综合实验二:学生成绩管理系统
1、要求
(一)程序运行时,首先显示主菜单如下:
- 新建数据
- 添加数据
- 删除数据
- 排序
- 查询
- 退出
屏幕提示:请输入序号选择相应操作。
要求当用户输入任一序号后,程序都能进行相应操作。
(二)在主菜单中选择序号4,弹出子菜单选择排序方式,子菜单如下:
- 数学成绩排序
- 程序设计成绩排序
- 总分排序。
- 返回主菜单
请按序号选择相应操作。
选择子菜单的序号后,程序能正确运行并在屏幕上显示按要求排序后的相关信息。
(三)在主菜单中选择序号5,弹出子菜单选择查询方式,子菜单如下:
- 学号查询
- 姓名查询
- 数学成绩查询
- 程序设计成绩查询
- 总分查询
- 返回主菜单
请按序号选择相应操作。
在子菜单中选择序号后,程序按以下方式工作:
1)学号查询:输入学号后,若该学号存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:查询到满足条件的结果后,查询即可结束)
2)姓名查询:输入姓名后,若该姓名存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:使用字符串比较函数进行比较)
3)按科目查询:输入指定分数,程序运行后显示该科目中考试成绩大于等于指定分数的同学的学号、姓名以及该科成绩并统计满足条件的人数;
4)总分查询:输入指定分数,程序运行后显示总分成绩大于等于指定分数的同学的学号、姓名以及各科成绩并统计满足条件的人数。
2、代码
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
long int ID;// 学号
char Name[50];// 姓名
int Math;// 数学成绩
int C;// 程序设计成绩
int Score;// 总分
struct Node* next;// 指针域
}node;
node list;// 链表
// 读取文件
int Read_FILE(node* L);
// 保存文件
int Save_FILE(node* L);
// 主菜单界面
void welcome();
// 新建学生信息
void Build(node* L);
// 增加学生信息
void Add(node* L, node e);// 功能
void Add_Printf();// 界面
// 删除学生信息
void Delete_Printf(node* L);// 界面
void Delete(node* s);// 功能
// 排序学生信息
void Sort(node* L);
void Print(node* L);// 输出学生信息
void Print_Printf();// 界面
bool cmp_big_Math(node e1, node e2);// 数学成绩从大到小
bool cmp_small_Math(node e1, node e2);// 数学成绩从小到大
bool cmp_big_C(node e1, node e2);// 程序设计成绩从大到小
bool cmp_small_C(node e1, node e2);// 程序设计成绩从小到大
bool cmp_big_Score(node e1, node e2);// 成绩从大到小
bool cmp_small_Score(node e1, node e2);// 成绩从小到大
// 查询学生信息
void Search_Printf(node* L);// 界面
node* Search_id(int id, node* L);// 按学号进行查找
node* Search_name(char name[], node* L);// 按姓名进行查找
void Search_math(int math, node* L);// 按数学成绩进行查找
void Search_c(int c, node* L);// 按程序设计成绩进行查找
void Search_score(int score, node* L);// 按总分进行查找
// 退出管理系统
void goodbye();
int main()
{
int choice = 0;
Read_FILE(&list);
while (true)
{
welcome();
scanf("%d", &choice);
switch (choice)
{
case 1:// 新建学生信息
Build(&list);
break;
case 2:// 增加学生信息
Add_Printf();
break;
case 3:// 删除学生信息
Delete_Printf(&list);
break;
case 4:// 排序学生信息
Sort(&list);
break;
case 5:// 查询学生信息
Search_Printf(&list);
break;
case 6:// 退出管理系统
goodbye();
break;
}
printf("是否需要继续操作?(Yes:1 / No:0):");
scanf("%d", &choice);
if (choice == 0)
{
break;
}
}
return 0;
}
void welcome()
{
system("cls");
printf("****************************************************************\n");
printf("*********** 学生成绩管理系统 ***********\n");
printf("*********** 1 ---- 新建学生信息 ***********\n");
printf("*********** 2 ---- 增加学生信息 ***********\n");
printf("*********** 3 ---- 删除学生信息 ***********\n");
printf("*********** 4 ---- 排序学生信息 ***********\n");
printf("*********** 5 ---- 查询学生信息 ***********\n");
printf("*********** 6 ---- 退出管理系统 ***********\n");
printf("****************************************************************\n");
printf("请选择想要实现的功能(数字):");
}
// 读取文件
int Read_FILE(node* L)
{
FILE* pfRead = fopen("student_information.txt", "r");
node st;
node* s;
node* t = L;
if (pfRead == NULL)
{
return 0;
}
while (fscanf(pfRead, "%ld %s %d %d %d", &st.ID, st.Name, &st.Math, &st.C, &st.Score) != EOF)
{
s = (node*)malloc(sizeof(node));
*s = st;
// 尾插法
t->next = s;
t = s;
t->next = NULL;
}
return 1;
}
// 保存文件
int Save_FILE(node* L)
{
FILE* pfWrite = fopen("student_information.txt", "w");
if (pfWrite == NULL)
{
return 0;
}
node* p = L->next;
while (p != NULL)
{
fprintf(pfWrite, " %ld %s %d %d %d\n", p->ID, p->Name, p->Math, p->C, p->Score);
p = p->next;
}
return 1;
}
// 新建学生信息
void Build(node* L)
{
node* p, * q;
p = L->next;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
L->next = NULL;
printf("新建成功!\n");
}
// 增加学生信息
void Add_Printf()
{
system("cls");
node st;
printf("请输入新增学生的相关信息:\n");
printf("学号:");
scanf("%ld", &st.ID);
printf("姓名:");
scanf("%s", st.Name);
printf("数学成绩:");
scanf("%d", &st.Math);
printf("程序设计成绩:");
scanf("%d", &st.C);
st.Score = st.Math + st.C;
Add(&list, st);
}
void Add(node* L, node e)
{
// 头插法
node* p = L;
node* s = (node*)malloc(sizeof(node));
*s = e;
s->next = p->next;
p->next = s;
Save_FILE(L);
}
// 删除学生信息
void Delete_Printf(node* L)
{
system("cls");
long int id;
node* p;
printf("请输入要删除的学生的学号:");
scanf("%ld", &id);
node* st = Search_id(id, L);
p = st;
if (st == NULL)
{
printf("查无此人!\n");
return;
}
st = st->next;
printf("________________________________________________________\n");
printf("|学号\t|姓名\t|数学成绩\t|程序设计成绩\t|总分\t|\n");
printf("________________________________________________________\n");
printf("%ld|%s\t|%d\t\t|%d\t\t|%d\t|\n", st->ID, st->Name, st->Math, st->C, st->Score);
printf("________________________________________________________\n");
Delete(p);
// 保存信息
Save_FILE(L);
}
void Delete(node* s)
{
node* t = s->next;
s->next = t->next;
t->next = NULL;
free(t);
}
// 排序学生信息
void Sort(node* L)
{
while (1)
{
system("cls");
int choice1 = 0, choice2 = 0;
printf("按照数学成绩排序 ---- 1\n");
printf("按照程序设计成绩排序 ---- 2\n");
printf("按照总分排序 ---- 3\n");
printf("返回主菜单 ---- 4\n");
printf("请选择排序方式:");
scanf("%d", &choice1);
system("cls");
if (choice1 == 1 || choice1 == 2 || choice1 == 3)
{
printf("从大到小排序 ---- 1\n");
printf("从小到大排序 ---- 2\n");
printf("请选择排序方式:");
scanf("%d", &choice2);
}
int flag = 0;
for (node* p = L->next; p != NULL; p = p->next)
{
for (node* q = p; q != NULL; q = q->next)
{
switch (choice1)
{
case 1:
if (choice2 == 1)
{
if (!cmp_big_Math(*p, *q))
{
flag = 1;
}
}
else if (choice2 == 2)
{
if (!cmp_small_Math(*p, *q))
{
flag = 1;
}
}
break;
case 2:
if (choice2 == 1)
{
if (!cmp_big_C(*p, *q))
{
flag = 1;
}
}
else if (choice2 == 2)
{
if (!cmp_small_C(*p, *q