题目:

代码:

#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