事情是这样的:
鄙人的学校开展了一个校内的知识竞赛,赛事主办方提供给了我们一个题库进行练习(但是是Word版本的),题目量不多(单选题 “ 也就 ” 140多道题目)。
当然,我们完全可以对着那个枯燥无味的Word文档进行死记硬背,但是,身为一名计算机专业的学生,这样做显然不符合我们 “ 专 业 风 格 ”,特别是对于我这种一面对长篇文字就倍感倦意的人来说,能有一个 刷题程序 来帮助我提高记忆的效果是再好不过的了。
激动过后冷静想了想,作为一名大一的学生,觉得以我目前所学的知识,是完全有可能驾驭得住我的想法的!!!!。
具体的实现:
一、需求分析:
由于我的需求非常的简单呐,仅仅是需要创建一个单项选择题库,实现类似于背英文单词的APP那样的一个小程序,程序给我提供问题,我提供选项,程序判断我的对错,即可;
二、题目分析:
题 目 例 子:
从图中我们不难看出,一道题目大刀阔斧的可以分成三个部分:题干、选项、答案;
那么,事情变简单了,我们把一道题目概括为一个结构体,结构体内部包含以上三种内容,分别用字符串、字符串、字符进行概括; 如下:
struct ques{
char question[300]; //保存问题
char select[5][100]; //二维数组用来保存选项
char temp[20]; //临时读取 “答案:A” 这样的字符串
char answer; //获取临时读取的字符串中的答案“A”
}a[150];
解 释 一 下:
Q1:为什么数组要开这么大?
因为据我所知,中文字符需要占据两个字符的位置,因此如果有15个汉字,就必须至少开辟一个str[30]这样一个空间;
Q1:a[150]是什么意思?
如上所述,结构体数组a中每一个元素代表了一个问题的全部概括。
三、具体的实现:
有了以上的分析,程序设计起来就十分的方便了。
第一步、把Word文档中的题库复制到一个txt文件中
第二步、读取txt文件中的内容存储到事先定义好的结构体数组中
第三步、将结构体数组中的问题一个一个输出并根据我们的输入进行判断我们的回答是 否正确;
以下是完整的代码以及效果
(别走开后面还有总结部分:精华!!!):
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
struct ques{
char question[300];
char select[5][100];
char temp[20];
char answer;
}a[150];
int main(){
int randnum,count=0;
int pan[150]={0};
srand((unsigned)time(NULL));
randnum=rand()%138+1;
FILE *fp = NULL;
fp=fopen("C:\\Users\\ryq\\Desktop\\shuati\\test22.txt","r+");
if(fp==NULL){
printf("WRONG!!!!!!!");
return 0;
}
for(int i=1;i<=138;i++){ //第二步、读取txt文件中的内容存储到事先定义好的结构体数组中
fscanf(fp,"%s",a[i].question);
for(int j=1;j<=4;j++){
fscanf(fp,"%s",a[i].select[j]);
}
fscanf(fp,"%s",a[i].temp);
a[i].answer=a[i].temp[6];
}
while(1){ //第三步、循环输出问题并进行判断
char an,flag;
randnum=rand()%138+1;
if(pan[randnum]==1) //这里的判断条件是记录每道题目出现的次数,
//博主是设置一道题目只出现一次,如果想出现两次
//更改为pan[randnum]>=2即可
continue;
pan[randnum]++;
printf("\n\t%s\n\n",a[randnum].question);
for(int j=1;j<=4;j++){
printf("\t%s\n\n",a[randnum].select[j]);
}
scanf("%c",&an);
if(an==a[randnum].answer)
printf("Y E S\n");
else{
printf("W R O N G\n");
printf("正确答案是:%C\n",a[randnum].answer);
}
count++; //count的作用是记录已经做了道题目
printf("你已经做了 %d 道题,还要继续吗?/Enter\n",count);
getchar();
scanf("%c",&flag);
if(flag!='\n')
break;
}
return 0;
}
运行截图:
总结部分 :
1、代码中用了随机数进行题目的随机输出题目;
2、增加了一些细节:比如题目出现的次数、已经做的题目数量等等;
3、使用\t\n等转义字符进行了简单的排版
个人感触:这次敲代码的感觉明显就和以往不一样了,以前是为了做题目而敲代码,但这次 感觉到的是所学到的知识真真切切得方便了我的生活。