• 试卷生成程序优缺点分析


     ·程序说明

    队友的个人项目完成了项目的所有功能要求。

    他使用了如下函数来实现需求:

    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型没有初始的时候是随机一个乱码,当随机数是19中,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;	
    }
    

     

    ·程序运行结果

    控制台界面:

    输出文件:

  • 相关阅读:
    /etc/fstab详解
    awk的简单用法2
    awk的简单用法3
    linux+nginx+mysql+php高性能服务器搭建
    awk的简单用法1
    ip_conntrack: table full, dropping packet.解决办法
    快速获得 Google Maps 地图页中心位置的经纬度
    Google 地图 教程收集
    第一章 Google Api Key的申请
    第二章 Google 常用功能
  • 原文地址:https://www.cnblogs.com/derzom/p/9709143.html
Copyright © 2020-2023  润新知