评论

收藏

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

编程语言 编程语言 发布于:2021-07-11 14:52 | 阅读数:373 | 评论:0

你的输入流中还有残留的字符,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[6];
char name[8];
int score[3];
double av;
}stu[N];
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[i], 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[i], sizeof(struct student), 1, fp);
fclose(fp);
return(i - 1);
}
void  creat()  /*录入学生原始数据并写入磁盘文件*/
{
int  i, j, n;
system("cls");   /*清屏*/
printf("请输入首次输入记录的数量:");
scanf("%d", &n);
for (i = 0; i<n; i++)
{
printf("\n请输入第%d个学生数据:\n", i + 1);
printf("学号: ");
scanf("%s", stu[i].num);
printf("姓名: ");
scanf("%s", stu[i].name);
for (j = 0; j<3; j++)
{
printf("成绩%d: ", j + 1);
scanf("%d", &stu[i].score[j]);
}
stu[i].av = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
}
save(n);    /*调用保存函数将录入的记录存入数据文件中*/
}
void  add()  /*追加数据并写入磁盘文件*/
{
int  i, 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[n - 1 + i].num);
printf("姓名: ");
scanf("%s", stu[n - 1 + i].name);
sum = 0;
for (j = 0; j<3; j++)
{
printf("成绩%d: ", j + 1);
scanf("%d", &stu[n - 1 + i].score[j]);
sum += stu[n - 1 + i].score[j];
}
stu[n - 1 + i].av = sum / 3.0;
}
save(n + k);   /*调用保存函数把新追加的数据存入数据文件中*/
}
void  modify()  /*根据学号修改学生数据*/
{
int  i, 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[i].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[k].num, stu[k].name);
for (j = 0; j<3; j++)
printf("%d\t", stu[k].score[j]);
printf("%.2lf\n", stu[k].av);
printf("\n");
printf("\n请重新输入该学生数据:\n");
printf("学号: ");
scanf("%s", stu[k].num);
printf("姓名: ");
scanf("%s", stu[k].name);
for (j = 0; j<3; j++)
{
printf("成绩%d: ", j + 1);
scanf("%d", &stu[k].score[j]);
}
stu[k].av = (stu[k].score[0] + stu[k].score[1] + stu[k].score[2]) / 3.0;
}
save(n);  /*调用保存函数保存修改后的数据*/
}
void  del()  /*根据学号删除学生的记录*/
{
int  i, 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[i].num, stu[i].name);
for (j = 0; j<3; j++)
printf("%d\t", stu[i].score[j]);
printf("%.2lf", stu[i].av);
printf("\n");
}
printf("请输入要删除的学生的学号:");
scanf("%s", s.num);
for (i = 0; i<n; i++)
if (strcmp(s.num, stu[i].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[k].num, stu[k].name);
for (j = 0; j<3; j++)
printf("%d\t", stu[k].score[j]);
printf("%.2lf\n", stu[k].av);
printf("\n");
for (i = k; i<n - 1; i++)
stu[i] = stu[i + 1];
n = n - 1;
save(n);  /*调用保存函数保存删除后的数据文件*/
}
}
void  show() /*显示所有学生数据*/
{
int  i, 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[i].num, stu[i].name);
for (j = 0; j<3; j++)
printf("%d\t", stu[i].score[j]);
printf("%.2lf", stu[i].av);
printf("\n");
}
fflush(stdin);
getchar();   /*按任意键继续*/
}
void  search()  /*按学号查找学生数据并显示*/
{
int  i, 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[i].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[k].num, stu[k].name);
for (j = 0; j<3; j++)
printf("%d\t", stu[k].score[j]);
printf("%.2lf\n", stu[k].av);
printf("\n");
}
getchar();
}
void  sort()  /*按个人平均成绩降序排序*/
{
int  i, j, n;
struct student  temp;
system("cls");
n = count(); /*调用统计函数统计数据文件中的记录数*/
for (i = 0; i<n - 1; i++)   /*排序*/
for (j = i + 1; j<n; j++)
if (stu[i].av<stu[j].av)
{
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp; printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
for (i = 0; i<n; i++)
{
printf("%s\t%s\t", stu[i].num, stu[i].name);
for (j = 0; j<3; j++)
printf("%d\t", stu[i].score[j]);
printf("%.2lf\n", stu[i].av);
}
printf("\n\n");
getchar();
}
}
//printf("-------------学生成绩表(排序后)--------------\n");
  
关注下面的标签,发现更多相似文章