我是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();
}
}
答案 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);
这就是我到目前为止所看到的一切。