题目:
依次输入成绩并且在输入负数时停止,且输出最大与最小成绩
记录
- 开始的时候在输入且判断部分出现一个奇怪的问题,那就是不知道为什么while中的scanf只能循环输入一次,第一次循环结束进入第二次循环的时候命令窗口完全无法输入任何东西,就算加入清除缓存的代码也没有什么用处
修改后的
#include<stdio.h>
int main()
{
int x = 0, max = 0, min = 0, top = 200;
printf("***请输入成绩上限(即满分成绩)***\n请依次输入学生整数成绩\n输入负数时结束成绩\n\n满分为:");
scanf("%d", &top);
min = top + 1;
//防止初始最小一直最小
printf("请依次输入成绩\n");
while (x >= 0)
{
scanf("%d", &x);
if (x < 0)break;
if (x > top)
//判断成绩是否低于满分
{
printf("请输入小于%d的成绩!!!\n", top);
//若输入成绩大于满分,重新返回输入
continue;
};
max = ((max > x) ? max : x);
//取最大
min = ((min < x) ? min : x);
//取最小
};
//输入负数时停止循环
printf("\n最高成绩为%d\n最低成绩为%d\n", max, min);
return 0;
}
最终成品!!!
#include<stdio.h>
int main()
{
int x = 0, max = 0, min = 0, top = 200, i = 0, j = 0;
char YN = 'n';
while (YN == 'n')
{
system("cls");
//清屏的命令,主要用于在进入第二次满分输入循环的时候清除前面的屏幕,美化作用
if (top <= 0)
{
printf("怎么输入了负数,请认真阅读下部分:\n");
//没有和下面的top非正数continue放在一起是因为清屏会把这句话也清理啦!
}
printf("***请输入成绩上限(即满分成绩)***\n请依次输入学生整数成绩\n输入负数时结束成绩\n\n满分为:");
scanf("%d", &top);
getchar();
//用于清理缓冲区的\n,避免后面读取字符的时候把\n给误读了
if (top <= 0)
{
continue;
//避免输入的满分为负数
}
printf("\n是否确定设置的满分为%d?\n是请输入y\n否请输入n\n(y/n):", top);
scanf("%c", &YN);
printf("\n");
};
min = top + 1;
//防止初始最小一直最小,否则可能让最后的最小值都是min的初始值
system("cls");
printf("请依次输入成绩,只有输入超过两个正数成绩才会输出最高最低喔\n");
while (x >= 0)
{
i++, j++;
scanf("%d", &x);
if (1 == i || 2 == i)
{
if (x < 0)
{
printf("笨蛋,还要输入%d次正确成绩才能结束!!!重来\n\n",3 - j);
//提示还需要输入多少次正确的成绩
i--, x = 0;
continue;
}
}
j--;
//i和j是用于逻辑判断,不可省略,有点懒,不赘述了
if (x < 0)break;
if (x > top)
//判断成绩是否低于满分
{
printf("请输入小于%d的成绩!!!\n", top)
//若输入成绩大于满分,重新返回输入
i--;
continue;
};
max = ((max > x) ? max : x);
//取最大
min = ((min < x) ? min : x);
//取最小
};
//输入负数时停止循环
printf("\n最高成绩为%d\n最低成绩为%d\n", max, min);
return 0;
}
功能
- 输入满分限制
- 确认是否为满分
- 检查满分是否为负数
- 确认满分后清除命令屏幕先前显示
- 输入至少两次正常的数字才会继续
- 计算最高最低成绩
清屏的实现
system("cls")即可
下传送门为DDOS命令收集
while循环中scanf无法第二次输入的问题
第一个是在用scanf("%c", &ch)的时候一定要注意前面是否还有没有被清理掉的\n,缓冲区的\n会被scanf读取,导致奇怪的错误(死循环或者无法进一步输入,或者scanf被跳过之类的)
第二个是开始的记录中在while用到子函数结果while中scanf只能输入第一次... ...
Comments NOTHING