资源描述
沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:C语言课程设计
课程设计题目:单项选择题标准化考试系统设计
院(系): 计算机学院
专 业: 计算机科学与技术
班 级: 34010104
学 号: 2013040101164
姓 名:
指导教师: 孙伟东
完成日期: 2014年03月1日
沈阳航空航天大学课程设计报告
目 录
第1章 概要设计 - 1 -
1.1题目的内容与要求 - 1 -
内容:设计并实现一个单项选择题标准化考试系统。该系统可以完成试题录入、试题抽取、自动判卷等功能。 - 1 -
1.2总体结构 - 1 -
第2章 详细设计 - 2 -
2.1菜单操作模块 - 2 -
2.2将题目装入内存模块 - 4-
2.3开始答题模块 - 5 -
2.4添加试题模块 - 9 -
第3章 调试分析 - 13 -
第4章 使用说明 - 14 -
附 录(程序清单) - 17 -
沈阳航空航天大学课程设计报告 第1章 概要设计
第1章 概要设计
1.1题目的内容与要求
内容:设计并实现一个单项选择题标准化考试系统。该系统可以完成试题录入、试题抽取、自动判卷等功能。
要求:
(1) 用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)
(2) 试题录入:可随时增加试题到试题库中
(3) 试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)
(4) 答题:用户可实现输入自己的答案
(5) 自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
1.2总体结构
本程序主要分为四个模块(功能模块图见下图):(1)模块一:菜单操作模块
该模块实现程序的菜单操作。2)模块二:将题目装入内存模块函数开辟内存空间将试题文件中题目装入内存中。(3)模块三:开始答题模块函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。判断用户输入答案是否正确。4)模块四:添加试题模块
菜单操作模块
将题目装入内存模块
开始答题模块
添加试题模块
单项选择题标准化考试系统
打开储存试题的文件进行试题信息输入。
图1.1 功能模块图
- 24 -
沈阳航空航天大学课程设计报告 第2章 详细设计
第2章 详细设计
2.1菜单操作模块:
控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块,实现各项功能,流程如图2.1所示。
开 始
Systcm(“cls”);
n=1
exe1( );break;
9
n=2
n=3
exe2( );break;
printf(“goodbycl\n”);
1
N
N
Y
Y
N
Y
1
n!=3
结 束
Y
N
输入错误,请重新输:入:
图2.1
该模块实现程序的菜单操作。
实现算法如下:
在屏幕上输出菜单选项。
接受用户输入。
2.2.将题目装入内存模块:
将题目装入内存模块函数开辟内存空间将试题文件中题目装入内存中
Side By Side
Fclose(fp);
结 束
!feof(fp)
(fp=fopen(“test.txt,,,,,,
Printf(“文件打开失败......
FILE”fp”;
N
Y
Y
N
开始
流程如图2.2所示
图2.2
函数开辟内存空间将试题文件中题目装入内存中。
实现算法如下:
遍历文件判断回车符个数(计算题目数)。
根据提供参数判断是否将当前题目装入内存。
开辟内存空间,将题目信息装入内存。
关闭文件返回题目总数。
2.3开始答题模块:
开始答题模块函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。判断用户输入答案是否正确。
流程图如图2.3
Vold main( )
0>n||n>tm
Printf(“答题数应小于总数.
i=0
2
N
Y
开始
ets( m )
M=rand( );
I<n
2
Touppor(ans[0])==
Printf(“恭喜你答对了......
I++
P1=head;
Head=p1->next;
P1=NULL
3
Y
N
N
Y
Y
N
!(0<m&&m<=tm)m
Touppor(ans[0])==p1->t....
Printf(“恭喜你答错了......
3
Printf(“******************************”);
i==1
exe1( );
i==2
exe2( );
main( );
4
N
Y
N
Y
图2.3
函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。判断用户输
入答案是否正确。
实现算法如下:
接受用户输入题目数,判断是否合法(大于0、小于总题数)。
置随机数并判断随机数是否合法。
调用将题目装入内存模块题目装入内存。
在屏幕上输出题目,接受用户输入答案。
判断用户输入的答案是否正确,输出答题结果统计。
2.4添加试题模块:
流程图如图2.4
4
Viod main( );
fp=fopen(“test.txt........
Printf(“文件打开失败请检查........
Struct test “p1=NULL;
Printf(“请输入题目:”);
P->que[0]==“\0”
5
N
Y
Y
N
5
Printf(“请输入选项A:”);
P1-〉answer1==’\0’
Y
N
Printf(“请输入选项B:”);
P1-〉answer2==’\0’
Y
N
Printf(“请输入选项C:”);
P1-〉answer3==“\0”
6
Scanf(“%c”,&p1->ture);
p1->ture&&p1..>ture
Printf(“请输入答案:”);
Y
N
Printf(“请输入选项D:”);
P1-〉answer4==’\0’
6
Printf(“\n请输入题目:”);
7
N
Y
main( );
7
n= =1
Fputc(“\n”,fp);
n= =1
exe2( );
Free(fp1);
0)
结 束
N
Y
N
Y
打开储存试题的文件进行试题信息输入。
实现算法如下:
打开文件。
开辟内存空间,接受用户输入题目信息。
判断用户输入是否合法。
写到文件并保存。
沈阳航空航天大学课程设计报告 第3章 调试分析
第3章 调试分析
问题1:文本文件无法删除指定的一行
方法:所以要用类似于进栈出栈的方法,把要删的信息过滤出去
问题2:程序不能运行
方法:解决办法就是不断的按F10进行调试,最终找到错误的地方。
问题3:打开的文件没有关闭,最终导致一部分源代码被无意休改
方法:问了成绩好的同学,最后加了个关闭文件的函数。
沈阳航空航天大学课程设计报告 第4章 使用说明
第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开辟的结构体首地址赋给p1
printf("\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();//继续答题
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文件。\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("请输入答案:");
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);
fputc(' ',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.返回主菜单\n");
scanf("%d",&n);
if(n==1)
exe2();
else
main();
}
else
{
free(p1);
exe2();
}
}
void main()
{ int n,temp=1;
while(1)
{
system("cls");
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();temp=0;break;
case 2:exe2();temp=0;break;
case 3:printf("\n^-^,goodbye!\n");
default:printf("输入错误,请重新输入:");scanf("%d",&n);break;
}
}
}
课程设计总结:
经过这整整5天的C课程设计的训练,我学到了很多,最主要的一点是怎样去运用自己学过的知识,怎样去找到你所需要的资料,并在短时间把它运用到具体的实践中,运用到你所需要的方面。这个过程是很艰难的,要花费很多的时间和精力,但是,在事情过后,自己就会发现自己已经在这个过程中学到了自己想要的东西,这种获得是更深刻的。
在做这个C课程设计的时候,我原先也是学的不怎么好,什么是结构体数据,什么是定义类型,怎样在一个main函数中调用别的定义函数,等等,可以说是忘得差不多了。然而,在这门课程设计中,这些方面却是特别重要的,可以说,掌握了这个,你就完全可以完成自己的任务。这就要求我们要自己去学,自己去探索。当然,看书、问同学是必不可少的,还有,身边有非常丰富的网络资源给我们好好利用,百度就是个很不错的地方。这样就从另一方面锻炼了我们检索知识获取信息的能力,在这个过程中,可以学到的是一种提升自我的能力。
指导教师评语:
指导教师(签字): 年 月 日
课程设计成绩
展开阅读全文