1、C语言课程设计单项选择题标准化考试系统报告C语言课程设计(单项选择题标准化考试系统)报告重 庆 理 工 大 学 课程 程序设计基础C 题目 C语言综合程序设计 院系名称 班 级 学生姓名 学号 指导教师 评阅教师 时 间 2011.6 重庆理工大学课程设计 1 问题描述 题目十四:单项选择题标准化考试系统设计 功能要求: (1)、用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案) (2)、试题录入:可随时增加试题到试题库中 (3)、试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入) (4)、答题:用户可实现输入自己的答案 (5)、自动判卷:系统可根据用户答案与标准答案进行评
2、分。 2 系统分析 2.1 题目要求 程序分4个函数来实现菜单操作、将题目装入内存、开始答题、题目的录入。 1.菜单操作: Main函数,实现程序的菜单操作。根据用户选择的菜单的不同选项调用不同的函数,实现“开始答题”、“添加试题”、“退出系统”等功能。 2.将试题装入内存: 此函数由“开始答题”函数调用。调用此函数时传递一个整型参数m,函数开辟内存空间将试题文件(“C:test.txt”)中第m道题装入内存中,并返回总题数。如果传递参数m为-1,函数将直接返回试题文件中所储存的总题数,不将任何试题装入内存中。 3.开始答题: 函数会让用户输入要答的题目数并进行判断,若用户要求的答题数大于总题
3、数程序会要求用户重新输入。程序生成随机数并判断是否合法,如果合法就调用“将试题装入内存”函数,参数为随机数。在屏幕上输出题干和选项并让用户输入答案。判断用户输入答案是否正确。 4.添加试题: 重庆理工大学课程设计 打开储存试题的文件(“C:test.txt”),开辟内存空间。进行试题信息输入。自动保存文件。 2.2算法设计 (1)模块一:菜单操作模块 该模块实现程序的菜单操作。 实现算法如下: 1?在屏幕上输出菜单选项。 2?接受用户输入。 3?判断用户输入,跳转到对应函数入口。 (2)模块二:将题目装入内存模块 函数开辟内存空间将试题文件中题目装入内存中。 实现算法如下: 1?遍历文件判断回
4、车符个数(计算题目数)。 2?根据提供参数判断是否将当前题目装入内存。 3?开辟内存空间,将题目信息装入内存。 4?关闭文件返回题目总数。 (3)模块三:开始答题模块 函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。判断用户输入答案是否正确。 实现算法如下: 1?接受用户输入题目数,判断是否合法(大于0、小于总题数)。 2?置随机数并判断随机数是否合法。 3?调用将题目装入内存模块题目装入内存。 4?在屏幕上输出题目,接受用户输入答案。 5?判断用户输入的答案是否正确,输出答题结果统计。 (4)模块四:添加试题模块 打开储存试题的文件进行试题信息输入。 实现算法如下: 1
5、?打开文件。 2?开辟内存空间,接受用户输入题目信息。 重庆理工大学课程设计 3?判断用户输入是否合法。 4?写到文件并保存。 2.3流程图 1.菜单操作模块: 2.将题目装入内存模块: 重庆理工大学课程设计 3.开始答题模块: 4.添加试题模块: 重庆理工大学课程设计 重庆理工大学课程设计 2.4关键问题 文件读写时文件指针的移位: 当用fgetc()函数遍历文件时文件指针是顺序移动的,当遇到回车符时才会判断出文件在第几行。而当读取文件信息的时候文件指针的位置应该在行首,这是就要用到fseek()函数将文件指针移位。而且还要恢复文件指针的位置,用于继续判断当前是文件的第几行。 3 系统实现
6、3.1 源代码 #include #include #define LEN sizeof(struct test) struct test char que81; char answer181; char answer281; char answer381; char answer481; char ture; struct test *next; ; struct test *head;/全局变量储存第一个结构体的指针 int zts(int m)/将第m道题装入内存,输入-1时将返回总题数 FILE *fp; struct test *p1=NULL; char ch,ch15; int
7、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
8、; 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=ch10; break;/将数据装入内存后跳出循环 while(!feof(fp);/文件结束跳出循环 fclose
9、(fp); 重庆理工大学课程设计 return n;/返回题目总数n void exe1() void main(); void exe2(); int n,m=0,tm,i,t=0,f=0; char ans2; struct test *p1; system(cls); printf(请输入要答题数:); scanf(%d,&n); tm=zts(-1); if(0n|ntm) printf(答题数应小于总数!); exe1(); for(i=0;in;i+)/n为用户要答题数 do m=rand();/置随机数 while(!(0m&mque,p1-answer1,p1-answer2,
10、p1-answer3,p1-answer4); scanf(%s,&ans); if(toupper(ans0)=p1-ture)/判断用户输入答案是否正确 printf(恭喜你答对了nn); t+;/回答正确统计 重庆理工大学课程设计 else printf(对不起,你答错了。n正确答案是:%cnn,p1-ture); f+;/回答错误统计 p1=head; do head=p1-next; free(p1); p1=head; while(p1!=NULL);/释放结构体占用内存 printf(*n); printf(n已完成测试!n共做%d道题:%d错误,%d正确。n正确率:%5.2f%
11、nn,n,f,t,(float)t/n*100); printf(*n); printf(nn1.继续答题;2.添加题目;3.返回主菜单;n请选择:); i=0; scanf(%d,&i); if(i=1) exe1();/继续答题 else if(i=2) exe2();/添加题目 else main();/返回主菜单 void exe2()/实现用户自主输入题目 void main(); system(cls); int n; 重庆理工大学课程设计 FILE *fp; if(fp=fopen(c:test.txt,a)=NULL) printf(文件打开失败请检查C盘下的test.txt文
12、件。n); exit(0); struct test *p1=NULL; p1=(struct test *)malloc(LEN);/开辟内存空间 do printf(请输入题目:); scanf(%s,&p1-que); while(p1-que0=0); do printf(请输入选项A:); scanf(%s,&p1-answer1); while(p1-answer1=0); do printf(请输入选项B:); scanf(%s,&p1-answer2); while(p1-answer2=0); do printf(请输入选项C:); scanf(%s,&p1-answer3)
13、; while(p1-answer3=0); do printf(请输入选项D:); scanf(%s,&p1-answer4); while(p1-answer4=0); printf(请输入答案:); 重庆理工大学课程设计 do scanf(%c,&p1-ture); p1-ture=toupper(p1-ture); while(p1-ture!=A&p1-ture!=B&p1-ture!=C&p1-ture!=D); printf(n确认输入题目,n1.是。 2.否。n); scanf(%d,&n); if(n=1) fputc(n,fp); fputs(p1-que,fp); fpu
14、tc( ,fp); fputs(A.,fp); fputs(p1-answer1,fp); fputc( ,fp); fputs(B.,fp); fputs(p1-answer2,fp); fputc( ,fp); fputs(C.,fp); fputs(p1-answer3,fp); fputc( ,fp); fputs(D.,fp); fputs(p1-answer4,fp); fputc( ,fp); fputc(p1-ture,fp); fclose(fp); printf(保存成功!); system(cls); free(p1); printf(是否继续添加,n1.继续添加 2.返
15、回主菜单n); scanf(%d,&n); if(n=1) exe2(); else 重庆理工大学课程设计 main(); else free(p1); exe2(); void main() system(cls); int n; printf(*n); printf(欢迎使用单项选择题标准化考试系统n); printf(*n); printf(t1.开始答题。n); printf(t2.添加试题。n); printf(t3.退出系统。n); printf(n请选择:); scanf(%d,&n); switch(n) case 1:exe1();break; case 2:exe2();b
16、reak; case 3:printf(n-,goodbye!n); while(n!=3); 4 系统测试 4.1 如何设计测试数据 1.添加3道试题,查看题目数据是否正常写入题库(“C:test.txt”)中。 2.开始答题,查看程序是否能正确判断用户回答问题是否正确。 4.2 系统测试过程 测试1: 重庆理工大学课程设计 测试2: 测试3: 测试4: 重庆理工大学课程设计 测试结果: 重庆理工大学课程设计 所有功能测试正常。 5 总结 1.经过测试系统工作完全正常,各部分功能全部实现。多次运行未发现明显错误。 2.心得体会:写个程序不容易。学习编程如果不动手就永远不知道自己的缺点在哪里。