程序在预期时不会退出

时间:2016-02-23 15:01:46

标签: c

我是C的新手,我正在努力编写一个程序,让您最多可以输入100个人的年龄和薪水。该程序首先将打印一些句子(显示功能),然后询问您是否要继续(yes_no功能)。输入个人信息后,该程序还会询问您是否要继续输入下一个人的信息。如果您想继续,则需要输入1和0表示否/退出。当我编译并运行代码时,我发现了一个问题,我无法弄清楚原因!

  

问题是如果在输入信息后选择0(表示没有/退出),程序不会退出。它只是询问下一个人的信息。但是当我从一开始就选择0时,它就像往常一样退出。为什么呢?

#include<stdio.h>

#define max 100
#define yes 1
#define no 0

int display(void);
int yes_no(void);
void get_data(void);

int date[max],month[max],year[max]; 
int cont;
int salary;

int main(){
    cont=display();
  if (cont==yes){
        get_data();
    }
return 0;
}

int display(void){
    printf("This program will let you enter ");
    printf("the age and salary of up to 100 people ");

    cont=yes_no();
    return cont;
}

int yes_no(void){
    int i=0;
    printf("\nDo you want to continue? Enter 1 for Yes and 0 for No\n");
    scanf("%d", &i);
    while(i<0 || i>1){
        printf("Invalid value.Please enter again\n");
        scanf("%d", &i);
    }
    if(i==1){
        return (yes);
    }else return (no);
}

void get_data(void){
    int i=0;
    for(i=0;i<max;i++){
        printf("Enter information for people %d\n", i+1);
        printf("Enter birthday\n");
        do{
            printf("Enter date\n");
            scanf("%d", &date[i]);
        }while( 0>date[i] || 31<date[i] );
        do{
             printf("Enter month\n");
             scanf("%d", &month[i]);
        }while( 0>month[i] || 12<month[i]);
        do{
             printf("Enter year\n");
             scanf("%d", &year[i]);
        }while( 1900>year[i] || 2016<year[i]);

             printf("Enter salary\n");
             scanf("%d", &salary);

    cont=yes_no();
    }
}

1 个答案:

答案 0 :(得分:4)

void get_data(void){
    int i=0;
    for(i=0;i<max;i++){
        printf("Enter information for people %d\n", i+1);
        printf("Enter birthday\n");
        do{
            printf("Enter date\n");
            scanf("%d", &date[i]);
        }while( 0>date[i] || 31<date[i] );
        do{
             printf("Enter month\n");
             scanf("%d", &month[i]);
        }while( 0>month[i] || 12<month[i]);
        do{
             printf("Enter year\n");
             scanf("%d", &year[i]);
        }while( 1900>year[i] || 2016<year[i]);

             printf("Enter salary\n");
             scanf("%d", &salary);

    cont=yes_no(); // <== The Problem lies here
    }
}

您询问用户是否要继续,但您从未检查yes_no()的返回值 只需在此行之后添加它,它应该像魅力一样:

if (cont == no)
    return;

正如其他人所提到的,您仍然可以采取一些措施来“改进”您的代码。

defines应该大写,以便#define YES 1坚持这一惯例。

你不应该使用全局变量。这些是糟糕的编程风格。只需将其他函数中所需的内容作为参数传递,如果稍后需要将操作值作为指针传递给它们。

此外,格式可以改进(但这主要是基于意见的主题;)) 在C中,每个花括号通常都有一个额外的行。

void get_data(void)
{
...
}

//instead of
void get_data(void){
...
}

do-while - 循环之后的空白应该看起来更像:

do
{
...
} while(1900 > year[i]); //here the curly bracket is ok that way 

操作员双方都应该留空:

printf("Enter information for people %d\n", i + 1);
// instead of this
printf("Enter information for people %d\n", i+1);

这就是我到目前为止所看到的一切。