| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1070 人关注过本帖
标题:标准单选题考试系统,又出问题了,求指教,怎么就串行了呢?
只看楼主 加入收藏
郭阳yang
Rank: 1
等 级:新手上路
帖 子:24
专家分:9
注 册:2020-10-24
结帖率:100%
收藏
 问题点数:0 回复次数:2 
标准单选题考试系统,又出问题了,求指教,怎么就串行了呢?
程序代码:
#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(an!=qs[a[i]].key) 
        printf("错误\n正确答案为%c\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;
    char 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)",i);

 printf("%s",qs->question);

 printf("A%s\n",qs->A);

 printf("B%s\n",qs->B);

 printf("C%s\n",qs->C);

 printf("D%s\n",qs->D);
}

void question2(Question* qs,int i)
{
printf("(%d)",i);

 printf("%s",qs->question);

 printf("A%s\n",qs->A);

 printf("B%s\n",qs->B);

 printf("C%s\n",qs->C);

 printf("D%s\n",qs->D);
printf("答案:%s\n",qs->key);}

int main(void)
{
    menu();
}
[local]1[/local]
搜索更多相关主题的帖子: total int void printf Question 
2021-03-02 14:35
郭阳yang
Rank: 1
等 级:新手上路
帖 子:24
专家分:9
注 册:2020-10-24
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2021-03-02 14:36
sssooosss
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:3
帖 子:664
专家分:1115
注 册:2019-8-27
收藏
得分:0 
共同学习
2021-03-05 08:37
快速回复:标准单选题考试系统,又出问题了,求指教,怎么就串行了呢?
数据加载中...
 
   



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

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