赵育峰c语言课程设计.docx
- 文档编号:17484346
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:19
- 大小:230.74KB
赵育峰c语言课程设计.docx
《赵育峰c语言课程设计.docx》由会员分享,可在线阅读,更多相关《赵育峰c语言课程设计.docx(19页珍藏版)》请在冰点文库上搜索。
赵育峰c语言课程设计
C语言课程设计报告
院系名称计算机学院
班级网信12-03班
学生姓名赵育峰
学号311209050329
指导教师毋小省
时间2013年7月
目录
1.问题描述
功能要求
2.系统分析
2.1题目要求
2.1算法设计
2.3流程图
2.4关键问题
3.系统实现
3.1源代码
4.系统测试
4.1如何设计测试数据
4.2系统测试过程
5.总结
1问题描述
题目九:
单项选择题标准化考试系统
功能要求:
(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)模块一:
菜单操作模块
该模块实现程序的菜单操作。
实现算法如下:
在屏幕上输出菜单选项。
接受用户输入。
判断用户输入,跳转到对应函数入口。
(2)模块二:
将题目装入内存模块
函数开辟内存空间将试题文件中题目装入内存中。
实现算法如下:
遍历文件判断回车符个数(计算题目数)。
根据提供参数判断是否将当前题目装入内存。
开辟内存空间,将题目信息装入内存。
关闭文件返回题目总数。
(3)模块三:
开始答题模块
函数会让用户输入要答的题目数,在屏幕上输出题干和选项并让用户输入答案。
判断用户输入答案是否正确。
实现算法如下:
接受用户输入题目数,判断是否合法(大于0、小于总题数)。
置随机数并判断随机数是否合法。
调用将题目装入内存模块题目装入内存。
在屏幕上输出题目,接受用户输入答案。
判断用户输入的答案是否正确,输出答题结果统计。
(4)模块四:
添加试题模块
打开储存试题的文件进行试题信息输入。
实现算法如下:
打开文件。
开辟内存空间,接受用户输入题目信息。
判断用户输入是否合法。
写到文件并保存。
2.3流程图
1.菜单操作模块:
2.将题目装入内存模块:
3.开始答题模块:
4.添加试题模块:
2.4关键问题
文件读写时文件指针的移位:
当用fgetc()函数遍历文件时文件指针是顺序移动的,当遇到回车符时才会判断出文件在第几行。
而当读取文件信息的时候文件指针的位置应该在行首,这是就要用到fseek()函数将文件指针移位。
而且还要恢复文件指针的位置,用于继续判断当前是文件的第几行。
3系统实现
3.1源代码
#include
#include
#defineLENsizeof(structtest)
structtest
{
charque[81];
charanswer1[81];
charanswer2[81];
charanswer3[81];
charanswer4[81];
charture;
structtest*next;
};
structtest*head;//全局变量储存第一个结构体的指针
intzts(intm)//将第m道题装入内存,输入-1时将返回总题数
{
FILE*fp;
structtest*p1=NULL;
charch,ch1[5];
inti,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=(structtest*)malloc(LEN);
head=p1;
p1->next=NULL;
}
else
{
p1->next=p1;
p1=(structtest*)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);
returnn;//返回题目总数n
}
voidexe1()
{
voidmain();
voidexe2();
intn,m=0,tm,i,t=0,f=0;
charans[2];
structtest*p1;
system("cls");
printf("请输入要答题数:
");
scanf("%d",&n);
tm=zts(-1);
if(0>n||n>tm)
{
printf("答题数应小于总数!
");
exe1();
}
for(i=0;i { do { m=rand();//置随机数 }while(! (0 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();//返回主菜单 } voidexe2()//实现用户自主输入题目 { voidmain(); system("cls"); intn; FILE*fp; if((fp=fopen("c: \\test.txt","a"))==NULL) { printf("文件打开失败请检查C盘下的test.txt文件。 \n"); exit(0); } structtest*p1=NULL; p1=(structtest*)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(); } } voidmain() { system("cls"); intn; printf("********************************\n"); printf("欢迎使用单项选择题标准化考试系统\n"); printf("********************************\n"); printf("\t1.开始答题。 \n"); printf("\t2.添加试题。 \n"); printf("\t3.退出系统。 \n"); printf("\n请选择: "); scanf("%d",&n); switch(n) { case1: exe1();break; case2: exe2();break; case3: 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.心得体会: 写个程序不容易。 学习编程如果不动手就永远不知道自己的缺点在哪里。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 赵育峰 语言 课程设计