当前位置:文档之家› C语言课程设计(单项选择题标准化考试系统)报告

C语言课程设计(单项选择题标准化考试系统)报告

重庆理工大学课程设计课程程序设计基础 C 题目 C 语言综合程序设计院系名称班级学生姓名学号指导教师评阅教师时间2011.61 问题描述题目十四:单项选择题标准化考试系统设计功能要求:(1)、用文件保存试题库。

(每个试题包括题干、 4 个备选答案、标准答案)(2)、试题录入:可随时增加试题到试题库中(3)、试题抽取:每次从试题库中可以随机抽出N道题(N 由键盘输入)(4)、答题:用户可实现输入自己的答案(5)、自动判卷:系统可根据用户答案与标准答案进行评分。

2 系统分析2.1 题目要求程序分 4 个函数来实现菜单操作、将题目装入内存、开始答题、题目的录入。

1. 菜单操作:Main 函数,实现程序的菜单操作。

根据用户选择的菜单的不同选项调用不同的函数,实现“开始答题” 、“添加试题” 、“退出系统”等功能。

2. 将试题装入内存:此函数由“开始答题”函数调用。

调用此函数时传递一个整型参数m,函数开辟内存空间将试题文件(“ C:\test.txt ”)中第m道题装入内存中,并返回总题数。

如果传递参数m 为-1 ,函数将直接返回试题文件中所储存的总题数,不将任何试题装入内存中。

3. 开始答题:函数会让用户输入要答的题目数并进行判断,若用户要求的答题数大于总题数程序会要求用户重新输入。

程序生成随机数并判断是否合法,如果合法就调用“将试题装入内存”函数,参数为随机数。

在屏幕上输出题干和选项并让用户输入答案。

判断用户输入答案是否正确。

4. 添加试题:打开储存试题的文件(“ C:\test.txt ”),开辟内存空间。

进行试题信息输入。

自动保存文件。

2.2 算法设计(1)模块一:菜单操作模块该模块实现程序的菜单操作。

实现算法如下○1 在屏幕上输出菜单选项。

○2 接受用户输入。

○3 判断用户输入,跳转到对应函数入口。

(2) 模块二:将题目装入内存模块函数开辟内存空间将试题文件中题目装入内存中。

实现算法如下:○1遍历文件判断回车符个数(计算题目数) 。

○2 根据提供参数判断是否将当前题目装入内存。

○3开辟内存空间,将题目信息装入内存。

○4 关闭文件返回题目总数。

(3) 模块三:开始答题模块函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。

判断用户输入答案是否正确。

实现算法如下:○1接受用户输入题目数,判断是否合法(大于0、小于总题数) 。

○2置随机数并判断随机数是否合法。

○3 调用将题目装入内存模块题目装入内存。

○4在屏幕上输出题目,接受用户输入答案。

○5判断用户输入的答案是否正确,输出答题结果统计。

(4) 模块四:添加试题模块打开储存试题的文件进行试题信息输入。

实现算法如下:○1打开文件。

○2 开辟内存空间,接受用户输入题目信息。

○3 判断用户输入是否合法。

○4 写到文件并保存。

2.3 流程图1. 菜单操作模块:2. 将题目装入内存模块:3. 开始答题模块:4. 添加试题模块:2.4 关键问题文件读写时文件指针的移位:{ 当用 fgetc() 函数遍历文件时文件指针是顺序移动的, 当遇到回车符时才会判断出文件在第几行。

而当读取文件信息的时候文件指针的位置应该在行首,这是就要用到 数将文件指针移位。

而且还要恢复文件指针的位置,用于继续判断当前是文件的第几行。

3 系统实现3.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);}dopy=1;ch=fgetc(fp);fseek() 函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,&p 1->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 正确。

\n 正确率:%5.2f%%\n\n",n,f,t,(float)t/n*100); printf("*******************************\n");printf("\n\n1. 继续答题; 2. 添加题目; 3. 返回主菜单;\n 请选择:"); i=0;scanf("%d",&i);if(i==1)exe1();// 继续答题elseif(i==2)exe2();// 添加题目elsemain();// 返回主菜单}void exe2()// 实现用户自主输入题目{void main();system("cls");int n;FILE *fp;if((fp=fopen("c:\\test.txt","a"))==NULL){printf(" 文件打开失败请检查 C 盘下的test.txt 文件。

\n"); exit(0); }struct test *p1=NULL;p1=(struct test *)malloc(LEN);// 开辟内存空间do{printf(" 请输入题目:"); scanf("%s",&p1->que);}while(p1->que[0]=='\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);}while(p1->answer3=='\0');do{printf(" 请输入选项D:"); scanf("%s",&p1->answer4);}while(p1->answer4=='\0'); printf(" 请输入答案:");doscanf("%c",&p1->ture);{p1->ture=toupper(p1->ture); }while(p1->ture!='A'&&p1->ture!='B'&&p1->ture!='C'&&p1->tur e!='D'); printf("\n 确认输入题目?\n1. 是。

相关主题