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