C语言实训,老师让写一个学生信息管理系统,要求如下:
注:本文非ACM题目,用到最多的东西是关于链表和指针的操作。
对于链表的排序我用的是交换节点的内容选择排序。本来想着用改变指针的方法,写了一半脑子就乱了T_T
我的代码:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #define N 1000 using namespace std; void start() { cout<<endl<<" ==================================================================="<<endl; cout<<endl<<" | ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ |"<<endl; cout<<endl<<" | 欢迎来到 **东北林业高中** 教育信息平台 |"<<endl; cout<<endl<<" | |"<<endl; cout<<endl<<" | Author---计算机(2)班 王小二 |"<<endl; cout<<endl<<" ================================================================== "<<endl; cout<<endl<<" 您可以根据以下提示进行您所需要的操作:"<<endl; cout<<endl<<" 增加学生信息----------------1 显示学生信息----------------2"<<endl; cout<<endl<<" 修改学生信息----------------3 查询学生信息----------------4"<<endl; cout<<endl<<" 删除学生信息----------------5 对学生信息进行排序----------6"<<endl; cout<<endl<<" 保存学生信息至记录文件------7 从记录文件读取学生信息------8"<<endl; cout<<endl<<" 新建学生信息文件------------9 运行结束-------------------10"<<endl<<endl; } struct student { int num; char name[20]; char sex[20]; int math,chinese,english,computer,PE; double ave; int sum; int rank; student *next; }; student *h,*t; void creatLink() { void sort(); student *p1,*p2; int n=0; p1=(struct student *)malloc(sizeof(struct student)); h=NULL; p1->next=NULL; printf("请输入信息(输入0,结束输入):(例如:lvshubao man 20130000)\n"); scanf("%s",&p1->name); if(p1->name[0]=='0') return; scanf("%s%d",&p1->sex,&p1->num); printf("请输入成绩依次是:math,chinese,english,computer,PE\n"); scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE); h=p1; // printf("%d\n",h->num); // printf("%d\n",p1->num); p2=p1; p2->next=NULL; p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5; p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE; //printf("%d\n",p1->sum); p1=(struct student *)malloc(sizeof(struct student)); p2->next=p1; printf("请再次输入信息:\n"); scanf("%s",&p1->name); while(p1->name[0]!='0') { scanf("%s%d",&p1->sex,&p1->num); printf("请再次输入成绩\n"); scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE); p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5; p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE; p2=p1; p1=(struct student *)malloc(sizeof(struct student)); p2->next=p1; printf("请再次输入信息:\n"); scanf("%s",&p1->name); } t=p2; p2->next=NULL; sort(); /*for(p1=h;p1!=NULL;p1=p1->next) { printf("%s\n",p1->name); }*/ } void show1() { student *p; for(p=h; p!=NULL; p=p->next) { printf(" 姓名:%s 性别:%s 学号:%d\n",p->name,p->sex,p->num); printf(" 数学:%d 语文:%d 英语:%d 计算机:%d 体育:%d\n",p->math,p->chinese,p->english,p->computer,p->PE); printf(" 总成绩: %d 平均成绩: %.2f 排名:%d\n\n",p->sum,p->ave,p->rank); } } void sw(student *x,student *y) { swap(x->name,y->name); swap(x->sex,y->sex); swap(x->num,y->num); swap(x->math,y->math); swap(x->english,y->english); swap(x->chinese,y->chinese); swap(x->computer,y->computer); swap(x->ave,y->ave); swap(x->PE,y->PE); swap(x->sum,y->sum); swap(x->rank,y->rank); } void sort()//名次递增 { student *p,*q,*m; int maxx; for(p=h; p!=NULL; p=p->next) { maxx=p->sum; for(q=p->next; q!=NULL; q=q->next) { if(q->sum>maxx) { maxx=q->sum; m=q; } } if(maxx>p->sum) sw(p,m); } int ip=1; for(p=h; p!=NULL; p=p->next) { p->rank=ip++; } } void sort3()//名次递减 { student *p,*q,*m; int maxx; for(p=h; p!=NULL; p=p->next) { maxx=p->sum; for(q=p->next; q!=NULL; q=q->next) { if(q->sum<maxx) { maxx=q->sum; m=q; } } if(maxx<p->sum) sw(p,m); } } void sort1()//学号递减 { student *p,*q,*m; int maxx; for(p=h; p!=NULL; p=p->next) { maxx=p->num; for(q=p->next; q!=NULL; q=q->next) { if(q->num<maxx) { maxx=q->num; m=q; } } if(maxx<p->num) sw(p,m); } } void sort2()//学号递增 { student *p,*q,*m; int maxx; for(p=h; p!=NULL; p=p->next) { maxx=p->num; for(q=p->next; q!=NULL; q=q->next) { if(q->num>maxx) { maxx=q->num; m=q; } } if(maxx>p->num) sw(p,m); } } void sort5()//姓名递增 { student *p,*q,*m; char maxx[30]; for(p=h; p!=NULL; p=p->next) { memset(maxx,0,sizeof(maxx)); strcpy(maxx,p->name); for(q=p->next; q!=NULL; q=q->next) { if(strcmp(maxx,q->name)>0) { memset(maxx,0,sizeof(maxx)); strcpy(maxx,q->name); m=q; } } if(strcmp(maxx,p->name)<0) sw(p,m); } } void sort6()//姓名递减 { student *p,*q,*m; char maxx[30]; for(p=h; p!=NULL; p=p->next) { memset(maxx,0,sizeof(maxx)); strcpy(maxx,p->name); for(q=p->next; q!=NULL; q=q->next) { if(strcmp(maxx,q->name)<0) { memset(maxx,0,sizeof(maxx)); strcpy(maxx,q->name); m=q; } } if(strcmp(maxx,p->name)>0) sw(p,m); } } void show() { student *p; p=h; // printf("%d\n",h->num); //printf("%d\n",p->num); printf("按学号查询请输入1,按姓名查询请输入2,按名次查询请输入3\n"); int x,y; scanf("%d",&x); if(x==1) { printf("请输入学号: "); scanf("%d",&y); p=h; while(y!=p->num) { p=p->next; } } else if(x==3) { printf("请输入名次: "); scanf("%d",&y); p=h; while(y!=p->rank) { p=p->next; } } else { printf("请输入姓名: "); char s[20]; scanf("%s",s); p=h; while(strcmp(s,p->name)) { p=p->next; } } printf("\n查询结果如下:\n"); printf(" 姓名:%s 性别:%s 学号:%d\n",p->name,p->sex,p->num); printf(" 数学:%d 语文:%d 英语:%d 计算机:%d 体育:%d\n",p->math,p->chinese,p->english,p->computer,p->PE); printf(" 总成绩: %d 平均成绩: %.2f 排名:%d\n\n",p->sum,p->ave,p->rank); } void create_file() { FILE *fp; student *p; fp=fopen("d:\\data.txt","w"); p=h; while(1) { fprintf(fp,"%s %s %d %d %d %d %d %d %.2f %d %d\n",p->name,p->sex,p->num,p->math,p->chinese,p->english,p->computer,p->PE,p->ave,p->sum,p->rank); if(p->next==NULL) break; p=p->next; } fclose(fp); } void read_file() { FILE *fp; student *p1,*p2; fp=fopen("d:\\data.txt","r"); int d=1; h=p2=(struct student *)malloc(sizeof(struct student)); fscanf(fp,"%s %s %d %d %d %d %d %d %lf %d %d\n",p2->name,p2->sex,&p2->num,&p2->math,&p2->chinese,&p2->english,&p2->computer,&p2->PE,&p2->ave,&p2->sum,&p2->rank); while(!feof(fp)) { p1=(struct student *)malloc(sizeof(struct student)); fscanf(fp,"%s %s %d %d %d %d %d %d %lf %d %d\n",p1->name,p1->sex,&p1->num,&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE,&p1->ave,&p1->sum,&p1->rank); p2->next=p1; p2=p1; } p2->next=NULL; fclose(fp); } void delet() { student *p,*q; printf("请输入要删除学生的学号:\n"); int x; scanf("%d",&x); int flag=1; if(h->num==x) { h=h->next; for(p=h;p!=NULL;p=p->next) --(p->rank); return; } else { for(p=h; p->next!=NULL; p=p->next) { if(p->next->num==x) { flag=0; break; } } if(flag) { printf("对不起,没有该学生!\n"); } else { if(p->next->next==NULL) { p->next=NULL; return; } p->next=p->next->next; for(p=p->next;p->next!=NULL; p=p->next) p->rank=p->rank-1; } } } void add() { printf("温馨提示: 请注意一次只能新增加一个学生,若增加多个请在主菜单再次选择“1” :)\n\n"); student *p1,*p; int x; for(p=h;p!=NULL;p=p->next) t=p; p1=(struct student *)malloc(sizeof(struct student)); t->next=p1; printf("请输入信息(输入0,结束输入):(例如:lvshubao man 20130000)\n"); scanf("%s",&p1->name); scanf("%s%d",&p1->sex,&p1->num); printf("请输入成绩依次是:math,chinese,english,computer,PE\n"); scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE); p1->next=NULL; // printf("%d\n",h->num); // printf("%d\n",p1->num); p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5; p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE; sort(); } void xiugai() { student *p,*q,*p1; printf("请输入要修改学生的学号:\n"); int x; scanf("%d",&x); int flag=1; for(p=h; p!=NULL; p=p->next) { if(p->num==x) { flag=0; break; } } if(flag) { printf("对不起,没有该学生!\n"); } else { p1=p; printf("重新输入该学生的信息(例如:lvshubao man 20130000)\n\n"); scanf("%s",&p1->name); scanf("%s%d",&p1->sex,&p1->num); printf("请输入成绩依次是:math,chinese,english,computer,PE\n"); scanf("%d%d%d%d%d",&p1->math,&p1->chinese,&p1->english,&p1->computer,&p1->PE); p1->ave=(p1->math+p1->chinese+p1->english+p1->computer+p1->PE)/5; p1->sum=p1->math+p1->chinese+p1->english+p1->computer+p1->PE; } } int main() { start(); int x; int flag; printf("您当前的位置是主菜单,请输入您所需要的操作所对应的数字:\n"); while(~scanf("%d",&x)) { flag=1; if(x==1) add(); else if(x==2) show1(); else if(x==3) xiugai(); else if(x==4) show(); else if(x==5) delet(); else if(x==6) { printf("请根据提示选择您想要的排序要求:\n"); cout<<endl<<" 学号升序----------------1 学号降序----------------2"<<endl; cout<<endl<<" 名次降序----------------3 名次升序----------------4"<<endl; cout<<endl<<" 姓名升序----------------5 姓名降序----------------6"<<endl; int y; scanf("%d",&y); if(y==1) sort1(); else if(y==2) sort2(); else if(y==3) sort3(); else if(y==4) sort(); else if(y==5) sort5(); else if(y==6) sort6(); else { printf("输入错误,将返回主菜单!\n"); } } else if(x==7) create_file(); else if(x==8) read_file(); else if(x==9) creatLink(); else if(x==10) break; else { printf("输入有误,请重新输入!\n"); flag=0; continue; } if(flag==1) printf("您当前的位置是主菜单,请输入您所需要的操作所对应的数字:\n"); } return 0; }