- 事先存入的数据:
- 菜单:
- 系统帮助及说明:
- 写入学生信息:
该写入仅写入数组并不存入文件。
- 读出学生信息
- 将学生信息存入文件中
此时文件中数据为:
- 输出每门课程最高分:
- 随机读取信息:
- 专业平均成绩升序(简单选择排序):
- 班级平均成绩降序(冒泡)::
- 班级单科成绩升序(插排):
- 综合查找:
- 输出所有信息:
- 删除学生信息:
源码如下(原创,如用请点赞):
-
#include<iostream> #include<string.h> #include<stdlib.h> #include<iomanip> #include<fstream> #include<time.h> #include<typeinfo> #include<conio.h> #define M 1000 int length; int l=5; char a[10],b[10],c[10],d[10],e[10],f[10],g[10];//标题 struct student { char num[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].num,&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()//从键盘输入一个学生信息存入文件和结构体数组。 { loop1:; printf("请输入学生信息:\n"); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); int i = length; char num_stu[10]; scanf("%s%s%s%s%d%d%d",&stu[i].num,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3); int n; for(n=0;n<99;n++) { if(stu[i].num==num_stu) { printf("学号冲突,请重新输入"); goto loop1; } } FILE *p = fopen("1.txt", "c"); //打开文件 fclose(p); l=l+1; printf("写入信息成功!\n"); length++; } void Output1()//输入学号,将对应的学生信息格式化输出。 { char *num; printf("请输入查询的学号:"); scanf("%d",num); printf("学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); for(int i=0;i<length;i++) if(strcmp(stu[i].num,num)==0) printf("%s %s %s %s %d %d %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); } void Output(struct student stu[M])//查询函数 { int i=0; char xh[25]; if(l==0) { printf("目前没有学生信息\n"); return; } else { printf("请输入查看学生的学号\n"); scanf("%s",&xh); for(i=0;i<l;i++) { if(strcmp(stu[i].num,xh)==0) { printf("%s %s %s %s %d %d %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); } } } } void all()//输出所有信息 { printf("学号 姓名 专业 班级 成绩1 成绩2 成绩3 总成绩 平均成绩 \n"); for(int i=0;i<length;i++) { int sum=stu[i].score1+stu[i].score2+stu[i].score3; int ave=sum/3; printf("%s %s %s %s %d %d %d %d %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,sum,ave); } } void help()/*帮助界面*/ { printf("\n\t\t\t0.欢迎使用系统帮助!\n"); printf("\n\t\t\t1.初次进入系统后,请先选择增加学生信息;\n"); printf("\n\t\t\t2.按照菜单提示键入数字代号;\n"); printf("\n\t\t\t3.增加学生信息后,切记保存;\n"); printf("\n\t\t\t4.谢谢您的使用!\n"); } void Save()//将某个学生信息存入一个文件。 { printf("请输入学生信息:\n"); printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n"); int i = length; scanf("%s%s%s%s%d%d%d",&stu[i].num,&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\n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); printf("%s %s %s %s %d %d %d",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); l=l+1; fclose(p); printf("写入文件成功!\n"); } void del(struct student stu[M])//删除函数 { int j,index=0,k=l; char xh[25]; printf("所要删除的学生学号为:\n"); scanf("%s",xh); do{ for(j=0;j<l;j++) { if(strcmp(stu[j].num,xh)==0) { for(j=index;j<l;j++) stu[j]=stu[j+1]; l--; if(l<k) printf("删除成功\n"); } index++; } } while(j==l); printf("没有你要删除的学生信息\n"); FILE *p = fopen("1.txt", "w"); //打开文件 for(int i=0;i<length;i++) { fprintf(p,"%s %s %s %s %d %d %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); printf("%s %s %s %s %d %d %d \n",stu[i].num,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].num,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].num,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].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]); } void Sort_insert()//按课程成绩由低到高进行直接插入排序。 { int i,j,len=0; char str[6]; int m; struct student tmp; struct student insert[100]; printf("请输入班级:\n"); scanf("%s",str); printf("请输入科目 :\n"); scanf("%s",m); if(m==1) { 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].num,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3); } if(m==2) {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].score2 < insert[i-1].score2) { 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].num,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3); } if(m=3) { 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].score3 < insert[i-1].score3) { 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].num,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3); } } void Search()//查找某班总分在某分数段以上的学生 { int i,k=0,score; int sum=stu[i].score1+stu[i].score2+stu[i].score3; 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 %3d\n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,sum); k++; } printf("%s班总分%d以上的一共有%d人。\n",str,score,k); } void Deletedatd()//删除信息 { int i, j, flag = 0; char m; printf("请输入想删除的信息:\n"); scanf("%lld", m); for (i = 0; i < l; i++) { if (stu[i].num==&m) { for (j = i; j < l + 1; j++) { stu[j] = stu[j + 1]; } } } getch(); } int main() { int i,j; if(Init()==0) { printf("文件不存在!"); return 0; } system("color 0f");//变色 int choice; int num; //num为每次输入的人数 static int k; // k为总人数 且会变化 int label_of_save=0;//存盘判据 while(1)//死循环 支持多次不同操作 { printf("\t\t\t ******************************************************\n\n"); printf("\t\t\t * 学生信息管理系统 * \n\n"); printf("\t\t\t ******************************************************\n\n"); printf("\t\t\t*********************系统功能菜单*************************\n"); printf("\t\t\t ---------------------- ---------------------- \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 0.系统帮助及说明 * * 1.写入学生信息 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 2.查询学生信息 * * 3.保存学生信息 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 4.课程最高分 * * 5.随机读取信息 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 6.专业平均成绩升序 * * 7.班级平均成绩降序 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 8.班级单科成绩升序 * * 9.综合查找 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 10.输出所有信息 * * 11.删除学生信息 * \n"); printf("\t\t\t ********************************************* \n"); printf("\t\t\t * 12.退出系统 * \n"); printf("\t\t\t ********************** \n"); printf("\t\t\t ---------------------- ---------------------- \n"); scanf("%d",&choice);//功能选择 int j;//支持增补的变量保障 if(choice>=0&&choice<=13) { switch(choice) { case 0: help(); break; case 1: Input(); break; case 2: Output(stu); 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 11: del(stu);//删除 break; case 10: all(); break; case 12: printf("\n ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); //退出提示 printf(" Goodbye! \n"); printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); exit(0);//将程序退出 } } else //没有按规范选择功能,要进行错误提示 //错误提示 { printf("\n ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf(" error input! \n"); printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); } } 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].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3); fclose(p); }