/*
* 已经将错误改正. * 建议 id 为字符串型, 加入检测是否惟一. 可以加入很多功能, 希望能做得更好. * 最好是图形界面的. * Welcome to mysite http://www. */ #include "stdio.h" #include "stdlib.h" #include "string.h" #define N 2 struct stu_info{ int id; /*学号*/ char name[20]; /*姓名*/ char major[20]; /*专业*/ float score; /*分数*/ }; struct stu_info student[20]; struct stu_info *p; struct stu_info temp; FILE *fp; /*输入模块*/ int save(){ if((fp=fopen("student.dat","w+"))==NULL){ printf("文件打开失败!\n"); exit(0); } printf("请依次输入 %d 个同学的信息:\n",N); printf("学号\t姓名\t专业\t分数\n"); for(p=student;p<student+N;p++){ scanf(" %d %s %s %f",&(p->id),p->name,p->major,&(p->score)); fwrite(p,sizeof(struct stu_info),1,fp); } printf("输入结束!\n"); fclose(fp); return 0; } /*输出模块*/ int show(){ if((fp=fopen("student.dat","r"))==NULL){ printf("文件打开失败!\n"); exit(0); } printf("文件已经打开,现在显示所有同学的信息.\n"); p=student; printf("学号\t姓名\t专业\t分数\n"); while(fread(p,sizeof(struct stu_info),1,fp)!=0){ printf("%d\t%s\t%s\t%f\n",p->id,p->name,p->major,p->score); p++; } fclose(fp); return 0; } /*建立文件模块*/ int select_id(int sid){ int flag=0; struct stu_info temp; if((fp=fopen("student.dat","r"))==NULL){ printf("文件打开失败!\n"); exit(0); } while(fread(&temp,sizeof(struct stu_info),1,fp)!=0 && flag==0){ if(sid==temp.id){ printf("%d\t%s\t%s\t\t%.2f\n",temp.id,temp.name,temp.major,temp.score); flag=1; break; } } if(flag==0){ printf("这里没有学号为 %d 的记录.\n", sid); } fclose(fp); return 0; } int select_major(char smajor[]){ int flag=0; struct stu_info temp; if((fp=fopen("student.dat","r"))==NULL){ printf("文件打开失败!\n"); exit(0); } while(fread(&temp,sizeof(struct stu_info),1,fp)!=0){ if (strcmp(smajor,temp.major)==0){ printf("%d\t%s\t%s\t%f\n",temp.id,temp.name,temp.major,temp.score); flag=1; } } if(flag==0){ printf("这里没有专业为 %s 的有关记录.\n", smajor); } fclose(fp); return 0; } /*查询模块*/ int search(){ int k,sid; char smajor[20]; printf("选择查询方式:\n"); printf("1.通过学生的学号查询.\n"); printf("2.通过学生的专业查询.\n"); printf("请输入1或2进行查询:\n"); scanf("%d",&k); switch(k){ case 1: printf("请输入学号:\n"); scanf("%d",&sid); select_id(sid); break; case 2: printf("请输入专业:\n"); scanf("%s",smajor); select_major(smajor); break; default: printf("输入有误.\n"); exit(0); } return 0; } /*添加模块*/ int append(){ struct stu_info temp; printf("请输入添加的学生记录信息.\n"); scanf("%d\t%s\t%s\t%f",&(temp.id),temp.name,temp.major,&(temp.score)); if((fp=fopen("student.dat","a+"))==NULL){ printf("文件打开失败!\n"); exit(0); } fseek(fp,sizeof(struct stu_info),1); fwrite(&temp,sizeof(struct stu_info),1,fp); printf("记录已经被添加.\n"); fclose(fp); return 0; } /*修改模块*/ int amend(){ int flag=0; struct stu_info temp; int sid; char smajor[15]; float newscore; if((fp=fopen("student.dat","r+"))==NULL){ printf("文件打开失败!\n"); exit(0); } printf("请输入要修改的学生的学号:\n"); scanf("%d",&sid); while(fread(&temp,sizeof(struct stu_info),1,fp)!=0 && flag==0) if(sid==temp.id){ printf("原来的记录是 %d\t%s\t%s\t%.2f\n",temp.id,temp.name,temp.major,temp.score); printf("请输入正确的专业:\n"); scanf("%s",smajor); printf("请输入正确的分数:\n"); scanf("%f",&newscore); strcpy(temp.major,smajor); temp.score=newscore; printf("现在的记录是 %d\t%s\t%s\t%.2f\n",temp.id,temp.name,temp.major,temp.score); fseek(fp,-sizeof(struct stu_info),1); fwrite(&temp,sizeof(struct stu_info),1,fp); flag=1; printf("记录已经被修改.\n"); break; } if(flag==0) printf("这里没有需要添加的信息.\n"); fclose(fp); return 0; } /*删除模块*/ int deleted(){ int sid; //int del_id=0; int i=0,j; int number=0; printf("请输入需要删除的学生的学号:\n"); scanf("%d",&sid); if((fp=fopen("student.dat","r+"))==NULL){ printf("文件打开失败!\n"); exit(0); } p=student; while(fread(p,sizeof(struct stu_info),1,fp)!=0){ if(sid==p->id){ printf("以下记录将被删除:\n%d\t%s\t%s\t%.2f\n",p->id,p->name,p->major,p->score); i--; } i++; number++; } if(i==number) printf("这里没有需要添加的信息.\n"); else{ printf("最新的文件有 %d 记录.\n",i); rewind(fp); for(j=0;j<i;j++){ printf("%d\t%s\t%s\t%.2f\n",student[j].id,student[j].name,student[j].major,student[j].score); fwrite(&student[j],sizeof(struct stu_info),1,fp); } printf("记录已经被删除.\n"); } fclose(fp); return 0; } /* main program */ int main(){ p=student; int choice; while(1){ printf(" ***************学生管理系统***************\n\n\n"); printf(" 1.输入 %d 个学生信息.\n\n", N); printf(" 2.显示学生的信息.\n\n"); printf(" 3.寻找学生的信息.\n\n"); printf(" 4.修改学生的信息.\n\n"); printf(" 5.添加学生的信息.\n\n"); printf(" 6.删除学生的信息.\n\n"); printf(" 0.退出学生管理系统.\n\n"); printf(" 请选择(0-6):\n"); scanf("%d",&choice); switch(choice){ case 1: save();break; /*输入模块*/ case 2: show();break; /*输出模块*/ case 3: search();break; /*查询模块*/ case 4: amend();break; /*修改模块*/ case 5: append();break; /*添加模块*/ case 6: deleted();break; /*删除模块*/ case 0: exit(0); default:printf("输入的数字有误.\n"); } } return 0; } |
|