1 引言
1.1 编写目的:
为了对院级活动《最强大脑》提供软件支持,同时为了练习使用windows API。
1.2 项目背景:
来自计算机学院学生会信息部指派的任务,规定时间完成软件的编写。
1.3 参考资料:
● 《windows程序设计》、网络资料
● 文档格式来自 http://blog.csdn.net/qjfpjie/article/details/7604834 由详细设计说明书改编
2 总体设计
2.1 需求概述
《随机出题软件》:分程序和题库,题库为3、5、7分题库。程序界面需提供这三种题的按钮,需要具有从题库中随机抽取题目、显示题目、显示答案以及倒计时功能。
《随机分队软件》:随机分好队伍。分别实现30人选5人,10人选5人。选出来的是编号。
3 程序描述
《随机出题软件》:
题库文件“1.txt、2.txt、3.txt”,答案文件分别对应“a1.txt、a2.txt、a3.txt”,放在程序根目录下。
题库中存题目的格式应该是"#12 李白字什么?",其中题号和题目描述不能连在一起。
题目描述中不能出现‘#’字符,否则误认为后面是题号。
3.1 逐个模块给出以下说明:
● 功能
《随机出题软件》:
随机抽取题库中题目、显示题目、显示答案、倒计时、声效提示、自动更新题库大小。
《随机分队软件》:
30选5、10选5、显示分队结果。
● 性能
《随机出题软件》:
题库如果过大,软件会卡死,显示的题目不能太长,所以要规范好题库文件。
3.2 算法:
《随机出题软件》:
核心算法为调用rand()及srand()实现随机出题功能,另无高深算法。
● 存储分配
利用txt文件存储,而没使用数据库,存储以及管理数据较为麻烦。
4 程序展示
《随机出题软件》:
文件结构:
使用演示:
《随机分队软件》:
文件结构:
使用演示:
5 源代码
目录:
《随机出题软件》myRandom.cpp
《随机出题软件》win1.cpp
《随机出题软件》myRandom.h
《随机出题软件》varset.h
《随机出题软件》win2.cpp
源代码下载地址(包含题库):
http://pan.baidu.com/s/1kTI81nx
部分代码展示:
《随机出题软件》:
- 主要的cpp文件
1 #include "myRandom.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <windows.h>
5
6 extern int QT_1,QT_2,QT_3;
7
8 int random(int qt) //传入题库号和该题库使用记录,然后随机输出该题库中的一个题的题号
9 {
10 int num;
11 switch(qt){
12 case 1:num = rand() % QT_1 + 1;break; //产生指定题库的随机题号
13 case 2:num = rand() % QT_2 + 1;break;
14 case 3:num = rand() % QT_3 + 1;break;
15 default:num=0;
16 }
17 return num;
18 }
19
20
21 int print_qt(int qt,int num,char question[]) //将指定题库(qt)中指定题号(num)的题的内容输出出来
22 {
23 int len = 0;
24 //将“qt.txt”放到字符数组filename中,根据qt的不同可改变
25 char filename[20];
26 int t=qt,i=0;
27 while(t/10){ //将题库号qt输入进filename中
28 filename[i++]=t/10+'0';
29 t/=10;
30 }
31 filename[i++]=t+'0';
32 char* p = filename;
33 strcpy(p+i,".txt"); //将.txt补上
34 //cout<<filename<<endl;
35
36 //用filename代表的文件作输入重定向
37 if(freopen(filename,"r",stdin)==NULL){
38 MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:1"),TEXT("ERROR"),MB_ICONERROR);
39 //fprintf(stderr,"打开%d.txt文件错误!
",qt);
40 fflush(stdin);
41 if(freopen("CON","r",stdin)==NULL);
42 return 0;
43 }
44 char c;
45 int n=0;
46 while((c=getchar())!=EOF){
47 if(c=='#'){ //遇到'#'检测后面数字是否为指定题号
48 scanf("%d",&n);
49 if(n==num) //找到该题
50 break;
51 }
52 }
53 if(c==EOF){ //没有找到该题号
54 MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:2"),TEXT("ERROR"),MB_ICONERROR);
55 return 0;
56 }
57 if(!n){
58 MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:3"),TEXT("ERROR"),MB_ICONERROR);
59 //fprintf(stderr,"没有在题库中找到当前随机号码的题目,请debug程序找出错误。
");
60 fflush(stdin);
61 if(freopen("CON","r",stdin)==NULL);
62 // fprintf(stderr,"重定向控制台错误!
");
63 return 0;
64 }
65 else{
66 //找到该题,输出内容
67 while((c=getchar())=='#' || c=='
'); //前面若有 # 或者 回车,直接忽略
68 if(c==EOF)
69 return len;
70 do{
71 question[len++] = c;
72 }while((c=getchar())!='#' && c!=EOF);
73 question[len] = '