沈阳航空航天大学课程设计报告课程设计名称:C语言课程设计课程设计题目:单项选择题标准化考试系统设计院(系):计算机学院专业:计算机科学与技术班级:34010104学号:2013040101164姓名:指导教师:孙伟东完成日期:2014年03月1日沈阳航空航天大学课程设计报告目录第1章概要设计 ........................................................................................................ - 1 - 1.1题目的内容与要求 ................................................................................................ - 1 -内容:设计并实现一个单项选择题标准化考试系统。
该系统可以完成试题录入、试题抽取、自动判卷等功能。
.................................................................................. - 1 -1.2总体结构 (1)第2章详细设计 ...................................................................................................... - 2 -2.1菜单操作模块 (1)2.2将题目装入内存模块 (1)2.3开始答题模块 (1)2.4添加试题模块 (1)第3章调试分析 .................................................................................................... - 13 - 第4章使用说明 .................................................................................................... - 14 - 附录(程序清单).............................................................................................. - 17 -第1章概要设计1.1题目的内容与要求内容:设计并实现一个单项选择题标准化考试系统。
该系统可以完成试题录入、试题抽取、自动判卷等功能。
要求:(1)用文件保存试题库。
(每个试题包括题干、4个备选答案、标准答案)(2)试题录入:可随时增加试题到试题库中(3)试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)(4)答题:用户可实现输入自己的答案(5)自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
1.2总体结构本程序主要分为四个模块(功能模块图见下图):(1)模块一:菜单操作模块该模块实现程序的菜单操作。
2)模块二:将题目装入内存模块函数开辟内存空间将试题文件中题目装入内存中。
(3)模块三:开始答题模块函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。
判断用户输入答案是否正确。
4)模块四:添加试题模块打开储存试题的文件进行试题信息输入。
第2章详细设计2.1菜单操作模块:控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块,实现各项功能,流程如图2.1所示。
图2.1 该模块实现程序的菜单操作。
实现算法如下:○1在屏幕上输出菜单选项。
○2接受用户输入。
2.2.将题目装入内存模块:将题目装入内存模块函数开辟内存空间将试题文件中题目装入内存中图2.2函数开辟内存空间将试题文件中题目装入内存中。
实现算法如下:○1遍历文件判断回车符个数(计算题目数)。
○2根据提供参数判断是否将当前题目装入内存。
○3开辟内存空间,将题目信息装入内存。
○4关闭文件返回题目总数。
2.3开始答题模块:开始答题模块函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。
判断用户输入答案是否正确。
流程图如图2.3图2.3函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。
判断用户输入答案是否正确。
实现算法如下:○1接受用户输入题目数,判断是否合法(大于0、小于总题数)。
○2置随机数并判断随机数是否合法。
○3调用将题目装入内存模块题目装入内存。
○4在屏幕上输出题目,接受用户输入答案。
○5判断用户输入的答案是否正确,输出答题结果统计。
2.4添加试题模块:流程图如图2.4打开储存试题的文件进行试题信息输入。
实现算法如下:○1打开文件。
○2开辟内存空间,接受用户输入题目信息。
○3判断用户输入是否合法。
○4写到文件并保存。
章调试分析第3章调试分析问题1:文本文件无法删除指定的一行方法:所以要用类似于进栈出栈的方法,把要删的信息过滤出去问题2:程序不能运行方法:解决办法就是不断的按F10进行调试,最终找到错误的地方。
问题3:打开的文件没有关闭,最终导致一部分源代码被无意休改方法:问了成绩好的同学,最后加了个关闭文件的函数。
第4章使用说明运行操作及结果:该程序可以进行单项选择题标准化考试的系统,实现输入不同的指令数字实现不同的功能;实现选择答题增加题目以及直接退出系统。
单项选择题标准化考试系统。
请输入你要的操作:1请输入你要的操作:2图为进行单项选择题标准化考试系统设计的情形使用时根据提示选择想要的查找方式。
考文献参考文献:[1] 张长海.C语言程设计[M].北京:高等教育出版社,2006[2] 谭浩强 C程序设计解题与上机指导(第三版) 北京清华大学出版社 2009[3] 范辉等编著《Visual C++6.0程序设计简明教程》高等教育出版社[4] 严蔚敏等《数据结构(c语言版)》北京:清华大学出版社,1997年4月第1版。
[5] 胡学钢等《数据结构算法设计指导》北京:清华大学出版社,1999年第1版。
附录(程序清单)#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct test)struct test{char que[81];char answer1[81];char answer2[81];char answer3[81];char answer4[81];char ture;struct test *next;};struct test *head;//全局变量储存第一个结构体的指针int zts(int m)//将第m道题装入内存,输入-1时将返回总题数{FILE *fp;struct test *p1=NULL;char ch,ch1[5];int i,n=0,wz,py;if((fp=fopen("c:\\test.txt","r"))==NULL)//只读方式打开文件{printf("文件打开失败请检查C盘下的test.txt文件。
\n");exit(0);}do{py=1;ch=fgetc(fp);for(i=0;ch!='\n'&&ch!=-1;i++)//循环判断回车符个数{py++;ch=fgetc(fp);}n++; //储存行数的变量if(n==m)//如果当前行数与传入参数相等{if(p1==NULL)//判断是否是第一次开辟内存空间{p1=(struct test *)malloc(LEN);head=p1;p1->next=NULL;}else{p1->next=p1;p1=(struct test *)malloc(LEN);p1->next=NULL;}wz=ftell(fp);//记录指针当前位置fseek(fp,(wz-py-1),0);//调整指针位置到行首fscanf(fp,"%s%s%s%s%s%s",&p1->que,&p1->answer1,&p1->answer2,&p1->answer3,&p1 ->answer4,&ch1);fseek(fp,wz+1,0);//调整指针位置到行末p1->ture=ch1[0];break;//将数据装入内存后跳出循环}}while(!feof(fp));//文件结束跳出循环fclose(fp);return n;//返回题目总数n}void exe1(){void main();void exe2();int n,m=0,tm,i,t=0,f=0;char ans[2];struct test *p1;system("cls");printf("请输入要答题数:");scanf("%d",&n);tm=zts(-1);if(0>n||n>tm){printf("答题数应小于总数!");exe1();}for(i=0;i<n;i++)//n为用户要答题数{do{m=rand();//置随机数}while(!(0<m&&m<=tm));//判断产生的随机数是否符合要求zts(m);p1=head;//将zts开辟的结构体首地址赋给p1printf("\n第%d题:\n",i+1);printf("%s\n%s\n%s\n%s\n%s\n请输入答案:",p1->que,p1->answer1,p1->answer2,p1->answer3,p1->answer4);scanf("%s",&ans);if(toupper(ans[0])==p1->ture)//判断用户输入答案是否正确{printf("恭喜你答对了!\n\n");t++;//回答正确统计}else{printf("对不起,你答错了。
\n正确答案是:%c\n\n",p1->ture);f++;//回答错误统计}}p1=head;do{head=p1->next;free(p1);p1=head;}while(p1!=NULL);//释放结构体占用内存printf("*******************************\n");printf("\n已完成测试!\n共做%d道题:%d错误,%d正确。