青衣 发表于 2021-7-11 14:52:21

getchar()不停止的原因-------学生成绩管理系统源码

你的输入流中还有残留的字符,getchar()()会接受那个字符。你可以在调用getchar()之前用fflush(stdin)刷新一下输入缓冲区。  应该有读入语句吧,没读干净,输入流里还有剩余的字符,就直接被getchar吞掉了,所以没有等待输入。
#include "stdio.h"
#include"string.h"
#include"stdlib.h"
void creat(), add(), modify(), del(), show(), search(), sort(), showmenu();
#define N 100
struct student
{
char num;
char name;
int score;
double av;
}stu;
int main()
{
int choice;
showmenu();
scanf("%d", &choice);
while (choice != 0)
{
switch (choice)
{
case 1:creat(); break;
case 2:add(); break;
case 3:modify(); break;
case 4:del(); break;
case 5:show(); break;
case 6:search(); break;
case 7:sort(); break;
}
showmenu();
scanf("%d", &choice);
}
return 0;
}
void showmenu()
{
system("cls"); /*清屏*/
printf("\n      学生成绩管理系统         \n");
printf("\n=================================\n");
printf("      1. 录入学生数据      \n");
printf("      2. 追加学生数据      \n");
printf("      3. 修改学生数据      \n");
printf("      4. 删除学生数据      \n");
printf("      5. 显示学生数据      \n");
printf("      6. 查找学生数据      \n");
printf("      7. 排序学生数据      \n");
printf("      0. 退出系统            \n");
printf("===============================\n");
printf("\n请输入您的选择(0-7):");
}
void save(int n)   /*将学生记录保存到二进制格式文件stud中*/
{
FILE *fp;
int i;
fp = fopen("stud", "wb");
for (i = 0; i<n; i++)
fwrite(&stu, sizeof(struct student), 1, fp);
fclose(fp);
}
/*******************************统计函数*****************************/
int count()   /*统计数据文件"stud"中记录个数*/
{
FILE *fp;
int i;
fp = fopen("stud", "rb");
for (i = 0; !feof(fp); i++)
fread(&stu, sizeof(struct student), 1, fp);
fclose(fp);
return(i - 1);
}
voidcreat()/*录入学生原始数据并写入磁盘文件*/
{
inti, j, n;
system("cls");   /*清屏*/
printf("请输入首次输入记录的数量:");
scanf("%d", &n);
for (i = 0; i<n; i++)
{
printf("\n请输入第%d个学生数据:\n", i + 1);
printf("学号: ");
scanf("%s", stu.num);
printf("姓名: ");
scanf("%s", stu.name);
for (j = 0; j<3; j++)
{
printf("成绩%d: ", j + 1);
scanf("%d", &stu.score);
}
stu.av = (stu.score + stu.score + stu.score) / 3.0;
}
save(n);      /*调用保存函数将录入的记录存入数据文件中*/
}
voidadd()/*追加数据并写入磁盘文件*/
{
inti, j, n, k, sum = 0;
system("cls");
n = count();/*调用统计函数统计数据文件中的记录数*/
printf("请输入追加记录的个数:");
scanf("%d", &k);
for (i = 1; i <= k; i++)
{
printf("\n请输入需追加的第%d个学生数据:\n", i);
printf("学号: ");
scanf("%s", stu.num);
printf("姓名: ");
scanf("%s", stu.name);
sum = 0;
for (j = 0; j<3; j++)
{
printf("成绩%d: ", j + 1);
scanf("%d", &stu.score);
sum += stu.score;
}
stu.av = sum / 3.0;
}
save(n + k);   /*调用保存函数把新追加的数据存入数据文件中*/
}
voidmodify()/*根据学号修改学生数据*/
{
inti, j, n, k = -1;
struct student s;
system("cls");
n = count();
printf("请输入要修改数据的学号:");
scanf("%s", s.num);
for (i = 0; i<n; i++)
if (strcmp(s.num, stu.num) == 0)
{
k = i; break;
}
if (k == -1) printf("该学号不存在\n");
else
{
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
printf("%s\t%s\t", stu.num, stu.name);
for (j = 0; j<3; j++)
printf("%d\t", stu.score);
printf("%.2lf\n", stu.av);
printf("\n");
printf("\n请重新输入该学生数据:\n");
printf("学号: ");
scanf("%s", stu.num);
printf("姓名: ");
scanf("%s", stu.name);
for (j = 0; j<3; j++)
{
printf("成绩%d: ", j + 1);
scanf("%d", &stu.score);
}
stu.av = (stu.score + stu.score + stu.score) / 3.0;
}
save(n);/*调用保存函数保存修改后的数据*/
}
voiddel()/*根据学号删除学生的记录*/
{
inti, j, k, n;
struct student s;
system("cls");
n = count();
printf("\n\n-----------------学生成绩表------------------\n\n");
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
for (i = 0; i<n; i++)
{
printf("%s\t%s\t", stu.num, stu.name);
for (j = 0; j<3; j++)
printf("%d\t", stu.score);
printf("%.2lf", stu.av);
printf("\n");
}
printf("请输入要删除的学生的学号:");
scanf("%s", s.num);
for (i = 0; i<n; i++)
if (strcmp(s.num, stu.num) == 0)
{
k = i; break;
}
if (k == -1) printf("数据不存在\n");
else
{
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
printf("%s\t%s\t", stu.num, stu.name);
for (j = 0; j<3; j++)
printf("%d\t", stu.score);
printf("%.2lf\n", stu.av);
printf("\n");
for (i = k; i<n - 1; i++)
stu = stu;
n = n - 1;
save(n);/*调用保存函数保存删除后的数据文件*/
}
}
voidshow() /*显示所有学生数据*/
{
inti, j, n;
system("cls");
n = count();
printf("\n\n-----------------学生成绩表------------------\n\n");
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
for (i = 0; i<n; i++)
{
printf("%s\t%s\t", stu.num, stu.name);
for (j = 0; j<3; j++)
printf("%d\t", stu.score);
printf("%.2lf", stu.av);
printf("\n");
}
fflush(stdin);
getchar();   /*按任意键继续*/
}
voidsearch()/*按学号查找学生数据并显示*/
{
inti, j, n, k = -1;
struct student s;
system("cls");
n = count();
printf("请输入要查找的学生的学号:");
scanf("%s", &s.num);
for (i = 0; i<n; i++)
if (strcmp(s.num, stu.num) == 0)
{
k = i; break;
}
if (k == -1) printf("数据不存在\n");
else
{
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
printf("%s\t%s\t", stu.num, stu.name);
for (j = 0; j<3; j++)
printf("%d\t", stu.score);
printf("%.2lf\n", stu.av);
printf("\n");
}
getchar();
}
voidsort()/*按个人平均成绩降序排序*/
{
inti, j, n;
struct studenttemp;
system("cls");
n = count(); /*调用统计函数统计数据文件中的记录数*/
for (i = 0; i<n - 1; i++)   /*排序*/
for (j = i + 1; j<n; j++)
if (stu.av<stu.av)
{
temp = stu;
stu = stu;
stu = temp; printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
for (i = 0; i<n; i++)
{
printf("%s\t%s\t", stu.num, stu.name);
for (j = 0; j<3; j++)
printf("%d\t", stu.score);
printf("%.2lf\n", stu.av);
}
printf("\n\n");
getchar();
}

}
//printf("-------------学生成绩表(排序后)--------------\n");
  
文档来源:51CTO技术博客https://blog.51cto.com/u_8697137/3035876
页: [1]
查看完整版本: getchar()不停止的原因-------学生成绩管理系统源码