沈 阳 航 空 航 天 大 学 北 方 科 技 学 院
课程设计任务书
题目:机房上机管理系统(2)
一、课程设计时间
2012年7月9日至2012年7月15日。
二、课程设计内容
用C语言编写软件完成以下任务:
1数据信息(学生的学号,姓名,系别,上机种类,存的机时数等)录入,保存在comp.dat文件中; 2存机时票;
3查询某学生上机信息。
三、课程设计要求
1. 程序质量:
贯彻结构化的程序设计思想。
用户界面友好,功能明确,操作方便。
用户界面中的菜单至少应包括“数据信息录入”、“学生存机时处
理”、“查询某生上机信息”、“退出”4项。
代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2. 课程设计说明书:
课程结束后,上交课程设计说明书和源程序。课程设计说明书的格式和内容参见提供的模板。
四、指导教师和学生签字
指导教师:________ 学生签名:________
I
沈 阳 航 院 设 计 用 纸
目录
一、需求分析 ...................................................... 1 二、程序流程图 .................................................. 2 三、模块设计说明 .............................................. 6 四、课设总结 ...................................................... 15 五、参考文献 ...................................................... 16 六、源程序 .......................................................... 16
II
沈 阳 航 院 设 计 用 纸
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为八个模块,其中每一个模块对应一个函数,它们分别是:可以调用其他各函数的主函数(main), 主菜单函数(menu), 读取文件内容函数(read),添加录入学生数据信息函数(add), 显示学生上机信息函数(show), 添加更改机时函数(change),查询学生数据信息函数(query)以及退出系统函数。
1、main函数:显示目录;
2、menu函数:在用户界面首页输出简单的操作界面,使用户在使用时更加明了方便;
3、read函数:主要通过FILE *fp=fopen(),实现文件内容的读取;
4、add函数: 主要实现程序最初运行时学生数据的录入以及其后运行中学生数据的添加功能;
5、show函数:实现的是显示学生上机信息的功能; 6、change函数:当输入一个学生的学号可把键盘输入的
1
沈 阳 航 院 设 计 用 纸
数据添加到该学生数据的机时里;
7、query函数:实现的功能是按照学号对学生的数据信息进行查询;
8、exist(0)函数:在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
二、程序流程图
1、程序总体结构图
输入n Switch(n) n=1添加录入学生信息 void add() n=2 显示学生上机信息 void show() n=3添加更改机时 void change() n=4 查询学生信息 void query() n=5退出程序 void exit(0)
2
沈 阳 航 院 设 计 用 纸
图1 程序总体结构图
2、具体功能框图 (1) read函数
开始 以rb方式打开文件 真 假 文件打开失败 结束 return
图2 read函数图
(2)add函数
3
沈 阳 航 院 设 计 用 纸
开始 以读或写方式打开e盘文件comp.dat 录入学生人数n且写入文件,定义循环变量i=1 i 沈 阳 航 院 设 计 用 纸 图3 add函数图 (3)change函数 开始 请输入要修改的学生学号 输入的学号和保存中的学号 相匹配 真 输入充入机时 假 无此学生信息 将修改的学生数据保存 输出机时修改成功!! Return 结束 图4 Change函数图 (4)query函数 5 沈 阳 航 院 设 计 用 纸 开始 输入待查学生学号 真 记录中无该学生的学号 假 输出该生信息 没有找到该学生信息 return 结束 图5 query函数图 三、模块设计说明 1、打开并读取文件(图2),通过定义了一个文件型的指针变量FILE *fp=fopen(),实现文件内容的读取。 具体程序如下: void read(struct student stu[N],int *n) { FILE *fp; 6 沈 阳 航 院 设 计 用 纸 int i=0; if((fp=fopen(\"e:\\\\comp.dat\ { printf(\"文件打开失败!\\n\"); return; } else { for(i=0;!feof(fp);i++)/*检查fp所指文件是否结束*/ fscanf(fp,\"%s%s%s%s%f\m,stu[i].kind,&stu[i].hour); } *n=i; fclose(fp); } 2、添加录入学生信息(图3),主要实现程序最初运行时学生数据的录入以及其后运行中学生数据的添加功能,注 7 沈 阳 航 院 设 计 用 纸 意要考虑到要查询的学生是否存在这一情况。 具体程序如下: void add()/*添加录入学生信息*/ {FILE *fp; int n,i; struct student stu; if((fp=fopen(\"e:\\\\comp.dat\当学生文件已经存在时,在已有的信息末尾添加新信息*/ { printf(\"请输入要添加的学生数量,按回车键确认:\"); scanf(\"%d\ fseek(fp,0L,2); for(i=1;i<=n;i++) { printf(\"\\n请输入第%d个学生的学号,姓名,系别,上机种类,用空格分开,并按回车键确认:\\n\ scanf(\"%s%s%s%s\ printf(\"\\n请输入第%d个学生的初始机时,并按回车 8 沈 阳 航 院 设 计 用 纸 键确认:\\n\ scanf(\"%f\ fprintf(fp,\"\\n %s %s %s %s %f\,stu.kind,stu.hour); /*把信息写入comp.dat*/ } } else { if((fp=fopen(\"e:\\\\comp.dat\当学生文件不存在时,新建学生文件并添加信息*/ { printf(\"请输入要添加的学生数量,按回车键确认: \"); scanf(\"%d\ for(i=1;i<=n;i++) 9 沈 阳 航 院 设 计 用 纸 { printf(\"\\n请输入第%d个学生的学号,姓名,系别,上机种类,用空格分开,并按回车键确认:\\n\ scanf(\"%s%s%s%s\*键入学生信息*/ printf(\"\\n请输入第%d个学生的初始机时,并按回车键确认:\\n\ scanf(\"%f\ fprintf(fp,\"\\n%s %s %s %s %f\stu.kind,stu.hour); } } } fclose(fp); } 3、显示所有学生信息,指的是上机的情况。 10 沈 阳 航 院 设 计 用 纸 void show()/*显示所有学生信息*/ {struct student stu[N]; int i,n; read(stu,&n);/*从文件中读出所有学生信息*/ printf(\" *****************所有的学生信息如下*****************\"); for(i=0;i :%10s\\n 剩 余 机 时%6.3f\\n\u[i].hour); } 4、添加更改机时(图4),打开文件,当要查询的学生存在时,输入该学生的学号就可把要存入的机时添加到该学生数据的机时里。 具体程序如下: void change()/*添加更改机时*/ {struct student stu[N],temp; 11 沈 阳 航 院 设 计 用 纸 int n,i; float j; FILE *fp; printf(\"\\n请输入更改信息学生的学号,按回车键确认:\"); scanf(\"%s\ read(stu,&n);/*从文件中读出所有学生信息*/ for(i=0;i break; if(i>=n) {printf(\"无此学生信息!\"); return; } printf(\"\\n请输入要充入的机时,按回车键确认:\\n\"); scanf(\"%f\ stu[i].hour=stu[i].hour+j;/*添加后的机时*/ 12 沈 阳 航 院 设 计 用 纸 if((fp=fopen(\"e:\\\\comp.dat\ {printf(\"打开文件失败!\"); return; } for(i=0;i printf(\"机时修改成功!\"); } 5、按照学号查询学生信息(图5),按照学号对学生的数据信息进行查询,可以具体到某一个学生,先输入一个学号,看是否与已有学号相同,是就输出此学生信息,否则输出“没有找到该学生信息!”。 具体程序如下: void query()/*查询学生信息*/ { 13 沈 阳 航 院 设 计 用 纸 struct student stu[N]; char number[20]; int i,n; read(stu,&n);/*从文件中读出所有学生信息*/ printf(\"\\n请输入待查询学生的学号,按回车键确认:\\n\"); scanf(\"%s\ for(i=0;i if(i>=n) {printf(\"没有找到该学生信息!\\n\"); return; } else 种 printf(\"\\n学号:%7s\\n姓名:%8s\\n系别:%10s\\n上机 类 :%10s\\n 剩 余 机 时%6.3f\\n\u[i].hour); } 14 沈 阳 航 院 设 计 用 纸 四、课设总结 为期两周的课程设计结束了,经过这一个周的课设,我学到了很多,也领悟了许多。开始我都不知道如何下手,经过与老师、同学的探讨,我明白了,要想解决这个问题,首要问题就是如何将信息录入文件,并且将学生数据定义为结构体类型会比较简单,最重要的是要做到保证学生数据的一致性以及数据的永久性保存,以便每次运行都能采用原数据。 从我看到课设题目到完成编程,我发现自己的编程能力其实很差,虽然在此之前进过培训班,拿到国家二级证书,但是并没有学到真正的本事,计算机的编程远远超出了我的想象,“学无止境”看来一点没错,尤其是在这样一个信息化飞速发展的时代,必须不断的用技术和知识去武装自己,更新自己,否则就会跟不上时代发展的潮流。在编程过程中,即使一个小小的错误都会使程序运行不出来,使我再次深刻体会到细心的重要„„总之,这一个周的课设没有白费时间,它让我能够系统地去解决一个看似 15 沈 阳 航 院 设 计 用 纸 复杂的问题,使我的思维变得缜密。这次课设,对于我来说,绝对是一次锻炼,对于今后的学习,生活,工作,更是有力无害的。 五、参考文献 1 谭浩强.C程序设计.北京:清华大学出版社,2007 2 刘成等.C语言程序设计实验指导与习题集.北京:中国铁道出版社,2006 3 杨振山等,大学计算机基础,高等教育出版社2004 六、源程序 /****************头文件**************/ #include 16 沈 阳 航 院 设 计 用 纸 #include #define N 20 /*宏定义*/ /****************结构体****************/ struct student {char num[20]; /*学号*/ char name[10]; /*姓名*/ char system[20]; /*系别*/ char kind[10]; /*上机种类*/ float hour; /*机时*/ }; void menu(); void read(struct student stu[N],int *n); void add(); void query(); void change(); void show(); void main() { 17 沈 阳 航 院 设 计 用 纸 int n; while(1) { menu(); printf(\"\\n 请输入您要选择的操作序号,按回车键确认:\"); scanf(\"%d\ switch(n) {case 1: add();break; case 2: show();break; case 3: change();break; case 4: query();break; case 5: exit(0); default: printf(\"输入错误,请输入列表中存在的序号!\\n \"); } } 18 沈 阳 航 院 设 计 用 纸 } void menu() {printf(\"************************* 机房上机管理系统 ************************* \"); printf(\"\\n 1 添加录入学生数据信息\"); printf(\"\\n 2 显示学生上机信息 \"); printf(\"\\n 3 添加更改机时 \"); printf(\"\\n 4 学生信息查询 \"); printf(\"\\n 5 退出 \"); } void read(struct student stu[N],int *n) { FILE *fp; int i=0; if((fp=fopen(\"e:\\\\comp.dat\ 19 沈 阳 航 院 设 计 用 纸 { printf(\"文件打开失败!\\n\"); return; } else { for(i=0;!feof(fp);i++)/*检查fp所指文件是否结束*/ fscanf(fp,\"%s%s%s%s%f\m,stu[i].kind,&stu[i].hour); } *n=i; fclose(fp); } void add()/*添加录入学生信息*/ {FILE *fp; int n,i; 20 沈 阳 航 院 设 计 用 纸 struct student stu; if((fp=fopen(\"e:\\\\comp.dat\当学生文件已经存在时,在已有的信息末尾添加新信息*/ { printf(\"请输入要添加的学生数量,按回车键确认:\"); scanf(\"%d\ fseek(fp,0L,2); for(i=1;i<=n;i++) { printf(\"\\n请输入第%d个学生的学号,姓名,系别,上机种类,用空格分开,并按回车键确认:\\n\ scanf(\"%s%s%s%s\ printf(\"\\n请输入第%d个学生的初始机时,并按回车键确认:\\n\ scanf(\"%f\ fprintf(fp,\"\\n %s %s %s %s %f\,stu.kind,stu.hour); /*把信息写入comp.dat*/ 21 沈 阳 航 院 设 计 用 纸 } } else { if((fp=fopen(\"e:\\\\comp.dat\当学生文件不存在时,新建学生文件并添加信息*/ { printf(\"请输入要添加的学生数量,按回车键确认: \"); scanf(\"%d\ for(i=1;i<=n;i++) { printf(\"\\n请输入第%d个学生的学号,姓名,系别, 上机种类,用空格分开,并按回车键确认:\\n\ scanf(\"%s%s%s%s\*键入学生信息*/ 22 沈 阳 航 院 设 计 用 纸 printf(\"\\n请输入第%d个学生的初始机时,并按回车键确认:\\n\ scanf(\"%f\ fprintf(fp,\"\\n%s %s %s %s %f\stu.kind,stu.hour); } } } fclose(fp); } void show()/*显示所有学生信息*/ {struct student stu[N]; int i,n; read(stu,&n);/*从文件中读出所有学生信息*/ printf(\" *****************所有的学生信息如下 23 沈 阳 航 院 设 计 用 纸 *****************\"); for(i=0;i :%10s\\n 剩 余 机 时%6.3f\\n\u[i].hour); } void change()/*添加更改机时*/ {struct student stu[N],temp; int n,i; float j; FILE *fp; printf(\"\\n请输入更改信息学生的学号,按回车键确认:\"); scanf(\"%s\ read(stu,&n);/*从文件中读出所有学生信息*/ for(i=0;i 沈 阳 航 院 设 计 用 纸 if(strcmp(temp.num,stu[i].num)==0)/*把输入的学号和已有的学号相比对*/ break; if(i>=n) {printf(\"无此学生信息!\"); return; } printf(\"\\n请输入要充入的机时,按回车键确认:\\n\"); scanf(\"%f\ stu[i].hour=stu[i].hour+j;/*添加后的机时*/ if((fp=fopen(\"e:\\\\comp.dat\ {printf(\"打开文件失败!\"); return; } for(i=0;i 25 沈 阳 航 院 设 计 用 纸 fclose(fp); printf(\"机时修改成功!\"); } void query()/*查询学生信息*/ { struct student stu[N]; char number[20]; int i,n; read(stu,&n);/*从文件中读出所有学生信息*/ printf(\"\\n请输入待查询学生的学号,按回车键确认:\\n\"); scanf(\"%s\ for(i=0;i if(i>=n) {printf(\"没有找到该学生信息!\\n\"); return; } else 26 沈 阳 航 院 设 计 用 纸 种 printf(\"\\n学号:%7s\\n姓名:%8s\\n系别:%10s\\n上机 类 :%10s\\n 剩 余 机 时%6.3f\\n\u[i].hour); } 27 因篇幅问题不能全部显示,请点此查看更多更全内容