天天看點

加減法的生成

  軟體工程開課兩周了,實質上的作業就是一個,寫代碼随機生成供國小生使用的算術式。第一感覺,沒啥感覺。。以為軟體工程又是可以混的一門課。。但是,當我閱讀了《軟體工程——建構之法》之後,頓時對其改觀,這是一本難得的能讓我看下去的教科書,而且他講述的内容也令我感到很熟悉。還記得當初學院裡有個讓我感到很自豪的項目叫“讓優秀的學生更優秀”,很幸運的是,我被劃到了張老師門下,張老師與我見面後扯了一大堆,具體的已經淡忘,但他着重提到的一個職業——架構師一直印在我的心上,讀了《建構之法》我發現裡面講的就是成為一個架構師的秘籍,遂我就像一個得到了絕世武功秘籍的修士對其進行精讀并實踐,高興的像個猴子。

  就拿這個随機加減法的生成為例,版本1.0:

  我以為,這是個很簡單的小程式,于是,一個不太常見的srand函數和幾個if結束了這個不成熟的版本,代碼如下:

void main()

{

int a,b,c,p,i;

srand(time(0));

printf("題目如下:\n");

for(i=0;i<20;i++)

{

a=rand()%101;

b=rand()%101;

p=rand()%2;

if(p==1)

printf("%d+%d=\n",a,b);

if(p==0)

{

if(a<b)

{

c=a;

a=b;

b=c;

}

printf("%d-%d=\n",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=\n",a,b);
    }
    if(p==1)
        printf("     %d+%d=\n",a,b);
    if(p==2)
        printf("     %d×%d=\n",a,b);
    if(p==3)
        printf("     %d÷%d=\n",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=\n",a,b);
    if(p==0)
    {
        if(a<b)
        {
            c=a;
            a=b;
            b=c;
        }
        printf("     %d-%d=\n",a,b);
    }
}



int main()
{
    int i;  //計數器
    long num;        //資料範圍極限
    char IsMul[5];
    srand(time(0));
    printf("請輸入算數題目範圍(即所允許的最大值)\n");
    scanf("%ld",&num);
    printf("請輸入是否加入乘除法,‘yes’ OR ‘no’\n");
    scanf("%s",IsMul);
    printf("***********************題目為:***********************\n");
    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("請輸入算數題目範圍(即所允許的最大值)\n");
    scanf("%ld",&num_limit);



    printf("請輸入是否加入乘除法,‘yes’ OR ‘no’\n");
    scanf("%s",IsMul);
    if(strcmp(IsMul,"yes")==0)
        bol_Mul = 1;
    else
        bol_Mul = 0;
    printf("***********************題目為:***********************\n");
    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("=\n");

}      

  1.2之後,我要加入的功能是随機嵌套括号,這個功能不再是前面那樣的體力活了,是以我還沒實作。。。暫時有個設想還沒來得及做完,就是改變1.2版本中數字與運算符完全分開的做法,再增加一個可以生成随機二項式的函數,這樣就能對其進行括号嵌套。期待我的1.3版本。。。。

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

  寫好一個項目對底層架構的要求很高,就像建座大廈,地基不穩,大廈必不穩固。回想1.1版本和1.2版本的推翻重寫,如果事先對整個工程進行預估,估計重寫量會少很多,《建構之法》中提到一個方法——把函數單調化,就是一個函數隻實作一個功能,我認為對這種情況很适用。

  另外,最近群裡助教們發了不少優秀同學blog的連結,我看了不少,第一感覺心裡是崩潰的,一直沒想到民間有那麼多高手,自己以前着實是坐井觀天了,結合自身我總結了一句話:“成才路上,不僅要學習技能,更要學習如何展示你的技能”。舉個例子,Ray同學的那個app看得我很蛋疼。。。。就是幾個按鈕,幾個跳轉,做過Android的不傻都會做,但是我沒做,他做了,這就是一種優秀。

  最近要做的事情實在太多(前幾天閑得蛋疼瘋狂接比賽),于是得了選擇恐懼症,竟不知道具體該做什麼,渾渾噩噩了兩天,還因為耳機聽太多大腦疲勞。。反而看《建構之法》的時候讓我感到了久違的輕松,這就是一本故事會。。事情越多越能鍛煉人,這并不能難倒我,Fighting!!!

最後說句牢騷話,cnblogs不能加#笑哭了#表情真是蛋疼。。。