·程序说明
队友的个人项目完成了项目的所有功能要求。
他使用了如下函数来实现需求:
void kuohao(int B[] ,int numA); //预定公式在括号中的位置
string Pschooltext(int A[],int numA); //生成一条小学的试题
string Jschooltext(int A[],int numA); //生成一条初中的试题
string Sschool(int A[],int numA); //生成一条高中的试题
int searchtext(string a[],string strname); //打开文件夹读取所有的历史试题并返回题目数量
string ltime(); //获取当前时间
·优缺点分析
细看代码后发现了有些不错的处理:
1、首先是生成括号的函数,由于题目限定了操作数个数,所以生成括号函数的操作,他才用了一个特别的int型数组来记录该操作数左右方括号的情况,具体是:
int B[6];//记录括号的位置 ,1单(,2单),3((,4)),0代表没有括号
括号位置确定代码:
void kuohao(int B[] ,int numA){ int k,n; if(numA<=2) k=0; else k=numA/2; n=rand()%(k+1); while(n>0) { int a,b; a=rand()%numA+1; b=rand()%(numA-a+1)+a; if(a==1 && b== numA) continue; else if(a!=b){ if(B[a]==0 && B[b]==0){ B[a]=1; B[b]=2; n--; } else if(B[a]==1 && B[b]==0){ B[a]=3; B[b]=2; n--; } else if(B[a]==0 && B[b]==2){ B[a]=1; B[b]=4; n--; } } } }
对应下标就是第几个操作数,下标1就是第一个操作数,然后在函数中用随机函数模拟,并分好不同的情况,最后再生成运算式中加进去。
2、他在处理如何打开一个文件夹中的所有txt文件进行查重的时候,每生成一套卷只需要进行一次,因为第一次将所有的题目都存在一个string数组中,然后每生成一道题只需要和数组对比一次,之后没有重复的题目就放进数组中(数组设立最大上限),所以打开操作只需一次。
文件读取函数:
int searchtext(string a[],string strname){ int i=0; string textname="F:\\输出文件\\"+strname+"\\*.txt"; struct _finddata_t fileinfo; string in_name; long handle; if ((handle = _findfirst(textname.c_str(), &fileinfo)) == -1L) { cout << "没有找到匹配文件!" << endl; return 0; } else { in_name = "F:\\输出文件\\"+strname + "\\" + fileinfo.name; ifstream fin(in_name.c_str()); if (!fin) { cerr << "open file error" << endl; exit(-1); } string str; while (getline(fin, str)) { a[i]=str; i++; } while (!(_findnext(handle, &fileinfo))) { in_name ="F:\\输出文件\\"+strname + "\\" + fileinfo.name; ifstream fin1(in_name.c_str()); if (!fin1) { cerr << "open file error" << endl; exit(-1); } string str; while (getline(fin1, str)) { a[i]=str; i++; } } _findclose(handle); } for(int j=0;j<i;j++) { if(a[j]!="") a[j]=a[j].substr(3); } return i; }
获取历史试题:
string a[10000]; int sum = searchtext(a,strname);
sum返回的是数组中存放题目的个数.
同时,我认为他的代码有以下几点不足之处:
1、他的代码有些冗长,其实在生成3中难度题目中的很多代码都可以写成一个函数进行重复调用
2、输出格式,不够美观,题号后面的“.”应该加个空格和题目分开
3、他的代码有个的BUG,就是假如随机生成的操作数如果在1到9之间,生成出来就是一个乱码的数:
产生Bug的代码:
char s1,s2; if(A[i]/10!=0) s1=A[i]/10+‘0‘; s2=A[i]%10+‘0‘; string S1,S2;S1=s1; S2=s2; number+=S1+S2;
Bug产生原因:
由于没有考虑char型没有初始的时候是随机一个乱码,当随机数是1到9中,s1就会没有被赋值,就会出现错误(该部分代码是将生成的随机数转化为string型)。
Bug截图:
后来经他本人debug,就把这个BUG很快地修正了;修正后代码:
char s1,s2; string S1,S2; s2=A[i]%10+‘0‘; S2=s2; if(A[i]/10!=0) { s1=A[i]/10+‘0‘; S1=s1; number+=S1+S2; } else{ number+=S2; }
·程序运行结果
控制台界面:
输出文件:
原文地址:https://www.cnblogs.com/derzom/p/9709143.html