优缺点分析——小初高数学试卷生成程序(C++)
1. 程序结果(源码于文末)
如上图所示该程序可实现用户登录,并可根据不同的用户类别生成不同的类型的数学题目,并且在当前目录生成yyyy-MM-dd-HH-mm-ss.txt 文件(空文件)。
2. 程序框架
主要函数
int x_sumbol(int x) //小学题目运算符选择 int x_question() //小学题目生成 int c_sumbol(int x) //中学题目运算符选择 int c_question() //中学题目生成 int g_sumbol(int x) //高中题目运算符选择 int g_question() //高中题目选择
主函数调用
3. 优点
该程序脉络清晰,程序分为各类型题目生成模块、账户设置模块、账户验证模块及文件生成模块。其中题目生成模块独立于主函数,其余模块在主函数顺序执行。
题目生成模块如x_sumbol(int x), x_question() 均采用随机数生成操作数和操作符,并通过if-else分支结构进行选择,结构清晰易理解。
主函数在设置好用户名后开始以while循环检测用户名及密码的正确性,接着在分支结构中选择相应程序进行执行。
总的来说,该程序逻辑清晰,if-else分支结构以及主函数外模块调用增加程序的可读性。
4. 不足
该程序首先有几点需求没有满足,如切换用户、将题目输出到指定文件夹中的txt文件以及不能持续生成多套试卷。
其次,该程序可以进一步对象化,比如可以将用户验证程序模块化。
5. 附源码
1 #include<iostream> 2 #include<cstdlib> 3 #include<time.h> 4 #include<fstream> 5 using namespace std; 6 7 int x_sumbol(int x){//小学的符号 8 x=rand()%4; 9 if(x==0){ 10 cout<<"+"; 11 } 12 13 else if(x==1){ 14 cout<<"-"; 15 } 16 17 else if(x==2){ 18 cout<<"*"; 19 } 20 21 else if(x==3){ 22 cout<<"/"; 23 } 24 25 } 26 27 int x_question(){//小学的题目 28 int g_oper; 29 g_oper=rand()%5+1; 30 int x=rand()%4; 31 int a=rand()%100+1; 32 int b=rand()%100+1; 33 int c=rand()%100+1; 34 int d=rand()%100+1; 35 int e=rand()%100+1; 36 37 if(g_oper==1){ 38 cout<<a<<endl; 39 } 40 41 else if(g_oper==2){ 42 cout<<a; 43 x_sumbol(x); 44 cout<<b<<endl; 45 } 46 47 else if(g_oper==3){ 48 cout<<a; 49 x_sumbol(x); 50 cout<<b; 51 x_sumbol(x); 52 cout<<c<<endl; 53 } 54 55 else if(g_oper==4){ 56 cout<<a; 57 x_sumbol(x); 58 cout<<b; 59 x_sumbol(x); 60 cout<<c; 61 x_sumbol(x); 62 cout<<d<<endl; 63 } 64 65 else if(g_oper==5){ 66 cout<<a; 67 x_sumbol(x); 68 cout<<b; 69 x_sumbol(x); 70 cout<<c; 71 x_sumbol(x); 72 cout<<d; 73 x_sumbol(x); 74 cout<<e<<endl; 75 } 76 } 77 78 int c_sumbol(int x){//初中的符号 79 x=rand()%4; 80 if(x==0){ 81 cout<<"+"; 82 } 83 84 else if(x==1){ 85 cout<<"-"; 86 } 87 88 else if(x==2){ 89 cout<<"*"; 90 } 91 92 else if(x==3){ 93 cout<<"/"; 94 } 95 96 } 97 98 int c_question(){//初中的题目,括号里的是开根或平方 99 int g_oper; 100 g_oper=rand()%5+1; 101 int x=rand()%4; 102 int a=rand()%100+1; 103 int b=rand()%100+1; 104 int c=rand()%100+1; 105 int d=rand()%100+1; 106 int e=rand()%100+1; 107 108 if(g_oper==1){ 109 cout<<a<<"(1/2)"<<endl; 110 } 111 112 else if(g_oper==2){ 113 cout<<a<<"(2)"; 114 c_sumbol(x); 115 cout<<b<<endl; 116 } 117 118 else if(g_oper==3){ 119 cout<<a; 120 c_sumbol(x); 121 cout<<b<<"(2)"; 122 c_sumbol(x); 123 cout<<c<<"(1/2)"<<endl; 124 } 125 126 else if(g_oper==4){ 127 cout<<a<<"(2)"; 128 c_sumbol(x); 129 cout<<b; 130 c_sumbol(x); 131 cout<<c<<"(2)"; 132 c_sumbol(x); 133 cout<<d<<"(1/2)"<<endl; 134 } 135 136 else if(g_oper==5){ 137 cout<<a; 138 c_sumbol(x); 139 cout<<b<<"(1/2)"; 140 c_sumbol(x); 141 cout<<c; 142 c_sumbol(x); 143 cout<<d<<"(2)"; 144 c_sumbol(x); 145 cout<<e<<endl; 146 } 147 } 148 149 int g_sumbol(int x){//高中的符号 150 x=rand()%4; 151 if(x==0){ 152 cout<<"+"; 153 } 154 155 else if(x==1){ 156 cout<<"-"; 157 } 158 159 else if(x==2){ 160 cout<<"*"; 161 } 162 163 else if(x==3){ 164 cout<<"/"; 165 } 166 167 } 168 169 int g_question(){//高中的题目 170 int g_oper; 171 g_oper=rand()%5+1; 172 int x=rand()%4; 173 int a=rand()%100+1; 174 int b=rand()%100+1; 175 int c=rand()%100+1; 176 int d=rand()%100+1; 177 int e=rand()%100+1; 178 179 if(g_oper==1){ 180 cout<<"sin("<<a<<")"<<endl; 181 } 182 183 else if(g_oper==2){ 184 cout<<a; 185 g_sumbol(x); 186 cout<<"tan("<<b<<")"<<endl; 187 } 188 189 else if(g_oper==3){ 190 cout<<a<<"(2)"; 191 g_sumbol(x); 192 cout<<b; 193 g_sumbol(x); 194 cout<<"sin("<<c<<")"<<endl; 195 } 196 197 else if(g_oper==4){ 198 cout<<"tan("<<a<<")"; 199 g_sumbol(x); 200 cout<<b; 201 g_sumbol(x); 202 cout<<c<<"(1/2)"; 203 g_sumbol(x); 204 cout<<"sin("<<d<<")"<<endl; 205 } 206 207 else if(g_oper==5){ 208 cout<<a; 209 g_sumbol(x); 210 cout<<"cos("<<b<<")"; 211 g_sumbol(x); 212 cout<<c<<"(2)"; 213 g_sumbol(x); 214 cout<<"tan("<<d<<""; 215 g_sumbol(x); 216 cout<<e<<"(1/3)"<<endl; 217 } 218 } 219 220 int main(){ 221 string acc; 222 int pass; 223 string x_a="张三1"; 224 string x_b="张三2"; 225 string x_c="张三3"; 226 string c_a="李四1"; 227 string c_b="李四2"; 228 string c_c="李四3"; 229 string g_a="王五1"; 230 string g_b="王五2"; 231 string g_c="王五3"; 232 int g_num; 233 234 do{ 235 cout<<"请输入账户、密码"; 236 cin>>acc>>pass; 237 }while(((acc!=x_a)&&(acc!=x_b)&&(acc!=x_c)&&(acc!=c_a)&&(acc!=c_b)&&(acc!=c_c)&&(acc!=g_a)&&(acc!=g_b)&&(acc!=g_c))||(pass!=123)); 238 239 if(((acc==x_a)||(acc==x_b)||(acc==x_c))&&(pass==123)){ 240 cout<<"当前选择为小学出题"<<endl; 241 cout<<"准备生成小学数学题目,请输入生成题目数量:"<<endl; 242 cin>>g_num; 243 for(int i=0;i<g_num;i++){ 244 x_question(); 245 cout<<endl; 246 } 247 } 248 249 else if(((acc==c_a)||(acc==c_b)||(acc==c_c))&&(pass==123)){ 250 cout<<"当前选择为初中出题"<<endl; 251 cout<<"准备生成初中数学题目,请输入生成题目数量:"<<endl; 252 cin>>g_num; 253 for(int i=0;i<g_num;i++){ 254 c_question(); 255 cout<<endl; 256 } 257 } 258 259 else if(((acc==g_a)||(acc==g_b)||(acc==g_c))&&(pass==123)){ 260 cout<<"当前选择为高中出题"<<endl; 261 cout<<"准备生成高中数学题目,请输入生成题目数量:"<<endl; 262 cin>>g_num; 263 for(int i=0;i<g_num;i++){ 264 g_question(); 265 cout<<endl; 266 } 267 } 268 269 else{ 270 cout<<"请输入正确的用户名、密码"; 271 } 272 273 time_t nowtime = time(NULL); 274 struct tm *p; 275 p = gmtime(&nowtime); 276 277 char filename[256] = {0}; 278 char timeinfo[256] = {0}; 279 sprintf(filename,"%d-%d-%d-%d-%d-%d.txt",1900+p->tm_year,1+p->tm_mon,p->tm_mday,8+p->tm_hour,p->tm_min); 280 sprintf(timeinfo,"%d/%d/%d %d:%02d.txt\n",1900+p->tm_year,1+p->tm_mon,p->tm_mday,8+p->tm_hour,p->tm_min); 281 282 ofstream out(filename); 283 284 return 0; 285 }