问题描述及代码:
/********************************************** *版权所有 (C)2015,yangzheng * *文件名称:学生成绩管理系统 *文件标识:无 *内容摘要:实现学成成绩的输入、插入、删除、修改、排序和输出 *其他内容:无 *当前版本:codeblocks *作者:杨征 *完成日期:2015.12.25 * *修改记录: *修改日期:2015125 *版本号:codeblocks *修改人:杨征 *修改内容:添加创建成绩单 *************************************************/
<pre name="code" class="cpp">#include<stdlib.h> #include<stdio.h> #include<conio.h> #include<malloc.h> #include<string.h> #include<iostream> using namespace std; typedef struct STUDENT { char Num[10];/*学生学号*/ char Name[20];/*学生姓名*/ char className[20];/*班级名称*/ char yearName[20];/*学期名称*/ float mark1;/*第1门成绩*/ float mark2;/*第2门成绩*/ float mark3;/*第3门成绩*/ struct STUDENT *next; } STUDENT; /*以下是函数声明*/ void chuangjian(); void Read();//从文件中读学生信息到链表中 void Menu();//显示菜单,根据用户的输入 void Create();//建立链表表头 STUDENT *MallocNode();//申请一个新结点,并将其初始化 void Input(STUDENT *t);//在链表的结尾处增加一个结点 void Output();//显示所有学生的信息 void DesplayInfoBystudentName();//根据用户输入的学生姓名显示该学生的信息 void shuchujiedian(STUDENT *t);//输出一个结点的信息 void Insert(STUDENT *t);//在链表的结尾处增加一个结点 void DeleteNodeBystudentNumber();//根据用户输入的学号删除该学生 void ChangeMarkByName();//根据输入的班级修改成绩 void ChangeMarkByNumber();//根据输入的学期修改成绩 void Save();//保存链表数据到文件中 void DesplayMarkSegment();//不及格学生成绩 void paixu();//按平均成绩排序 #endif // ST_H_INCLUDED
<pre name="code" class="cpp">#include"st.h" int choose;/*用于接受用户的选择*/ STUDENT *headLink;/*链表表头指针*/ /************************************ * 功能描述:从文件中读学生信息到链表中 * 输入参数:无 * 输出参数:无 ************************************/ void Read(void) { FILE *fp; STUDENT *p; fp=fopen("student.txt","r"); if(!fp) { printf("文件不存在\n"); return; } p=MallocNode(); while(fscanf(fp,"%s%s%s%f%f%f",p->Num,p->Name,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0) { Insert(p); p=MallocNode(); } fclose(fp); } /************************************ * 功能描述:显示菜单,根据用户的输入 * 完成相应的功能 * 输入参数:你要选择的功能的序号 * 输出参数:选择的功能 ************************************/ void Menu() { STUDENT *p; printf("-------请选择相应功能------------\n\n"); printf(" 1 创建成绩单 |\n"); printf(" 2 从文件中读取学生成绩 |\n"); printf(" 3 按姓名查询 |\n"); printf(" 4 增加学生 |\n"); printf(" 5 删除学生 |\n"); printf(" 6 按班级修改学生成绩 |\n"); printf(" 7 按学期修改学生成绩 |\n"); printf(" 8 保存所有学生信息 |\n"); printf(" 9 显示不及格学生成绩 |\n"); printf(" 10 按平均成绩排序并输出绩 |\n"); printf(" 11 退出 |\n\n"); scanf("%d",&choose);/*取得用户的选择*/ switch(choose) { case 1: system("cls"); chuangjian(); getch(); break; case 2: system("cls"); Output();/*显示所有学生的信息*/ getch(); break; case 3: system("cls"); DesplayInfoBystudentName();//根据用户输入的学生姓名显示该学生的信息 break; case 4: system("cls"); p=MallocNode();/*先申请一个新结点*/ Input(p);/*要求用户输入信息到新结点中*/ Insert(p);/*将新结点加到链表中*/ getch(); break; case 5: system("cls"); DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/ getch(); break; case 6: system("cls"); ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/ getch(); break; case 7: system("cls"); ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/ getch(); break; case 8: system("cls"); Save();/*保存数据*/ break; case 9: system("cls"); DesplayMarkSegment();/*显示不及格的学生成绩*/ getch(); break; case 10: system("cls"); paixu();/*按平均成绩排序*/ getch(); break; case 11: system("cls"); Save();/*保存数据后再退出*/ free(headLink); break; default: break; } Menu();/*递归调用*/ Save(); } void chuangjian()//创建学生成绩单 { int a,i; printf("输入学生的个数:\n"); scanf("%d",&a); for (i=0; i<a; i++) { STUDENT *p,*q; p= (STUDENT*)malloc(sizeof(STUDENT)); printf("输入第%d个学生的信息:\n",i+1); printf("请输入:学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\n\n"); scanf("%s %s %s %d %d %d",p->Num,p->Name,&p->className,&p->mark1,&p->mark2,&p->mark3); p->next=NULL; q->next=p; q=q->next; } } /************************************ * 功能描述:建立链表表头 * 输入参数:无 * 输出参数:无 ************************************/ void Create(void) { STUDENT *p; p=(STUDENT*)malloc(sizeof(STUDENT)); headLink=p; p->next=NULL; } /************************************ * 功能描述:申请一个新结点,并将其初始化 * 输入参数:无 * 输出参数:无 ************************************/ STUDENT *MallocNode(void) { STUDENT *p; int i; p=(STUDENT*)malloc(sizeof(STUDENT)); if(p==NULL) return NULL; for(i=0; i<10; i++) p->Num[i]='\0'; for(i=0; i<20; i++) p->Name[i]='\0'; for(i=0; i<20; i++) p->className[i]='\0'; p->mark1=0.0; p->mark2=0.0; p->mark3=0.0; p->next=NULL; return p; } /************************************ * 功能描述:取得用户输入的学生信息 * 输入参数:学生的姓名、学号、班级、 * 成绩1、成绩2、成绩3 * 输出参数:输出学生的姓名、学号、 * 班级、成绩1、成绩2、成绩3 ************************************/ void Input(STUDENT *t) { printf("请输入学生学号:\n"); scanf("%s",t->Num); printf("请输入学生姓名:\n"); scanf("%s",t->Name); printf("请输入该生所在班级:\n"); scanf("%s",t->className); printf("请输入第1门成绩:\n"); scanf("%f",&(t->mark1)); printf("请输入第2门成绩:\n"); scanf("%f",&(t->mark2)); printf("请输入第3门成绩:\n"); scanf("%f",&(t->mark3)); } /************************************ * 功能描述:在链表的结尾处增加一个结点 * 输入参数:无 * 输出参数:无 ************************************/ void Insert(STUDENT *t) { STUDENT *p; p=headLink; while(p->next) { p=p->next; } p->next=t; } /************************************ * 功能描述:根据用户输入的学生姓名显 * 示该学生的信息 * 输入参数:学生姓名 * 输出参数:输出学生的姓名、学号、 * 班级、成绩1、成绩2、成绩3 ************************************/ void DesplayInfoBystudentName(void) { STUDENT *p; char studentName[20]; char flag=0; p=headLink->next; printf("请输入学生姓名:\n"); scanf("%s",studentName); while(p) { if(strcmp(p->Name,studentName)==0) { printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); shuchujiedian(p); flag=1; break; } p=p->next; } if(!flag) printf("对不起,不存在姓名为 %s 的学生\n",studentName); } /************************************ * 功能描述:输出一个结点的信息 * 输入参数:无 * 输出参数:输出学生的姓名、学号、 * 班级、成绩1、成绩2、成绩3 ************************************/ void shuchujiedian(STUDENT *t) { printf("%s\t",t->Num); printf("%s\t",t->Name); printf("%s\t",t->className); printf("%.2f\t",t->mark1); printf("%.2f\t",t->mark2); printf("%.2f\t",t->mark3); printf("%.2f\t",t->mark1+t->mark2+t->mark3); printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3); } /************************************ * 功能描述:根据用户输入的学号删除该学生 * 输入参数:学生学号 * 输出参数:无 ************************************/ void DeleteNodeBystudentNumber(void) { char studentNumber[10]; STUDENT *p,*q; char flag=0; printf("请输入要删除的学生学号:"); scanf("%s",studentNumber); p=headLink; q=headLink->next; while(q) { if(strcmp(q->Num,studentNumber)==0) { p->next=q->next; free(q); flag=1; break; } p=p->next; q=q->next; } if(!flag) { printf("不存在该学号的学生\n"); return; } printf("成功删除\n"); } /************************************ * 功能描述:显示所有学生的信息 * 输入参数:无 * 输出参数:输出学生的姓名、学号、 * 班级、成绩1、成绩2、成绩3 ************************************/ void Output(void) { STUDENT *p; p=headLink->next; if(p==NULL) { printf("现在没有学生信息,请先输入学生信息\n\n"); return; } printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); while(p) { shuchujiedian(p); p=p->next; } } /************************************ * 功能描述:根据输入的班级修改成绩 * 输入参数:学生班级、姓名 * 输出参数:无 ************************************/ void ChangeMarkByName(void) { STUDENT *p; int a; char studentName[20]; char flag=0; float mark1,mark2,mark3; p=headLink->next; printf("请输入学生班级:\n"); scanf("%d",&a); printf("请输入学生姓名:\n"); scanf("%s",studentName); while(p) { if(strcmp(p->Name,studentName)==0) { printf("请输入新的第1门成绩:\n"); scanf("%f",&mark1); printf("请输入新的第2门成绩:\n"); scanf("%f",&mark2); printf("请输入新的第3门成绩:\n"); scanf("%f",&mark3); p->mark1=mark1; p->mark2=mark2; p->mark3=mark3; flag=1; printf("修改成功\n"); break; } p=p->next; } if(!flag) printf("对不起,不存在班级为 %s 的学生\n",studentName); } /************************************ * 功能描述:根据输入的学期修改成绩 * 输入参数:学期、姓名 * 输出参数:无 ************************************/ void ChangeMarkByNumber(void) { STUDENT *p; int b; char studentNumber[20]; char flag=0; float mark1,mark2,mark3; p=headLink->next; printf("请输入学生所在学期:\n"); scanf("%d",&b); printf("请输入学生学号:\n"); scanf("%s",studentNumber); while(p) { if(strcmp(p->Num,studentNumber)==0) { printf("请输入新的第1门成绩:\n"); scanf("%f",&mark1); printf("请输入新的第2门成绩:\n"); scanf("%f",&mark2); printf("请输入新的第3门成绩:\n"); scanf("%f",&mark3); p->mark1=mark1; p->mark2=mark2; p->mark3=mark3; flag=1; printf("修改成功\n"); break; } p=p->next; } if(!flag) printf("对不起,不存在学期为 %s 的学生\n",studentNumber); } /************************************ 函数功能:保存链表数据到文件中 ************************************/ void Save(void) { STUDENT *p; FILE *fp; p=headLink->next; if(p==NULL) { printf("现在没有学生信息,请先输入学生信息\n\n"); return; } fp=fopen("student.txt","w+"); if(!fp) { printf("文件不存在\n"); return; } while(p) { fprintf(fp,"%s %s %s %f %f %f\n",p->Num,p->Name,p->className,p->mark1,p->mark2,p->mark3); p=p->next; } fclose(fp); } /************************************ * 功能描述:不及格学生成绩 * 输入参数:无 * 输出参数:不及格的信息 ************************************/ void DesplayMarkSegment(void) { STUDENT *p; int count=0; p=headLink->next; printf("60分以下(不及格)的学生成绩如下:\n"); printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"); while(p) { if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/ { count++; shuchujiedian(p); } p=p->next; } printf("不及格的学生一共有%d人\n",count); } /************************************ * 功能描述:按平均成绩排序 * 输入参数:无 * 输出参数:无 ************************************/ void paixu(void) { STUDENT exchange,*r,*p,*q; r=headLink->next; if(r==NULL) { printf("现在还没学生信息,请先输入学生信息\n"); return; } while(r)/*两层while循环实现排序*/ { p=r; q=r->next; while(q) { if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3)) { strcpy(exchange.Num,q->Num);/*先复制q结点信息到exchange*/ strcpy(exchange.Name,q->Name); strcpy(exchange.className,q->className); exchange.mark1=q->mark1; exchange.mark2=q->mark2; exchange.mark3=q->mark3; strcpy(q->Num,p->Num);/*再复制p结点信息到q*/ strcpy(q->Name,p->Name); strcpy(q->className,p->className); q->mark1=p->mark1; q->mark2=p->mark3; q->mark3=p->mark3; strcpy(p->Num,exchange.Num);/*最后复制exchange结点信息到p*/ strcpy(p->Name,exchange.Name); strcpy(p->className,exchange.className); p->mark1=exchange.mark1; p->mark2=exchange.mark2; p->mark3=exchange.mark3; } q=q->next; } r=r->next; } Output(); }
<pre name="code" class="cpp">#include"st.h" /************************************ * 功能描述:主函数 * 输入参数:无 * 输出参数:无 ************************************/ int main() { Create(); Menu(); Read(); }