实验内容:
编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩。
实验要求:
(1) main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
(2) 定义函数Input:从键盘输入一个学生信息。
(3) 定义函数Output:将某个学生信息格式化输出。
(4) 定义函数Save:将某个学生信息存入文件。
(5) 定义函数Fetch:从文件中随机读取某个学生的信息。
(6) 定义函数Max:求所有学生某门课程的最高分和分数最高的学生的姓名。
(7) 定义函数Sort_select:对某个专业的学生,按总平均成绩由低到高进行简单选择排序。
(8) 定义函数Sort_buble:对某个班级的学生,按总平均成绩由高到低进行冒泡排序。
(9) 定义函数Sort_insert:对某个班级的学生,按某门课程成绩由低到高进行直接插入排序。
(10) 定义函数Search:实现班级和成绩的综合查找(如1班,总分240分以上同学)。
程序如下:
#include<iostream> #include<string.h> #include<stdlib.h> #include<iomanip> #include<fstream> #include<time.h> #include<typeinfo> int length; char a[10],b[10],c[10],d[10],e[10],f[10],g[10];//标题 struct student { char grad[10];//学号 char name[10];//姓名 char spec[10];//专业 char stu_class[10];//班级 int score1; int score2; int score3; }stu[30]; int Init()//初始化 { int i = 0; FILE *p = fopen("1.txt", "r"); //打开文件 if(p==NULL) return 0; fscanf(p,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题 while (!feof(p)) //检测流上的文件结束符,如果文件结束,则返回非0值 { //将文件中数据读取到结构体数组 fscanf(p,"%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3); i++; } length = i; fclose(p); return 1; } void Input()//从键盘输入一个学生信息存入文件和结构体数组。 { printf("请输入学生信息:\n"); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); int i = length; scanf("%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3); FILE *p = fopen("1.txt", "a"); //打开文件 fprintf(p,"\n%s %s %s %s %d %d %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); fclose(p); printf("写入文件成功!\n"); length++; } void Output()//输入学号,将对应的学生信息格式化输出。 { char *grad; printf("请输入查询的学号:"); scanf("%s",grad); printf("学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); for(int i=0;i<length;i++) if(strcmp(stu[i].grad,grad)==0) printf("%s %s %s %s %d %d %d \n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); } void Save()//将某个学生信息存入一个新的文件。 { printf("请输入学生信息:\n"); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); int i = length; scanf("%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3); FILE *p = fopen("other.txt", "w"); //打开文件 fprintf(p,"%s %s %s %s %s %s %s\n",a,b,c,d,e,f,g); fprintf(p,"%s %s %s %s %d %d %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); fclose(p); printf("写入文件成功!\n"); } void Max()//求所有学生某门课程的最高分及对应的学生的姓名。 { int i; int max[3]={0,0,0}; for(i=0;i<length;i++) if(max[0]<stu[i].score1) max[0]=stu[i].score1; printf("课程1最高分:%d分----",max[0]); for(i=0;i<length;i++) if(stu[i].score1 == max[0]) printf("%s ",stu[i].name); printf("\n"); for(i=0;i<length;i++) if(max[1]<stu[i].score2) max[1]=stu[i].score2; printf("课程2最高分:%d分----",max[1]); for(i=0;i<length;i++) if(stu[i].score2 == max[1]) printf("%s ",stu[i].name); printf("\n"); for(i=0;i<length;i++) if(max[2]<stu[i].score3) max[2]=stu[i].score3; printf("课程3最高分:%d分----",max[2],stu[i].name); for(i=0;i<length;i++) if(stu[i].score3 == max[2]) printf("%s ",stu[i].name); printf("\n"); } void Fetch()//从文件中随机读取某个学生的信息。 { int i = time(NULL) % length; printf("第%d名学生\n",i+1); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); printf("%s %s %s %s %d %d %d \n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); } void Sort_select()//按总平均成绩由低到高进行简单选择排序。 { struct student tmp; char str[6]; int i,j,t,n,k; float avg[length],avg_temp; printf("请输入专业:\n"); scanf("%s",str); for(i=0;i<length;i++) avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3; //简单选择排序 for(i=0; i<length; i++) //做n-1趟选取 { k = i; for(j=i+1;j<=length;j++) if(avg[j] < avg[k] && strcmp(stu[i].spec,str)==0 && strcmp(stu[j].spec,str)==0) k = j; //k为最小值 if(i!=k)//交换 { tmp=stu[k]; avg_temp = avg[k]; stu[k]=stu[i]; avg[k] = avg[i]; stu[i]=tmp; avg[i] = avg_temp; } } printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n"); for(i=0;i<length;i++) if(strcmp(stu[i].spec,str)==0) printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]); } void Sort_buble()//按总平均成绩由高到低进行冒泡排序。 { struct student tmp; char str[6]; float avg[length],avg_temp; int i,j; printf("请输入班级:\n"); scanf("%s",str); for(i=0;i<length;i++) avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3; //冒泡排序 for(i=0;i<length;i++) for(j=0;j<length;j++) if(avg[i]>avg[j] && strcmp(stu[i].stu_class,str)==0 && strcmp(stu[j].stu_class,str)==0) { tmp = stu[i]; avg_temp = avg[i]; stu[i] = stu[j]; avg[i] = avg[j]; stu[j] = tmp; avg[j] = avg_temp; } printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n"); for(i=0;i<length;i++) if(strcmp(stu[i].stu_class,str)==0) printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]); } void Sort_insert()//按课程1成绩由低到高进行直接插入排序。 { int i,j,len=0; char str[6]; struct student tmp; struct student insert[100]; printf("请输入班级:\n"); scanf("%s",str); for(i=0;i<length;i++) if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序 { insert[len] = stu[i]; len++; } for(i=1;i<len;i++)//循环从第2个元素开始 { if(insert[i].score1 < insert[i-1].score1) { tmp = insert[i]; for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--) insert[j+1] = insert[j]; insert[j+1] = tmp; } } printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); for(i=0;i<len;i++) printf("%5s %-6s %3s %s %3d %3d %3d\n",insert[i].grad,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3); } void my_Sort_insert()//按课程1成绩由低到高进行直接插入排序。 { int i,j=0,len=0,location[50]; char str[6]; struct student tmp; struct student insert[100]; printf("请输入班级:\n"); scanf("%s",str); for(i=0;i<length;i++) if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序 { insert[len] = stu[i]; location[j++] = i;//存储位置 len++; } for(i=1;i<len;i++)//循环从第2个元素开始 { if(insert[i].score1 < insert[i-1].score1) { tmp = insert[i]; for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--) insert[j+1] = insert[j]; insert[j+1] = tmp; } } for(i=0;i<len;i++) stu[location[i]] = insert[i]; printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); for(i=0;i<length;i++) printf("%5s %-6s %3s %s %3d %3d %3d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); } void Search()//查找某班总分在某分数段以上的学生 { int i,k=0,score; char str[6]; printf("请输入班级和分数:\n"); scanf("%s%d",str,&score); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 总分\n"); for(i=0;i<length;i++) if(strcmp(stu[i].stu_class,str)==0 && stu[i].score1+stu[i].score2+stu[i].score3 > score) { printf("%5s %-6s %3s %s %3d %3d %3d %d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score1+stu[i].score2+stu[i].score3); k++; } printf("%s班总分%d以上的一共有%d人。\n",str,score,k); } void Sort_total_score()//Self:全体总分排序 { struct student tmp; int i,j; //根据总分进行从大到小冒泡排序 for(i=0;i<length;i++) for(j=0;j<length;j++) if(stu[i].score1+stu[i].score2+stu[i].score3 > stu[j].score1+stu[j].score2+stu[j].score3) { tmp = stu[i]; stu[i] = stu[j]; stu[j] = tmp; } for(i=0;i<length;i++) printf("%5s %-6s %3s %s %3d %3d %3d %d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score1+stu[i].score2+stu[i].score3); } void Sort_grad()//Self:全体学号排序 { struct student tmp; int i,j; //根据学号进行从大到小冒泡排序 for(i=0;i<length;i++) for(j=0;j<length;j++) if(strcmp(stu[i].grad,stu[j].grad) > 0 ) { tmp=stu[i]; stu[i]=stu[j]; stu[j]=tmp; } for(i=0;i<length;i++) printf("%5s %-6s %3s %s %3d %3d %3d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); } int main() { int i,j,k; if(Init()==0) { printf("文件不存在!"); return 0; } printf("菜单\n1.输入学生信息\n2.输出学生信息\n3.写入文件\n4.查找课程最高分\n5.随机读取学生信息\n6.同专业平均分简单选择排序\n7.同班级平均分冒泡排序\n"); printf("8.同班级按课程1分数直接插入排序\n9.综合查找\n10.全体总分排序\n11.全体学号排序\n12.重现菜单\n0.退出\n"); printf("请输入选项:"); scanf("%d",&k); while(k) { switch(k) { case 0: break; case 1: Input(); break; case 2: Output(); break; case 3: Save(); break; case 4: Max(); break; case 5: Fetch(); break; case 6: Sort_select(); break; case 7: Sort_buble(); break; case 8: Sort_insert(); //my_Sort_insert(); break; case 9: Search(); break; case 10: Sort_total_score(); break; case 11: Sort_grad(); break; case 12: printf("菜单\n1.写入文件\n2.输出学生信息\n3.写入新文件\n4.查找课程最高分\n5.随机读取学生信息\n6.同专业平均分简单选择排序\n7.同班级平均分冒泡排序\n"); printf("8.同班级按课程1分数直接插入排序\n9.综合查找\n10.全体总分排序\n11.全体学号排序\n12.重现菜单\n0.退出\n"); break; default: printf("输入有误,请重新输入!\n"); } printf("请输入选项:"); scanf("%d",&k); } return 0; } void write() { int i = length; FILE *p = fopen("1.txt", "w"); //打开文件 fprintf(p,"%s %s %s %s %s %s %s\n",a,b,c,d,e,f,g); for(i=0;i<length;i++) fprintf(p,"%s %s %s %s %d %d %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); fclose(p); }
1.txt文本文件内容:
grad name spec class score1 score2 score3 2201 Amy cs 2018-1 98 95 98 2202 Bob cs 2018-2 91 74 59 2203 Cindy cs 2018-2 98 84 79 2204 Dell law 2018-1 86 94 99 2205 Emy law 2018-1 98 86 89
实验内容:
编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链表结点类型,包括:学号、姓名、班级、专业、3门成绩。
实验要求:
(1) main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
(2) 定义函数CreateList:按学号由小到大,建立有序的链表。逆序输入 n 个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。
(3) 定义函数Output:以指向某个学生结点的指针为参数,将学生信息格式化输出。
(4) 定义函数Save:将某个学生信息存入文件。
(5) 定义函数Fetch:从文件中随机读取某个学生的信息。
(6) 定义函数Search_num:查找指定学号的学生,返回指向该学生结点的指针。
(7) 定义函数InsertList:在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。
(8) 定义函数Delete_num:从链表中删除指定学号的学生。
(9) 定义函数Search_major_subject_score:查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
(10) 定义函数Delete_major_subject:从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
程序如下:
#include<iostream> #include<string.h> #include<stdlib.h> #include<iomanip> #include<fstream> #include<time.h> int length=0; using namespace std; char a[10],b[10],c[10],d[10],e[10],f[10],g[10]; //定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩 typedef struct StuNode { char grad[10];//学号 char name[10];//姓名 char spec[10];//专业 char stu_class[10];//班级 int score1;//C int score2;//Java int score3;//Python struct StuNode *next; }student, *StuLink; void Sort(StuLink &head)//从小到大进行冒泡排序 { StuLink tmp,pre,p,q; if (head->next) { p = head->next->next; head->next->next = NULL; while (p) { pre = head; //pre是q的前驱 q = pre->next; while (q && strcmp(q->grad,p->grad)<0)//从链表第二个结点开始找比当前插入值大的结点 { pre = pre->next; q = q->next; } tmp = p->next;//将p插入到结点pre和q之间 p->next = q; pre->next = p; p = tmp; } } } student *CreateList()//初始化:创建链表 { void Output(StuLink &p); StuLink head = (student*)malloc(sizeof(student)); StuLink p,q; p = head; q = head; char grad[10];//学号 char name[10];//姓名 char spec[10];//专业 char stu_class[10];//班级 int score1; int score2; int score3; FILE *r= fopen("2.txt","r"); if(r==NULL) { printf("打开文件失败!"); return NULL; } fscanf(r,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题 while(fscanf(r,"%s%s%s%s%d%d%d",grad,name,spec,stu_class,&score1,&score2,&score3)!=EOF) { q = (student*)malloc(sizeof(student)); strcpy(q->grad,grad); strcpy(q->name,name); strcpy(q->spec,spec); strcpy(q->stu_class,stu_class); q->score1 = score1; q->score2 = score2; q->score3 = score3; p->next = q; p = q; length++; } p->next = NULL; Sort(head); //倒序输出 StuLink k = head,t; while(k->next) k = k->next; printf("倒序输出:\n 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); while(k!=head) { //倒序输出 t = head; while(t->next!=k) t = t->next;//t为k前驱 Output(k); k = t; } return head; } void Output(StuLink &p)//输出信息 { printf("%5s %-5s %-3s %s %3d %3d %3d\n",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3); } void Print_List(StuLink &head)//打印整个链表 { StuLink p = head->next; while(p) { Output(p); p = p->next; } } void Save(StuLink &head)//写入文件。 { StuLink p = (student*)malloc(sizeof(student)),q = head->next; char grad[10],name[10],spec[10],stu_class[10]; int score1,score2,score3; printf("请输入学生信息:\n"); scanf("%s%s%s%s%d%d%d",p->grad,p->name,p->spec,p->stu_class,&p->score1,&p->score2,&p->score3); FILE *w =fopen("2.txt","a"); if(w==NULL) { printf("打开文件失败!\n"); return; } else printf("写入成功!\n"); fprintf(w,"\n%s %s %s %s %d %d %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3); fclose(w); //存入链表 p->next = q; head->next = p; Sort(head); } void Fetch(StuLink &H)//随机读取某个学生的信息。 { StuLink p = H->next; int i = time(NULL) % length; int j = i; while(j) { p = p->next; j--; } printf("第%d名学生\n",i+1); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); Output(p); } student *Search_num(StuLink &H) { //查找指定学号的学生,返回指向该学生结点的指针。 char grad[10]; printf("请输入查询信息的学号:"); scanf("%s",grad); StuLink p = H->next; while(p) { if(strcmp(p->grad,grad)==0) return p; p = p->next; } return NULL; } void InsertList(StuLink &H) { //在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。 StuLink p = H->next, q = H; StuLink insert = (student*)malloc(sizeof(student)); printf("请输入学生信息:\n"); scanf("%s%s%s%s%d%d%d",insert->grad,insert->name,insert->spec,insert->stu_class,&insert->score1,&insert->score2,&insert->score3); while(p) { if(strcmp(p->grad,insert->grad) > 0 ) { q->next = insert;//应插入q和p之间 insert->next = p; break; } q = q->next;//q是p的前驱 p = p->next; } if(!p)//insert的学号大于所有已知值 { q->next = insert; insert->next = NULL; } p = H->next; printf("\n"); Print_List(H); } void Delete_num(StuLink &H)//从链表中删除指定学号的学生。 { StuLink p = H->next, q = H; char grad[10]; printf("请输入想删除的学生的学号:\n"); scanf("%s",grad); while(p) { if(strcmp(p->grad,grad)==0) { q->next = p->next; free(p); break; } q = q->next; p = p->next; } Print_List(H); } student *Search_major_subject_score(StuLink &H) { //查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。 char spec[10]; float score; StuLink p = H->next; int lesson; printf("请输入专业、课程序号和门限分数:\n"); scanf("%s%d%f",spec,&lesson,&score); while(p) { if(strcmp(p->spec,spec)==0) if(lesson==1 && p->score1<score || lesson==2 && p->score2<score || lesson==3 && p->score3<score) return p; p = p->next; } return NULL; } void Delete_major_subject(StuLink &H) { //从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。 char spec[10]; float score; StuLink p = H->next, q = H; int lesson,flag = 0; printf("请输入专业、课程序号和门限分数:\n"); scanf("%s%d%f",spec,&lesson,&score); while(p) { if(strcmp(p->spec,spec)==0 && lesson == 1 && p->score1 < score) // cs 1 94 { Output(p); q->next = p->next; free(p); p = q->next; flag = 1; } else if(strcmp(p->spec,spec)==0 && lesson == 2 && p->score2 < score) // cs 1 94 { Output(p); q->next = p->next; free(p); p = q->next; flag = 1; } else if(strcmp(p->spec,spec)==0 && lesson == 3 && p->score3 < score) // cs 1 94 { Output(p); q->next = p->next; free(p); p = q->next; flag = 1; } else { q = p; p = p->next; } } if(flag==0) printf("不存在此学生!\n"); else { printf("剩余学生:\n"); p = H->next; while(p) { Output(p); p = p->next; } } } void write(StuLink &H)//写入其他文件 { StuLink p = H->next; FILE *w = fopen("other.txt","w"); fprintf(w,"%s %s %s %s %s %s %s",a,b,c,d,e,f,g); while(p) { fprintf(w,"\n%s %s %s %s %d %d %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3); p = p->next; } fclose(w); printf("写入成功!"); } int main() { StuLink H = CreateList(),temp; int k; printf("菜单\n1.写入文件\n2.随机读取学生信息\n3.查找指定学号的学生\n4.按学号顺序插入节点\n"); printf("5.从链表中删除指定学号的学生\n6.查找某个专业的、某门课程的成绩小于某个分数的学生,返回其指针\n"); printf("7.从链表中删除某个专业的、某门课程的成绩小于某个分数的学生\n8.重现菜单\n9.打印链表\n10.覆盖式写入\n0.退出\n"); printf("请输入选项:"); scanf("%d",&k); k = int(k); while(k) { k = int(k); switch(k) { case 0: break; case 1: Save(H); break; case 2: Fetch(H); break; case 3: temp = Search_num(H); if(temp) { printf("指针为:%d\n",temp); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); Output(temp); } else printf("不存在此学生!\n"); break; case 4: InsertList(H); break; case 5: Delete_num(H); break; case 6: temp = Search_major_subject_score(H); if(temp) { printf("指针为:%d\n",temp); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); Output(temp); } else printf("不存在此学生!\n"); break; case 7: Delete_major_subject(H); break; case 8: printf("菜单\n1.写入文件\n2.随机读取学生信息\n3.查找指定学号的学生\n4.按学号顺序插入节点\n"); printf("5.从链表中删除指定学号的学生\n6.查找某个专业的、某门课程的成绩小于某个分数的学生,返回其指针\n"); printf("7.从链表中删除某个专业的、某门课程的成绩小于某个分数的学生\n8.重现菜单\n9.打印链表\n10.覆盖式写入\n0.退出\n"); break; case 9: Print_List(H); break; case 10: write(H); break; default: printf("输入有误,请重新输入!\n"); } printf("请输入选项:"); scanf("%d",&k); } return 0; }
2.txt文本文件内容:
grad name spec class score1 score2 score3 2201 Amy cs 2018-1 98 95 98 2202 Bob cs 2018-2 91 74 59 2203 Cindy cs 2018-2 98 84 79 2204 Dell law 2018-1 86 94 99 2205 Emy law 2018-1 98 86 89