今天,我无聊的趟在床上,回忆着过去的点点滴滳。
17年前,我还非常小,非常笨,连英文字母都数不清楚。那时,我看着学习机书本上写的代码,一点一点的按到电脑上,如果有一点按错了或者看着因为停电而没有存软盘的代码我可以哭上半天,哭的是天昏地暗。那是,妈妈鼓励我,不要放弃,大不了再重写一遍。要我坚强,但是,错过了就不能再错!那时,我的程序是这样的:
10 CLS
15 ON ERROR GOTO 100
20 INPUT "PLEASE INPUT "; A$
30 FOR I=0 TO LEN(A$)
40 B$=MID$(A$,I,1)
50 C=ASC(B$)
60 D=C+3
70 PRINT CHR$(D)
80 NEXT
100 PRINT "ERROR"
这是一个值得我记一辈子的程序,虽然记的已经不真切了,也是我第一个由自己写的程序,虽然有不少东西都是参考书上的。比如20行的“PLEASE INPUT”当时的我只知道PLEASE是请的意思,因为当时在看MAZI的故事的时候有看过这个词。至于逻辑完全都是按书上来改的,一台学习机,一本说明手册,一个软盘,一台电视。这就是当时的我,对编程初感兴趣的我。
那个时候,我完全不会用GOSUB,完全不知道函数是干嘛的。也没有WHILE语句,更没有DO…WHILE结构,条件只有IF – THEN,连ELSE都是浮云。所有函数都当成关键字来使,实际上那时的我根本就无法理解函数。只知道某些字母加一个括号可以输出我要的东西,并且括号里可以由我自己控制。
至于变量,F-BASIC是不用定义的,拿来就用,类型也很简单只有int和string。至于有没有double我当真不知道,那时我还不知道小数点来着。我只知道变量定义不加$的就是数值型,加了就是字符串型。
第70句代码是我对调试的第一次理解,在当时,我知道我可以通过每一步输出我想要知道的变量的值来确定代码的每一句是否符合我的理解。
那时记忆最深刻的,就是写一个300行的代码忘了存盘。我哭了整整半天,最后在妈妈的安慰下,我打起精神再一次把代码重新输进去。玩上了我自己输的第一个程序——打飞机。- -#为神马是这个名,我至今残念中。这就是我的初学者之旅。
我曾记得当时妈妈教我学五笔的时候,告诉我不用背字根如何学当时感觉妈妈好强大;曾记得在父亲单位的打字室里见到的第一台电脑,装的是MS-DOS 5.x,看着叔叔阿姨们打着一篇篇文稿。有时也小露两手打一些简单的字,因为用的是五笔也不怕有字不认识;曾记得当时小学计算机老师看见我玩得一手DOS命令的时候那惊讶的表情。时光飞逝,很快6年就过去了,时间也到了2001年。那时,我有了我的第一台电脑,可惜第三天就被我在妈妈的指导下给拆了个七零八落。
2001年,我的电脑上有了一个软件Visual Basic 6。我第一次知道原来世界还有函数这么美好的东西。于是那个陪了我走过好多年的程序变成了:
Private Sub Submit_Click()
Dim a As String
Dim i As Integer
Dim b As String
Dim c As Int
a=TextBox1.Text
For i=0 To Len(a)
Mid(a,i,1)=Chr(Asc(Mid(a,i,1))+3)
Next i
TextBox1.Text=a
End Sub
很久不写VB的代码了,已经忘了差不多了啊。但是Mid(a,i,1)=Chr(Asc(Mid(a,i,1))+3)这一句代码确是我在那时对函数这一词真真切切的理解。也就是在那时,我第一次清楚的知道了y=f(x,a,b,c)的意思。在当时,我认为,函数就是一种缩写,它代表着一句,或者若干句代码(从求水仙花数中的x*x*x中领悟,当时不知道POW函数)任何一个使用函数的位置都可以使用它所代表的代码替换。
1年后,这段程序还是这段程序,不同的是,我已经在头上加了 On Error Resume Next 这语句。到了这个时候,我已经领悟了如何用手去执行代码。每一段代码可以根据输入值使用纸笔演算每一步的变量应该有的值。这时,我学会了断点,也学会了监视。
在这时,我认为函数就是有一个输入和一个输出的算法。它可以通过一定的形式,将变量x转变为我所想要的变量y。而编程就是通过编写若干个函数来达到我所想要的目地。就是这一年,正式说明了我已经进入了面向过程编程的门坎。那时,我理解向顶向下,逐步分解简直就是不费吹灰之力啊。
时到初三2004年,我可以以自己的意愿编写程序了。虽然一部分算法还需要借助书本,但是我也算是能写属于我自己的程序了。那时,我写了一个计算24点的程序,那时,计算表达式的算法还需要借助书本。但是在编写完后,这个算法我可以完全理解。在那时,面向对象之魂初步觉醒。那时,面向过程的思路已经非常清晰,我也成功建立了一套属于我的初步编程理论体系。那时的我总结为:
计算机程序是按照一定的步骤完成特定任务的产物,在编制计算机程序时,可以将重复使用的步骤整理成若干个函数。函数是代码的集合,它拥有零个或一个输入,可以有一个或多个输出,在一个输出时,使用RETURN语句,如果要返回多个值,则可以使用数组返回或者使用ByRef传入的参数。
在编写完函数之后,要进行调试工作,调试可以通过断点,输出每步的值,监视每个参数的改变来进行。调试的最终目地是找到代码中错误的地方并且改正它。
伴着这它们,我进入了高中。三年的高中生活除了忙碌的学习以外,也让我的计算机水平被老师和同学所认可。再也没有其它同学说我不务正业了,也不再有老师认为我学这个完全没有用处。三年的高中生活让我清楚的知道了C语言好像比VB要好用一些。当然除了那个蛋疼的界面显示以外。于是,那个陪了我好久的程序变成了:
#include <stdio.h>
void main(int argc, char *argv)
{
char table[26];
char msg[200], encrypt[200];
int i;
for(i=0; i<26; i++)
{
table[i] = 'a' + ((i+3)%26);
printf("%c", table[i]);
}
printf("\nInput message MUST BE LETTER:")
scanf("%s", msg);
for(i=0; i<200; i++)
{
if (msg[i] == '\0')
{
break;
}
encrypt[i] = table[msg[i] - 'a'];
}
printf("\nResult:%s", encrypt);
getch();
}
还记得当时因为嫌烦,而没有判断输入是否是字符就直接使用数组映射的悲剧,恩上面的代码也是如此。在这三年里,我好好的学习了C和C++。在当时,我还是认为C++和C没什么区别。最多就是一个用class关键字进一步整理了代码。那时,我对class的理解就是整理函数的手段。C++最大的好处有两点,一函数非常清楚,二cin和cout要比printf和scanf好用不少。这三年来,我理解最多的就是输入和输出语句。这三年,使用C语言我能够写出一个完整的打字程序,也能写比如超级玛丽的游戏。更能够在玩游戏的时候总结游戏里使用的数据结构。我总结:
计算机的输入和输出可以到任何一个地方,磁盘,内存,屏幕都可以。所以所有输入和输出的函数都带有一个隐含的参数,也就是输出的位置。所有的输入和输出都是流式的,就像水一样流到任何一个可以显示,存储的位置。
调试程序时,可以使用Trace法和Debug法。Trace有助于调试Release版的程序,它没有源代码,也不可能在运行处执行调试环境,如果不想看汇编那么在程序里加入Trace信息则是再好不过的。
而计算机程序等于算法加数据结构,每一段程序(函数)都可以按照以下格式定义和书写:
function type FunctionName(type paramTable, type* paramOutput)
{
//Step1.定义数据结构,以及函数输出
//Step2. 检查参数
if (!CheckParam(paramTable))
{
//处理参数错误异常
}
//Step3. 收集其它输入
//TODO: scanf etc.
//Step4. 转变(也就是函数的具体算法)
//Step5. 输出检查(可选)
//Step6. 输出
*paramOutput = value;
return re;
}
至此,我的面向过程之路就已经全部走完了,我用这种方法建立了我的面向过程编程体系。也通过这个建立起了我以后所有思想的支柱,及我生活的行动理论。不做不知道,回忆一下过去,对我自己也是很有进步的嘛。那亲爱的博友们,你们的第一个理论是如何建立的呢?回忆完如此,吃些东西准备健身,面向对象的思路以后再写吧。