选择题标准化系统
程序代码:
#include<stdio.h> #include<windows.h>//cls #include<ctype.h>//toupper #include<time.h>//time #include <stdlib.h>//malloc typedef 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<n;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<n;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);//大小写转换<ctype.h> 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<total;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(); }