题目:
代码:
#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