C课设报告多功能上课点名系统.doc

上传人:小飞机 文档编号:1612514 上传时间:2022-12-10 格式:DOC 页数:41 大小:1.60MB
返回 下载 相关 举报
C课设报告多功能上课点名系统.doc_第1页
第1页 / 共41页
C课设报告多功能上课点名系统.doc_第2页
第2页 / 共41页
C课设报告多功能上课点名系统.doc_第3页
第3页 / 共41页
C课设报告多功能上课点名系统.doc_第4页
第4页 / 共41页
C课设报告多功能上课点名系统.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C课设报告多功能上课点名系统.doc》由会员分享,可在线阅读,更多相关《C课设报告多功能上课点名系统.doc(41页珍藏版)》请在三一办公上搜索。

1、C语言课程设计实习报告专 业:地空学院 学 号: 班级序号: 姓 名: 指导教师: 目录一、C语言课程设计的目的3二.题目:自动点名系统3三、总体设计3四 详细设计61 结构体及函数62 主函数73 各函数设计9五 上机操作24学 习 心 得30六、算法和系统的优缺点31七 :原代码(附录)31C语言程序设计报告(实习日期: 2013-12至2014-1)一、C语言课程设计的目的高级语言课程设计是学习完高级语言程序设计课程后进行的一次全面的综合性上机实验。其目的在于为同学提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼同学的分析解决实际问题的能力。提高学生适

2、应实际,实践编程的能力。二.题目:自动点名系统 需求分析:设计一个供教师上课使用的自动点名系统,满足实际点名中的以下功能 1 计算机随机选取学生,进行点名。 2 可以记录学生是否到课。 3 查询历史记录,包括已经点过的学生记录和旷课的学生记录。 4 点名时有公平性,任意两个人被点次数差不超过一次(不包括有旷课记录的学生)。 5 对旷过课的学生单独点名。 6 清除历史记录。 7 系统功能清晰、使用方便。 8 用文件记录点名、旷课的数据。三、总体设计系统由6个模块组成: 点名系统连续点名模块(pickc))多人点名模块 (pickn)浏览历史模块(printrecord)点旷过课学生模块 (pic

3、khistory)清除模块 (clear)退出模块(exit)连续点名模块:输入c(choose)点一个人,输入e(end)返回主菜单,每次点人后输入学生的到课情况(y/n)。连续点名模块(pickc)选出一个学生是否到课?(y/n)继续点名?(c/e)多人点名模块:根据输入的要点名人数点名,同时记录到课情况,点完后返回主菜单 多人点名模块 (pickn)输入点名人数记录到课情况返回主菜单浏览历史模块:选择后显示历史记录(点名记录、到课记录)。 点旷课学生模块:额外点所有有旷到记录的学生,不计入总点名次数,但如果又旷到,则旷到次数加一。此次上课点名(此次运行程序)已经由前两个模块点到的,不会出

4、现在这个模块。(即不会出现一个旷到学生被意外记两次的情况)点旷过课学生模块 (pickhistory)点名,记录到课情况返回菜单清除模块:清除历史记录。退出模块:退出程序。四 详细设计1 结构体及函数 学生信息(姓名、学号)存在结构体Student中,各功能由函数实现。 #include #include#include #include #include #define N 57typedef struct /存储学生信息char num9;char name7;Student;void choose(Student *stu,int *a,int *b,int *c); /choose a

5、 studentint minimum(int *a); /数组最小值函数void function(Student *stu,int *a,int *b,int *c); /主菜单函数void pickn(Student *stu,int *a,int *b,int *c); /选多个学生的函数void pickc(Student *stu,int *a,int *b,int *c); /连续选学生的函数void pickhistory(Student *stu,int *b,int *c); /点旷到学生的函数void printrecord(Student *stu,int *a,int

6、 *b); /浏览历史函数void read(Student *stu); /读取student.txt的函数void saverecord(int *a,int *b); /存储历史记录到sturecord.dat的函数void loadrecord(int *a,int *b); /读取文件 sturecord.dat的函数void clear(int *a,int *b); /清除历史记录函数void title(); /打印标题函数void menu(); /打印目录函数void borderup(); /打印上边界函数void borderdown(); /打印下边界函数2 主函数

