标题:选择题标准化系统
取消只看楼主
郭阳yang
Rank: 1
等 级:新手上路
帖 子:24
专家分:9
注 册:2020-10-24
结帖率:100%
已结贴  问题点数:20 回复次数:3 
选择题标准化系统
程序代码:
#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();
     }
搜索更多相关主题的帖子: total int printf Question void 
2021-03-01 15:33
郭阳yang
Rank: 1
等 级:新手上路
帖 子:24
专家分:9
注 册:2020-10-24
得分:0 
求指教
2021-03-01 15:33
郭阳yang
Rank: 1
等 级:新手上路
帖 子:24
专家分:9
注 册:2020-10-24
得分:0 
回复 3楼 zbjzbj
这里出现了什么问题吗
2021-03-01 19:59
郭阳yang
Rank: 1
等 级:新手上路
帖 子:24
专家分:9
注 册:2020-10-24
得分:0 
回复 5楼 纯蓝之刃
解决了,谢谢啦,不过我又发现了新问题,
2021-03-02 14:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-504987-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023722 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved