getPositiveValues不会返回值

时间:2018-10-15 01:50:27

标签: c

什么不起作用:

在下面的代码中,在scanf下的getPositiveValue中输入的值将不会返回。无论输入是什么,它们都以0的形式返回。

我不知道如何解决这个问题。有人可以告诉我为什么它不起作用吗?

我尝试过的事情:

我尝试使用return CHAN;甚至return CHAN.n;以及所有其他成员,但是没有用。

我的代码:

#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define N 25 //number of lines

typedef struct CHANNEL_ //Structure CHANNEL
{
    char name[9];
    double n;//roughness coefficient
    double S;//channel slope
    double B;//width
    double D;//maxDepth
} CHANNEL;

double computeVelocity(CHANNEL, double);

int main(void)
{
    CHANNEL CHAN;
    void getPositiveValue(CHANNEL);
    void displayTable(CHANNEL);
    //Function declarations

    printf("Enter the name of the channel: ");
    fgets(CHAN.name, 9, stdin);
    getPositiveValue(CHAN);
    printf("Channel data for %s\n Coefficient of roughness: %lf\n Slope: %lf\n Width: %lf\n Maximum depth: %lf\n", CHAN.name, CHAN.n, CHAN.S, CHAN.B, CHAN.D);
    printf("Depth    Average Velocity\n");
    displayTable(CHAN); //function call to display the table with values
}

void getPositiveValue(CHANNEL CHAN)
{
    int Flag; //sentinel
    do
    {
        Flag = FALSE;
        printf("Give the coefficient for roughness, slope, width, and maxdepth: ");
        scanf("%lf %lf %lf %lf", &CHAN.n, &CHAN.S, &CHAN.B, &CHAN.D);
        if(CHAN.n < 0 || CHAN.S < 0 || CHAN.B < 0 || CHAN.D < 0) //sentinel checkpoint
        {
            Flag = TRUE;
            printf("The values must be positive.\n");
        }
    } while(Flag == TRUE);
}

void displayTable(CHANNEL CHAN)
{
    double increment = CHAN.D/N;
    double H = 0; //depth
    double arraydepth[N]; //N is used to avoid magic numbers when defining array size
    double arrayvelocity[N]; //N is used to avoid magic numbers when defining array size
    int i; //using separate integers for the two different arrays just so it looks better and less confusing
    for ( i = 0; i < N; i++)
    {
        H += increment;
        arrayvelocity[i] = computeVelocity(CHAN, H);
        arraydepth[i] = H;
        printf("%lf %lf\n", arraydepth[i], arrayvelocity[i]);
    }
}

double computeVelocity(CHANNEL CHAN, double H)
{
    double U;
    U = CHAN.B / H;
    U = U / (CHAN.B + (2 * H));
    U = pow(U, (2 / 3));
    U = U / CHAN.n;
    U = U * (sqrt(CHAN.S));

    return U;
}

2 个答案:

答案 0 :(得分:1)

您遇到的输入问题是由于在C中按值调用函数这一事实。这意味着,当您将struct传递给函数时,它就是一个副本函数中使用的struct的值,而不是原始值。一旦控件返回到struct,在getPositiveValue()函数中对main()所做的任何更改都不可见。

要解决此问题,请将指针传递给该结构。使用->运算符可取消引用指针并一次访问成员。这是您代码的修改版本。我还自由地将函数声明移到程序顶部。

pow()中找到的computeVelocity()函数的调用中也存在错误:

U = pow(U, (2 / 3));

应为:

U = pow(U, (2.0 / 3.0));

表达式2 / 3执行整数除法,结果为零,因此在调用pow()之后,U始终为1。可以通过强制进行浮点除法来轻松解决此问题,就像上面第二行一样。

#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define N 25 //number of lines

typedef struct CHANNEL_ //Structure CHANNEL
{
    char name[9];
    double n;//roughness coefficient
    double S;//channel slope
    double B;//width
    double D;//maxDepth
} CHANNEL;

double computeVelocity(CHANNEL, double);
void getPositiveValue(CHANNEL *);
void displayTable(CHANNEL);

int main(void)
{
    CHANNEL CHAN;
    printf("Enter the name of the channel: ");
    fgets(CHAN.name, 9, stdin);
    getPositiveValue(&CHAN);
    printf("Channel data for %s\n Coefficient of roughness: %lf\n Slope: %lf\n Width: %lf\n Maximum depth: %lf\n", CHAN.name, CHAN.n, CHAN.S, CHAN.B, CHAN.D);
    printf("Depth    Average Velocity\n");
    displayTable(CHAN); //function call to display the table with values
}

void getPositiveValue(CHANNEL *CHAN)
{
    int Flag; //sentinel
    do
    {
        Flag = FALSE;
        printf("Give the coefficient for roughness, slope, width, and maxdepth: ");
        scanf("%lf %lf %lf %lf", &CHAN->n, &CHAN->S, &CHAN->B, &CHAN->D);
        if(CHAN->n < 0 || CHAN->S < 0 || CHAN->B < 0 || CHAN->D < 0) //sentinel checkpoint
        {
            Flag = TRUE;
            printf("The values must be positive.\n");
        }
    }while(Flag == TRUE);
}

void displayTable(CHANNEL CHAN)
{
    double increment = CHAN.D/N;
    double H = 0; //depth
    double arraydepth[N]; //N is used to avoid magic numbers when defining array size
    double arrayvelocity[N]; //N is used to avoid magic numbers when defining array size
    int i; //using separate integers for the two different arrays just so it looks better and less confusing
    for ( i = 0; i < N; i++)
    {
        H += increment;
        arrayvelocity[i] = computeVelocity(CHAN, H);
        arraydepth[i] = H;
        printf("%lf %lf\n", arraydepth[i], arrayvelocity[i]);
    }
}

double computeVelocity(CHANNEL CHAN, double H)
{
    double U;
    U = CHAN.B / H;
    U = U / (CHAN.B + (2 * H));
    U = pow(U, (2.0 / 3.0));
    U = U / CHAN.n;
    U = U * (sqrt(CHAN.S));
    return U;
}

示例程序交互:

Enter the name of the channel: chan
Give the coefficient for roughness, slope, width, and maxdepth: 0.035 0.0001 10 4.2
Channel data for chan

 Coefficient of roughness: 0.035000
 Slope: 0.000100
 Width: 10.000000
 Maximum depth: 4.200000
Depth    Average Velocity
0.168000 0.917961
0.336000 0.566077
0.504000 0.423161
0.672000 0.342380
0.840000 0.289368
1.008000 0.251450
1.176000 0.222759
1.344000 0.200172
1.512000 0.181859
1.680000 0.166669
1.848000 0.153840
2.016000 0.142843
2.184000 0.133301
2.352000 0.124935
2.520000 0.117535
2.688000 0.110939
2.856000 0.105020
3.024000 0.099677
3.192000 0.094829
3.360000 0.090410
3.528000 0.086363
3.696000 0.082644
3.864000 0.079214
4.032000 0.076040
4.200000 0.073095

答案 1 :(得分:0)

您的代码中有很多编译器错误。这是我第一次尝试修复它

#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define N 25 //number of lines

typedef struct CHANNEL_ {
    char name[50];
    double n;//roughness coefficient
    double S;//channel slope
    double B;//width
    double D;//maxDepth
} CHANNEL;

double computeVelocity(CHANNEL, double);
void getPositiveValue(CHANNEL);
void displayTable(CHANNEL);

int main(void) {
    CHANNEL CHAN;

    printf("Enter the name of the channel: ");
    fgets(CHAN.name, 50, stdin);
    getPositiveValue(CHAN);
    printf("Channel data for %s\n Coefficient of roughness: %lf\n Slope: %lf\n Width: %lf\n Maximum depth: %lf\n", CHAN.name, CHAN.n, CHAN.S, CHAN.B, CHAN.D);
    printf("Depth    Average Velocity\n");
    displayTable(CHAN); //function call to display the table with values
}

void getPositiveValue(CHANNEL CHAN) {
    int Flag; //sentinel
    do {
        Flag = FALSE;
        printf("Give the coefficient for roughness: \n Give the slope: \n Give the channel width: \n Give the maximum depth of the channel: ");
        scanf("%lf %lf %lf %lf", &CHAN.n, &CHAN.S, &CHAN.B, &CHAN.D);
        if(CHAN.n < 0 || CHAN.S < 0 || CHAN.B < 0 || CHAN.D < 0) {
            Flag = TRUE;
            printf("The values must be positive.\n");
        }
    } while(Flag == TRUE);
}

void displayTable(CHANNEL CHAN) {
    double increment = CHAN.D/N;
    double H = 0; //depth
    double arraydepth[N];
    double arrayvelocity[N];
    int i;
    for ( i = 0; i < N; i++) {
        H += increment;
        arrayvelocity[i] = computeVelocity(CHAN, H);
        arraydepth[i] = H;
        printf("%lf %lf\n", arraydepth[i], arrayvelocity[i]);
    }
}

double computeVelocity(CHANNEL CHAN, double H)
{
    double U;
    U = CHAN.B / H;
    U = U / (CHAN.B + (2 * H));
    U = pow(U, (2 / 3));
    U = U / CHAN.n;
    U = U * (sqrt(CHAN.S));

    return U;
}

第一个错误是struct定义。在C语言中,您可以定义struct并同时定义一个变量。但是,您不应使用相同的名称来混淆自己和编译器。另外,您还需要了解void函数不会返回值,并且不能位于=表达式的右侧。

使用typedef可以使您每次需要输入struct关键字。您还需要使用%s输出字符串。也是这里和那里的错字。