7、主函数有读取学生信息、读取历史记录、显示菜单、点名、存储信息的功能,全部用函数实现。int main()int aN=0,bN=0,cN=0; /a,b,c数组分别存被点次数、Student stuN; /旷课次数、本次上课是否被点srand(unsigned)time(NULL); read(stu); loadrecord(a,b);title();menu(); function(stu,a,b,c);saverecord(a,b);return 0; 结束开始显示功能判断 根据判断的值调用各功能模块函数3 各函数设计(1) 存读数据函数1 从student.txt读取学生信息的函数vo

8、id read(Student *stu)FILE *fp;int i; /circulate char c,d5,e,*p; /c判断是否为名字的字符,d存名字后的空格与回车,e存中间的空格fp=fopen(students.txt,r); /open fileif(fp=NULL) printf(file dont exist!n); exit (0);for(i=0;iN;i+) /存信息到 stu57fgets(stui.num,9,fp); /学号e=fgetc(fp);p=&stui.name; /名字c=0;while(c!=t)c=fgetc(fp);if(c!=t)*p=c;

9、p+;else*p=0;fgets(d,5,fp);fclose(fp);2 保存点名记录到sturecord.dat的函数void saverecord(int *a,int *b)FILE *fp;if(fp=fopen(sturecord.dat,wb)=NULL)printf(cant open a file to save datan);exit (0);if(fwrite(a,sizeof(int),N,fp)!=N) /二进制方式存数据printf(file write error (array a)n);if(fwrite(b,sizeof(int),N,fp)!=N)prin

10、tf(file write error (array b)n);fclose(fp);3 从sturecord.dat读取点名记录的函数void loadrecord(int *a,int *b)FILE *fp;if(fp=fopen(sturecord.dat,rb)=NULL)printf(cant open sturecord.datan run it again!na); saverecord(a,b); /如果 sturecord.data不存在则新建立一个 exit (0);if(fread(a,sizeof(int),N,fp)!=N)printf(file read erro

11、r (array a)n);if(fread(b,sizeof(int),N,fp)!=N)printf(file read error (array b)n);fclose(fp);(2)基本函数1 数组最小值函数 求数组中的最小值,由choose函数调用,choose函数中的随机数r要满足ar=miminum(a)才使用。即每次只点被点过次数最少的学生。int minimum(int *a)int mi,i;mi=a0;for(i=0;iai)mi=ai; return (mi);2 点名函数 Choose函数可以用随机数r从stuN结构体中随机选择一个再输出相应学生信息,aN记录下被点学

