作业帮 > 综合 > 作业

小弟最近在弄一个背单词的程序,程序现在有了,有些想改动的地方,想把测试单词的部分改成以ABCD4个选项出现的形式,然后选

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/29 12:39:50
小弟最近在弄一个背单词的程序,程序现在有了,有些想改动的地方,想把测试单词的部分改成以ABCD4个选项出现的形式,然后选择正确的答案,请问怎么改动,原来是出现中文然后输入英文.希望大神能附上代码,感激不尽
我大概能理解你的意思,但是不太清楚具体的要求,是不是像下面这个样子?1.请问hello的意思是?A.喂,用于打招呼B.错误答案BC.错误答案CD.错误答案D
如果是这样的话,你可以定义一个结构体,存储题目的相关信息:typedef struct
{

   char answer;                // 正确答案

   const char *answerA;    // 答案A  

   const char *answerB;    // 答案B  

   const char *answerC;    // 答案C  

   const char *answerD;    // 答案D  
}QuestionInfor;

这么定义我觉得不是很好的,因为你不能把信息存储到文件当中,如果要不信息存储到文件中,你可以自己写一个解析器:
【我简单的写了下面的代码,你看看对你有没有帮助吧,我测试过,可以使用】

#include  <stdio.h>#include <ctype.h>
// 返回值#define ERR_END_OF_FILE     -1    // 文件到达尾部
#define ERR_FILE_OP             -2    // 文件相关操作出错
#define ERR_INVALID_ARG     -3    // 非法参数

/*! \brief  从文件中读出一行,行号为'\n'

   \param  fp 文件描述符

   \param  buffer 缓存

   \param  len 缓存长度

   \return  假如读取成功,返回值大于0,否则,返回 ERR_END_OF_FILE/ERR_FILE_OP/ERR_INVALID_ARG

*/
static int myGetLine(FILE *fp,char *buffer,int len)
{

   int i,offset;

   size_t mBytes;

   if (len <= 0) {

       printf("非法参数!\n");

       return ERR_INVALID_ARG;

   }

   if (feof(fp)) {

       return ERR_END_OF_FILE;

   }

   mBytes = fread(buffer,1,len,fp);

   if (mBytes < 0) {

       printf("读取文件错误!\n");

       return -ERR_FILE_OP;

   } else if ( mBytes == 0) {

       return ERR_END_OF_FILE;

   }

   offset = 0 ;

   for (i = 0;i < mBytes;i++) {

       if (buffer[i] == '\n') {

           buffer[i] = 0 ;

           offset = mBytes - i - 1;

           break ;

       }

   }

   buffer[len - 1] = 0 ;

   if (fseek(fp,-offset,SEEK_CUR) != 0 ) {

       printf("文件操作错误!\n");

       return ERR_FILE_OP;

   }

   return i + 1;

}

// 从文件中读取一个问题
static char getOneQuestion(FILE * fp)
{

   // 缓存大小

   char cpBuffer[1024];

   // 答案

   char cAnswer;

   int i,ret;

   cAnswer = ERR_END_OF_FILE;

   

   // 提取一个问题相关信息

   while ( 1 ) {

       ret = myGetLine(fp,cpBuffer,1024);

       if (ret < 0 ) {

           return ret;

       }

       if (strcmp(cpBuffer,"<Question>") != 0) {

           continue ;

       }

       break ;

   }

   // 获取单词

   if ((ret = myGetLine(fp,cpBuffer,1024)) < 0) {

       return ret;

   }

   printf("%s 是什么意思?\n",cpBuffer);

   // 获得答案

   if ((ret = myGetLine(fp,cpBuffer,1024)) < 0) {

       return ret;

   }

   for (i = 0;i < 1024;i++) {

       if (isalpha(cpBuffer[i])) {

           cAnswer = cpBuffer[i] ;

           break ;

       }

   }

   

   // 获取选项

   while ((ret = myGetLine(fp,cpBuffer,1024)) > 0) {

       if (strcmp(cpBuffer,"</Question>") == 0) {

           break ;

       }

       printf("%s \n",cpBuffer);

   }

   return cAnswer;

}

// main 函数int main()
{

   FILE *fp;

   char cAnswer,cInput;

   fp = fopen("words.inf","r");

   if (fp == NULL) {

       printf("Open file error\n");

       // 错误处理代码

       return -1;

   }

   while (1) {

       putchar(10);

       cAnswer = getOneQuestion(fp);

       if (cAnswer == -1) {

           printf("测试结束\n");

           break ;

       } else if (cAnswer < 0) {

           printf("读取题目错误\n");

           break;

       }

       printf("\n请输入答案 : \n");

       cInput = getchar();

       if (cInput == 'q' || cInput == 'Q') {

           break;

       }

       if ( toupper( cInput ) == toupper(cAnswer)) {

           printf("回答正确\n");

       } else {

           printf("回答错误,正确答案是 %c \n",cAnswer);

       }

       getchar();

       getchar();

   }

   fclose(fp);

   return 0;
}