刚写了一个学生信息管理系统,权当是训练,由于时间仓促,肯定有BUG,如果大家发现了,希望在评论中指出啊!本人不胜感激!(运行平台linux+GCC)
#define LEN sizeof(struct student) #define FORMAT "%-8d|%-15s|%-12.1lf|%-12.1lf|%-12.1lf|%-12.1lf\n" #define DATA stu[i].num,stu[i].name,stu[i].elec,stu[i].expe,stu[i].requ,stu[i].sum #include <stdio.h> #include <stdlib.h> #include <string.h> struct student /*定义学生成绩结构体*/ { int num; /*学号*/ char name[15]; /*姓名*/ double elec; /*选修课*/ double expe; /*实验课*/ double requ; /*必修课*/ double sum; /*总分*/ }; struct student stu[50]; /*声明各模块的函数*/ void input_info(); /*录入学生成绩信息*/ void show_info(); /*显示学生成绩信息*/ void sort_by_sum(); /*按总分排序*/ void delete_info(); /*删除学生成绩信息*/ void modify_info(); /*修改学生成绩信息*/ void menu(); /*主菜单*/ void insert_info(); /*插入学生成绩信息*/ void count_total(); /*计算总人数*/ void search_info(); /*查找学生成绩信息*/ void initialization_info(); /*清空学生成绩信息*/ int main (void) { int choice; menu(); scanf("%d",&choice); while(choice) { switch(choice) { case 1: input_info();break; case 2: search_info();break; case 3: delete_info();break; case 4: modify_info();break; case 5: insert_info();break; case 6: sort_by_sum();break; case 7: count_total();break; case 8: show_info();break; case 9: initialization_info();break; default: printf("未知选项,请重新选择!\n");break; } getchar(); menu(); scanf("%d",&choice); } printf("Good Bye!\n"); } /*这是一个菜单文件,用来打印系统选项*/ void menu() { system("clear"); printf("\n\n\n\n\n"); printf("\t\t---------------------StudentManage---------------------|\n"); printf("\t\t|\t 0.退出 \n"); printf("\t\t|\t 1.输入信息 \n"); printf("\t\t|\t 2.查找信息 \n"); printf("\t\t|\t 3.删除信息 \n"); printf("\t\t|\t 4.修改信息 \n"); printf("\t\t|\t 5.插入信息 \n"); printf("\t\t|\t 6.排序信息 \n"); printf("\t\t|\t 7.统计人数 \n"); printf("\t\t|\t 8.显示信息 \n"); printf("\t\t|\t 9.清空信息 \n"); printf("\t\t--------------------------------------------------------\n\n"); printf("\t\t\t请选择(0~8):"); } void count_total() { FILE *fp; int cnt = 0; if((fp=fopen("../data/data.txt","r+"))==NULL) { printf("文件打开失败!"); getchar(); return; } while(!feof(fp)) if( fread(&stu[cnt],LEN,1,fp) == 1 ) cnt++;/*统计记录个数即学生个数*/ if( cnt == 0 ) { printf("没有记录!"); getchar(); fclose(fp); return; } printf("这个班级有%d个学生!",cnt);/*将统计的个数输出*/ getchar(); fclose(fp); } /*这是一个删除信息的文件*/ void delete_info() { FILE *fp; int snum,i,j,cnt = 0; char ch[2]; if( (fp=fopen("../data/data.txt","r+")) == NULL ) { printf("文件打开失败!"); getchar(); return; } while( !feof(fp) ) if( fread(&stu[cnt],LEN,1,fp) == 1 ) cnt++; fclose(fp); if( cnt == 0 ) { printf("没有记录!"); getchar(); return; } printf("请输入要删除的学号:"); scanf("%d",&snum); for(i=0;i<cnt;i++) if( snum == stu[i].num ) break; printf("找到该学生,删除吗?(y/n):"); scanf("%s",ch); if( strcmp(ch,"Y") == 0 || strcmp(ch,"y") == 0 ) for(j=i;j<cnt-1;j++) stu[j] = stu[j+1]; cnt--; if( (fp=fopen("../data/data.txt","wb")) == NULL ) { printf("文件打开失败!"); getchar(); return; } for(j=0;j<cnt;j++) { if( fwrite(&stu[j],LEN,1,fp) != 1) { printf("删除失败!"); getchar(); } } if( j == cnt ) { printf("删除成功!"); getchar(); } fclose(fp); } void input_info() { int i; int cnt = 0; char ch[2]; FILE *fp; if( (fp=fopen("../data/data.txt","a+")) == NULL ) { printf("文件打开失败!"); getchar(); return; } while( !feof(fp) ) { if( fread(&stu[cnt],LEN,1,fp) == 1 ) cnt++; } fclose(fp); if( cnt == 0 ) printf("没有记录!\n"); else { system("clear"); show_info(); } if( (fp=fopen("../data/data.txt","wb")) == NULL ) { printf("文件打开失败!"); getchar(); return; } for(i=0;i<cnt;i++) fwrite(&stu[i],LEN,1,fp); printf("要写入信息吗?(y/n):"); scanf("%s",ch); while( strcmp(ch,"Y") == 0 || strcmp(ch,"y") == 0 ) { loop:printf("请输入学号:"); scanf("%d",&stu[cnt].num); for(i=0;i<cnt;i++) if( stu[i].num == stu[cnt].num ) { printf("学号有重复,请重新输入!\n"); goto loop; } printf("请输入姓名:"); scanf("%s",&stu[cnt].name); printf("请输入选修课成绩:"); scanf("%lf",&stu[cnt].elec); printf("请输入实验课成绩:"); scanf("%lf",&stu[cnt].expe); printf("请输入必修课成绩:"); scanf("%lf",&stu[cnt].requ); stu[cnt].sum = stu[cnt].elec + stu[cnt].expe + stu[cnt].requ; if( fwrite(&stu[cnt],LEN,1,fp) != 1 ) { printf("保存失败!\n"); getchar(); } else { printf("保存成功!\n"); cnt++; } printf("继续输入信息吗?(y/n):"); scanf("%s",ch); } fclose(fp); printf("操作完成!"); getchar(); } void insert_info() { FILE *fp; int i,j,k,snum,cnt = 0; if( (fp=fopen("../data/data.txt","r+")) == NULL ) { printf("文件打开失败!"); getchar(); return; } while( !feof(fp) ) if( fread(&stu[cnt],LEN,1,fp) == 1 ) cnt++; if( cnt == 0 ) { printf("没有记录!\n"); getchar(); return; } fclose(fp); show_info(); loop:printf("请输入你想插入的位置(某个学号的后面):"); scanf("%d",&snum); for(i=0;i<cnt;i++) if( snum == stu[i].num ) break; if( i == cnt ) { printf("没有找到该学号!请重新输入\n"); goto loop; } for(j=cnt-1;j>=i;j--) stu[j+1] = stu[j]; printf("请输入新的信息!\n"); retype:printf("请输入学号:"); scanf("%d",&stu[i].num); for(k=0;k<=cnt;k++) if( k != i && stu[k].num == stu[i].num ) { printf("学号已存在,请重新输入!\n"); goto retype; } printf("请输入姓名:"); scanf("%s",&stu[i].name); printf("请输入选修课成绩:"); scanf("%lf",&stu[i].elec); printf("请输入实验课成绩:"); scanf("%lf",&stu[i].expe); printf("请输入必修课成绩:"); scanf("%lf",&stu[i].requ); stu[i].sum = stu[i].elec + stu[i].expe + stu[i].requ; if( (fp=fopen("../data/data.txt","wb")) == NULL ) { printf("文件打开失败!"); getchar(); return; } for(k=0;k<=cnt;k++) if( fwrite(&stu[k],LEN,1,fp) != 1 ) { printf("保存失败!"); getchar(); } if( k == cnt+1 ) { printf("保存成功!"); getchar(); } fclose(fp); } void modify_info() { FILE *fp; int i,j,m=0,snum; if( (fp=fopen("../data/data.txt","r+")) == NULL ) { printf("文件打开失败!!!!"); getchar(); return; } while(!feof(fp)) if(fread(&stu[m],LEN,1,fp)==1) m++; if( m == 0 ) { printf("没有记录!"); getchar(); fclose(fp); return; } show_info(); printf("请输入你想修给的信息!\n"); loop:printf("请输入学号:"); scanf("%d",&snum); for(i=0;i<m;i++) if(snum==stu[i].num)/*检索记录中是否有要修改的信息*/ break; if(i == m) { printf("没有你输入的学生!请重新输入!"); goto loop; } printf("找到该学生,你可以修改!\n"); printf("请输入姓名:"); scanf("%s",stu[i].name);/*输入名字*/ printf("请输入选修课的成绩:"); scanf("%lf",&stu[i].elec);/*输入选修课成绩*/ printf("请输入实验课的成绩:"); scanf("%lf",&stu[i].expe);/*输入实验课成绩*/ printf("请输入必修课的成绩:"); scanf("%lf",&stu[i].requ);/*输入必修课成绩*/ printf("修改成功!\n"); stu[i].sum=stu[i].elec + stu[i].expe + stu[i].requ; if( (fp=fopen("../data/data.txt","wb")) == NULL ) { printf("文件打开失败!"); getchar(); return; } for(j=0;j<m;j++)/*将新修改的信息写入指定的磁盘文件中*/ if(fwrite(&stu[j] ,LEN,1,fp)!=1) { printf("保存失败!"); getchar(); } if( j == m ) { printf("保存成功!"); getchar(); } fclose(fp); } void search_info() { FILE *fp; int snum,i,cnt = 0; char ch[2]; if( (fp=fopen("../data/data.txt","rb")) == NULL ) { printf("文件打开失败!"); getchar(); return; } while( !feof(fp) ) if( fread(&stu[cnt],LEN,1,fp) == 1 ) cnt++; fclose(fp); if( cnt == 0 ) { printf("没有记录!"); getchar(); return; } printf("请输入要查询的学号:"); scanf("%d",&snum); for(i=0;i<cnt;i++) if( snum == stu[i].num ) { printf("找到该学生,是否查询?(y/n):"); scanf("%s",ch); if( strcmp(ch,"Y") == 0 || strcmp(ch,"y") == 0 ) { printf("学号 姓名 选修课 实验课 必修课 总分\t\n"); printf(FORMAT,DATA); getchar(); break; } } if( i == cnt ) { printf("没有找到该学生!"); getchar(); } } void show_info() { FILE *fp; int i,m=0; fp=fopen("../data/data.txt","rb"); while( !feof(fp) ) { if( fread(&stu[m] ,LEN,1,fp ) == 1 ) m++; } fclose(fp); if( m == 0 ) { printf("没有记录!"); getchar(); return; } printf("------------------------------------------------------------------------\n"); printf("学号 |姓名 |选修课 |实验课 |必修课 |总分\t\n"); for(i=0;i<m;i++) { printf(FORMAT,DATA);/*将信息按指定格式打印*/ } printf("------------------------------------------------------------------------\n"); getchar(); } void sort_by_sum() { FILE *fp; struct student t; int i=0,j=0,m=0; if( (fp=fopen("../data/data.txt","r+")) == NULL ) { printf("文件打开失败!"); getchar(); return; } while(!feof(fp)) if(fread(&stu[m] ,LEN,1,fp)==1) m++; fclose(fp); if( m == 0 ) { printf("没有记录!"); getchar(); return; } if( (fp=fopen("../data/data.txt","wb")) == NULL ) { printf("文件打开失败!!!"); getchar(); return; } for(i=0;i<m-1;i++) for(j=i+1;j<m;j++)/*双重循环实现成绩比较并交换*/ if(stu[i].sum<stu[j].sum) { t=stu[i]; stu[i]=stu[j]; stu[j]=t; } for(i=0;i<m;i++)/*将重新排好序的内容重新写入指定的磁盘文件中*/ if(fwrite(&stu[i] ,LEN,1,fp)!=1) { printf("保存失败!"); getchar(); } fclose(fp); printf("保存成功!\n"); getchar(); } void initialization_info() { FILE *fp; if((fp=fopen("../data/data.txt","w")) == NULL ) { printf("清空失败!"); getchar(); } else { printf("清空成功!"); getchar(); } return; }