如何显示数组中存储的所有值以及如何将这些值传递给第二个函数{C}
该程序的主要目的是显示称为“通道”的数组中的所有值,以便用户可以看到所有可能的选择。在我提示用户从四个通道中选择一个之后,我需要将这些值传递给第二个函数,以便计算一些东西。这就是我目前所拥有的 我也不能使用任何循环 请帮忙如何显示数组中存储的所有值以及如何将这些值传递给第二个函数{C},c,arrays,pointers,parameter-passing,C,Arrays,Pointers,Parameter Passing,该程序的主要目的是显示称为“通道”的数组中的所有值,以便用户可以看到所有可能的选择。在我提示用户从四个通道中选择一个之后,我需要将这些值传递给第二个函数,以便计算一些东西。这就是我目前所拥有的 我也不能使用任何循环 请帮忙 #include <stdio.h> //我想在这里显示所有频道及其值。。。我知道我必须使用printf,但我需要使用指针吗 printf("Please note:\n 0 = Channel 1 \n 1 = Channel 2 \n 2 = Cha
#include <stdio.h>
//我想在这里显示所有频道及其值。。。我知道我必须使用printf,但我需要使用指针吗
printf("Please note:\n 0 = Channel 1 \n 1 = Channel 2 \n 2 = Channel 3 \n 3 = Channel 4);
printf("Pick a channel from 0-3\n");
int c = 0;
scanf("%i", &c);
CHANNEL chosen = channels [c];
}
//这是到目前为止我对第二个函数所做的,我有关于如何计算速度的公式,但我不知道如何传递所选的值,我还需要在顶部放置一个函数原型吗
CHANNEL calculateVelocity(CHANNEL channels[])
{
double velocity;
//THIS IS THE EQUATION I NEED TO USE
//velocity = (slope/n)*(pow((width/depth)/width +2 * depth),(2/3));
}
让我们一次一个地检查你的每个问题。现在,我怀疑你的
printf
声明是否达到了你的目的。要打印每个通道及其包含的元素,我建议创建一个helper函数,可能看起来像:
void CHANNEL_print(CHANNEL* channel) {
printf("%s\n", channel->name);
printf("%lf\n", n); // Note that %lf is for doubles
// print the rest of the values just like this...
}
我不打算完整地完成这个函数,因为这个问题似乎是某种家庭作业问题(否则为什么不使用循环??),我不想完全给出答案。不过,你应该能够很容易地把其余的问题弄清楚
至于第二个函数,在调用它之前需要函数原型或定义本身,这是正确的。您似乎只想在函数中使用一个通道
,因此您的原型应该类似于
double calculateVelocity(CHANNEL*CHANNEL)
因为(我假设)你想要返回你计算的速度。指针应该是指向要传递给函数的通道的指针(即&channel[c]
),然后,函数内的计算本身如下所示:
速度=(通道->坡度/通道->n)*功率((通道->宽度/通道->深度)/通道->宽度+2*通道->深度,2.0/3.0)
请注意,
2/3=0
,因为它是整数除法,所以等式中有一个额外的)
。除了printf
调用中缺少的“
(来自两个调用)您忘记了main
的返回值,这种方式是默认的int
,您已经很好地开始了
CHANNEL selected
现在是所选的频道,要使用其数据,必须将其传递给函数。由于要使用其值,并且不想更改它们,因此可以按值传递给函数
函数应返回double
,因为velocity是double
。要访问成员变量,必须使用以下sytnax:
double calculateVelocity(const CHANNEL selected)
{
double velocity;
double n = selected.n;
double slope = selected.slope;
double width = selected.width;
double depth = selected.depth;
//THIS IS THE EQUATION I NEED TO USE
velocity = (slope/n)*pow(((width/depth)/width +2 * depth),(2.0/3.0));
return velocity;
}
如果我是你,我也会检查控制台的输入,这样你就不会将错误的索引传递给频道
数组
int main ()
{
CHANNEL channels [4] = {
{"Channel1", 2.0, 2.0, 10.0, 2.0},
{"Channel2", 0.020, 0.0002, 8.0, 1.0},
{"Channel3", 0.015, 0.0010, 20.0, 1.5},
{"Channel4", 0.030, 0.0007, 24.0, 3.0}
};
printf("Please note:\n 0 = Channel 1 \n 1 = Channel 2 \n 2 = Channel 3 \n 3 = Channel 4\n");
printf("Pick a channel from 0-3\n");
int c = 0;
scanf("%i", &c);
if(c < 0 || c > 3)
{
printf("Input is invalid: %d\n", c);
return 1;
}
CHANNEL chosen = channels [c];
printf("Calculated velocity: %f\n" ,calculateVelocity(chosen));
return 0;
}
int main()
{
频道频道[4]={
{“Channel1”,2.0,2.0,10.0,2.0},
{“Channel2”,0.020,0.0002,8.0,1.0},
{“Channel3”,0.015,0.0010,20.0,1.5},
{“Channel4”,0.030,0.0007,24.0,3.0}
};
printf(“请注意:\n 0=频道1\n 1=频道2\n 2=频道3\n 3=频道4\n”);
printf(“从0-3\n中选择一个频道”);
int c=0;
scanf(“%i”、&c);
如果(c<0 | | c>3)
{
printf(“输入无效:%d\n”,c);
返回1;
}
所选通道=通道[c];
printf(“计算速度:%f\n”,计算速度(已选择));
返回0;
}
包括
math.h
对于pow
只是一个旁注,如果函数的定义在外部模块中,或者函数的定义在调用它之后出现,那么您需要函数原型。我知道您说过不允许使用循环,但是遍历数组几乎是最理想的用例或者使用循环。下面是我如何使用循环来显示数组的内容:
printf( "%20s%8s%8s%8s%8s\n", "Name", "N", "Slope", "Width", "Depth" );
printf( "%20s%8s%8s%8s%8s\n", "----", "-", "-----", "-----", "-----" );
for ( size_t i = 0; i < N; i++ ) // where N is the number of rows in the array
{
printf( %20s%8.3f%8.4f%8.1f%8.1f\n",
channels[i].name,
channels[i].n,
channels[i].slope,
channels[i].width,
channels[i].depth
);
在你的例子中,N是4
for
循环的结构是
for ( expr1opt ; expr2opt ; expr3opt ) statement
因此,
%20s
表示“在至少20个字符宽的字段中打印字符串,并在左侧填充空格。”%8.3f
表示在包括小数点在内的至少8个字符宽的字段中打印浮点值,小数点后不超过3位。”因此,基本上您希望将所选的通道
传递给函数,并使用其成员变量?@BenceKaulics是的,这正是我要注意的。您缺少“
来自您的printf
调用。@约翰伯德我们在课堂上还没有学过它们yet@AjAlmero:那太不幸了;在数组中显示项目是循环的最佳用例。我觉得有趣的是,您的讲师选择在基本控制结构之前教授数组和函数定义。我是否必须在main之前或之后声明helper函数您可以在main
之前声明函数原型并在之后定义函数,或者在main之前声明并定义函数。选择哪一个取决于个人喜好。您可能想解释一下为什么要在calculateVelocity()
中使用中间变量,而不仅仅是使用传递给函数的结构的成员。@alk我不想弄乱代码的可读性,也不想弄乱原始公式。而且我发现语法更清晰。挑剔:转换说明符f
需要一个double
,不需要前缀长度修饰符l
(ell)。
Name N Slope Width Depth
---- - ----- ----- -----
Channel1 0.035 0.0001 10.0 2.0
Channel2 0.020 0.0002 8.0 1.0
Channel3 0.015 0.0010 20.0 1.5
...
for ( expr1opt ; expr2opt ; expr3opt ) statement
% [flags] [field-width] [. precision] [length-modifier] conversion-specifier