如何使用while循环
我在编程方面是全新的,最近我发现这个网站帮助教育我的自我。 我正在尝试使用“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
我的身影,至少第一部分工作,但我得到我之后不提示接下来看看总然后请求对考试成绩。
您可以遇到的一个常见问题是输出缓冲。在您的代码中:
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);
}
感谢您的帮助,我想了解您在这里告诉我的大部分内容,因此我可能需要一段时间才能了解它,但我必须问,这是否允许我在“作业”部分之后继续输入数据已经进入? – Ruisu 2013-02-13 23:38:18
请后输出。我怀疑你没有看到提示,因为你需要调用'fflush(stdout)'。很多终端都是行缓冲的,除非你写一个换行符(或显式刷新),否则默认情况下不会将输出刷新到屏幕。 – paddy 2013-02-13 22:19:47
在我的Mac(铿锵声)和Windows(vc2012)上运行良好。 – WhozCraig 2013-02-13 22:22:33
很难想象在读取输入前没有刷新输出的任何C I/O库。 – 2013-02-13 22:42:40