资源描述
-数据构造与算法I课程设计报告课设题目:单项选择题标准化考试系统学生*:*:同组同学:完成日期:成绩:目录一、设计流程1二、需求分析1三、总体设计2四、详细设计3五、系统测试14六、总结19七、参考文献19一本次课程设计的流程(1) 需求分析(2) 试题的录入(3) 试题的抽取(4) 试题的删除(5) 答题(6) 自动判卷(7) 系统测试(8) 退出系统二需求分析1. 课程设计名称及内容设计一单项选择题标准化考试系统,实现考试的标准化管理。2设计方案提示(1)用文件保存试题库。每个试题包括题干、4个备选答案、标准答案; (2)试题录入:可随时增加试题到试题库中; (3)试题抽取:每次从试题库中可以随机抽出N道题N由键盘输入; (4)答题:用户可实现输入自己的答案; (5)自动判卷:系统可根据用户答案与标准答案的比照实现判卷并给出成绩。三总体设计1总的表达 1、用来保存试题库,可以用到Struct TestNode Testquestions构造体数组,将试题一一对应的保存下来,放在相应的文件里; 2、试题的录入,可以定义一个 Status InsertNode(int &N)函数将试题录入; 3、试题的抽取,可以定义一个 void printNode(TestNode p,int n)的函数,用到Rand函数进展随机抽取; 4、答题方面,则定义一个 void answer(int sum)函数用于答题者的输入答案; 5、自动判卷,则可以定义一个 Status Match(TestNode p,char m)函数,用来比照答题者答案和正确答案,给出判断正确与否; 6、存储方面每次插入和删除操作都能自动存储试题至文档。7、用一个main函数将上述各个函数功能块连接起来,实现单项选择题标准化考试系统的各个方面的功能,完成设计单项选择题标准化考试系统进展答题并判卷显示整*试卷内容插入试题删除试题退出系统四详细设计1.模块流程1答题功能模块进入函数answer(int sum)i=0,isumNum=rand()%sum题目是否重复输出数据从键盘获得数据I=0,isum,答案是否正确输出错误输出正确输出总成绩函数完毕(2) 显示功能构造功能开场I=0,iN,进入函数printNode(TestNode p,int n)输出一道题目离开函数printNode(TestNode p,int n)功能完毕(3) 输入功能构造函数InsertNode(int &n)开场翻开并读取文件输入题目内容将题目插入到题库末尾将题库存储至文件函数InsertNode(int &n)完毕(4) 删除功能构造函数DeleteTitle(int *n)开场翻开并读取文件输入删除题目编号将从题库中删除将题库存储至文件函数DeleteNode(int *n)完毕4构造体程序中主要用到了构造体数组,定义类型,如typedef int Status等,用构造体数组可以使得程序比较简便,易于读懂,免去频繁的赋值,而用定义类型,可以使得程序具有移植性。2. 功能模块(1) 试题的录入模块Status InsertNode(int &n) / printf(%d,n); int i=0,j; FILE *fp; if(fp=fopen(e*am.t*t,wb+)=NULL) printf(Cannot open file.); getchar(); e*it(1); / printf(%d,n); while(!feof(fp) fread(&Testquestionsi,sizeof(TestNode),1,fp); i+; / printf(%d,n); / printf(%d,n); printf(请输入题目:); gets(Testquestionsn.subject); gets(Testquestionsn.subject); printf(请输入选项A:); gets(Testquestionsn.option1); printf(请输入选项B:); gets(Testquestionsn.option2); printf(请输入选项C:); gets(Testquestionsn.option3); printf(请输入选项D:); gets(Testquestionsn.option4); printf(请输入答案:); scanf(%c,&Testquestionsn.result); getchar(); / printf(%d,n); n+; / printf(%d,n); for(j=0;jn;j+) fwrite(&Testquestionsj,sizeof(TestNode),1,fp); fclose(fp); system(cls); return TRUE;2试题的输出模块void printNode(TestNode p,int n) /int i=0; printf(%d) ,n); printf(%sn,p.subject); printf( A %s ,p.option1); printf( B %s ,p.option2); printf( C %s ,p.option3); printf( D %s ,p.option4);Status Match(TestNode p,char m) if(m=p.result) return TRUE; else return ERROR;(3) 答题判卷模块void answer(int sum) int a,Num,s100; float score=0; char r; for(int i=0;isum;i+) key:Num=rand()%sum; for(a=0;ai;a+) if(sa=Num) goto key; si=Num; for(int i=0;isum;i+) printNode(Testquestionssi,si+1); printf(n请输入答案:);scanf(%c,&r); getchar(); if( Match(Testquestionssi,r) printf(n答案正确!an); score+; else printf(n答案错误!an); printf(n你的总成绩为:%fn,score/sum*100);(4) 试题的删除模块Status DeleteTitle(int *n) int i=0,k,temp; FILE *fp; if(fp=fopen(e*am.t*t,wb+)=NULL) printf(Cannot open file.); getchar(); e*it(1); while(!feof(fp) fread(&Testquestionsi,sizeof(TestNode),1,fp); i+; /n=i-1; printf(请输入所要删除的题目的题号:n); scanf(%d,&k); getchar(); for(;k=*n;k+) / Testquestionsi=Testquestionsi+1; Testquestionsk-1=Testquestionsk; / Testquestions*n=Testquestions0; temp=*n; *n=temp-1; for(int j=0;jN|sum=0) printf(请输入你想要的答题数目); scanf(%d,&sum); answer(sum); break; case 2:system(cls); /printNode for(i=1;i=N;i+) printNode(Testquestionsi-1,i); printf(n); break; case 3:system(cls); /InsertNode InsertNode(N); break; case 4:system(cls); /DeleteTitle DeleteTitle(p); printf(删除成功!n); break; case 5:printf(你将退出系统(Y/N); /e*it scanf(%c,&flag); getchar(); if(flag=Y|flag=y) return TRUE; system(cls); break; default:printf(请输入正确选择!n); return 0;五系统测试1 运行系统,进入界面2. 开场插入试题进展插入试题连续插入两道题显示整*试卷内容3. 进展答题进展答题4. 退出系统退出系统5.检查文件六总结通过这次课程设计,增加了我学习软件技术的兴趣,让我对于程序设计的流程更加了解,对程序本身的构造印象深刻。在此次课程设计过程总我们团结协作,轮流架构,体会到了合作的乐趣,同时广泛搜寻资料,从网上和书上找到了大量的相关资料和教程,丰富了我们自身的知识储藏,对数据构造的性质有了更深的体会。总体来说通过这次课程设计收获的不只是知识,还有合作的乐趣,以及对程序艺术的一点体会。七参考文献1 谭浩强. C程序设计(第二版).:清华大学,1999,122 美H M Deitel,P J Deitel著,薛万鹏等译. C语言程序设计教程.:机械工业,2000.073 严蔚敏吴伟民编著数据构造C语言版,:清华大学,2007八程序源代码:/ FUNCTION.C/ 课程设计/ CREATED BY EUTIAL ON 6/27/16./ COPYRIGHT 2021 EUTIAL. ALL RIGHTS RESERVED./*INCLUDE *INCLUDE *INCLUDE *DEFINE TRUE 1*DEFINE ERROR 0*DEFINE MA* 30TYPEDEF INT STATUS;TYPEDEF STRUCT CHAR SUBJECT200, OPTION130, OPTION230, OPTION330, OPTION430; CHAR RESULT;TESTNODE;TESTNODE TESTQUESTIONSMA*;STATUS INSERTNODE(INT &N) / PRINTF(%D,N); INT I=0,J; FILE *FP; IF(FP=FOPEN(E*AM.T*T,WB+)=NULL) PRINTF(CANNOT OPEN FILE.); GETCHAR(); E*IT(1); / PRINTF(%D,N); WHILE(!FEOF(FP) FREAD(&TESTQUESTIONSI,SIZEOF(TESTNODE),1,FP); I+; / PRINTF(%D,N); / PRINTF(%D,N); PRINTF(请输入题目:); GETS(TESTQUESTIONSN.SUBJECT); GETS(TESTQUESTIONSN.SUBJECT); PRINTF(请输入选项A:); GETS(TESTQUESTIONSN.OPTION1); PRINTF(请输入选项B:); GETS(TESTQUESTIONSN.OPTION2); PRINTF(请输入选项C:); GETS(TESTQUESTIONSN.OPTION3); PRINTF(请输入选项D:); GETS(TESTQUESTIONSN.OPTION4); PRINTF(请输入答案:); SCANF(%C,&TESTQUESTIONSN.RESULT); GETCHAR(); / PRINTF(%D,N); N+; / PRINTF(%D,N); FOR(J=0;JN;J+) FWRITE(&TESTQUESTIONSJ,SIZEOF(TESTNODE),1,FP); FCLOSE(FP); SYSTEM(CLS); RETURN TRUE;STATUS DELETETITLE(INT *N) INT I=0,K,TEMP; FILE *FP; IF(FP=FOPEN(E*AM.T*T,WB+)=NULL) PRINTF(CANNOT OPEN FILE.); GETCHAR(); E*IT(1); WHILE(!FEOF(FP) FREAD(&TESTQUESTIONSI,SIZEOF(TESTNODE),1,FP); I+; /N=I-1; PRINTF(请输入所要删除的题目的题号:N); SCANF(%D,&K); GETCHAR(); FOR(;K=*N;K+) / TESTQUESTIONSI=TESTQUESTIONSI+1; TESTQUESTIONSK-1=TESTQUESTIONSK; / TESTQUESTIONS*N=TESTQUESTIONS0; TEMP=*N; *N=TEMP-1; FOR(INT J=0;J*N;J+) FWRITE(&TESTQUESTIONSJ,SIZEOF(TESTNODE),1,FP); FCLOSE(FP); SYSTEM(CLS); RETURN TRUE;VOID PRINTNODE(TESTNODE P,INT N) /INT I=0; PRINTF(%D) ,N); PRINTF(%SN,P.SUBJECT); PRINTF( A %S ,P.OPTION1); PRINTF( B %S ,P.OPTION2); PRINTF( C %S ,P.OPTION3); PRINTF( D %S ,P.OPTION4);STATUS MATCH(TESTNODE P,CHAR M) IF(M=P.RESULT) RETURN TRUE; ELSE RETURN ERROR;VOID ANSWER(INT SUM) INT A,NUM,S100; FLOAT SCORE=0; CHAR R; FOR(INT I=0;ISUM;I+) KEY:NUM=RAND()%SUM; FOR(A=0;AI;A+) IF(SA=NUM) GOTO KEY; SI=NUM; FOR(INT I=0;IN|SUM=0) PRINTF(请输入你想要的答题数目); SCANF(%D,&SUM); ANSWER(SUM); BREAK; CASE 2:SYSTEM(CLS); /PRINTNODE FOR(I=1;I=N;I+) PRINTNODE(TESTQUESTIONSI-1,I); PRINTF(N); BREAK; CASE 3:SYSTEM(CLS); /INSERTNODE INSERTNODE(N); BREAK; CASE 4:SYSTEM(CLS); /DELETETITLE DELETETITLE(P); PRINTF(删除成功!N); BREAK; CASE 5:PRINTF(你将退出系统(Y/N); /E*IT SCANF(%C,&FLAG); GETCHAR(); IF(FLAG=Y|FLAG=Y) RETURN TRUE; SYSTEM(CLS); BREAK; DEFAULT:PRINTF(请输入正确选择!N); RETURN 0;. z.
展开阅读全文