#define _CRT_SECURE_NO_WARNINGS
#include
#include
int main()
```c
{
float c,h,p,GP,GPA,sum1 = 0, sum2 = 0;
while (scanf("%f%f", &c, &h) != EOF)
{
if (c >= 60 || c <= 100)
{
p = ((100 - c), 2);
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c >= 0 || c < 60)
{
GP= 0;
}
sum1 = sum1 + h;
sum2 = sum2 + GP * h;
}
GPA = sum2 / sum1;
printf("总GPA为:%.2f", GPA);
return 0;
}
while循环结束不了,printf没有显示
```
修改如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
float c, h, p, GP, GPA, sum1 = 0, sum2 = 0;
while (scanf("%f%f", &c, &h) == 2)
{
if (c >= 60 && c <= 100)
{
p = pow((100 - c), 2);
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c < 60 && c >= 0)
{
GP = 0;
}
sum1 = sum1 + h;
sum2 = sum2 + GP * h;
}
GPA = sum2 / sum1;
printf("总GPA为:%.2f", GPA);
return 0;
}
你的代码中while循环没有结束的原因可能是由于scanf函数没有读取到EOF,导致程序一直在等待输入。你可以尝试在输入完毕后,手动输入EOF来结束scanf函数。此外,printf函数不输出的原因可能是由于缓冲区没有刷新到文件中。你可以尝试在printf语句后添加一个换行符或者使用fflush函数来刷新缓冲区
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main()
{
float c, h, p, GP, GPA, sum1 = 0, sum2 = 0;
while (scanf("%f%f", &c, &h) != EOF)
{
if (c >= 60 || c <= 100)
{
p = pow((100 - c), 2);
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c >= 0 || c < 60)
{
GP = 0;
}
sum1 = sum1 + h;
sum2 = sum2 + GP * h;
}
GPA = sum2 / sum1;
printf("总GPA为:%.2f", GPA);
return 0;
}
我看到你的代码有一个问题。你的while循环条件是scanf(“%f%f”, &c, &h) != EOF,这意味着你需要输入一个文件结束符(EOF)才能结束循环。如果你是在命令行输入数据,你可以按Ctrl+Z(Windows)或Ctrl+D(Linux)来输入EOF。如果你是从文件读取数据,你需要确保文件有一个EOF字符。否则,你的循环会一直等待输入,printf语句就不会执行。
该回答通过自己思路及引用到各个渠道搜索综合及思考,得到内容具体如下:
在您的代码中,while循环没有正确结束的原因是,当输入流结束时,scanf()函数不会返回EOF,而是返回0,因此while循环不会结束。
另外,您在计算p值时使用了逗号操作符(,),这可能导致计算结果不正确。
此外,您应该使用逻辑运算符&&而不是||来测试c的范围。
最后,您的代码缺少一些必要的头文件,例如<math.h>,需要包含它来使用pow()函数。
以下是修改后的代码示例:
#include <stdio.h>
#include <math.h>
int main()
{
float c, h, p, GP, GPA, sum1 = 0, sum2 = 0;
while (scanf("%f%f", &c, &h) == 2) // 修改while循环条件
{
if (c >= 60 && c <= 100) // 修改if条件
{
p = pow((100 - c), 2); // 修改计算p值的代码
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c >= 0 && c < 60) // 修改if条件
{
GP = 0;
}
sum1 = sum1 + h;
sum2 = sum2 + GP * h;
}
GPA = sum2 / sum1;
printf("总GPA为:%.2f\n", GPA); // 添加换行符
return 0;
}
在修改后的代码中,我们将while循环的条件修改为当scanf()函数成功读取两个浮点数时才继续执行循环。我们还使用了逻辑运算符&&来测试c的范围,并修改了计算p值的代码,以使用pow()函数而不是逗号操作符。最后,我们添加了一个换行符,以便在输出时换行。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
对这个返回值我们分析一下 :scanf("%f%f", &c, &h) != EOF
scanf函数返回成功读入的数据项数,如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d
EOF的值是-1
函数返回值为int型,表示正确读入数据的个数。
1.如果c和h都被成功读入,那么scanf的返回值就是2;
2.如果只有c被成功读入,返回值为1;
3.如果c读取失败,返回值为0;
你确定scanf获取到了EOF?
引用chatGPT作答,代码逻辑存在问题。
在第一个if条件中,表达式(100 - c), 2使用了逗号操作符,逗号操作符会先计算第一个表达式,然后返回第二个表达式的结果,因此表达式的结果是2,而不是(100 - c)^2。
在第二个if条件中,使用了逻辑或操作符||,而应该使用逻辑与操作符&&。因此,该条件始终为真,程序会为任何c输入值分配一个GP值为0。
要修复代码,请使用pow()函数代替逗号操作符,正确计算(100 - c)的平方。此外,请在第二个if条件中使用逻辑与操作符。以下是更正后的代码:
#include <stdio.h>
#include <math.h>
int main()
{
float c, h, p, GP, GPA, sum1 = 0, sum2 = 0;
while (scanf("%f%f", &c, &h) != EOF)
{
if (c >= 60 && c <= 100)
{
p = pow((100 - c), 2);
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c >= 0 && c < 60)
{
GP = 0;
}
sum1 = sum1 + h;
sum2 = sum2 + GP * h;
}
GPA = sum2 / sum1;
printf("总GPA为:%.2f", GPA);
return 0;
}
注意:请确保输入值并使用EOF(Unix / Linux上为ctrl+d,Windows上为ctrl+z)终止输入以结束while循环并显示结果。
修改如下,scanf输入成功两个浮点数后,返回值为2
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
float c,h,p,GP,GPA,sum1 = 0, sum2 = 0;
int fla=0;
//
do{
fla=scanf("%f%f", &c, &h);
//printf("%f %f\n",c,h);
if (c >= 60 || c <= 100)
{
p = ((100 - c), 2);
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c >= 0 || c < 60)
{
GP= 0;
}
sum1 = sum1 + h;
sum2 = sum2 + GP * h;
}
while (fla == 2);
GPA = sum2 / sum1;
printf("总GPA为:%.2f", GPA);
return 0;
}
在您提供的代码中,使用了 scanf() 函数来循环读取输入数据,但是在输入完最后一组数据后,scanf() 函数并不会返回 EOF,导致程序一直在等待输入,从而使得 while 循环无法结束。这时您可以使用 Ctrl + Z(Windows 系统)或者 Ctrl + D(Linux/MacOS 系统)来手动结束输入,从而使得 scanf() 函数返回 EOF,使得程序能够正常结束。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
float c,h,GP,sum1 = 0, sum2 = 0;
int i = 0; // added a counter variable
printf("plese in put\r\n");
fflush(stdout);
while (scanf("%f%f", &c, &h) == 2 && i < 10) // changed the condition of the loop
{
if (c >= 60 && c <= 100) // changed || to &&
{
GP = 4 - (3.0 / 1600.0) * pow((100 - c), 2); // eliminated p
}
else if (c >= 0 && c < 60) // changed || to &&
{
GP= 0;
}
sum1 = sum1 + h;
sum2 = sum2 + GP * h;
i++; // incremented the counter
}
printf("总GPA为:%.2f\n", sum2 / sum1); // eliminated GPA and added newline
return 0;
}
问题在于while循环没有退出条件,需要在外层套一个循环,用来输入学科成绩和学分,输入结束时使用break跳出循环。修改后的代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
float c, h, p, GP, GPA, sum1 = 0, sum2 = 0;
while (1) {
scanf("%f%f", &c, &h);
if (c < 0 || c > 100) {
break;
}
if (c >= 60 || c <= 100) {
p = pow((100 - c), 2);
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c >= 0 || c < 60) {
GP = 0;
}
sum1 += h;
sum2 += GP * h;
}
GPA = sum2 / sum1;
printf("总GPA为:%.2f", GPA);
return 0;
}
修改后,当输入的成绩小于0或大于100时,while循环通过break退出,程序可以正常输出结果。同时,我也修改了pow函数的用法,将(100-c),2改为pow((100-c),2)。
不知道你这个问题是否已经解决, 如果还没有解决的话:今天遇到类似这样一道编程题:
#include<stdio.h>
int main()
{
int i = 0;
printf("++i,++i,++i,++i,++i,++i = ");
printf("%d %d %d %d %d %d\n",++i,++i,++i,++i,++i,++i);
i=0;
printf("i++,i++,i++,i++,i++,i++ = ");
printf("%d %d %d %d %d %d\n",i++,i++,i++,i++,i++,i++);
i=0;
printf("i++,i++,i++,++i,++i,++i = ");
printf("%d %d %d %d %d %d \n",i++,i++,i++,++i,++i,++i);
i=0;
printf("++i,++i,++i,i++,i++,i++ = ");
printf("%d %d %d %d %d %d\n",++i,++i,++i,i++,i++,i++);
i=0;
printf("++i,++i,i,i,i++,i++ = ");
printf("%d %d %d %d %d %d\n",++i,++i,i,i,i++,i++);
}
输出结果:
编程环境是:VS2010、win10
总结一下:
printf()从右往左输出;
如果输出为 i++,则输出当前 i 后立马赋值 i = i + 1;否则输出位置为 ++i 或者 i 时,先进行完所有运算再输出 i 的最终值。
c
#define _CRT_SECURE_NO_WARNINGS
#include
#include
int main()
{
float c,h,p,GP,GPA,sum1 = 0, sum2 = 0;
int flag;
while ((flag=scanf("%f%f", &c, &h)) != EOF)
{
if (flag == 0)
{
char buf[1024];
fgets(buf, 1024, stdin);
continue;
}
if (c >= 60 || c <= 100)
{
p = pow((100 - c), 2);
GP = 4 - (3.0 / 1600.0) * p;
}
else if (c >= 0 || c < 60)
{
GP= 0;
}
sum1 += h;
sum2 += GP * h;
}
GPA = sum2 / sum1;
printf("总GPA为:%.2f", GPA);
return 0;
}