学生成绩管理系统
2019级计算机类的学生有不超过50人(实际人数由键盘输入)参加期末考试,考试科目有高等数学、大学英语、大学物理、计算机程序设计I、中国近代史纲要5门课,请你们小组根据所学的知识编程实现由菜单驱动的学生成绩管理系统:
要求:程序运行后先显示下面的菜单,并提示用户输入选项
- 录入每个学生的学号、姓名和各科考试成绩 1
- 计算每门课程的总分和平均分
- 按每个学生的总分由低到高排出名次
- 计算每门课程的总分和平均分
- 按学号由小到大排出名次
- 按姓名查询学生成绩排名及其各科考试成绩
- 统计各分数段的学生人数及所占的百分比
- 打印每个学生的学号、姓名以及学生的各科成绩以及总成绩和平均分
9.退出
请输入你的选择:
根据用户输入的选项执行相应的操作。
如何修改并补充?求大佬解决……
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
/*学生信息结构体*/
typedef struct Node
{
char Name[10]; //学生姓名
char ID[15]; //学生学号
int Score[5]; //五科成绩(高等数学、大学英语、大学物理、计算机程序设计I、中国近代史纲要)
float Ave_Sco;
struct Node *next;
}Lnode;
void Display(); /*界面显示函数*/
void GetScore(Lnode *&h); /*成绩录入函数*/
void S(Lnode *h); //计算每门课程的总分和平均分
void T(Lnode *h); //统计各分数段的学生人数及所占的百分比
void PrintScore(Lnode *h); /*成绩打印函数*/
void FindInf(Lnode *h); /*查找信息*/
void Quit(Lnode *h); /*退出函数*/
void SaveInf(Lnode *h);
void LoadInf(Lnode *h);
/*初始化链表*/
void InitList(Lnode *&head)
{
head = (Lnode *)malloc(sizeof(Lnode));
if (head == NULL)
{
printf("error!");
exit(1);
}
head->next = NULL; //使头节点指针域为空
}
int main()
{
Lnode *ScoreList; //建立成绩链表,所有学生信息存放在此链表
int Function;
char flag;
int t = 0;
InitList(ScoreList);
LoadInf(ScoreList);
while (1)
{
Display();
printf("请选择操作: ");
scanf("%d", &Function);
switch (Function)
{
case 1: while (1)
{
GetScore(ScoreList);
printf("是否继续输入 (Y/N)");
scanf("%s", &flag);
if (flag == 'N' || flag == 'n')break;
} system("cls"); break;
case 6: FindInf(ScoreList); _getch(); system("cls"); break;
case 7: T(ScoreList); _getch(); system("cls"); break;
case 8: PrintScore(ScoreList); _getch(); system("cls"); break;
case 9: Quit(ScoreList); break;
default: printf("Error!!! 请重新输入:");
break;
} //switch结束
}
return 0;
}
/*系统界面显示*/
void Display()
{
printf("\t**********************************************\n");
printf("\t1、录入每个学生的学号、姓名和各科考试成绩\n");
printf("\t2、计算每门课程的总分和平均分\n");
printf("\t3、按每个学生的总分由低到高排出名次\n");
printf("\t4、计算每门课程的总分和平均分\n");
printf("\t5、按学号由小到大排出名次\n");
printf("\t6、按姓名查询学生成绩排名及其各科考试成绩\n");
printf("\t7、统计各分数段的学生人数及所占的百分比\n");
printf("\t8、打印每个学生的学号、姓名以及学生的各科成绩以及总成绩和平均分\n");
printf("\t9、退出系统\n");
printf("\n\n\n\n");
}
/*成绩录入*/
void GetScore(Lnode *&h)
{
Lnode *p, *q = h;
char name[10], id[15];
int Math, English, Phy, Cpro, History;
p = (Lnode *)malloc(sizeof(Lnode)); //为学生信息申请节点
printf("请依次输入学生信息:\n");
printf("姓名 学号 高等数学 大学英语 大学物理 计算机程序设计I 中国近代史纲要\n");
scanf("%s %s %d %d %d %d %d", &name, &id, &Math, &English, &Phy, &Cpro, &History);
for (; q->next != NULL; q = q->next){;} //移动到尾节点
strcpy(p->Name, name);
strcpy(p->ID, id);
p->Score[0] = Math;
p->Score[1] = English;
p->Score[2] = Phy;
p->Score[3] = Cpro;
p->Score[4] = History;
p->next = NULL;
q->next = p;
q = p;
}
void S(Lnode *h)
{
Lnode *p = h->next;
printf("高等数学的总分:");
}
//统计各分数段的学生人数及所占的百分比:修改下
void T(Lnode *h)
{
Lnode *p = h->next;
float score,sum,ave;
int n,i;
printf("请输入人数:",n);
scanf("%d",&n);
sum=0;
i=0;
do{
printf("\n请输入%d个人的百分制成绩:",n,score);
scanf("%f",&score);
}
while(score<0||score>100);
sum=sum+score;
i++;
n=i;
if(n!=0){
ave=sum/n;
printf("\n平均成绩为%.2f分。\n",ave);
printf("第%d个人的%.2f分转换为等级制是:",n,score);
switch((int)score/10){
case 10:
case 9:printf("A等!\n");break;
case 8:printf("B等!\n");break;
case 7:printf("C等!\n");break;
case 6:printf("D等!\n");break;
default:printf("E等!\n");break;
}
}
p = p->next;
}
/*成绩打印*/
void PrintScore(Lnode *h)
{
Lnode *p = h->next;
printf("%-14s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n","排名", "学号", "姓名", "高等数学", "大学英语", "大学物理", "计算机程序设计I", "中国近代史纲要");
while (p != NULL)
{
printf("%-14s%-8s%-8d%-8d%-8d%-8d%-8d\n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2], p->Score[3], p->Score[4]);
p = p->next;
}
}
/*信息查找*/
void FindInf(Lnode *h)
{
Lnode *p = h->next;
char name[10], id[15];
printf("请输入学生姓名:");
scanf("%s", name);
printf("请输入学生学号:");
scanf("%s", id);
while (p)
{
if (strcmp(p->Name, name) == 0 && strcmp(p->ID, id) == 0)
{
printf("当前学生信息:\n");
printf("%-14s%-8s%-8s%-8s%-8s%-8s%-8s\n", "学号", "姓名", "高等数学", "大学英语", "大学物理", "计算机程序设计I", "中国近代史纲要");
printf("%-14s%-8s%-8d%-8d%-8d%-8d%-8d\n", p->ID, p->Name, p->Score[0], p->Score[1], p->Score[2], p->Score[3], p->Score[4]);
break;
}
else
{
p = p->next;
}
}//while循环结束
}
/*退出系统*/
void Quit(Lnode *h)
{
SaveInf(h); //退出时保存信息
exit(0);
}
/*打开文件*/
void LoadInf(Lnode *h)
{
Lnode *p = h;
Lnode *q; //临时变量 用于保存从文件中读取的信息
FILE* file = fopen("./Information.dat", "rb");
if (!file)
{
printf("文件打开失败!");
return ;
}
// 使用feof判断文件是否为结束要注意的问题:
// 当读取文件结束时,feof函数不会立即设置标志符为-1,而是
// 需要再读取一次后,才会设置。所以要先读一次。
q = (Lnode *)malloc(sizeof(Lnode));
fread(q, sizeof(Lnode), 1, file);
while (!feof(file)) //一直读到文件末尾
{
p->next = q;
p = q;
q = (Lnode *)malloc(sizeof(Lnode));
fread(q, sizeof(Lnode), 1, file);
} //while循环结束
p->next = NULL;
fclose(file);
}
/*保存信息到文件中*/
void SaveInf(Lnode *h)
{
Lnode *p = h->next;
int flag;
FILE* file = fopen("./Information.dat", "wb");
if (!file)
{
printf("文件打开失败!");
return;
}
while (p != NULL)
{
flag = fwrite(p, sizeof(Lnode), 1, file); //将p的内容写到文件中
if (flag != 1)
{
break;
}
p = p->next;
}
fclose(file);
}