zoukankan      html  css  js  c++  java
  • 结队编程之——阅读分析队友的代码(C++自动生成数学试卷)

    队友用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.事先想清楚方法怎么调用,脑袋里面有个大致的框架

    我的代码也很难看,所以还得努力呀

  • 相关阅读:
    子查询
    关联,分组练习
    共享锁(S锁)和排它锁(X锁)
    mac 搭建Vue开发环境
    移动端web开发
    负margin
    关于前端的margin
    清除的通用样式 css
    css布局
    <div class="clear"></div>
  • 原文地址:https://www.cnblogs.com/chen-song/p/9712108.html
Copyright © 2011-2022 走看看