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