项目|c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)

复制时运行出错请看这里:c语言学生成绩管理系统
完整代码点击这里:github免费完整代码
github不能访问请点击这里 gitee链接
c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)详细内容 一、功能描述
实现学生基本信息的管理,包括学生资料的录入、查询、修改、删除、浏览等操作,实现学生成绩信息的管理,包括学生成绩的录入、查询、修改、删除、浏览等操作。学生的基本信息包括:学号、姓名、班级、所选科目等,程序应提供班级与科目信息的录入功能。分析每个班单科成绩。(排序,最高分,最低分,及格率(60以上),优秀率(90以上))。保存信息到c盘目录下,以txt文件保存
项目|c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)
文章图片

项目|c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)
文章图片

项目|c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)
文章图片

1、总体设计
1)分析程序的功能
用户录入信息,实现增删查改和分析(排序)。信息保存到c盘
2)系统总体结构:
分为9个结构。用户实现学生成绩的增删查改,并在用户输入指令后,实现成绩
的分析。
模块 函数名称
录入学生的资料和成绩 input

//01录入学生的资料和成绩. struct node*input(node *head){ int i=0,j=1; struct node *p,*n; p=(struct node*)malloc(sizeof(struct node)); p=head; while(1){ if(j>0){ i++; n=(struct node*)malloc(sizeof(struct node)); printf("请输入第%d个学生的学号,姓名\n",i); scanf("%d %s",&n->date,&n->name); getchar(); printf("请输入科目(文或理)和班级(1或者2)\n"); scanf("%s %d",&n->kemu,&n->me_class); fflush(stdin); printf("请输当前学生的语文,数学,英语成绩\n"); scanf("%lf %lf %lf",&n->yuwen,&n->shuxue,&n->yingyu); getchar(); n->num=n->yuwen+n->shuxue+n->yingyu; n->avg=(p->num)/3; p->next=n; p=n; printf("是否继续输入下一个同学的信息?输入 1 继续,输入0就停止输入\n"); fflush(stdin); scanf("%d",&j); fflush(stdin); } else { p->next=last=NULL; p=last; break; } } free(p); //释放p return head; }

增加学生信息及成绩 add
struct node*add(struct node*head){ if(head->next==NULL){ printf("还没有存储数据,请先存储数据"); return head; } else{ struct node*head1,*p; head1=(struct node*)malloc(sizeof(struct node)); printf("正在添加学生信息及成绩\n"); head1=input(head1); //插入的节点用链表的方式存储. p=head->next; while(p->next!=NULL){ p=p->next; } p->next=head1->next; //因为头结点是空的所以应该链接头结点的下一个节点。 return head; } }

【项目|c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)】查询学生信息及成绩 find
struct node*find(struct node*head){ int i; struct node*p; if(head==NULL){ printf("还没有存储数据,请先存储数据\n"); } else{ printf("请输入你要找查的学号:"); scanf("%d",&i); p=head->next; while(p->date!=i&&p->next!=NULL){ p=p->next; } if(p->date==i){ printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); printf("\n"); return p; } else{ printf("没有找到你要查找的同学\n"); return NULL; } } }

