学生管理系统
#include "stdafx.h" #include "string.h" #include "stdio.h" #include "stdlib.h" #include "conio.h" #define M 3 #define N 100 #define LEN 9 void no_deal(int i); int score_input(int i); void average(int i); void menu(); int load(); void topput_(); void printf_face(); void printf_one(int i); void puts_(); void printf_back(); void browse(); typedef struct student //定义学生信息结构体 { char num[11]; char name[20]; int score[M]; double aver; }STU; STU stu[N]; int no_input(int i,int n) { int j,k,w1; do { w1=0; printf("学号:\t\t [%d位,低于%d位前面补0,长的截尾处理!]",LEN,LEN); scanf("%s",stu[i].num); no_deal(i); for(j=0;stu[i].num[j]!='\0';j++) if(stu[i].num[j]<'0'||stu[i].num[j]>'9') { puts("别开玩笑!只能输入0-9.好吧,再给你一次机会,别让我失望了!\n"); w1=1; break; } if(w1==1) for(k=0;k<n;k++) if(k!=i&&strcmp(stu[k].num,stu[i].num)==0) { puts("已经存在啦!重来一次!\n"); w1=1; break; } }while(w1==1); return 0; } void input(int i) { no_input(i,i); printf("姓名:"); scanf("%s",stu[i].name); score_input(i); average(i); } /***************************保存学生信息*************************/ int save(int n) { FILE *fp; int i; if((fp=fopen("yao.txt","wb"))==NULL) { printf("无法打开文件!\n任意键退出程序.......\n"); getch(); return 0; } for(i=0;i<n;i++) if(stu[i].aver!=0) if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("文件写入发生错误\n"); fclose(fp); return 0; } void copy() { char outfile[20],infile[10]; FILE *sfp,*tfp; STU *p=NULL; system("cls"); printf("请输入需要被复制的文件名(默认数据处理在yao.txt中):\n"); scanf("%s",infile); if((sfp=fopen(infile,"rb"))==NULL) { printf("无法打开文件!\n任意键退出程序......\n"); getch(); return; } printf("另存为.....,比如:hao.txt:\n"); scanf("%s",&outfile); if((tfp=fopen(outfile,"wb"))==NULL) { printf("无法打开文件!\n\n"); getch(); return; } while(!feof(sfp)) fputc(fgetc(sfp),tfp); fclose(sfp); fclose(tfp); printf("\n复制成功!!!!\n"); printf("\n输入任意键返回主菜单"); getch(); menu(); } /************************学号格式调整*********************/ void no_deal(int i) { int len=strlen(stu[i].num); int j,k=9; for(j=len-1;j>=0;j--) { stu[i].num[k--]=stu[i].num[j]; } for(j=k;j>=0;j--) stu[i].num[j]='0'; stu[i].num[10]='\0'; } void del() { struct student s; int i,k,n,c,w0=1; system("cls"); n=load(); do { system("cls"); k=-1; topput_(); printf_face(); for(i=0;i<n;i++) if(stu[i].aver!=0) printf_one(i); puts_(); do { printf("\n\n输入你要删除记录的学号! no.:\t['Ctrl-z' 退出]"); if(scanf("%s",s.num)!=1) menu(); for(i=0;i<n;i++) if(strcmp(s.num,stu[i].num)==0) { k=i; s=stu[i]; } if(k==-1) printf("\n\n不存在!请重新输入!"); }while(k==-1); puts("\n"); printf_face(); printf_one(k); printf("\n你确定?\n\t1).确定 2).不,要删除其他的 3).不保存退出[]\b\b"); scanf("%d",&c); if(c==1) { stu[k].aver=0; printf("\n\n操作成功!\n\n要继续删数据吗?\n\t1).继续 2).返回主菜单\t[ ]\b\b"); scanf("%d",&w0); } if(c==3) w0=0; if(w0!=0&&c!=3) save(n); }while(w0==1); menu(); } int score_input(int i) { int j; for(j=0;j<M;j++) { printf("分数 %d:",j+1); scanf("%d",&stu[i].score[j]); } return 0; } void average(int i) { int j,sum; for(sum=0,j=0;j<M;j++) sum+=stu[i].score[j]; stu[i].aver=sum*1.0/M; //乘以1.0转为double型 } void printf_one(int i) { int j; printf("%11s %-14s",stu[i].num,stu[i].name); for(j=0;j<M;j++) printf("%9d",stu[i].score[j]); printf(" %9.2f\n",stu[i].aver); } void puts_() { printf("\n\n------------------------------------------------------------------"); } int modify_data(int i,int n) { int c,w1; do { puts("\n你想修改什么:=>\n\n1).学号\t2).姓名\t3).数学\t4).英语\t5).C语言\ \n6).重新输入所有分数\t7).重输所有记录\t8).取消并返回"); printf("输入:[]\b\b"); scanf("%d",&c); if(c>8||c<1) { puts("\n选择失误!严肃点,再来一次!"); getchar(); } }while(c>8||c<1); do { switch(c) { case 1:no_input(i,n); break; case 2:printf("姓名:"); scanf("%s",stu[i].name); break; case 3:printf("数学:"); scanf("%s",stu[i].score[0]); break; case 4:printf("英语:"); scanf("%s",stu[i].score[1]); break; case 5:printf("C语言:"); scanf("%s",stu[i].score[2]); break; case 6:score_input(i); break; case 7:input(i); break; case 8:menu(); } if(c>2&&c<7) average(i); puts("\n现在:\n"); printf_face(); printf_one(i); printf("\n你确定你目前的决定?\n\n\t1).不不,重修改一下!\n\t3).算了还是走吧,别保存了![]\b\b"); scanf("%d",&w1); }while(w1==2); return w1; } void enter() { int i,n; system("cls"); printf("输入你要记录的学生数吧:(1-%d)?\t['0'返回]:\n",N); scanf("%d",&n); if(n==0) menu(); else { printf("\n\t好的!开始输入....\n"); for(i=0;i<n;i++) { printf("\n请输入第%d个的记录\n",i+1); input(i); } if(i!=0) save(n); printf_back(); } } int load() { FILE *fp; int i; if((fp=fopen("yao.txt","rb"))==NULL) { printf("无法打开文件!\n任意键退出程序.......\n"); getch(); return 0; } for(i=0;!feof(fp);i++) fread(&stu[i],sizeof(struct student),1,fp); fclose(fp); return (i-1); } void printf_back() { int w; printf("\n\t操作成功!\n"); printf("\t接着干什么?\n\t1).立刻浏览全部数据\t2).返回:[ ]\b\b"); scanf("%d",&w); if(w==1) browse(); else menu(); } void printf_face() { printf("\n\t学号\t姓名\t\t 数学\t 英语 c语言 平均分\n"); } /**********************************增加学生信息**************************/ int add() { int i,n,m,k; FILE *fp; system("cls"); n=load(); printf("你需要加入多少学生:(0-%d)?:",N-n); scanf("%d",&m); if(m==0) menu(); else { k=m+n; for(i=n;i<k;i++) { printf("\n请输入第%d个学生的记录\n",i-n+1); input(i); } if((fp=fopen("yao.txt","ab"))==NULL) { printf("文件打不开!\n"); getch(); return 0; } for(i=n;i<k;i++) if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("文件写入错误!\n"); fclose(fp); printf_back(); } return 0; } void topput_() { printf("\n 记 录 浏 览 "); printf("\n--------------------------------------------------------------------------------\n"); } void browse() { int i,n; n=load(); system("cls"); topput_(); printf_face(); for(i=0;i<n;i++) printf_one(i); puts_(); printf("\n\t 这里一共有 %d 个记录!\n",n); printf("\n\t 输入任意键返回主菜单... ..."); getch(); menu(); } /*******************************按姓名查找********************************/ void search() { int i,n,k,w1=1,w2,w3,w4; struct student s; system("CLS"); n=load(); do { do { k=-1; printf("\n\n输入你要查找记录的主人公! 姓名:"); scanf("%s",s.name); printf_face(); for(i=0;i<n;i++) if(strcmp(s.name,stu[i].name)==0) { k=i; printf_one(k); } if(k==-1) { printf("\n\n不存在! 请重新输入!"); printf("\n\n要继续吗?\n\t1).继续\t 2).不,我要返回 \t[ ]\b\b"); scanf("%d",&w1); } }while(k==-1 && w1!=2); w4=w3=0; if(k!=-1) { printf("\n\n接着干什么?\n\t1).再次查找 2).修改 3).删除 4).返回主菜单 [ ]\b\b"); scanf("%d",&w2); switch(w2) { case 2:w3=modify_data(k,n);break; case 3: { printf("\n\n你确定了吗?\n\t1).确定 2).不,还是返回吧! \t[ ]\b\b"); scanf("%d",&w4); if(w4==1) stu[k].aver=0; break; } } if(w3==1 || w4==1) { save(n); printf("\n\n操作成功!"); printf("\n\n接着干什么?\n\t1).再次查找 2).返回 [ ]\b\b"); scanf("%d",&w2); } } }while(w2==1); menu(); } /**************************学生成绩排名(按平均成绩排名)***********************/ void order() { int i,j,k,n; struct student s; system("CLS"); n=load(); for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(stu[j].aver>stu[k].aver) k=j; s=stu[i]; stu[i]=stu[k]; stu[k]=s; } save(n); puts("\n\n"); printf_back(); } /* **********************学生信息修改*********************/ void modify() { struct student s; int i,n,k,w0=0,w1,w2=0; n=load(); do { system("CLS"); k=-1; topput_(); printf_face(); for(i=0;i<n;i++) printf_one(i); puts_(); do { printf("\n\n输入你要修改记录的学号! 学号. :\t【'Ctrl-z' 退出】"); if(scanf("%s",s.num)!=1) menu(); for(i=0;i<n;i++) if(strcmp(s.num,stu[i].num)==0) { k=i; s=stu[i]; } if(k==-1) printf("\n\n不存在! 请重新输入~"); }while(k==-1); printf_face(); printf_one(k); w1=modify_data(k,n); if(w1==1) { printf("\n操作成功!\n\n决定修改别的吗?\n\n\t1).是的\t2).不!保存并返回\t[ ]\b\b"); scanf("%d",&w0); w2=1; } else { w0=0; if(w2==1) stu[k]=s; } if(w0!=1 && w2==1) save(n); }while(w0==1); menu(); } /* *************************主界面******************* */ void menu() { int n,w1; do { system("cls"); puts("\t\t\t\t学生信息管理系统\n"); puts("\t\t\t\t\t\t ---何耀"); puts("\t\t*************************主菜单***********************\n"); puts("\t\t1.初始数据输入(会覆盖已有数据)"); puts("\t\t2.可选择个数的数据添加"); puts("\t\t3.数据部分修改"); puts("\t\t4.数据部分删除"); puts("\t\t5.数据查看与浏览"); puts("\t\t6.数据查找(按姓名)"); puts("\t\t7.数据排序(按平均分降序)"); puts("\t\t8.已有文件拷贝"); puts("\t\t0.退出系统"); puts("\t\t*******************************************************\n"); printf("\t\t请输入你的选择(0-8):"); scanf("%d",&n); if(n<0||n>8) { printf("\n\t\t你的选择不在范围内,请重新输入"); /*输入必须是0-8之间*/ getch(); w1=1; } else w1=0; }while(w1==1); /*功能选择*/ switch(n) { case 1:enter(); break; case 2:add(); break; case 3:modify(); break; case 4:del(); break; case 5:browse(); break; case 6:search(); break; case 7:order(); break; case 8:copy(); break; case 0:exit(0); break; } } int main(int argc, char* argv[]) { printf("Hello World!\n"); menu(); return 0; }