1、课 程 报 告课 程 名 称: 程序设计实践 专 业 班 级 : 计算机类1304班 学 生 姓 名 : 唐林 学 号 : 201316920403 任 课 教 师 : 唐建国 学 期 :2013-2014学年第二学期 课程报告任务书题 目标准化考试系统主要内容1.建立一个InsertNode函数来实现插入试题的功能。2.建立一个AddNode函数来实现添加试题的功能。3.建立一个Change函数来实现对试题进行修改的功能。4.新建一个DeleteNode函数来实现对试题的删除。5.建立个printNode函数实现对试题的输出功能。6.建立一个Match函数来判断答案是否正确。7.建立answ
2、er函数实现随机选题并进行答题和统计得分功能。8.在主函数main中,使用switch函数让用户进行选择。任务要求一、对该考试系统进行需求分析,找出该系统需要哪些功能来实现,在每个功能中运用学过的算法来实现,每个功能用不同的函数来实现,确定函数之间调用的关系。二、整个设计过程具体要求(1)需求分析 对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;(2)设计过程 进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)(3)实现过程 养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;(4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答
3、辩。成绩评定报告撰写情况(30分)系统完成情况(30分)答辩情况(40分)总分内容20分规范程度5分程序测试5分基本功能20分扩展功能10分自述情况10分答辩情况30分成绩评定教师: 1 需求分析该系统包括以下功能:1. 进行随机答题并判卷2. 显示试题所有内容3. 插入试题4. 添加试题5. 自主选题并判卷6. 修改试题7. 删除试题8. 退出系统2 概要设计 2.1整体框架图标准化考试系统 退出系统 删 除 试 题修改试题添加试题显示试题所有内容进行随机答题并判卷自主选题并判题 图2-1-12.2 函数功能图 2.2.1 随机答题并判卷功能图进入函数answer(int sum,int N
4、) i=1,i=sumN Y Num=rand()%sum 输 出 数 据 答案是否正确 “答案错误” “答案正确” 输出总成绩图2-2-1 2.2.2 修改试题功能图 进入Change(int &N) 输入修改的题号m i=0,iNYNTestquestionsn-1=Testquestionsn n+ N=N-1 删除成功删除失败 图2-2-32.3 自定义函数返回值函数名参数表函数功能StatusSaveNodeint &N将试题存入文件中StatusReadNodeint &N 从文件中读取试题StatusInsertNodeint &N向试题库中插入试题StatusChangeint
5、 &N修改试题StatusDeleteNodeint &N删除试题voidprintNode(TestNode p,int n)输出试题StatusMatch(TestNode p,char m)检查答案voidanswer(int sum,int N)随机进行答题并判卷voidOtheranswer(int N,int s)自主选题作答并判卷StatusAddNodeint &N 向题库中添加试题 3 详细设计 3.1 添加试题将想要输入的是试题,从键盘输入,题库中总的题数作为结构数组的下标,存入一道题就将结构数组的下标向后移动一位,最后将存入最后一道题的下标返回,作为题库中的总题数。Sta
6、tus AddNode(int &N) /添加试题内容printf(如果不添加了试题了,在题目输入“*”结束!n);while(1) printf(请输入所要插入题题目、题干和选项:n);printf(请输入题目:);gets(TestquestionsN.subject);if(strcmp(TestquestionsN.subject,*)=0)break;printf(请输入选项A:);gets(TestquestionsN.option1);printf(请输入选项B:);gets(TestquestionsN.option2);printf(请输入选项C:);gets(Testque
7、stionsN.option3);printf(请输入选项D:);gets(TestquestionsN.option4);printf(请输入答案:);scanf(%c,&TestquestionsN.result);getchar();N+; /N表示结构体数组长度,通过加&号使其值能返回 return TRUE;3.2 修改试题 先从键盘中输入想要修改第几道试题,当题标输入m时,找到结构数组m-1对应的元素就是要修改的试题,再将修改的试题进行保存,从而实现对试题的修改功能。Status Change(int &N)int m,i;printf(请输入您要修改第几题?n);scanf(%d
8、,&m);getchar(); /吸收空格字符 for(i=0;iN)printf(修改试题失败!n);elseprintf(修改试题成功!n);return TRUE;3.3 删除试题 先从键盘中输入想要修改第几道试题,当题标输入n时,找到结构数组n-1对应的元素就是要删除的试题,在用一个for循环,将n到N-1个元素向前移动,从而实现对试题的删除功能。 Status DeleteNode(int &N) /删除数组中的第n道题 int n;printf(输入你想是删除第几道试题:n);scanf(%d,&n);if(nN)printf(删除不成功n);return ERROR;while(
9、n=N)Testquestionsn-1=Testquestionsn;n+;N=N-1;printf(删除成功n);return TRUE;3.4 随机选题并判题 学生进入考试系统,输入形成试卷的题数,系统将会自动抽取试题,在进行作答之后,立刻能看到学生是否做对本道试题,如果作对,将会显示“答案正确”,否者会显示“答案错误”并且会显示正确答案。 void answer(int sum,int N) /随机进行答题 int i,score=0,Num; char r; for(i=1;i=sum;i+)Num= rand()%N; /随机函数,以随机选定何题进行解答 printNode(Tes
10、tquestionsNum,i); printf(n); printf(n请输入第(%d)答案:,i); scanf(%c,&r);getchar();if(Match(TestquestionsNum,r) /调用函数Match判断所输入的答案与标准答案是否相同printf(n答案正确!n);score+;else printf(n答案错误!n); printf(正确答案为:%cn,TestquestionsNum.result);printf(n你的总成绩为:%dn,score);3.5 自主选题并判题 通过函数中传递题库的总数和要形成试卷的总题数,输入将要选择的试题,将输入的试题在结构数
11、组中找到,可以进行作答,当输入的答案不与标准答案匹配时,答卷系统将会自动报错,并且输出正确的答案,如果输入正确将会显示“答案正确”,在最后答卷系统将会输出总的成绩。 void Otheranswer(int N,int s)int i,score=0,k;char m;for(i=1;i=s;i+)printf(输入要选择第几题?n);scanf(%d,&k);while(kN)printf(输入的题号在题库中不存在!n);printf(n请重新输入正确的题号:);scanf(%d,&k);printNode(Testquestionsk-1,i);printf(n请输入(%d)答案:,i);
12、getchar();scanf(%c,&m);getchar();if(m=Testquestionsk-1.result)printf(答案正确!n); score+;else printf(答案错误!n);printf(正确答案为:%cn,Testquestionsk-1.result);printf(总分为:%dn,score);3.6 登陆考试系统函数 屏幕上会显示教师和学生两种端口,如果过选择学生端口将会进入登陆和注册两个选项,已经注册过的就可以直接登陆了,反之则进行注册。进入学生答题系统后可以选择随机答题或者自主选题进行作答两种方式。登陆教师窗口后,可以直接查看试题、删除试题、修改
13、试题、添加试题的功能。void Denglu()FILE *fp1;int a,c,num,flag=1;int i=0;char Mima20=0,b20;printf(ttt1 进入登录n);printf(nttt2 进入注册n);scanf(%d,&c);while(flag)if(c2)printf(n请输入正确的选项!n);scanf(%d,&c);flag=1;elseflag=0;if(c=2)printf(请注册:n);Zhuce();else if(fp1=fopen(student.txt,rb)=NULL)printf(打开文件失败!);exit(0);printf(请输
14、入学号:);scanf(%d,&num);printf(请输入密码);while(c=getch()!=r)Mimai=c;i+;if(c!=b)printf(*);elseprintf(bb); rewind(fp1); while(!feof(fp1)fscanf(fp1,%d,&a);fscanf(fp1,%s,&b);if(a=num&strcmp(b,Mima)=0)break; while(a!=num|strcmp(b,Mima)!=0)i=0;printf(n错误,重新输入:n);printf(请输入学号:);scanf(%d,&num);printf(请输入密码);while
15、(c=getch()!=r)Mimai=c;i+;if(c!=b)printf(*);elseprintf(bb);rewind(fp1);while(!feof(fp1)fscanf(fp1,%d,&a);fscanf(fp1,%s,&b);if(a=num&strcmp(b,Mima)=0)break;printf(tt欢迎登陆单选题标准化考试系统!n);system(pause);getchar();printf(n);if(fclose(fp1)printf(关闭文件失败!n);exit(0);*源代码#include #include #include#include#define
16、TRUE 1#define ERROR 0#define MAX 30typedef int Status;typedef structchar option130,option230,option330,option430,subject150;char result;int q;TestNode;TestNode TestquestionsMAX;Status SaveNode(int &N) /把结构体数组保存到文件cheng中,如成功保存返回TRUE,否则返回ERRORint i;FILE *fp;if(fp=fopen(cheng,wb)=NULL) return ERROR;for
17、(i=0;iN;i+)fwrite(&Testquestionsi,sizeof(TestNode),1,fp);fclose(fp);return TRUE;Status ReadNode(int &N) /从文件读出结构体数组的内容,如成功读取返回TRUE,否则返回ERRORFILE *fp;int i=0;if(fp=fopen(cheng,rb)=NULL)return ERROR;while(!feof(fp) / 用feof检测文件是否结束,如果结束,返回正确fread(&Testquestionsi,sizeof(TestNode),1,fp);i+; N=i-1;return
18、TRUE;void Zhuce()void Denglu();int i,m;i=0;char n20=0,c;FILE *fp1;if(fp1=fopen(student.txt,ab)=NULL)printf(打开文件失败!n);exit(0);printf(请注册学号:);scanf(%d,&m);fprintf(fp1,%d ,m);printf(请设置密码(20字符以内):);while(c=getch()!=r)ni=c;i+;if(c!=b)printf(*);elseprintf(bb);fprintf(fp1,%sn,n);if(fclose(fp1)printf(关闭文件失
19、败!n);exit(0);printf(n);printf(ttt注册完成!n);Denglu();void Denglu()FILE *fp1;int a,c,num,flag=1;int i=0;char Mima20=0,b20;printf(ttt1 进入登录n);printf(nttt2 进入注册n);scanf(%d,&c);while(flag)if(c2)printf(n请输入正确的选项!n);scanf(%d,&c);flag=1;elseflag=0;if(c=2)printf(请注册:n);Zhuce();else if(fp1=fopen(student.txt,rb)
20、=NULL)printf(打开文件失败!);exit(0);printf(请输入学号:);scanf(%d,&num);printf(请输入密码);while(c=getch()!=r)Mimai=c;i+;if(c!=b)printf(*);elseprintf(bb); rewind(fp1); while(!feof(fp1)fscanf(fp1,%d,&a);fscanf(fp1,%s,&b);if(a=num&strcmp(b,Mima)=0)break; while(a!=num|strcmp(b,Mima)!=0)i=0;printf(n错误,重新输入:n);printf(请输入
21、学号:);scanf(%d,&num);printf(请输入密码);while(c=getch()!=r)Mimai=c;i+;if(c!=b)printf(*);elseprintf(bb);rewind(fp1);while(!feof(fp1)fscanf(fp1,%d,&a);fscanf(fp1,%s,&b);if(a=num&strcmp(b,Mima)=0)break;printf(tt欢迎登陆单选题标准化考试系统!n);system(pause);getchar();printf(n);if(fclose(fp1)printf(关闭文件失败!n);exit(0);Status
22、AddNode(int &N) /添加试题内容printf(如果不添加了试题了,在题目输入“*”结束!n);while(1) printf(请输入所要插入题题目、题干和选项:n);printf(请输入题目:);gets(TestquestionsN.subject);if(strcmp(TestquestionsN.subject,*)=0)break;printf(请输入选项A:);gets(TestquestionsN.option1);printf(请输入选项B:);gets(TestquestionsN.option2);printf(请输入选项C:);gets(Testquestio
23、nsN.option3);printf(请输入选项D:);gets(TestquestionsN.option4);printf(请输入答案:);scanf(%c,&TestquestionsN.result);printf(请输入试题难度:);scanf(%d,&TestquestionsN.q);getchar();N+; /N表示结构体数组长度,通过加&号使其值能返回 return TRUE;void printNode(TestNode p,int n) /输出第n道题题目printf(%d) ,n);printf(%sn,p.subject);printf( A %s ,p.opti
24、on1);printf( B %s n,p.option2);printf( C %s ,p.option3);printf( D %s ,p.option4);printf( 试题难度为:%dn,p.q);Status Change(int &m) int i;printNode(Testquestionsm-1,m); printf(n);printf(修改题目请按 1n);printf(修改选项A请按 2n);printf(修改选项B请按 3n);printf(修改选项C请按 4n);printf(修改选项D请按 5n);printf(修改标准答案请按 6n);printf(修改试题难度
25、请按 7n);scanf(%d,&i);getchar(); /吸收空格字符switch(i)case 1: printf(n请输入新的题目:); gets(Testquestionsm-1.subject); break;case 2:printf(请输入新的选项A:); gets(Testquestionsm-1.option1); break;case 3: printf(请输入新的选项B:); gets(Testquestionsm-1.option2); break;case 4:printf(请输入新的选项C:); gets(Testquestionsm-1.option3); b
26、reak;case 5:printf(请输入新的选项D:); gets(Testquestionsm-1.option4); break;case 6:printf(请输入新的答案:); scanf(%c,&Testquestionsm-1.result); break;case 7:printf(请输入新的试题难度:);scanf(%d,&Testquestionsm-1.q);break;default:printf(请输入正确的修改选项n);break;return TRUE;Status InsertNode(int &N)int i,j,P;printf(输入要插入到第几题?n);s
27、canf(%d,&i);getchar();N=N+1;for(j=N-1;j=(i-1);j-)Testquestionsj=Testquestionsj-1;printf(请输入题目:);gets(Testquestionsi-1.subject);printf(请输入选项A:);gets(Testquestionsi-1.option1);printf(请输入选项B:);gets(Testquestionsi-1.option2);printf(请输入选项C:);gets(Testquestionsi-1.option3);printf(请输入选项D:);gets(Testquestio
28、nsi-1.option4);printf(请输入答案:);scanf(%c,&Testquestionsi-1.result);printf(请输入试题难度:);scanf(%d,&Testquestionsi-1.q);getchar();return TRUE;Status DeleteNode(int &N) /删除数组中的第n道题 int n;printf(输入你想是删除第几道试题:n);scanf(%d,&n);if(nN)printf(删除不成功n);return ERROR;while(n=N)Testquestionsn-1=Testquestionsn;n+;N=N-1;p
29、rintf(删除成功n);return TRUE;Status Match(TestNode p,char m) /判断m是否为p题目的答案,若是返回TRUE,否则返回ERRORif(m=p.result)return TRUE;else return ERROR;void answer(int sum,int N) /随机进行答题 int i,score=0,Num; char r; for(i=1;i=sum;i+)Num= rand()%N; /随机函数,以随机选定何题进行解答 printNode(TestquestionsNum,i); printf(n); printf(n请输入第(
30、%d)答案:,i); scanf(%c,&r);getchar();if(Match(TestquestionsNum,r) /调用函数Match判断所输入的答案与标准答案是否相同printf(n答案正确!n);score+;else printf(n答案错误!n); printf(正确答案为:%cn,TestquestionsNum.result);printf(n你的总成绩为:%dn,score);void Otheranswer(int N,int s)int i,score=0,k,j,y;char m;for(i=1;i=s;i+)printf(输入试题难度n);scanf(%d,&
31、k);while(k2)printf(题库中没有该难度的试题!n);printf(n请重新输入试题难度:);scanf(%d,&k);for(j=0;jN;j+)if(y=j)continue;if(Testquestionsj.q=k)printNode(Testquestionsj,i);printf(n请输入(%d)答案:,i);getchar();scanf(%c,&m);getchar();if(Match(Testquestionsj,m)printf(答案正确!n); score+;else printf(答案错误!n);printf(正确答案为:%cn,Testquestion
32、sj.result); break;y=j;printf(总分为:%dn,score);void main()char flag; int N=0,i,sum,m,s,score=0,chose,Chose=3;ReadNode(N);while(Chose2)printf(ttt请选择自己的类型n);printf(ttt1 学生端口n);printf(ttt2 教师端口n);scanf(%d,&Chose);system(cls);switch(Chose)case 1:Denglu(); system(cls);while(1)printf(ttt单项选择题标准化考试系统进行答题n );p
33、rintf(ttt1 进行随机答题并判卷n);printf(ttt2 自主选题并判卷n);printf(ttt3 退出系统n);scanf(%d,&chose);getchar();switch(chose) case 1:system(cls); ReadNode(N); printf(请输入试题的总题数:); scanf(%d,&sum);getchar(); if(N=0) printf(对不起,题库中没有试题!n); printf(按任意键回到菜单!n); getchar(); else answer(sum,N); getchar(); break; case 2:system(cls); ReadNode(N);