简单学生成绩管理系统
这是我写的第一个成绩管理系统,完成于大一刚学完C语言的假期,当时链表使用还不熟练,花了一个下午完成的,现在整理了出来,留做纪念。
整体上看来,当时基础还是很扎实的,格式也很规范,用的普通的不带头链表完成的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
typedef struct Students{
char digit[11];//十位学号
char name[20];//姓名
double gradesTime[3];//三项分别记录学生高数、马克思、C语言平时成绩
double gradesExam[3];//考试成绩
double gradesSum[3];//总成绩
struct Students* next;
} Student;
//这里只对函数做简单介绍
int Check(Student* p);//判断输入是否合法
Student* Add(Student* head);//将学生信息添加到链表
void Read(Student* head);//输出低于平均分人数
void Find(Student* head);//查找节点
void Revise(Student* head);//修改链表中的一个节点
Student* Delete(Student* head);//删除结点
Student* Sort(Student* head);//排序并输出
int main(int argc,char *argv[])
{
Student* head=NULL;//创建表头
//根据选择调用操作函数
while(1)
{
//界面准备
int choose;
printf("\t\t\t\t ***学生成绩信息管理系统***\n");
printf("\t\t\t\t\t1.添加学生信息\n");
printf("\t\t\t\t\t2.统计学生信息\n");
printf("\t\t\t\t\t3.查找学生成绩\n");
printf("\t\t\t\t\t4.修改学生成绩\n");
printf("\t\t\t\t\t5.删除学生信息\n");
printf("\t\t\t\t\t6.学生信息排序\n");
printf("\t\t\t\t\t7.退出系统\n");
printf("\t\t\t\t\t***************\n");
printf("\t\t\t\t\t请输入操作指令\n");
scanf("%d",&choose);
switch(choose)
{
case 1:head=Add(head);break;
case 2:Read(head);break;
case 3:Find(head);break;
case 4:Revise(head);break;
case 5:head=Delete(head);break;
case 6:head=Sort(head);break;
case 7:break;
default:printf("请输入正确的操作指令!\n");break;
}
if(choose==7)
{
printf("退出成功\n");
break;
}
else
{
system("pause");
system("cls");
}
}
return 0;
}
int Check(Student* p)
{
int result=1;//result作为返回值,1合法,0非法
for(int i=0;i<3;i++)
{
if(p->gradesTime[i]<0||p->gradesTime[i]>100||p->gradesExam[i]<0||p->gradesExam[i]>100)
{
result=0;
break;
}
}
return result;
}
Student* Add(Student* head)
{
Student* p;//创建临时指针
p=(Student*)malloc(sizeof(Student));
p->next=NULL;
printf("输入十位学号:");
scanf("%s",p->digit);
int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息
for(Student* i=head;i!=NULL;i=i->next)//判断是否已储存该学生信息
{
if(strcmp(i->digit,p->digit)==0)
{
printf("该学生信息已保存\n");
judge=0;
break;
}
}
if(judge==1)
{
printf("输入姓名:");
scanf("%s",p->name);
printf("依次输入高数、马克思、C语言平时成绩:");
scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
printf("依次输入上述考试成绩:");
scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
while(Check(p)==0)//判断成绩是否合法
{
printf("输入的成绩应该在0-100之间,请重新输入!\n");
printf("依次输入高数、马克思、C语言平时成绩:");
scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
printf("依次输入上述考试成绩:");
scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
}
//输入完成,计算总成绩
p->gradesSum[0]=0.3*p->gradesTime[0]+0.7*p->gradesExam[0];
p->gradesSum[1]=0.5*p->gradesTime[1]+0.5*p->gradesExam[1];
p->gradesSum[2]=0.4*p->gradesTime[2]+0.6*p->gradesExam[2];
//将成绩存进链表
Student *tail;
if(head==NULL)//判断表头是否为空
head=p;
else
{
for(tail=head;tail->next!=NULL;tail=tail->next);//找尾巴
tail->next=p;
}
}
return head;
}
void Read(Student* head)
{
if(head==NULL)
printf("暂没有学生信息\n");
else
{
double average[3];//记录三门平均分
int n=0;//记录学生人数
for(Student* i=head;i!=NULL;i=i->next)//遍历链表
{
average[0]+=i->gradesSum[0];
average[1]+=i->gradesSum[1];
average[2]+=i->gradesSum[2];
n++;
}
for(int i=0;i<3;i++)
average[i]/=n;
int count[3]={0};//记录三门低于平均分人数
for(Student* i=head;i!=NULL;i=i->next)//遍历链表
{
for(int j=0;j<3;j++)
{
if(i->gradesSum[j]<average[j])
count[j]++;
}
}
printf("高数低于平均分的学生数=%d\n",count[0]);
printf("马克思低于平均分的学生数=%d\n",count[1]);
printf("C语言低于平均分的学生数=%d\n",count[2]);
}
}
void Find(Student* head)
{
char tem[11];//临时储存要查找学生的学号
printf("输入要查找学生的十位学号:");
scanf("%s",tem);
int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息
for(Student* i=head;i!=NULL;i=i->next)//判断是否已储存该学生信息
{
if(strcmp(i->digit,tem)==0)
{
printf("姓名:%s\n",i->name);
printf("高数、马克思、C语言平时成绩分别为:%.2f %.2f %.2f\n",i->gradesTime[0],i->gradesTime[1],i->gradesTime[2]);
printf("考试成绩分别为:%.2f %.2f %.2f\n",i->gradesExam[0],i->gradesExam[1],i->gradesExam[2]);
printf("总成绩分别为:%.2f %.2f %.2f\n",i->gradesSum[0],i->gradesSum[1],i->gradesSum[2]);
judge=0;
break;
}
}
if(judge==1)
printf("没有该学生信息\n");
}
void Revise(Student* head)
{
char tem[11];//临时储存要查找学生的学号
printf("输入要修改的学生的十位学号:");
scanf("%s",tem);
getchar();
int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息
for(Student* i=head;i!=NULL;i=i->next)//判断是否已储存该学生信息
{
if(strcmp(i->digit,tem)==0)
{
printf("查找到该生姓名为%s,是否进行修改?(Y/N)",i->name);
char a;
scanf("%c",&a);
if(a=='Y')
{
Student* p;//创建临时指针
p=(Student*)malloc(sizeof(Student));
*p=*i;
printf("依次输入修改后的高数、马克思、C语言平时成绩:");
scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
printf("依次输入修改后的上述考试成绩:");
scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
while(Check(p)==0)//判断成绩是否合法
{
printf("输入的成绩应该在0-100之间,请重新输入!\n");
printf("依次输入修改后的高数、马克思、C语言平时成绩:");
scanf("%lf %lf %lf",&p->gradesTime[0],&p->gradesTime[1],&p->gradesTime[2]);
printf("依次输入修改后的上述考试成绩:");
scanf("%lf %lf %lf",&p->gradesExam[0],&p->gradesExam[1],&p->gradesExam[2]);
}
//输入完成,计算总成绩
p->gradesSum[0]=0.3*p->gradesTime[0]+0.7*p->gradesExam[0];
p->gradesSum[1]=0.5*p->gradesTime[1]+0.5*p->gradesExam[1];
p->gradesSum[2]=0.4*p->gradesTime[2]+0.6*p->gradesExam[2];
*i=*p;
printf("修改成功\n");
}
else
printf("请重新输入操作指令\n");
judge=0;
break;
}
}
if(judge==1)
printf("没有该学生信息\n");
}
Student* Delete(Student* head)
{
char tem[11];//临时储存要删除学生的学号
printf("输入要删除的学生的十位学号:");
scanf("%s",tem);
getchar();
int judge=1;//值为1表示没有重复,为0表示已经储存过该生信息
Student *p1,*p2;
for(p1=p2=head;p1!=NULL;p2=p1,p1=p1->next)//判断是否已储存该学生信息
{
if(strcmp(p1->digit,tem)==0)
{
printf("查找到该生姓名为%s,是否进行删除?(Y/N)",p1->name);
char a;
scanf("%c",&a);
if(a=='Y')
{
if(p1==head)//删除表头情况
head=head->next;
else
{
p2->next=p1->next;
free(p1);
}
}
else
printf("请重新输入操作指令\n");
judge=0;
break;
}
}
if(judge==1)
printf("没有该学生信息\n");
return head;
}
Student* Sort(Student* head)
{
if(head==NULL)
printf("暂没有学生信息\n");
else
{
int choose;
printf("按照哪一门成绩进行降序排序?(1.高数 2.马克思 3.C语言)\n");
scanf("%d",&choose);
int n=0;//n用于统计学生人数好确定冒泡次数
for(Student* i=head;i!=NULL;i=i->next,n++);
for(int i=0;i<n-1;i++)//进行冒泡排序
{
Student *p1,*p2;
for(p1=p2=head;p1!=NULL&&p1->next!=NULL;p2=p1,p1=p1->next)
{
if(p1->gradesSum[choose-1]<p1->next->gradesSum[choose-1])//满足条件,进行链表顺序前后交换
{
Student* tem;
tem=p1->next->next;
if(p1==head)//更换表头的情况
{
head=p1->next;
head->next=p1;
p1->next=tem;
p1=head;//这句话很关键!
}
else
{
p2->next=p1->next;
p1->next->next=p1;
p1->next=tem;
p1=p2->next;//这句话很关键!
}
}
}
}
int m=1;
for(Student* i=head;i!=NULL;i=i->next,m++)
{
printf("——以下为成绩第%d的同学的信息——\n",m);
printf("学号:%s\n",i->digit);
printf("姓名:%s\n",i->name);
printf("高数、马克思、C语言平时成绩分别为:%.2f %.2f %.2f\n",i->gradesTime[0],i->gradesTime[1],i->gradesTime[2]);
printf("考试成绩分别为:%.2f %.2f %.2f\n",i->gradesExam[0],i->gradesExam[1],i->gradesExam[2]);
printf("总成绩分别为:%.2f %.2f %.2f\n",i->gradesSum[0],i->gradesSum[1],i->gradesSum[2]);
}
}
return head;
}
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 郭同学的笔记本
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果