如何显示数组中存储的所有值以及如何将这些值传递给第二个函数{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