删除学生信息及成绩 del
void del(struct node*head){ int key,j=0; struct node*p,*s; s=head->next; p=head; printf("请输入你要删除学生的学号"); fflush(stdin); //删除缓存的数据。 scanf("%d",&key); while(s!=NULL){ if(s->date!=key){ p=s; s=s->next; } else break; } if(s!=NULL){ p->next=s->next; free(s); printf("删除成功\n"); } else printf("删除失败\n"); }

修改学生信息和成绩 change
struct node*change(struct node*head){ struct node*p=NULL; p=find(head); if(p==NULL){ printf("修改失败\n"); return head; } else{ printf("请输入修改的学生信息\n"); printf("姓名 班级 科目\n"); scanf("%s %d %s",&p->name,&p->me_class ,&p->kemu); fflush(stdin); printf("请输入修改的学生成绩\n"); printf("语文 数学 英语\n"); scanf("%lf %lf %lf",&p->yuwen,&p->shuxue,&p->yingyu); fflush(stdin); //getchar() printf("\n学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); return head; } }

浏览学生信息及成绩 output
struct node* output(struct node*head) { if(head==NULL) printf("还没有数据请先输入数据\n"); else { struct node *p; p=head->next; printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); while(p!=NULL) {printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); p=p->next; printf("\n"); } printf("\n"); } return head; }

文件夹操作 file
void file(struct node*head) { int i=0; FILE *fp; struct node*p=head->next; fp=fopen("C:\\学生成绩单.txt","wt"); fprintf(fp,"学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); while(p!=NULL) { fprintf(fp,"%d\t%s\t%d\t%s\t%lf\t\t%lf\t\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); p = p->next; i++; } if(i>0) printf("\t\t\t\t\t—————成功保存c盘—————\n"); else printf("\t\t\t\t\t—————没有数据保存失败到桌面—————\n"); fclose(fp); }

