zoukankan      html  css  js  c++  java
  • 加减法的生成

      软件工程开课两周了,实质上的作业就是一个,写代码随机生成供小学生使用的算术式。第一感觉,没啥感觉。。以为软件工程又是可以混的一门课。。但是,当我阅读了《软件工程——构建之法》之后,顿时对其改观,这是一本难得的能让我看下去的教科书,而且他讲述的内容也令我感到很熟悉。还记得当初学院里有个让我感到很自豪的项目叫“让优秀的学生更优秀”,很幸运的是,我被划到了张老师门下,张老师与我见面后扯了一大堆,具体的已经淡忘,但他着重提到的一个职业——架构师一直印在我的心上,读了《构建之法》我发现里面讲的就是成为一个架构师的秘籍,遂我就像一个得到了绝世武功秘籍的修士对其进行精读并实践,高兴的像个猴子。

      就拿这个随机加减法的生成为例,版本1.0:

      我以为,这是个很简单的小程序,于是,一个不太常见的srand函数和几个if结束了这个不成熟的版本,代码如下:

    void main()
    
    {
    
    int a,b,c,p,i;
    
    srand(time(0));
    
    printf("题目如下:
    ");
    
    for(i=0;i<20;i++)
    
    {
    
    a=rand()%101;
    
    b=rand()%101;
    
    p=rand()%2;
    
    if(p==1)
    
    printf("%d+%d=
    ",a,b);
    
    if(p==0)
    
    {
    
    if(a<b)
    
    {
    
    c=a;
    
    a=b;
    
    b=c;
    
    }
    
    printf("%d-%d=
    ",a,b);
    
    }
    
    }
    
    }

      每次码完代码,诸如怎么把这个代码写得更加高大上之类的想法总会涌上心头,但是通常会因为各种因素而难以实现(主要是懒),这次很幸运的是老师又对这个代码进行了要求添加,支持多项式,支持括号,支持balabala总之是一大堆要求,于是,别懒了,继续写,1.1版本诞生。这个版本我添加了乘除法功能、数字大小上限功能,另外也对乘除法的输出进行了优化,具体就是把C语言里的乘除号* /改成了人类日常熟知的乘除号× ÷(虽然没有任何卵用,但这也是对用户体验的一种提升啊!!!)。下面贴上代码:

    #include <stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<math.h>
    
    int multiplication(long num)            //有乘除法
    {
        int a,b,c,p,i;
        int x = num+1;
        a=rand()%x;
        b=rand()%x;
        p=rand()%4;
        if(p==0)
        {
            if(a<b)
            {
                c=a;
                a=b;
                b=c;
            }
            printf("     %d-%d=
    ",a,b);
        }
        if(p==1)
            printf("     %d+%d=
    ",a,b);
        if(p==2)
            printf("     %d×%d=
    ",a,b);
        if(p==3)
            printf("     %d÷%d=
    ",a,b);
    }
    
    void no_multiplication(long num)              //无乘除法
    {
        int a,b,c,p,i;
        int x = num+1;
        a=rand()%x;
        b=rand()%x;
        p=rand()%2;
        if(p==1)
            printf("     %d+%d=
    ",a,b);
        if(p==0)
        {
            if(a<b)
            {
                c=a;
                a=b;
                b=c;
            }
            printf("     %d-%d=
    ",a,b);
        }
    }
    
    
    
    int main()
    {
        int i;  //计数器
        long num;        //数据范围极限
        char IsMul[5];
        srand(time(0));
        printf("请输入算数题目范围(即所允许的最大值)
    ");
        scanf("%ld",&num);
        printf("请输入是否加入乘除法,‘yes’ OR ‘no’
    ");
        scanf("%s",IsMul);
        printf("***********************题目为:***********************
    ");
        if(strcmp(IsMul,"yes")==0)
        {
            for(i=0;i<20;i++)
                multiplication(num);
        }
        else {
            for(i=0;i<20;i++)
                no_multiplication(num);
        }
    
    
        return 0;
    }

      很明显,代码多了好多,不过我想再加个生成多项式的功能,反观以上两次代码,明显并不能实现这个需求,于是,代码推翻重写,版本1.2上线。更新内容:多项式生成,式子的生成不再像以前那样用if else配合固定形式输出,而是把数与运算符分开,一切都随机生成,代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include "time.h"
    #include "math.h"
    #include "string.h"
    
    long num_limit;                        //数据极限
    
    int bol_Mul;                      //是否有乘除法的判断
    
    
    /*
    函数声明
    */
    void Muliplication_Judge();                //是否有乘除法并生成相应符号
    void Formula_Create();                      //多项式的生成
    
    int main()
    {
        int i;
        char IsMul[5];
        srand(time(0));
    
        printf("请输入算数题目范围(即所允许的最大值)
    ");
        scanf("%ld",&num_limit);
    
    
    
        printf("请输入是否加入乘除法,‘yes’ OR ‘no’
    ");
        scanf("%s",IsMul);
        if(strcmp(IsMul,"yes")==0)
            bol_Mul = 1;
        else
            bol_Mul = 0;
        printf("***********************题目为:***********************
    ");
        for(i = 0;i<30;i++)
            Formula_Create();
    
        return 0;
    }
    
    
    void Muliplication_Judge()
    {
        int p;
        char symbol[5];
        if(bol_Mul == 1)
        {
            p = rand()%4;
            switch(p)
            {
                case 0:strcpy(symbol,"+");break;
                case 1:strcpy(symbol,"-");break;
                case 2:strcpy(symbol,"×");break;
                case 3:strcpy(symbol,"÷");break;
            }
        }
        else {
            p = rand()%2;
            switch(p)
            {
                case 0:strcpy(symbol,"+");break;
                case 1:strcpy(symbol,"-");break;
            }
        }
        printf("%s",symbol);
    }
    
    void Formula_Create()
    {
        int i;
        int p=1;
        int a;
        while(p<2){
            p = rand()%3;
        }
        printf("         ");
        for (i=0;i<p-1;i++)
        {
            a= rand()%num_limit;
            printf("%d",a);
            Muliplication_Judge();
        }
        a = rand()%num_limit;
        printf("%d",a);
        printf("=
    ");
    
    }

      1.2之后,我要加入的功能是随机嵌套括号,这个功能不再是前面那样的体力活了,所以我还没实现。。。暂时有个设想还没来得及做完,就是改变1.2版本中数字与运算符完全分开的做法,再增加一个可以生成随机二项式的函数,这样就能对其进行括号嵌套。期待我的1.3版本。。。。

    下面说说最近的一些感受。

      写好一个项目对底层架构的要求很高,就像建座大厦,地基不稳,大厦必不稳固。回想1.1版本和1.2版本的推翻重写,如果事先对整个工程进行预估,估计重写量会少很多,《构建之法》中提到一个方法——把函数单调化,就是一个函数只实现一个功能,我认为对这种情况很适用。

      另外,最近群里助教们发了不少优秀同学blog的链接,我看了不少,第一感觉心里是崩溃的,一直没想到民间有那么多高手,自己以前着实是坐井观天了,结合自身我总结了一句话:“成才路上,不仅要学习技能,更要学习如何展示你的技能”。举个例子,Ray同学的那个app看得我很蛋疼。。。。就是几个按钮,几个跳转,做过Android的不傻都会做,但是我没做,他做了,这就是一种优秀。

      最近要做的事情实在太多(前几天闲得蛋疼疯狂接比赛),于是得了选择恐惧症,竟不知道具体该做什么,浑浑噩噩了两天,还因为耳机听太多大脑疲劳。。反而看《构建之法》的时候让我感到了久违的轻松,这就是一本故事会。。事情越多越能锻炼人,这并不能难倒我,Fighting!!!

    最后说句牢骚话,cnblogs不能加#笑哭了#表情真是蛋疼。。。

  • 相关阅读:
    CentOS下crontab执行java程序
    大数据学习总结(1)任务描述
    敏捷开发总结(2)开发过程活动
    敏捷开发总结(1)软件研发过程
    持续集成(4)工具对比
    持续集成(2)整体流程
    持续集成(1)概念模型
    用户画像(3)用户画像的建模方法-事实标签
    用户画像(2)构建用户画像的数据源
    用户画像(1)用户画像的概念、意义和目标
  • 原文地址:https://www.cnblogs.com/weit/p/5276852.html
Copyright © 2011-2022 走看看