2013-02-13 123 views
0

我在编程方面是全新的,最近我发现这个网站帮助教育我的自我。 我正在尝试使用“C”来编写一个程序,该程序会在我的书中遇到三种不同类别的成绩提示,并且我认为它们是我最好的选择。 我目前的代码看起来像这样。如何使用while循环

int countA; 
int gradeA; 
int totalA; 
int weightA; 
float averageA; 

int countE; 
int gradeE; 
int totalE; 
int weightE; 
float averageE; 

int countQ; 
int gradeQ; 
int totalQ; 
int weightQ; 
float averageQ; 

totalA = 0; 
countA = 0; 

totalE = 0; 
countE = 0; 

totalQ = 0; 
countQ = 0; 

printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeA); 

while (gradeA != -1){ 
totalA = totalA + gradeA; /* add gradeA to totalA */ 
    countA = countA + 1; 
     printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
     scanf("%d", &gradeA); 
} 
if (countA != 0) { 
averageA = (float) totalA/countA; 
printf("total is %.2f\n", averageA); 
} 



printf("Enter Exam Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeE); 

while (gradeE != -1){ 
totalE = totalE + gradeE; /* add gradeE to totalE */ 
    countE = countE + 1; 
     printf("Enter Exam Grade, -1 to end: "); /* prompt for input */ 
     scanf("%d", &gradeE); 
} 
if (countE != 0) { 
averageE = (float) totalE/countE; 
printf("total is %.2f\n", averageE); 
} 


printf("Enter Quiz Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeQ); 

while (gradeQ != -1){ 
totalQ = totalQ + gradeQ; /* add gradeQ to totalQ */ 
    countQ = countQ + 1; 
     printf("Enter Quiz Grade, -1 to end: "); /* prompt for input */ 
     scanf("%d", &gradeQ); 
} 
if (countQ != 0) { 
averageQ = (float) totalQ/countQ; 
printf("total is %.2f\n", averageQ); 
} 

我们什么,我想这点后,做的是两次重复这个过程,但是当我尝试运行exe文件我得到的第1部分运行,但其他两个部分根本就没有得到由于某种原因而提出的。这是否仅限于重复陈述的内容?或者我有一个错误在哪里。我试图弄清楚我做错了什么,但我只是看到它。

我不太确定如何正确发布这里,但这是我得到的输出的一个例子。

这里是我输出的一个例子,你可以看到它提示我输入第一个段,它是Assignment部分,但是输入-1结束循环后,它给出了平均值和结束值。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>project1.exe 
Enter Assignment Grade, -1 to end: 100 
Enter Assignment Grade, -1 to end: 80 
Enter Assignment Grade, -1 to end: 77 
Enter Assignment Grade, -1 to end: 33 
Enter Assignment Grade, -1 to end: 76 
Enter Assignment Grade, -1 to end: 92 
Enter Assignment Grade, -1 to end: -1 
total is 76.33 

我的身影,至少第一部分工作,但我得到我之后不提示接下来看看总然后请求对考试成绩。

+0

请后输出。我怀疑你没有看到提示,因为你需要调用'fflush(stdout)'。很多终端都是行缓冲的,除非你写一个换行符(或显式刷新),否则默认情况下不会将输出刷新到屏幕。 – paddy 2013-02-13 22:19:47

+1

在我的Mac(铿锵声)和Windows(vc2012)上运行良好。 – WhozCraig 2013-02-13 22:22:33

+0

很难想象在读取输入前没有刷新输出的任何C I/O库。 – 2013-02-13 22:42:40

回答

2

您可以遇到的一个常见问题是输出缓冲。在您的代码中:

printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
scanf("%d", &gradeA); 

您的终端可能不会将输出缓冲区刷新为屏幕。所以它会等待输入,但是您可能看不到提示。强制它,你可以这样做:

printf("Enter Assignment Grade, -1 to end: "); /* prompt for input */ 
fflush(stdout); 
scanf("%d", &gradeA); 

现在,这使得更多的重复。如果你只需要为每个循环写一次提示而不是两次,那会更好。你可以通过在循环之前将gradeA初始化为零来解决这个问题。然后在循环中的第一个计算不产生任何影响:

gradeA = 0; 
totalA = -1; 

while (gradeA != -1) 
{ 
    totalA = totalA + gradeA; 
    countA = countA + 1; 
    printf("Enter Assignment Grade, -1 to end: "); 
    fflush(stdout); 
    scanf("%d", &gradeA); 
} 

通知我设置countE为-1,以撤消您在循环顶部增加它的事实。这一切都开始感觉有点笨拙。

另一个问题是,如果用户输入的不是整数,那么程序会产生未定义的行为(因为您实际上没有初始化gradeA)。您可以测试scanf是否成功,因为它返回它读取的项目数。

懒惰的做法是这样的:

if(1 != scanf("%d", &gradeA)) { 
    printf("Invalid input!"\n"); 
    exit(1); 
} 

你可以决定。我会在答案的其余部分忽略这一点。

当你加强你的循环,很明显代码重复是一个主题。你正在改变的是变量和提示。因此,它可能是时候把它变成一个功能:

int grade_average(const char *what, int *total, float *average) 
{ 
    int count = -1; 
    int grade = 0; 
    *total = 0; 

    while(grade != -1) 
    { 
     count++; 
     *total += grade; 

     printf("Enter %s Grade, -1 to end: ", what); 
     fflush(stdout); 

     if(1 != scanf("%d", &grade)) return 0; // fail on input error. 
    } 

    if(count > 0) { 
     *average = (float)*total/count; 
    } 

    return 1; 
} 

现在你可以这样调用:

if(grade_average("Assignment", &totalA, &averageA)) { 
    printf("Total is %.2f\n", averageA); 
} 

if(grade_average("Exam", &totalE, &averageE)) { 
    printf("Total is %.2f\n", averageE); 
} 

if(grade_average("Quiz", &totalQ, &averageQ)) { 
    printf("Total is %.2f\n", averageQ); 
} 
+0

感谢您的帮助,我想了解您在这里告诉我的大部分内容,因此我可能需要一段时间才能了解它,但我必须问,这是否允许我在“作业”部分之后继续输入数据已经进入? – Ruisu 2013-02-13 23:38:18