C#_工程实践笔记_用刚学的C#语言做一个随机抽题的小程序
在暑期用了将近两周的时间学了C#语言,也对面向对象的思想有了一定的了解,但不能光说不练,从我学习C语言的过程我就深刻地体会过实践的经验积累对于掌握一门计算机语言多么重要。
历史遗留问题
之前学校的一个学生工作部门需要做一个程序用来随取题目,因为时间紧张,我先用C语言写了一个命令行的程序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(void)
{
// 1------11,41------51 大问题
// 12-----40,小问题
int Big_Ques,Small_Ques_1,Small_Ques_2;
char choose;
Lable:
Big_Ques = 0;
Small_Ques_1 = 0;
Small_Ques_2 = 0;
choose = '\n';
srand((unsigned)time(NULL));
Big_Ques = rand()%21+1;
if(Big_Ques>11)
{
Big_Ques+=30;
}
while(Small_Ques_1 < 12)
{
Small_Ques_1 = rand()%31;
Small_Ques_1+=10;
}
while(Small_Ques_2 < 12 || Small_Ques_1 == Small_Ques_2)
{
Small_Ques_2 = rand()%31;
Small_Ques_2+=10;
}
printf("****************************************************\n");
printf(" 答辩题目随机抽选\n");
printf("****************************************************\n");
printf(" 第一道小问题是 %d\n",Small_Ques_1);
printf(" 第二道小问题是 %d\n",Small_Ques_2);
printf("----------------------------------------------------\n");
printf(" 大问题是 %d\n",Big_Ques);
printf("****************************************************\n");
printf("\n\n是否再次抽取问题?\n");
printf("<1 再次抽取>\n");
printf("<2 退出程序>\n");
while(choose == '\n')
{
choose = getchar();
getchar();
if(choose == '1')
{
system("cls");
goto Lable;
}
}
}
十分简陋,没有界面,就只是cmd黑黑的一块,而且也只是显示一个范围内随机数字,具体题目还需要人来对照数字查找,其实就是做了骰子,用到的也就是生成随机数字的函数。虽然满足了对方的需求,但也差强人意。这个程序还需更加完善。
新的工程
正好,有了目标,也完整地学了一下C#,用的是VisualStudio2017这个强大的IDE,设计窗体也十分方便,这样就开始工作。
先分析一下,描述一下基本功能,需要满足一个用户在窗口内通过按键来随机抽取题库中的题目的需要,这个题库用户可以自己添加或删减,再抽取题目后窗口上同时显示出题目内容。因为对方需要哈,窗口内会把题干和答案同时显示。
接下来再分析一下,需要什么样的基本配置呢,一个窗体,上面有按键和文本显示窗口,需要一个方便用户打开和修改内容的题库。窗体和控件就是用窗体设计器的工具箱里的控件就好了。题库我用了两个txt文本,比较简单粗暴哈,一个用来存放小题题目,一个用来存放大题题目,这也是甲方需要。
还需要程序有什么样的模块呢,首先窗体设计器,然后是文件模块用来读取文本里的题目,随机数字模块用来选择抽哪道题目。大概就这些。
可是我在这的时候犯难了,如果用户用的时候忘了带上题库,或者抽到的数字题库里没有怎么办,程序怎么知道在用户的操作后,题库里有多少题。因为我经常会用到调试单片机的一些上位机,也深刻的意识到有一个类似输出窗口那样给出提示信息的面板多么方便,所以可以也设计一个文本框来显示程序的运行状态,可以提醒用户发生什么异常以及给出推荐的解决办法,让程序更友好。
需要再设计一个清空按键,清空当前所有文本框内的内容,避免信息窗口信息累积过多。
最好再留一个按键用来提供帮助信息,使用户用起来更清晰更方便,同时也能标注一下程序的当前版本。
因为这个程序是要用在大屏幕上对下面的观众展示,要求上面的题目的字体要足够清楚,也就是足够大,而且内容显示完整,具体需要多少我打算再设计两个按键可以用来调整字体大小,怎么样的字号合适还是由用户来决定吧,我只是提供一个初始值和调整办法。
这样最终的窗口布局就明确了,其实也是陆陆续续后期反复修改得到的:
初步设想的程序的流程,就是运行程序,然后程序自检题库时候存在,同时检查题库内的题目个数,如果出现任何异常,报告异常,并给出可能有效的解决方案,然后就是用户按下按键抽题,如果操作成功,报告成功和题目序号可方便用户管理,如果操作失败也给出解决方案。
背后代码
列好需求就可以着手准备了,先写好底层的组件,设计了两个类,一个是非静态的File类封装操作题库文件的一些方法,同时可以设置属性,封装为只读保护,另一个也是非静态的RandomNum类,里面可能只有一个静态的方法,生成一个给定范围内的随机数字的方法,其实C#里已经有很方便的随机数生成函数,我这里