队友用c++写的的,其中使用到的函数名称如下
bool enter(string account,string password) //登录验证 int makefile(int number,string account,string topic[60][30])//创建文件 int primaryschool(string account) //生成小学题目 int juniorschool(string account) //生成初中题目 int seniorschool(string account) //生成高中题目 int main()
功能实现都没有问题,条例也很清晰,尤其是创建文件的部分让我学到了很多
int makefile(int number,string account,string topic[60][30]) { time_t t = time(0); char file[30]; strftime(file, sizeof(file), "%Y-%m-%d-%H-%M-%S.txt", localtime(&t)); //以固定格式的时间为文件名 ofstream openfile((account + '/' + file).c_str()); //打开文件并在文件末尾写 for(int i=0;i<number;i++) { for(int j=0;j<30;j++) { openfile<<topic[i][j]; } openfile<<endl; } }
因为其实我对C++的创建文件部分不太熟,看别人的代码,总有收获
不过还是有一些缺陷,主要是在函数的调用方面
体会一下看到这段代码的感受
bool enter(string account,string password) //登录验证 { if(account=="张三1"&&password=="123") { return true; } if(account=="张三2"&&password=="123") { return true; } if(account=="张三3"&&password=="123") { return true; } if(account=="李四1"&&password=="123") { return true; } if(account=="李四2"&&password=="123") { return true; } if(account=="李四3"&&password=="123") { return true; } if(account=="王五1"&&password=="123") { return true; } if(account=="王五2"&&password=="123") { return true; } if(account=="王五3"&&password=="123") { return true; } return false; }
看到这的时候我心里面就“咯噔”一下,因为这个源程序足足有400多行,但是显然,如果只是生成试卷的话是不可能用这么多的
我理解的情况。生成试卷应该是封装成一个函数的,然后再写“小学”,“初中”,“高中”三个函数来调用
但是队友可能比较赶时间,
int primaryschool(string account) //生成小学题目 int juniorschool(string account) //生成初中题目 int seniorschool(string account) //生成高中题目
这三个函数都有大量的重复~
而且,里面也用了很多if,变量的命名也让我看不太懂
int primaryschool(string account) //生成小学题目 { cout<<"准备生成小学数学题目,请输入生成题目数量(10-30)"<<endl; int number; cin>>number; while(number<10||number>30) { cout<<"请输入有效输入范围:10-30"<<endl; cin>>number; } string topic[60][30]; for(int i=0;i<60;i++) { for(int j=0;j<30;j++) { topic[i][j]=""; } } srand((unsigned)time(NULL)); int flag=0; //对是否有括号进行标记 int flag2=0; //对括号是否只括了一个操作数进行标记 for(int i=0;i<number*2;i+=2) { int operand=(rand()%(5-1+1))+1; int z=2; stringstream temp; temp<<i/2+1; temp>>topic[i][0]; topic[i][1]=". "; for(int j=0;j<operand;j++) { int l_bracket=(rand()%(1-0+1)); if(flag==0&&l_bracket==1&&j<operand-1&&j>0) //左括号 { topic[i][z]="("; z++; flag=1; } int operand_data=(rand()%(100-1+1))+1; stringstream ss; ss<<operand_data; ss>>topic[i][z]; if(flag==1) { flag2++; } z++; int r_bracket=(rand()%(1-0+1)); if(flag==1&&r_bracket==1&&flag2>1) //右括号 { topic[i][z]=")"; z++; flag=0; flag2=0; } if(j==operand-1&&flag==1) { topic[i][z]=")"; z++; flag=0; flag2=0; } if(j<operand-1) { int sign=(rand()%(4-1+1))+1; switch(sign) { case 1:topic[i][z]="+";z++;break; case 2:topic[i][z]="-";z++;break; case 3:topic[i][z]="*";z++;break; case 4:topic[i][z]="/";z++;break; } } else { topic[i][z]="="; } } } number*=2; makefile(number,account,topic); cout<<"小学试题已生成完毕"<<endl; }
这个代码看着其实挺累人的
所以这让我对面向对象有了更深的理解
每个方法只做一件事,就像老师说的,每个方法最多20行,只需要调用就行,修改的时候非常方便,可扩展性强
但是这有一个缺陷,就是调来调去容易晕,也好解决,两条
1.命名规范,让人一看命名就知道这个方法是干什么的
2.事先想清楚方法怎么调用,脑袋里面有个大致的框架
我的代码也很难看,所以还得努力呀