输出成绩统计 Outtj
void Outtj(struct node1 stu[50],int si,int n) { doubleavg1=0,avg2=0,avg3=0; doublek1=0,k2=0,k3=0; //及格率 doublej1=0,j2=0,j3=0; //优秀率 doublemax1; doublemin1; int j; max1=stu[0].yuwen; min1=stu[0].yuwen; for(j=0; j; j++) { avg1+=stu[j].yuwen; if(stu[j].yuwen>=60) k1++; if(stu[j].yuwen>=90) j1++; if(stu[j].yuwen>max1) max1=stu[j].yuwen; if(stu[j].yuwen=60)k2++; if(stu[j].shuxue>=90)j2++; if(stu[j].shuxue>max1) max1=stu[j].shuxue; if(stu[j].shuxue=60) k3++; if(stu[j].yingyu>=90)j3++; if(stu[j].yingyu>max1) max1=stu[j].yingyu; if(stu[j].yingyu

输出成绩排序 OutPx
void OutPx(struct node*head,struct node1 stu[],int si,int n){//stu[50]数组,int si长度,int n班级。 int j,k=0; int i,h; //控制学科。 struct xueke { char aa[15]; }km[4]={{"语文"},{"数学"},{"英语"},{"总成绩"}}; lbzsz(head); printf("\t\t%d班的成绩排序\n",n); for(i=0,h=1; i<4; i++,h++){//for1 for(j=0; j; j++){//for2 for(k=0; k-1-j; k++){//for3 if(h==1){ if(stu[k].yuwen[k+1].yuwen){ t=stu[k+1]; stu[k+1] =stu[k] ; stu[k]=t; } } if(h==2){ if(stu[k].shuxue[k+1].shuxue){ t =stu[k+1]; stu[k+1] =stu[k] ; stu[k] =t ; } } if(h==3){ if(stu[k].yingyu[k+1].yingyu){ t=stu[k+1]; stu[k+1] =stu[k] ; stu[k] =t ; } } if(h==4){ if(stu[k].num[k+1].num){ t =stu[k+1]; stu[k+1] =stu[k] ; stu[k] =t ; } } }//for3结束 }//for2结束 printf("%s排名\n学号\t姓名\t班级\t%s成绩\t排名\n",km[i].aa,km[i].aa); if(h==1){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yuwen,k); } if(h==2){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].shuxue ,k); } if(h==3){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yingyu ,k); } if(h==4){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].num,k); } } }

三、总程序清单
#include #include #include"stdd.h" #include #include"cjfx.h" int main() { int i,j=1; struct node*head; last=NULL; head=(struct node*)malloc(sizeof(struct node)); head->next =NULL; printf("\t\t---欢迎使用学生成绩管理系统---\n"); while(j){ i= menu(); switch(i){ case 0: j=0; printf("退出成功"); break; case 1: head=input(head); system("pause"); break; //创建节点函数 case 2: head=add(head); system("pause"); break; //增加学生信息及成绩 case 3: find(head); system("pause"); break; //查询学生信息及成绩 case 4: del(head); system("pause"); break; //删除学生信息及成绩; case 5: head=change(head); system("pause"); break; //05修改学生信息和成绩 case 6: output(head); system("pause"); break; //浏览学生信息及成绩 case 7: file(head); system("pause"); break; //(自己创新)保存到桌面 case 8: main1(head); system("pause"); break; //(创新)学生成绩分析 default:break; } printf("\n"); printf("\t\t——————————————\n"); }//while结束 system("pause"); }

#include #include #include struct node1 { int date; //学号 int me_class; //班级 double yuwen; //语文成绩 double shuxue; //数学成绩 double yingyu; //英语成绩 double num; //总分 double avg; //平均分 char name[20]; //姓名 char kemu[20]; //所选科目 }stu1[50],stu2[50],t; int si1=0,si2=0; void lbzsz(struct node*head); void OutPx(struct node*head,struct node1 stu[50],int si,int n); //输出成绩排序//输出成绩统计 void Outtj(struct node1 stu[50],int si,int n); //输出成绩统计 int cjmenu(){ int i=1; printf("\t\t 1.1班成绩排序\n"); printf("\t\t 2.2班成绩排序\n"); printf("\t\t 3.1班成绩统计\n"); printf("\t\t 4.2班成绩统计\n"); printf("\t\t 0.退出\n"); printf("\t\t-----------------------------\n"); printf("\t请选择序号\n"); scanf_s("%d",&i); while(1) { if(i<0||i>4) { printf("***没有此选项。请重新选择***\n"); system("pause"); } break; } return i; } void main1(struct node*head) { int i,j=1; printf("\t\t---成绩分析系统---\n"); while(j){ i= cjmenu(); lbzsz(head); switch(i){ case 0: j=0; printf("退出成功"); break; case 1: OutPx(head,stu1,si1,1); system("pause"); break; system("pause"); case 2: OutPx(head,stu2,si2,2); system("pause"); break; system("pause"); case 3: Outtj(stu1,si1,1); system("pause"); break; system("pause"); case 4: Outtj(stu2,si2,2); system("pause"); break; system("pause"); default:break; } printf("\n"); printf("\t\t——————————————\n"); }//while结束 } //链表存入两个数组 void lbzsz(struct node*head) { struct node*p; p=head; if(head->next==NULL) {printf("没有数据请先存入数据"); } if(head->next) { for(si1=0,si2=0; p->next !=NULL; ) { p=p->next ; if(p->me_class %2==0) { stu2[si2].avg =p->avg ; //平均分 stu2[si2].date=p->date; //学号 strcpy(stu2[si2].kemu,p->kemu); //字符串要用strcpy stu2[si2].me_class=p->me_class; strcpy(stu2[si2].name,p->name); stu2[si2].num=p->num; stu2[si2].shuxue=p->shuxue; stu2[si2].yingyu=p->yingyu; stu2[si2].yuwen=p->yuwen; si2++; } else { stu1[si1].avg =p->avg ; //平均分 stu1[si1].date=p->date; //学号 strcpy(stu1[si1].kemu,p->kemu); stu1[si1].me_class=p->me_class; strcpy(stu1[si1].name,p->name); stu1[si1].num=p->num; stu1[si1].shuxue=p->shuxue; stu1[si1].yingyu=p->yingyu; stu1[si1].yuwen=p->yuwen; si1++; } } } /******************************************************/ }//链表存入两个数组 //输出成绩排序 void OutPx(struct node*head,struct node1 stu[],int si,int n){//stu[50]数组,int si长度,int n班级。 int j,k=0; int i,h; //控制学科。 struct xueke { char aa[15]; }km[4]={{"语文"},{"数学"},{"英语"},{"总成绩"}}; lbzsz(head); printf("\t\t%d班的成绩排序\n",n); for(i=0,h=1; i<4; i++,h++){//for1 for(j=0; j; j++){//for2 for(k=0; k-1-j; k++){//for3 if(h==1){ if(stu[k].yuwen[k+1].yuwen){ t=stu[k+1]; stu[k+1] =stu[k] ; stu[k]=t; } } if(h==2){ if(stu[k].shuxue[k+1].shuxue){ t =stu[k+1]; stu[k+1] =stu[k] ; stu[k] =t ; } } if(h==3){ if(stu[k].yingyu[k+1].yingyu){ t=stu[k+1]; stu[k+1] =stu[k] ; stu[k] =t ; } } if(h==4){ if(stu[k].num[k+1].num){ t =stu[k+1]; stu[k+1] =stu[k] ; stu[k] =t ; } } }//for3结束 }//for2结束 printf("%s排名\n学号\t姓名\t班级\t%s成绩\t排名\n",km[i].aa,km[i].aa); if(h==1){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yuwen,k); } if(h==2){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].shuxue ,k); } if(h==3){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yingyu ,k); } if(h==4){ for(j=0,k=1; j; j++,k++) printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].num,k); } } } //输出成绩统计 void Outtj(struct node1 stu[50],int si,int n) { doubleavg1=0,avg2=0,avg3=0; doublek1=0,k2=0,k3=0; //及格率 doublej1=0,j2=0,j3=0; //优秀率 doublemax1; doublemin1; int j; max1=stu[0].yuwen; min1=stu[0].yuwen; for(j=0; j; j++) { avg1+=stu[j].yuwen; if(stu[j].yuwen>=60) k1++; if(stu[j].yuwen>=90) j1++; if(stu[j].yuwen>max1) max1=stu[j].yuwen; if(stu[j].yuwen=60)k2++; if(stu[j].shuxue>=90)j2++; if(stu[j].shuxue>max1) max1=stu[j].shuxue; if(stu[j].shuxue=60) k3++; if(stu[j].yingyu>=90)j3++; if(stu[j].yingyu>max1) max1=stu[j].yingyu; if(stu[j].yingyu

#include //结构体 struct node { int date; //学号 int me_class; //班级 double yuwen; //语文成绩 double shuxue; //数学成绩 double yingyu; //英语成绩 double num; //总分 double avg; //平均分 char name[20]; //姓名 char kemu[20]; //所选科目 struct node *next; }; struct node*input(struct node*head); //01录入学生的资料和成绩. struct node*add(struct node*head); //02增加学生信息及成绩 struct node*find(struct node*head); //3.查询学生信息及成绩 void del(struct node*head); //04删除学生信息及成绩; struct node*change(struct node*head); //05修改学生信息和成绩 struct node* output(struct node*head); //06浏览学生信息及成绩 void file(struct node*head); //文件夹操作。 //主菜单 int menu(){ int i=1; printf("\t\t 1.录入学生信息及成绩\n"); printf("\t\t 2.增加学生信息及成绩\n"); printf("\t\t 3.查询学生信息及成绩\n"); printf("\t\t 4.删除学生信息及成绩\n"); printf("\t\t 5.修改学生信息及成绩\n"); printf("\t\t 6.浏览学生信息及成绩\n"); printf("\t\t 7.保存学生成绩到c盘\n"); printf("\t\t 8.成绩分析系统\n"); printf("\t\t 0.退出\n"); printf("\t\t-----------------------------\n"); printf("\t请选择序号\n"); scanf_s("%d",&i); while(1) { if(i<0||i>8) { printf("***没有此选项。请重新选择***\n"); system("pause"); } break; } return i; } struct node *last; //尾节点 //01录入学生的资料和成绩. struct node*input(node *head)// { int i=0,j=1; struct node *p,*n; p=(struct node*)malloc(sizeof(struct node)); p=head; while(1) {if(j>0) { i++; n=(struct node*)malloc(sizeof(struct node)); printf("请输入第%d个学生的学号,姓名\n",i); scanf("%d %s",&n->date,&n->name); getchar(); printf("请输入科目(文或理)和班级(1或者2)\n"); scanf("%s %d",&n->kemu,&n->me_class); fflush(stdin); printf("请输当前学生的语文,数学,英语成绩\n"); scanf("%lf %lf %lf",&n->yuwen,&n->shuxue,&n->yingyu); getchar(); n->num=n->yuwen+n->shuxue+n->yingyu; n->avg=(p->num)/3; p->next=n; p=n; printf("是否继续输入下一个同学的信息?输入 1 继续,输入0就停止输入\n"); fflush(stdin); scanf("%d",&j); fflush(stdin); } else { p->next=last=NULL; p=last; break; } } free(p); //释放p return head; } //02增加学生信息及成绩 struct node*add(struct node*head) { if(head->next==NULL) { printf("还没有存储数据,请先存储数据"); return head; } else { struct node*head1,*p; head1=(struct node*)malloc(sizeof(struct node)); printf("正在添加学生信息及成绩\n"); head1=input(head1); //插入的节点用链表的方式存储. p=head->next; while(p->next!=NULL) { p=p->next; } p->next=head1->next; //因为头结点是空的所以应该链接头结点的下一个节点。 return head; } } //3.查询学生信息及成绩 struct node*find(struct node*head) { int i; struct node*p; if(head==NULL) { printf("还没有存储数据,请先存储数据\n"); } else { printf("请输入你要找查的学号:"); scanf("%d",&i); p=head->next; while(p->date!=i&&p->next!=NULL) { p=p->next; } if(p->date==i) { printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); printf("\n"); return p; } else { printf("没有找到你要查找的同学\n"); return NULL; } } } //04删除学生信息及成绩; void del(struct node*head) { int key,j=0; struct node*p,*s; s=head->next; p=head; printf("请输入你要删除学生的学号"); fflush(stdin); //删除缓存的数据。 scanf("%d",&key); while(s!=NULL) { if(s->date!=key) { p=s; s=s->next; } else break; } if(s!=NULL) { p->next=s->next; free(s); printf("删除成功\n"); } else printf("删除失败\n"); } //05修改学生信息和成绩 struct node*change(struct node*head) { struct node*p=NULL; p=find(head); if(p==NULL) { printf("修改失败\n"); return head; } else { printf("请输入修改的学生信息\n"); printf("姓名 班级 科目\n"); scanf("%s %d %s",&p->name,&p->me_class ,&p->kemu); fflush(stdin); printf("请输入修改的学生成绩\n"); printf("语文 数学 英语\n"); scanf("%lf %lf %lf",&p->yuwen,&p->shuxue,&p->yingyu); fflush(stdin); //getchar() printf("\n学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); return head; } } //06浏览学生信息及成绩(测试) struct node* output(struct node*head) { if(head==NULL) printf("还没有数据请先输入数据\n"); else { struct node *p; p=head->next; printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); while(p!=NULL) { printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); p=p->next; printf("\n"); } printf("\n"); } return head; } void file(struct node*head) { int i=0; FILE *fp; struct node*p=head->next; fp=fopen("C:\\学生成绩单.txt","wt"); fprintf(fp,"学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n"); while(p!=NULL) { fprintf(fp,"%d\t%s\t%d\t%s\t%lf\t\t%lf\t\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu); p = p->next; i++; } if(i>0) printf("\t\t\t\t\t—————成功保存c盘—————\n"); else printf("\t\t\t\t\t—————没有数据保存失败到桌面—————\n"); fclose(fp); }

复制时运行出错请看这里:c语言学生成绩管理系统

    推荐阅读