#include
#include//cls#include//toupper#include//time#include //malloctypedef struct
{
char question[200],A[100],B[100],C[100],D[100];
char key;
}Question;
void menu();
void remenu();
void answer();
void addquestion();
void readfile(Question* qs,int total);
void question1(Question* qs,int i);//输出问题(不输出答案);void question2(Question* qs,int i);//输出问题(带答案)int Total();
void menu()
{
int n;//记录序列号 system("cls");
printf("************************************************************************************************************************\n");
printf("* 单项选择题标准化考试系统 V2.4 *\n");
printf("* *\n");
printf("* ①抽取答题 *\n");
printf("* *\n");
printf("* ②试题录入 *\n");
printf("* *\n");
printf("* ③ 退出 *\n");
printf("************************************************************************************************************************\n");
do
{
printf("┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉\n");
printf("请输入正确的序列号:\n");
printf("┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉\n");
scanf("%d",&n);
printf("\n");
}
while(n<1||n>4);
switch(n)
{
case 1:
answer();
break;
case 2:
addquestion();
break;
case 3:
exit(0);
break;
dedault:
printf("错误\n");
}
}
void addquestion()
{
FILE* readf;
char ch;
system("cls");//清屏 printf("*****************************************************************************\n");
printf("试题录入 \n");
printf("*****************************************************************************\n") ;
readf=fopen("question.txt","a");//a为文件追加内容 if(!readf)
{
printf("无法打开文件,打开文件失败\n");
exit(1);
}
printf("请按照以下格式来录入问题、ABCD四个选项及正确答案,并以#结束\n");
printf("例;( )是当前所处历史方位的关键词。\n") ;
printf("新时代\n");
printf("新时期\n");
printf("新阶段\n");
printf("新征程\n");
printf("A\n");
ch=getchar();//读取第一个字符 while(ch!='#')
{
fputc(ch,readf);
ch=getchar();
}
fclose(readf);
remenu();
}
void answer()
{
int i,j,total,n;//i用于索引,j也用于索引同i一起实现生产不重复的随机数组的功能。total用来存储总题目数。n用来存储用户输入的抽取题目数目。 int *a;//生产整型指针,用于建立动态数组 Question *qs;//生成Question型指针,用于建立动态结构数组 int score=0;//用于记分 char an;//存储用户输入的答案
total=Total();//利用Total()函数将总题目数返回给total qs=(Question*)malloc(total*sizeof(Question));
readfile(qs,total);//读取题目
system("cls");
printf("************************************************************************************************************************\n");//美化界面 printf("抽取答题 \n");
printf("************************************************************************************************************************\n");
printf("当前题库题目总数:%d\n",total);
loop1:printf("请输入抽查的题目数量:"); //loop1充当前哨,防止用户输入的n>total scanf("%d",&n);
printf("正在加载...\n");
printf("………………………………………………………………………………………………………………………………………………………………\n");
if(n<=total)
{
//开始生成不重复的随机数组 a=(int*)malloc(n*sizeof(int));//分配空间生成动态数组 for(i=0;i
{
loop2:srand(time(NULL));//srand和rand一起使用,这条语句大家把它看作用rand之前的一个习惯用法(rand为随机数) a[i]=rand()%total; //保证随机数在total内(小于total)(total为总题数) for(j=i-1;j>=0;j--)
{
if(a[i]==a[j])
goto loop2;//如果新抽出的题目(a[i])与已抽出的题目(a[j])一样,跳到loop:后的语句重新抽取a[i]
}
}
}
else
{
printf("超过最大题数,最大题数为%d\n",total);//保证抽出的题目不重复且在系统支持范围内(题目数量不超出总题数) goto loop1;
}
for(i=0;i
question1(&qs[a[i]],i+1);
fflush(stdin);//清空键盘缓冲区 an=getchar();//读取用户输入的答案 while((int)an<65||((int)an>68&&(int)an<97)||(int)an>100)//用强制转换判断用户输入的是否为选项 {
printf("请输入A,B,C,D其中之一作为你的答案\n");
fflush(stdin);
an=getchar();//读取用户输入的答案
}
if((int)an>96&&(int)an<101)//若用户输入的是小写字母,让其转换为大写字母 an=toupper(an);//大小写转换 if(qs[a[i]].key==an);//批改 {
score+=1;//正确+1分 printf("正确\n\n");
}
if(qs[a[i]].key!=an);
{
printf("错误\n正确答案为%C\\n\n",qs[a[i]].key);
}
}
printf("¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤\n");
printf("共%d题,您答对了%d道题\n",n,score);
printf("得分:%f\n",((float)score/n)*100);//评分 printf("¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤\n");
free(qs);//释放分配的内存空间 free(a);//同上 remenu();//返回菜单或退出//试题删除函数():用于删除题目。包含Total(),Readfile(),Putques2(),Remenu()函数
void remenu();
{
int n;
do
{
printf("§返回主菜单§请输入①\n");
printf("§ 退出 §请输入②\n");
scanf("%d",&n);
}while(n<1||n>2);
if(n==1)
menu();
else
exit(0);
}
void readfile(Question* qs,int total);
{
int i=0;
char o;
FILE* readf;
readf=fopen("question.txt","r");//仅打开 if(!readf)
{
printf("打开文件失败\n");
exit(1);
}
for(i=0;i
fscanf(readf,"%s%s%s%s%s%c%c",qs[i].question,qs[i].A,qs[i].B,qs[i].C,qs[i].D,&o,&qs[i].key);
fclose(readf);
}
//计算总题目数函数():功能入其名,利用几个空字符串读取文件内所有题目,读完一题total加一次1。int Total()
{
int total;//total用于存储总题目数 char question[200],A[100],B[100],C[100],D[100];//建立空字符串用于存储读的题目 char key,o;
FILE* readf;
readf=fopen("question.txt","r");
if(!readf)
{
printf("打开文件失败\n");
exit(1);
}
for(total=0;!feof(readf);total++)//每读完一个题目,总题目数+1 fscanf(readf,"%s%s%s%s%s%c%c",question,A,B,C,D,&o,&key);
total-=1;
fclose(readf);//关闭文件 return total;//返回total的值并退出该函数}
//输出题目函数():用于题目的打印。一个打印出来无答案,一个有答案。分别用于抽取答题函数和试题删除函数。void question1(Question* qs,int i);//导入Question型指针,以及当前题目序号i{printf("(%d)%s\n A.%s\n B.%s\n C.%s\n D.%s\n",i,qs->question,qs->A,qs->B,qs->C,qs->D);}
void question2(Question* qs,int i);
{printf("(%d)%s\n A.%s\n B.%s\n C.%s\n D.%s\n 答案:%c\n",i,qs->question,qs->A,qs->B,qs->C,qs->D,qs->key);}
int main()
{
menu();
}