所属专业:软件工程软件三班
完成人:潘尚
一.设计计划.
1.能够用菜单明确的指导用户操作.
2.操作完成可以返回主菜单.
3.将输入的题目保存至C盘的文本文件中,以便日后读取.
4.若没有题目,提示用户输入题目,建立文本文档于C盘根目录.
5.答题为随机抽取题目进行回答.
6.若输入小写答案选项如abcd,将其转换为大写字母再判断.
7.系统在用户答完题目后可以进行正确率, 答对个数的统计.
二.程序模块设计.
1.模块一:菜单操作模块
该模块实现程序的菜单操作.
算法
(1)在屏幕上呈现美观的菜单..
(2)提示用户输入.
(3)待用户输入选项,swich语句判断,输入错误则重新输入.
2.模块二:题目装入内存模块
函数开辟内存空间将试题文件中题目装入内存中.
算法:
(1)寻找回车符号,判断题目数量.
(2)开辟内存空间,将题目信息装入内存.
(3)关闭文件返回题目总数.
3.模块三:答题模块
在屏幕上输出题目让用户输入答案。判断用户输入答案是否正确.
算法:
(1)接受用户输入题目数,判断是否小于总共题目或者小于0.
(2)置随机数.
(3)将题目装入内存.
(4)输出题目,等待用户输入答案.
(5)判断输入.
4.模块四:添加试题模块
打开储存试题的文件进行试题信息输入.
算法:
打开文件,开辟内存空间,判断用户输入,写入文件.
四:流程图绘制
1.菜单流程图
2.装入内存
3.答题模块
{
五.问题.
文件读写时文件指针的移位:
当用fgetc()函数遍历文件时文件指针是顺序移动的,当遇到回车符时才会判断出文件在第几行。而当读取文件信息的时候文件指针的位置应该在行首,这是就要用到fseek()函数将文件指针移位。而且还要恢复文件指针的位置,用于继续判断当前是文件的第几行。
六.源代码.
#include<stdio.h>
#include<stdlib.h>
#defineLEN sizeof(struct test)
structtest
{
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;
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=(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);
returnn;//返回题目总数n
}
void exe1()
{
charchange(char word);
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<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(change(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() //实现用户自主输入题目
{
char change(char word);
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=change(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()
{
voidchange(char word);
leap: system("cls"); //调用dos命令
int n;
puts("┌────────────────────────────────────────┐\n");
puts("│****欢迎使用单项选择题标准化考试系统****|\n");
puts("│─────────────1.开始答题。───────────────│\n");
puts("│─────────────2.添加试题。───────────────│\n");
puts("│─────────────3.帮助说明。───────────────│\n");
puts("│─────────────4.版权信息。───────────────│\n");
puts("│─────────────5.退出系统。───────────────│\n");
puts("│****************************************│\n");
puts("│ ^-^ │\n");
puts("│ ┌──────────────┐ │\n");
puts("│ │ copyright@潘尚 │ │\n");
puts("│ │ 1.01 │ │\n");
puts("│ │ │ │\n");
scanf("%d",&n);
switch(n)
{
case1:exe1();break;
case2:exe2();break;
case3:
system("cls");
printf("这是一款自我检测的答题系统,试题保存在c盘根目录的test.txt文本文件中,可自行加入试题.\n\n可直接打开c盘文件自行添加题目\n\n\n注意格式:题目 选项A. B. C. D. 答案\n\n\n");getchar();
puts("输入任何值回到主菜单");getchar();goto leap;
case4:
system("cls");
printf("版权所有:潘尚。联系:574273250@qq.com\n\nedition:1.01 \n\n 来自华中科技大学文华学院软件三班 \n\n");getchar();
puts("输入任何值回到主菜单");getchar();goto leap;
case5:printf("\n欢迎再次使用,再见^-^\n");getchar();
}while(n!=7);
}
char change(char word) /*转换为大写字母*/
{
if((word>=‘a‘)&&(word<=‘z‘))
word-=32;
return(word);
}
七.测试.
|
|
|
|
|
C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans
原文地址:http://blog.csdn.net/shinepan/article/details/24703583