读入文档未完成,是个败点
/****************************************************** File name:学生信息管理系统 // 文件名 Author: Sno:1508010317 class:软工1503 Date:2017.3.19 // 作者及完成日期 Description: 1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。 2.将功能补充完全(基于文件处理,完成刷新和保存功能)。 3.将学生信息改为更好的数据组织,而非离散形式(结构体)。 提高要求: 可将程序中的不足(如数据验证)等根据自己的能力与理解完成。 Function List: // 主要函数及其功能 1、menu(); //界面函数 2、insert(STUDENTS t[]); //输入函数 3、list(STUDENTS t[],int n); //显示函数 4、search(STUDENTS t[],int n);//查询函数 5、del(STUDENTS t[],int n); //删除函数 6、save(STUDENTS t[],int n); //保存函数 7、modify(STUDENTS t[],int n);//修改函数 8、load(STUDENTS t[]); //加载函数 9、help(); //帮助函数 10、find_name(STUDENTS t[],int n,char *s); //姓名查找函数 11、find_code(STUDENTS t[],int n,char *no);//学号查找函数 12、sort(STUDENTS t[],int n); //排序函数 History: // 历史修改记录 <author> <time> <desc> 2017.3.19 增加加载函数失败 不能实现读取文件信息 2017.3.19 增加排序函数,成功实现*************************************************/
#include <stdio.h> /**I/O函数**/#include <stdlib.h> /**标准库函数**/#include <string.h> /**字符串函数**/#define N 50 /**最大学生人数**/typedef struct { char code[20]; /**学号**/ char name[20]; /**姓名**/ char sex[5]; /**性别**/ int age; /**年龄**/ float score0; /**C语言成绩**/ float score1; /**高数成绩**/ float score2; /**英语成绩**/} STUDENTS;/**定义数据结构**/
/*****以下所有函数******/int menu(); /**界面函数**/int insert(STUDENTS t[]); /**输入函数**/void list(STUDENTS t[],int n); /**显示函数**/void search(STUDENTS t[],int n);/**查询函数**/int del(STUDENTS t[],int n); /**删除函数**/void save(STUDENTS t[],int n); /**保存函数**/void modify(STUDENTS t[],int n);/**修改函数**/int load(STUDENTS t[]); /**加载函数**/void help(); /**帮助函数**/int find_name(STUDENTS t[],int n,char *s); /**姓名查找函数**/int find_code(STUDENTS t[],int n,char *no);/**学号查找函数**/void sort(STUDENTS t[],int n); /**排序函数**/
/********界面函数********/int menu(){ int c; printf(" ******************************************************\n"); printf(" * 学生信息管理系统 *\n"); printf(" ******************************************************\n"); printf(" *******************系统功能菜单***********************\n"); printf(" ---------------------- ------------------------- \n"); printf(" ********************************************* \n"); printf(" * 0.系统帮助及说明 * * 1.加载学生信息 * \n"); printf(" ********************************************* \n"); printf(" * 2.查询学生信息 * * 3.修改学生信息 * \n"); printf(" ********************************************* \n"); printf(" * 4.增加学生信息 * * 5.按学号删除信息 * \n"); printf(" ********************************************* \n"); printf(" * 6.显示当前信息 * * 7.保存信息到文件 * \n"); printf(" ********************************************* \n"); printf(" * 8.退出系统 * * 9.按学号排序 * \n"); printf(" ********************************************* \n"); printf(" ---------------------- ------------------------ \n"); do{ printf("\n 输入您的菜单选项编号(0-9):"); scanf("%d",&c); }while(c<0 || c>9); return c;}
/********帮助函数********/void help(){ system("cls"); /**清屏**/ printf("\n0.欢迎使用系统帮助!\n"); printf("\n1.初次进入系统后,请先选择 4 增加学生信息;\n"); printf("\n2.按照菜单提示键入数字代号;\n"); printf("\n3.增加学生信息后,切记按 7 保存;\n"); printf("\n4.谢谢您的使用!\n"); getchar();}
/*******增加函数********/int insert(STUDENTS t[]){ int i,n; system("cls");/**清屏**/ printf("\n 请输入待增加学生人数:\n"); scanf("%d",&n); printf("请输入学生记录:\n"); printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n"); printf("....................................................................\n"); for(i=0;i<n;i++) { scanf("%s",t[i].code); /**输入学号**/ scanf("%s",t[i].name); /**输入姓名**/ scanf("%s",t[i].sex); /**输入性别**/ scanf("%d",&t[i].age); /**输入年龄**/ scanf("%f",&t[i].score0); /**C语言成绩**/ scanf("%f",&t[i].score1); /**高数成绩**/ scanf("%f",&t[i].score2); /**英语成绩**/ } getchar(); return n; }
/**查找函数**/void search(STUDENTS t[],int n){ char s[21]; /**以姓名和学号最长长度+1为准**/ system("cls"); /**清屏**/ int i,item; printf("----------------------\n"); printf("-----1.按学号查询-----\n"); printf("-----2.按姓名查询-----\n"); printf("-----3.退出本菜单-----\n"); printf("----------------------\n"); while(1) { printf("请选择子菜单编号:"); scanf("%d",&item); switch(item) { case 1: printf("请输入查找的学号:\n"); /**学号查找**/ scanf("%s",s); getchar(); i=find_code(t,n,s); /**将学号查找函数返回值赋给i**/ if(i>n-1) printf("没有学号为%s的学生! \n",s); else { printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n"); printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n", t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2); } break; case 2: printf("请输入查找的姓名:\n"); /**姓名查找**/ scanf("%s",s); getchar(); i=find_name(t,n,s); /**将姓名查找函数返回值赋给i**/ if(i>n-1) printf("没有姓名为%s的学生! \n",s); else { printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n"); printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n", t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2); } break; case 3:return; /**返回界面函数**/ default:printf("请在1-3之间选择\n"); } }}
/**按姓名查找函数,参数为学生数组和学生总数以及姓名s**/int find_name(STUDENTS t[],int n,char *s){ int i; for(i=0;i<n;i++) { if(strcmp(s,t[i].name)==0) /**比较两者是否相等,相等则返回0**/ return i; } return i;}
/**按学号查找函数,参数为学生数组和学生总数以及学号no**/int find_code(STUDENTS t[],int n,char *no){ int i; for(i=0;i<n;i++) { if(strcmp(no,t[i].code)==0) /**比较两者是否相等,相等则返回0**/ return i; } return i;}
/**修改学生信息函数**/void modify(STUDENTS t[],int n){ char s1[21]; /**以姓名和学号最长长度+1为准**/ int ch=0; int i,item; system("cls"); /**清屏**/ printf("请输入要修改的学生学号:\n"); scanf("%s",s1); for(i=0;i<n;i++) if(strcmp(t[i].code,s1)!=0) { printf("没有找到学号为%s的学生!\n",s1); } else { printf("------------------\n"); printf("1.修改姓名\n"); printf("2.修改年龄\n"); printf("3.修改性别\n"); printf("4.修改C语言成绩\n"); printf("5.修改高等数学成绩\n"); printf("6.修改大学英语成绩\n"); printf("7.退出本菜单\n"); printf("------------------\n"); printf("学号为%s的学生修改前:\n",s1); printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n"); printf("%6s %7s %6s %6d %9.1f %10.1f %10.1f\n", t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2); while(1) { printf("请选择子菜单编号:"); scanf("%d",&item); switch(item) { case 1: printf("请输入新的姓名:\n"); scanf("%s",t[i].name); break; case 2: printf("请输入新的年龄:\n"); scanf("%d",&t[i].age); break; case 3: printf("请输入新的性别:\n"); scanf("%s",t[i].sex); break; case 4: printf("请输入新的C语言成绩:\n");/**C语言成绩**/ scanf("%f",&t[i].score0); break; case 5: printf("请输入新的高等数学成绩:\n"); /**高数成绩**/ scanf("%f",&t[i].score1); break; case 6: printf("请输入新的大学英语成绩:\n");/**英语成绩**/ scanf("%f",&t[i].score2); break; case 7: return; getchar(); default:printf("请在1-7之间选择\n"); } } }}
/**删除函数,参数是结构体数组,记录数**/int del(STUDENTS t[],int n){ char s[21]; int ch=0; int i; system("cls"); /**清屏**/ printf("请输入要删除的学生学号:\n"); scanf("%s",s); getchar(); i=find_code(t,n,s); if(i==n) printf("没有学号为%s的学生! \n",s); else { printf("正在删除中! \n"); for(;i<n;i++) { strcpy(t[i].name,t[i+1].name); strcpy(t[i].code,t[i+1].code); strcpy(t[i].sex,t[i+1].sex); t[i].age=t[i+1].age; t[i].score0=t[i+1].score0; t[i].score1=t[i+1].score1; t[i].score2=t[i+1].score2; } n--; printf("删除成功! \n"); } getchar(); return n;}
/**显示信息,参数为记录数组和总人数**/void list(STUDENTS t[],int n){ int i; system("cls"); printf("****************************学生清单********************************\n"); printf("学生学号 学生姓名 性别 年龄 C语言成绩 高等数学 大学英语成绩\n"); printf("--------------------------------------------------------------------\n"); for(i=0;i<n;i++) { printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n", t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2); } printf("--------------------------------------------------------------------\n"); getchar();}
/****保存函数,参数为结构体数组和总人数****/void save(STUDENTS t[],int n){ int i; FILE * fp ; /**指向文件的指针**/ system("cls"); if((fp=fopen("017.txt","w"))==NULL) /**打开文件,并判断打开是否正常**/ { printf("无法打开学生记录文件! \n"); /**打开失败**/ exit(1); /**退出**/ } printf("\n正在保存中\n"); fprintf(fp,"%d",n); /**将记录数写入文件**/ fprintf(fp,"\r\n"); /**将换行符号写入文件**/ for(i=0;i<n;i++) { fprintf(fp,"%6s %10s %6s %6d %9.1f %10.1f %10.1f", t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2); fprintf(fp,"\r\n"); /**将换行符号写入文件**/ } fclose(fp); /**关闭文件**/ getchar(); printf("--------保存成功---------\n"); /**显示保存成功**/}
/**加载函数,读入参数,参数为结构体数组**/int load(STUDENTS t[]){ int i,n; system("cls"); FILE * fp; if((fp=fopen("017.txt","r"))==NULL) /**打开文件**/ { printf("无法打开学生信息文件! \n"); /**打开失败**/ exit(1); /**退出**/ } fscanf(fp,"%d",&n); /**读入记录数**/ for(i=0;i<n;i++) {/**按格式读入记录**/ fscanf(fp,"%6s %10s %6s %6d %9.1f %10.1f %10.1f", t[i].code,t[i].name,t[i].sex,&t[i].age,&t[i].score0,&t[i].score1,&t[i].score2); } fclose(fp); /**关闭文件**/ printf("已经成功加载学生信息文件! \n"); /**显示保存成功**/ getchar(); return n;}
/**排序函数**/void sort(STUDENTS t[],int n){ int i,j,p1,p2,p3,p4; system("cls"); STUDENTS temp; for(i=0;i<n-1;i++) { for(j=n-1;j>i;j--) if((strcmp(t[j-1].code,t[j].code))>0) /**比较学号大小**/ { /**交换学号**/ strcpy(temp.code,t[j-1].code); strcpy(t[j-1].code,t[j].code); strcpy(t[j].code,temp.code); /**交换姓名**/ strcpy(temp.name,t[j-1].name); strcpy(t[j-1].name,t[j].name); strcpy(t[j].name,temp.name); /**交换性别**/ strcpy(temp.sex,t[j-1].sex); strcpy(t[j-1].sex,t[j].sex); strcpy(t[j].sex,temp.sex); /**交换年龄**/ p1=t[j-1].age; t[j-1].age=t[j].age; t[j].age=p1; /**交换C成绩**/ p2=t[j-1].score0; t[j-1].score0=t[j].score0; t[j].score0=p2; /**交换高数成绩**/ p3=t[j-1].score1; t[j-1].score1=t[j].score1; t[j].score1=p2; /**交换英语成绩**/ p4=t[j-1].score2; t[j-1].score2=t[j].score2; t[j].score2=p2; } } printf("排序成功! \n"); getchar();}
/******主函数******/int main(){ STUDENTS stu[N]; /**定义结构体数组**/ int length; /**定义学号姓名等长度**/ for(;;) /**无限循环**/ { switch(menu()) /**调用界面函数,返回值作为开关语句的条件**/ { case 0:help();break; /**显示操作步骤**/ case 1:load(stu);break; /**加载到内存**/ case 2:search(stu,length);break; /**按姓名查找记录**/ case 3:modify(stu,length);break; /**按学号修改记录**/ case 4:length=insert(stu);break; /**输入记录**/ case 5:length=del(stu,length);break; /**按姓名删除记录**/ case 6:list(stu,length);break; /**显示全部记录**/ case 7:save(stu,length);break; /**保存文件**/ case 8:exit(0); /**程序结束**/ case 9:sort(stu,length);break; /**排序**/ } getchar(); printf("按回车键返回主菜单...\n"); /**提示信息**/ } return 0;}