ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

小学期C语言实训:考试出题计分系统设计

2019-07-14 19:39:00  阅读:333  来源: 互联网

标签:题目 计分 scanf ans ret C语言 实训 printf reading


题目:

在这里插入图片描述

代码:

#include<stdio.h>
#define _question_len 100
#define maxn 1000
typedef struct Question{ // 题目结构体,存储一个题目
    char str[_question_len] ; // 试题内容
    char ans_A[20], ans_B[20], ans_C[20], ans_D[20] ;
    char real_answer, chos_answer ; // real_answer:正确答案,chos_answer:所选答案
};
struct Question list[maxn]; // 题库中题目
int ques_num ; // 当前题库中题目数量
int m ; // 生成题目数量
int chos_id[maxn] ; // 选取的题目号码
char name[40], student_id[40] ;
int i, j, is_reading ;

void printQuestion ( int id , struct Question q ) { // 输出题目
    printf( "Question %d : \n%s\n", id, q.str ) ;
    printf( "A.%s\tB.%s\tC.%s\tD.%s\n", q.ans_A, q.ans_B, q.ans_C, q.ans_D ) ;
}
void readQuestion ( int id ) { // 读取题目
    struct Question ret ;
    if ( is_reading == 0 ) printf( "请输入要添加的试题内容:\n" ) ;
    scanf( "%s", ret.str ) ;
    if ( is_reading == 0 ) printf( "请输入要选项A内容:\n" ) ;
    scanf( "%s", ret.ans_A ) ;
    if ( is_reading == 0 ) printf( "请输入要选项B内容:\n" ) ;
    scanf( "%s", ret.ans_B ) ;
    if ( is_reading == 0 ) printf( "请输入要选项C内容:\n" ) ;
    scanf( "%s", ret.ans_C ) ;
    if ( is_reading == 0 ) printf( "请输入要选项D内容:\n" ) ;
    scanf( "%s", ret.ans_D ) ;
    if ( is_reading == 0 ) printf( "请输入正确选项:\n" ) ;
    char ch = '\n';
    while( ch=='\n' || ch == ' ' || ch == '\t' ) scanf( "%c", &ch ) ;
    ret.real_answer = ch ;
    list[id] = ret ;
}
void Init () { // 初始化
    m = 0 ;
    is_reading = 0 ;
    freopen( "姓名_学号.txt" ,"r", stdin ) ;
    is_reading = 1 ;
    scanf( "%d", &ques_num ) ;
    for( i=0; i<ques_num; i++ ) {
        readQuestion( i );
    }
    freopen( "CON", "r", stdin ) ;
    is_reading = 0 ;
    printf( "试卷读取完毕\n" ) ;
}
void creatTest ( int num ) { // 选取 num 道题生成试卷
    int rest = ques_num ;
    int vis[maxn] = {0} ;
    for( i=0; i<num; i++ ) {
        int temp = rand()%rest , k = 0 ;
        for( j=0; j<num&&k<temp; j++ ) {
            if( vis[j] == 1 ) {
                continue;
            }
            else {
                k++ ;
            }
        }
        chos_id[i] = k ;
        vis[k] = 1 ;
    }
}
void printList () { // 输出功能表
    int T = 20 ;
    T = 10 ; while( T-- ) printf("-") ;
    printf( "功能表:") ;
    T = 10 ; while( T-- ) printf("-") ;
    printf( "\n" );
    printf( "添加题目请输入:1\n" ) ;
    printf( "抽取试卷请输入:2\n" ) ;
    printf( "开始答题请输入:3\n" ) ;
    printf( "自动判卷并输出成绩请输入:4\n" ) ;
    printf( "结束程序请输入:5\n") ;
    T=26; while( T-- ) printf("-") ;    printf( "\n" );
}
int main()
{
    Init() ;
    int op = 0;
    while ( 1 ) {
        printList() ;
        printf( "请输入所选功能:\n" ) ;
        scanf( "%d", &op ) ; // 输入当前操作数
        if (op == 1 ) { // 添加试题
            readQuestion( ques_num ) ;
            ques_num++ ;
            printf( "试题读取完毕\n" ) ;
        }
        else if ( op == 2 ) { // 生成试卷
            printf( "当前题库题目数量为: %d\n请输入需要生成的试卷题目数量:", ques_num ) ;
            m = 1 ;
            scanf( "%d", &m ) ;
            while( m > ques_num ) { // 输入题目数不合法
                printf( "题库中题目数量不足,请重新输入:" ) ;
                scanf( "%d", &m ) ;
            }
            creatTest( m ) ;
            printf( "试卷生成完毕\n" ) ;
        }
        else if ( op == 3 ) { // 答题
            printf( "请输入学号:\n" ) ;  scanf( "%s", student_id ) ;
            printf( "请输入姓名:\n" ) ;  scanf( "%s", name ) ;
            printf( "请开始答题:\n" ) ;
            for( i=0; i<m; i++ ) {
                printQuestion( i+1 , list[chos_id[i]] ) ;   printf("你的答案:");
                char ch = '\n' ;
                while( ch=='\n' || ch == ' ' || ch == '\t' ) scanf( "%c", &ch ) ; // 保证读入信息为字母选项
                list[chos_id[i]].chos_answer = ch ;
            }
            printf( "答题完毕\n" ) ;
        }
        else if ( op == 4 ) { // 判卷输出成绩
            if ( m == 0 ) {
                printf( "试卷题目数为0,请重新生成。\n" ) ;
                continue ;
            }
            int ac_num = 0 ; // 答对题数
            printf( "题号:\t正确答案:\t你的答案:\n") ;
            for( i=0; i<m; i++ ) {
                printf("%d\t%c\t%c\n", i+1, list[chos_id[i]].real_answer, list[chos_id[i]].chos_answer ) ;
                if ( list[chos_id[i]].real_answer == list[chos_id[i]].chos_answer ) ac_num++ ;
            }
            printf( "判题结束\n" ) ;
            printf( "学生姓名: %s\t学号: %s\n", name, student_id ) ;
            printf( "正确数: %d/%d\n正确率: %.2f\n", ac_num, m, 1.0*ac_num/m ) ;
        }
        else if ( op == 5 ) { // 结束程序
            printf( "程序结束\n " ) ;
            return 0;
        }
        else { // 输入操作数不合法
            printf( "输入不合法,请重新输入\n" ) ;
        }
    }
    return 0;
}

运行截图:

在这里插入图片描述

文件内容:

对应输入文件 “姓名_学号.txt” 内容:

5
4+2=()
1
-2
3
6
D

4+1=()
1
-2
3
5
D

1+2=()
1
-2
3
6
C

-4+2=()
1
-2
3
6
B

2*4=()
8
-2
3
6
A

4+2=()
1
-2
3
6
A

标签:题目,计分,scanf,ans,ret,C语言,实训,printf,reading
来源: https://blog.csdn.net/qq_36306833/article/details/95913479

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有