12、生(ar+;),之后可以用bN记录学生是否到课(y/n)。cN记录此次课(此次运行程序)的点名,不保存到sturecord.dat,用于防止此次上课点名已经由随机点名模块(pickn,pickc)点到的,不会出现在旷到学生点名模块(pickhistory)。将在pickc、pickn函数中调用。 void choose(Student *stu,int *a,int *b,int *c)int r;char yon,e; /yon yes or no ,e接收回车dor=rand()%N; /r为0到N-1的随机数 while(ar!=minimum(a);ar+; /记录下被点学生cr+;p

13、rintf( %sn,stur.name);printf( %sn,stur.num);printf(n Enter y or n to record attendance: bb);yon=getchar();e=getchar(); /接收回车putchar(n);if(yon=n)br+; /记录旷到printf( *n); printf( the absence has been saved.n);printf( *nn); (3)功能模块 1 连续点名函数输入c 点名,直到输入e时结束void pickc(Student *stu,int *a,int *b,int *c) /参数在

14、调用chooses时使用char coe=c,e; /coe控制点名或是结束,e 接收回车borderup(); /打印边界,每个功能函数开始结尾都有 /使程序运行时显得清晰while(coe=c)printf( Enter c to choose,enter e to end: bb);coe=getchar();e=getchar();if(coe=c)putchar(n); choose(stu,a,b,c); borderdown();2 点n人函数输入要点的人数点名void pickn(Student *stu,int *a,int *b,int *c)int n,i,e;borde

15、rup();printf( How many students do you want to check? bb);scanf(%d,&n);e=getchar();printf(n);for(i=0;in;i+)choose(stu,a,b,c);borderdown();3 浏览历史模块显示被点情况、旷到情况void printrecord(Student *stu,int *a,int *b)int i;borderup();printf( name number of being picked number of absence numbern);for(i=0;iN;i+)print

16、f(%6s %d %d %sn,stui.name,ai,bi,stui.num); borderdown();4 点旷到学生模块点所有有旷到记录的学生,完成显示finish。因为不随机,不调用choose。void pickhistory(Student *stu,int *b,int *c)int i,yon,e; borderup();for(i=0;iN;i+)if(bi!=0 & ci=0) /有旷到记录且这节课还没点过的 /后半段与choose 函数一致printf( %sn,stui.name); printf( %sn,stui.num); printf(nEnter y or

17、 n to record attendance: bb); yon=getchar(); e=getchar(); putchar(n); if(yon=n) bi+; printf( *n); printf( the absence has been saved.n); printf( *nn); printf(finish!n);borderdown();5 清除模块用saverecord函数使历史记录sturecord.dat恢复到原始值。void clear(int *a,int *b)int i;for(i=0;iN;i+)ai=0;bi=0; saverecord(a,b);pri

18、ntf( All record has been clear successfully.nnn);删除模块:用户输入要删除的信息,如输入歌曲名 ,根据歌曲名找到其他记录并删除。程序void delete() int j,v,c;char w20; FILE *fp;printf(Please input the songname which you want to delete:);scanf(%s,w); fp=fopen(data.txt,rb); for(j=0;j100;j+) if(fread(&danj,sizeof(struct system),1,fp)!=1) break;v

19、=j;for(j=0;jv;j+) if(strcmp(w,danj.name)=0)c=j; fclose(fp);fp=fopen(data.txt,wb); for(j=0;jv;j+) if(j!=c) fwrite(&danj,sizeof(struct system),1,fp); fclose(fp);printf(Delete OK!n);i-;(4)菜单函数菜单函数调用五个功能函数实现菜单的功能,return回到主函数存储数据后程序结束。void function(Student *stu,int *a,int *b,int *c)char f,e; /f存选择 e 存回车w

20、hile(1)printf( Enter function number: bb);scanf(%c,&f);e=getchar();switch(f)case 1:pickc(stu,a,b,c);break;case 2:pickn(stu,a,b,c);break;case 3:printrecord(stu,a,b);break;case 4:pickhistory(stu,b,c);break;case 5:clear(a,b);break;case 6:printf(n );return;break;default:menu(); /menu函数打印功能及对应数字 (5)打印界面函

21、数void title()printf(*n);printf(* *n);printf(* ROLL CALL SYSTEM *n);printf(* *n);printf(* *n); void menu()borderup();printf(Instruction:n);printf( 1:choose one student each timen);printf( 2:choose several studentsn);printf( 3:open history recordn);printf( 4:choose students who have absence recoredn);

22、printf( 5:clear historyn);printf( 6:exitn);printf( (default:show this instruction again)n);borderdown();void borderup()printf(-n);void borderdown() printf(-nnnn);清除记录退出连续点名点旷到学生历史记录点多人结束选择功能保存数据读入数据开始 程序的流程图如上五 上机操作1 主菜单函数2 连续点名功能 3 多人点名功能4浏览历史模块5 点旷到学生模块6删除记录模块7 退出模块学 习 心 得这次C语言课程设计让我学到了很多东西,有了自己设计

23、程序、编写程序的经验,可以自己解决编程过程中的遇到的困难与问题。一开始随机数不会写,到网上查阅了资料学会了随机数需要的函数。文件的读写也碰到了很多问题,编写从student.txt读信息到结构体的函数用了很长时间,刚写的时候不是字符数目不对,就是对fgets函数不熟悉(不知道碰到回车符时自动结束)。在读写信息存到文件sturecord.dat时,用二进制存取,但在打开与读取时没用wbrb因而碰到了很奇怪的问题,做了很多检查又看了书后才发现问题。有一次没有改完错误就关了机,过了几天才又编写,结果打文件编译有问题时完全忘了在哪有问题,提示有8个错误。然后只能隔离各个函数检查,不久发现了问题所在。有

24、时候改了很多地方才又重新编译,结果错了很多处,找了一下找不到问题,又忘记改了哪里,让事情变得很麻烦。这让我知道以后大幅更改前应先另存文件或将改的地方做标记。当运行效果更预计不一样时,我学会了从运行情况分析代码不完善的地方。例如,各功能函数编好了后,运行时发现依次运行功能时3不正常,显示error(表示输入了1-6以外的数),之后456也error,但第一次运行3、4、5或6又正常。之后我分别运行11、22、33、44、55、66。发现只有连续用两次2功能时有问提,并且之后再用其他的也有问题。于是我确定是2的函数有问题,并且是输入的问题,在之后运行其他功能时是把回车传了进去。检查后发现2中确实忘

25、记接收回车。这次编程让我学到了不少知识,更让我意识到了自己动手实践的重要性,有耐心、毅力才能把事情做好。六、算法和系统的优缺点系统的优点是简洁、清晰,每次次用完一个功能屏幕上的内容都在一个框内,显得有条理。点名的信息以文件储存,便于调用。改进思路:在删除模块中加入可选择的删除模式,达到如查找模块一样的可选择模式删除。另外在退出系统模块中加入返回主菜单功能。七 :原代码(附录)#include #include #include #include int i=0;struct system char author20;char singer20;char time20;char name20;

26、dan100;void enter()int j;char c2;FILE *fp; if(fp=fopen(data.txt,w)=NULL)printf(Can not open the file!n);exit(0);for(j=0;ji;j+) fwrite(&danj,sizeof(struct system),1,fp); while(1)printf(Please input the author:n);scanf(%s,dani.author);printf(Please input the songs name:n);scanf(%s,dani.name);printf(Pl

27、ease input the singer:n);scanf(%s,dani.singer);printf(Please input the outday:n);scanf(%s,dani.time);if(fwrite(&dani+,sizeof(struct system),1,fp)!=1)printf(File write errorn);else printf(Successful!n);printf(Is there any more?( Yesy/Non) n);scanf(%s,c);if(strcmp(c,n)=0)break; fclose(fp);void delete(

28、) int j,v,c;char w20; FILE *fp;printf(Please input the songname which you want to delete:);scanf(%s,w); fp=fopen(data.txt,rb); for(j=0;j100;j+) if(fread(&danj,sizeof(struct system),1,fp)!=1) break;v=j;for(j=0;jv;j+) if(strcmp(w,danj.name)=0)c=j; fclose(fp);fp=fopen(data.txt,wb); for(j=0;jv;j+) if(j!

29、=c) fwrite(&danj,sizeof(struct system),1,fp); fclose(fp);printf(Delete OK!n);i-;void browse() int j; FILE *fp; fp=fopen(data.txt,rb); for(j=0;j100;j+) if(fread(&danj,sizeof(struct system),1,fp)=1)printf(Name:%sn,danj.name);printf(Author:%sn,danj.author);printf(Singer:%sn,danj.singer);printf(Outday:%

30、sn,danj.time);printf(-n);else break; fclose(fp);void search() int flag,j,x;char w20;FILE *fp;char v20; printf(1)By authorn); printf(2)By singern);printf(3)By namen);printf(Please choose which you want to search:n);scanf(%d,&x); if(x=3) flag=0;printf(Please input the songs name:); scanf(%s,&w); fp=fo

