设计并实现简单学生成绩管理系统:含多操作及实训详情
设计并实现一个简单的学生成绩管理系统

学生成绩表信息包含学号,包含姓名,包含各科课程成绩,各科课程成绩有语文、数学、英语、政治,还包含总分。用带头结点的单链表管理学生成绩表,每个学生的信息依次从键盘输入,可根据需要进行插入操作,可根据需要进行删除操作,可根据需要进行排序操作,可根据需要进行输出操作。
一、实训环境
在信息工程学院双创交流中心的******电脑室开展实训,企业老师带领我们复习C语言的基本知识,之后讲解学生成绩管理系统各个组件功能的构成部分,还讲解每部分的代码详解。
二、项目开发过程
1. 学生成绩管理系统主页面功能全览
#include
#include
#include
#include
using namespace std;
定义一种结构体类型,结构体类型名为PNode,用LinkList作为指向该结构体类型指针的别名;
typedef struct PNode{
int stdio;
char name[30];
double chinese;
double math;
double english;
double politics;
double sum;
PNode *next;
}PNode;
int main(){
创建一个名为llist的链表,将其初始化为指向通过动态内存分配得到的节点,该节点的大小由PNode类型决定。
llist->next=NULL;
int a,b=1;
while(b){
打印换行符,打印字符串“-----------------------学生成绩管理系统-----------------------”,再打印换行符
printf("请选择你需要的功能:\n");
打印出“ 1.查找 2.插入 3.排序 4.展示 5.删除 6.退出”
scanf("%d",&a);
switch(a){
情况1:打印换行,输出“-----------------------学生成绩查找功能-----------------------”,调用check函数并传入llist,然后跳出循环。
情况2:打印换行,打印“-----------------------学生成绩插入功能-----------------------”,调用input函数并传入llist,然后跳出循环。
第三种情况,输出换行后的“-----------------------学生成绩排序功能-----------------------”,调用sortList函数并传入llist,然后跳出循环。
情况4:输出换行,输出“-----------------------学生成绩展示功能-----------------------”,调用display函数并传入llist,然后跳出循环;
情况5:输出换行,输出“-----------------------学生成绩删除功能-----------------------”,调用删除列表函数(llist),然后跳出循环;
case 6:b = 0; break;
默认情况下,打印输出“输入有误!请重新输入!” ,并换行
}
}
输出换行,输出“-----------------------已退出成绩管理系统-----------------------”,再输出换行
return 0;
}
输入学生信息,按照输入顺序建立一个带头结点的单链表,一直持续到输入学号为0才结束。
void input(LinkList llist){
printf("请输入考试的学生人数:\n");
int n;scanf("%d",&n);
LinkList p;
for(int i=1;i<=n;i++){
p=(LinkList)malloc(sizeof(PNode));
printf("请输入学生学号:\n");
scanf("%d",&p->stdio);
printf("请输入学生姓名:\n");
scanf("%s",p->name);
printf("请输入学生语文成绩:\n");
scanf("%lf",&p->chinese);
printf("请输入学生数学成绩:\n");
scanf("%lf",&p->math);
printf("请输入学生英语成绩:\n");
scanf("%lf",&p->english);
printf("请输入学生政治成绩:\n");
scanf("%lf",&p->politics);
p指向的结构体中的sum成员,等于p指向的结构体中的chinese成员加上p指向的结构体中的math成员,再加上p指向的结构体中的english成员,再加上p指向的结构体中的politics成员;
p->next=llist->next;
llist->next=p;
}
输出换行符,输出“-----------------------学生成绩完成录入-----------------------”,输出换行符
}
输入一个学生的姓名,在链表中开展查找操作,若存在该学生,便显示其所有信息,若不存在,就显示提示信息“查无此人”。
void check(LinkList llist){
LinkList e=llist->next;
int f;
printf("请输入查找的学号:\n");
scanf("%d",&f);
while(e->stdio!=f)
e=e->next;
if(e->stdio==f)
输出整数,制表符,字符串,六个双精度浮点数,换行符,其中整数为e指向结构体的stdio成员的值,字符串为e指向结构体的name成员的值,六个双精度浮点数分别为e指向结构体的chinese、math、english、politics、sum成员的值 。
else
printf("查找值不存在!\n");
}
4.展示链表中所输入的全部学生信息。
void display(LinkList llist){
打印换行符,输出“-----------------------学生成绩信息展示-----------------------”,再输出换行符
输出“学号”“姓名”“语文”“数学”“英语”“政治”“总分”,中间用制表符分隔\n
LinkList p=llist->next;
if(llist->next==NULL){
printf("系统中无学生信息!\n");
}
else{
while(p!=NULL){
输出格式化内容,其中包含变量p指向结构体中的stdio成员的值,p指向结构体中的name成员的值,p指向结构体中的chinese成员的值,p指向结构体中的math成员的值,p指向结构体中的english成员的值,p指向结构体中的politics成员的值,p指向结构体中的sum成员的值,输出格式为按制表符分隔,name成员的值后接lf,其余数值成员的值占6个字符宽度,最后换行。
p=p->next;}
}
打印换行符,打印字符串“-----------------------学生成绩完成展示-----------------------”,再打印换行符。
}
5. 将学生成绩按总成绩从低到高排序,并输出结果。
定义一个名为sortList的函数,该函数带有一个LinkList类型的参数llist 。
printf("请输入排序的依据:\n");
打印出“1.数学”,打印出“2.语文”,打印出“3.英语”,打印出“4.政治”,打印出“5.总分”。
int a;
scanf("%d",&a);
switch(a){
case 1:
printf("按照数学排序已完成\n");
if(llist->next==NULL){
printf("学生成绩无数据!");
否则,如果链表中当前节点的下一个节点的下一个节点为空
printf("学生成绩为一个,无需排序!");
}else{
LinkList p=llist->next->next;
llist->next->next=NULL;
LinkList q,r;
while(p!=NULL){
q=llist;
r=p->next;
当q的下一个节点不为空时,且q的下一个节点的数学相关内容(这里原句不完整,推测是math相关属性等)math){
q=q->next;
}
p->next=q->next;
q->next=p;
p=r;
}
}
break;
case 2:
printf("按照语文排序已完成\n");
if(llist->next==NULL){
printf("学生成绩无数据!");
} else if(llist->next->next==NULL){
printf("学生成绩为一个,无需排序!");
}else{
LinkList p=llist->next->next;
llist->next->next=NULL;
LinkList q,r;
while(p!=NULL){
q=llist;
r=p->next;
当q的下一个节点不为空时,且q的下一个节点的中文……(你提供的内容不完整,请补充完整以便准确改写)chinese){
q=q->next;
}
p->next=q->next;
q->next=p;
p=r;
}
}
break;
case 3:
printf("按照英语排序已完成\n");
if(llist->next==NULL){
printf("学生成绩无数据!");
} else if(llist->next->next==NULL){
printf("学生成绩为一个,无需排序!");
}else{
LinkList p=llist->next->next;
llist->next->next=NULL;
LinkList q,r;
while(p!=NULL){
q=llist;
r=p->next;
当q的下一个节点不为空时,并且q的下一个节点的英文……(你提供的内容不完整,请补充完整以便准确改写)english){
q=q->next;
}
p->next=q->next;
q->next=p;
p=r;
}
}
break;
case 4:
printf("按照政治排序已完成\n");
if(llist->next==NULL){
printf("学生成绩无数据!");
} else if(llist->next->next==NULL){
printf("学生成绩为一个,无需排序!");
}else{
LinkList p=llist->next->next;
llist->next->next=NULL;
LinkList q,r;
while(p!=NULL){
q=llist;
r=p->next;
当q的下一个节点不为空时,且q的下一个节点的政治相关内容(这里politics表述不完整,无法准确完整改写该部分)politics){
q=q->next;
}
p->next=q->next;
q->next=p;
p=r;
}
}
break;
case 5:
printf("按照总分排序已完成\n");
if(llist->next==NULL){
printf("学生成绩无数据!");
} else if(llist->next->next==NULL){
printf("学生成绩为一个,无需排序!");
}else{
LinkList p=llist->next->next;
llist->next->next=NULL;
LinkList q,r;
while(p!=NULL){
q=llist;
r=p->next;
当q的下一个节点不为空时,并且q的下一个节点的和sum){
q=q->next;
}
p->next=q->next;
q->next=p;
p=r;
}
}
break;
default:
printf("输入有误!\n");
}
}
输入一个学生的学号,查看链表中是否存在该学生信息,若存在,则将其删除。
定义一个名为deleteList的函数,该函数带有一个LinkList类型的参数llist ,
LinkList p=llist;
int d;
printf("请输入删除的学号:\n");
scanf("%d",&d);
while(p!=NULL){
如果p指向的下一个节点的stdio成员不等于d,那么将p更新为p指向的下一个节点,然后跳出循环;
如果p指向的下一个节点的stdio成员等于d,那么将p指向的下一个节点改为它的下下个节点;
else
printf("删除值不存在!\n");
打印换行符,打印字符串“-----------------------学生成绩完成删除-----------------------”,再打印换行符。
}