经过多方帮助,目前已经基本实现了输入、输出、修改信息的功能。但还存在三个问题:
1.输入中文姓名和性别之后再输出,仍然出现乱码;
输出结果如下图所示:
2.当通过程序输入了一组学生信息并退出程序,再点击“运行”时,无法正常运行程序;
运行结果如下图:
3.在使用modify()函数修改学生信息时,如果试图修改GPA,则输入新的GPA并键入回车后,程序直接跳过判断环节。重新显示学生信息,GPA变成了0。
以上三个问题该如何解决?
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
int n = 0;
struct Student
{ // 设置结构体变量,储存学生信息
int id; // 学号
char name[10]; // 姓名
char gender[10]; // 性别
int age; // 年龄
int MathAna; // 数学分析成绩
int LiAlg; // 高等代数成绩
int Computer; // 程序设计成绩
int English; // 大学英语成绩
float GPA; // 平均学分绩GPA
};
struct Student st[100];
int read();
int save();
void menu(); // 菜单
void input(); // 输入学生信息
void output(); // 输出学生信息
void modify();
int main()
{
SetConsoleOutputCP(65001);
int i;
read();
while (1)
{
menu(); // 调用菜单函数,显示菜单界面
scanf("%d", &i); // 输入数字,进入不同功能
switch (i)
{
case 0:
return 0;
case 1:
input();
break;
case 2:
modify();
break;
case 8:
output();
break;
default:
break;
}
}
}
int read()
{
FILE *fp; // 定义一个文件指针fp
fp = fopen("students.txt", "a+"); // 以"a+" 方式打开students文本文件,可读写,文件不存在则创建文件。
if (fp == NULL)
{
printf("读取文件错误!\n");
return 0;
}
fread(&n, sizeof(int), 1, fp); // 读取总数
for (int i = 0; i < n; i++) // 读取n个数组元素
fread(&st[i], sizeof(struct Student), 1, fp);
fclose(fp); // 关闭文件
}
int save()
{
FILE *fp; // 定义一个文件指针fp
fp = fopen("students.txt", "w"); // 以"读取的" 方式打开students文本文件
if (fp == NULL)
{
printf("写入文件错误!\n");
return 0;
}
fwrite(&n, sizeof(int), 1, fp); // 先写入总数
fwrite(st, sizeof(struct Student), n, fp); // 写入n个数组元素
fclose(fp); // 关闭文件
}
void menu() // 该函数用于实现菜单界面
{
printf("\n\n\n\n");
printf("\t\t|***************学生信息管理系统***************|\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|\t\t 1.输入学生信息\t |\n");
printf("\t\t|\t\t 2.修改学生信息\t |\n");
printf("\t\t|\t\t 3.查询学生信息\t |\n");
printf("\t\t|\t\t 4.按GPA排序\t |\n");
printf("\t\t|\t\t 5.按性别统计\t |\n");
printf("\t\t|\t\t 6.按年龄统计\t |\n");
printf("\t\t|\t\t 7.显示挂科学生信息\t |\n");
printf("\t\t|\t\t 8.显示所有学生信息\t |\n");
printf("\t\t|\t\t 9.删除学生信息\t |\n");
printf("\t\t|\t\t 0.退出系统\t\t |\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|**********************************************|\n\n");
printf("请您选择操作(0-9):");
}
void input() // 该程序用于实现输入学生信息
{
int i = 0; // 学生人数初始化//
char c;
do
{
printf("请输入学生的个人信息:\n");
printf("\n请输入第%d位学生的信息:\n", n + 1);
printf("请输入学生的学号:");
scanf("%d", &st[n].id);
printf("请输入学生的姓名:");
getchar();
scanf("%s", st[n].name);
printf("请输入学生的性别:");
getchar();
scanf("%s", st[n].gender);
printf("请输入学生的年龄:");
scanf("%d", &st[n].age);
printf("请输入学生的数学分析成绩:");
scanf("%d", &st[n].MathAna);
printf("请输入学生的高等代数成绩:");
scanf("%d", &st[n].LiAlg);
printf("请输入学生的程序设计成绩:");
scanf("%d", &st[n].Computer);
printf("请输入学生的大学英语成绩:");
scanf("%d", &st[n].English);
printf("请输入学生的GPA:");
scanf("%f", &st[n].GPA);
n++;
printf("\n\n\t\t\t\t是否继续输入(Y/N):");
getchar(); // 提示是否继续,从键盘获得一个字符
scanf("%c", &c);
} while (c == 'y' || c == 'Y');
save();
}
void output() // 该程序用于实现输出学生信息
{
int i;
char c;
do
{
printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
for (i = 0; i < n; i++)
{
printf(" %d ", st[i].id);
printf(" %-s ", st[i].name);
printf(" %-s ", st[i].gender);
printf(" %d ", st[i].age);
printf("\t%d ", st[i].MathAna);
printf("\t\t%d ", st[i].LiAlg);
printf("\t\t%d ", st[i].Computer);
printf("\t\t%d ", st[i].English);
printf("\t\t%.2f \n", st[i].GPA);
}
printf("\n\n\t\t\t\t是否继续其它操作(Y/N):"); // 提示是否继续
scanf("%c", &c);
c = getchar();
} while (c == 'y' || c == 'Y');
}
void modify() //该函数用于修改学生信息
{
int i,tp,id1;
char c;
FILE * fp; //定义一个文件指针fp//
lb:
printf("\n按学号修改\n\n");
printf("请输入要修改的学生学号\n");
scanf("%d", &id1);
for (i = 0; i < n; i++)
{
if (id1 == st[i].id)
{
printf("要修改的学生信息为:\n");
printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
printf(" %d ", st[i].id);
printf(" %-s ", st[i].name);
printf(" %-s ", st[i].gender);
printf(" %d ", st[i].age);
printf("\t%d ", st[i].MathAna);
printf("\t\t%d ", st[i].LiAlg);
printf("\t\t%d ", st[i].Computer);
printf("\t\t%d ", st[i].English);
printf("\t\t%.2f \n", st[i].GPA);
do {
printf("请选择要修改项:\n");
printf("1学号\n2姓名\n3性别\n4年龄\n5数学分析成绩\n6高等代数成绩\n7程序设计成绩\n8大学英语成绩\n9GPA\n");
scanf("%d", &tp);
switch (tp)
{
case 1:
{
printf("请输入学号:\n");
scanf("%d", &st[i].id);
goto la;
}
case 2:
{
printf("请输入姓名:\n");
scanf("%s", st[i].name);
goto la;
}
case 3:
{
printf("请输入性别:\n");
scanf("%s", &st[i].gender);
goto la;
}
case 4:
{
printf("请输入年龄:\n");
scanf("%d", &st[i].age);
goto la;
}
case 5:
{
printf("请输入数学分析成绩:\n");
scanf("%d", &st[i].MathAna);
goto la;
}
case 6:
{
printf("请输入高等代数成绩:\n");
scanf("%d", &st[i].LiAlg);
goto la;
}
case 7:
{
printf("请输入程序设计成绩:\n");
scanf("%d", &st[i].Computer);
goto la;
}
case 8:
{
printf("请输入大学英语成绩:\n");
scanf("%d",&st[i].English);
goto la;
}
case 9:
{
printf("请输入GPA:\n");
scanf("%d",&st[i].GPA);
goto la;
}
}
}
while ( tp < 10 );
la:
printf("是否继续修改(y/n)\n"); //提示是否继续
getchar();
scanf("%c", &c);
if (c == 'y' || c == 'Y')
goto lb;
}
}
fp = fopen("students.txt", "w+"); //以"读写" 方式打开students文本文件
for (i = 0; i < n; i++)
fwrite( & st[i], sizeof(struct Student), 1, fp); //以 方式将其写入student文本文件
fclose(fp); //关闭文件
}