31、pen(data.txt,rb); for(j=0;j100;j+) if(fread(&danj,sizeof(struct system),1,fp)!=1) break; if(strcmp(danj.name,w)=0) printf(Name:%sn,danj.name);printf(Author:%sn,danj.author);printf(Singer:%sn,danj.singer);printf(Outday:%sn,danj.time);printf(-n);flag=1; if(flag=0)printf(Cannot find the song!n); fclose

32、(fp);else if(x=2) flag=0;printf(Please input the singer:); scanf(%s,&v); fp=fopen(data.txt,rb); for(j=0;j100;j+) if(fread(&danj,sizeof(struct system),1,fp)!=1) break; if(strcmp(danj.singer,v)=0) printf(Name:%sn,danj.name);printf(Author:%sn,danj.author);printf(Singer:%sn,danj.singer);printf(Outday:%s

33、n,danj.time);printf(-n);flag=1; if(flag=0)printf(Cannot find the song!n); fclose(fp); else if(x=1) flag=0;printf(Please input the author:); scanf(%s,w); fp=fopen(data.txt,rb); for(j=0;j100;j+) if(fread(&danj,sizeof(struct system),1,fp)!=1) break; if(strcmp(danj.author,w)=0) printf(Name:%sn,danj.name);printf(Author:%sn,danj.author);printf(Singer:%sn,danj.singer);printf(Outday:%sn,danj.time);printf(-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号