分享
 
 
 

给学习编程的朋友几点建议

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

给学习编程的朋友几点建议

偷猫,2002-1-26

本文的观点,主要是针对初学者容易犯的错、容易走的误区和针对编程老手容易犯的旧错误而谈的,也许对你来说本文是多余的。另外,本文不止是讲教条,同时也讲了我自己在编程中的实际应用以及实际思路。如果对你有所帮助,我就没有白写了。

一、学编程要学算法

大概是因为Visual系列程序设计工具太完美了的缘故,许多人学习编程后发现,原来编程这么好玩,从此就喜欢上了。也同样因为Visual系列程序设计工具太完美了,导致有相当一部分人以为画界面就是编程。

前两天,我在办公室里有几位同事闲谈,谈到编程时,我笑道:“你到网上去看看,自称是程序员的人不下一亿。”当然这是个过分的夸张了,但是你不得不承认,也许有不止几亿的人亲自用鼠标在Visual Basic中画过界面,现在的小学生、初高中生都开设了Visual Basic程序设计课程。经过了短短的几节课的学习(一学期只有三四十节信息技术课,还不止学VB一个内容),许多学生会说:“我也会编程序了。”——真的吗?

我不由得想起了多年前的微机学科。那时的微机课不外乎几个内容:DOS、WPS和Basic。那时的Basic语言,除了input和print两个语句可以看到运行结果外,其它的都看不到。全凭脑子想象、组合,去领会什么叫If-Then-Else,什么叫Fore-Next,什么叫Do-loop。由此学到了各种算法。那才叫编程啊。

前几天居然在《编程空间》看到有一帖,跟人家讨论怎么编程,问的问题是诸如“怎样利用随机函数Rnd( )生成20个在1-100之间的各不相同的正整数”之类的问题,还指明要用VB编。由此可见算法被忽略到什么程度了。现在叫我把这样的程序编出来,无论是用Basic,还是用C,还是用Pascal,甚至用JavaScript,VBScript我都会随手编来,最多去查几个多年不用的单词是怎么拼的。为什么?就因为这些语言的算法是一样的。语法本身只是一个外壳,算法才是其中的灵魂。

学会了算法之后,你再学几十个单词,就会了一门编程语言。你会发现,Basic、C、ASP、Java……都是一样的。

二、要明确什么是面向对象

几年前,编程从来不用提对象。那时候在Basic和C中的输入输出是这样编的:

◆Basic:

Rem ----------输入输出---------

input age promapt "请输入你的年龄:"

print "你的年龄是:";age;"岁"

◆C:

//------------输入输出---------

printf("请输入你的年龄:");

scanf("%d",&age);

printf("\n你的年龄是:%d岁\n",age);

那年头学过编程的朋友一定还记得这样的语句(至少我觉得这是终生难忘的),那时至所以不提对象,一是因为没这个必要,输入设备只有键盘,输出设置只有显示器。二是因为那时的程序也差,比如上面这样的程序,设计者先问你姓名后问你年龄,使用者就必须先输入姓名后输入年龄,现在呢?给你几个输入框,随你先填哪个,填好后按个按钮就行了。功能的复杂,导到了对象必然要出现。

现在的编程一直在喊着“面向对象”,但是许多最近才学习程序设计的人,他们一起步使用的就是面向对象的语言,却反而不知道什么是面向对象。

我给别人讲Visual Basic第一课时,跟本不就提什么编程,我只这样举生活中的例子:

◆请告诉我 冰箱.外壳颜色(访问对象的属性,用法:对象名.属性名)

◆自行车.颜色=红色(设置对象属性)

◆电视机.开(完成一个工作,用法:对象名.方法名)

◆汽车.行驶(北,100km/s,50km)(带参数的方法)

……

这样做是不是一定比直接讲Visual Basic好我还不知道,但是这样至少可以让别人先感觉一下将要进行的编程中的一些思路。

我不建议谁还去学面象过程的编程,我从八年前(1993)开始学习Basic,到97年学习结构化的True Basic,到98年开始转向面象对象的Visual Basic。这两次转折的时候,我都遇上了很大的困难:旧的思维方式一直在顽固地抵制着新的东西的进入。其中98年那一次,我花了半年时间才把思维方式转过来了。最近才学习编程的朋友,你们真的很幸运。

三、程序中要有详细的注释

我有的时候看到人家编的程序,我简直受不了:他的程序里面几乎从来没有一个注释。如果你这样做了,你能保证过一年半载的还看得懂吗?——什么?你看得懂?有两个可能:这么长时间里,你一共才编了这么一个程序,而且只有几十行百来行。或者编了几个程序,都只有七八行。如果你编了几个大程序,每个几千行,你再回来看看半年前的那个,你试试。

我记得98年我刚学Visual Basic时,我把小时候玩过的游戏《华容道》和在其它电子玩具上的游戏《黑白棋》移植到了计算机里,过了没多久,我再看我的《华容道》时,我已经看不懂了。——注意,我是有注释的,但还是看不懂。所谓看不懂,并不是看不懂其中的语句,而是看不懂某一个语句在整个程序段里起的是什么作用。

后来,我就继续把注释做得更详细些。比如

◆说明每一个变量所表示的内容,取值范围

'------------申明变量-------------

Dim ShiFouYouQiZi(0:63) As Byte '某个位置是否有棋子的标志,取值0-2

'1表示有玩家的棋子

'2表示有电脑的棋子,

'0表示没有棋子

◆说明每个过程的功能,参数,返回值

Public Function MakePath(ByVal OldPath As String) As String

'一般情况下,可以用App.Path & "\shuju.dat"来表示当前路径下的shuju.dat

'但是如果用户把程序装在一个驱动器的根目录下,就会出错,

'比如C盘,上例将返回“c:\\shuju.dat”

'这个过程的功能是将不以“\”结尾的路径后添加“\”,以便于加上“shuju.dat”

'OldPath是没有处理过的路径字串

'返回处理过的路径字串

'使用方法:MakePath(App.Path)&"shuju.dat"

MakePath=OldPath

If Right(MakePath,1)<>"\" Then MakePath=MakePath+"\"

End Function

◆说每一个程序分支的情况

'-----------If-Else-End if结构---------

If Rs.EOF Then

'没有查到相应的用户信息,没有符合条件的用户

Msgbox("查无此人!")

Else

'有符合条件的用户记录

'以下语句略

End If

四、要用结构化

也许有人要问:现在的语言都是结构化的,我想不用还难呢,你这不是白说了?

在这里我要说的结构化,是两个方面的内容:一是同一级语句尽量对齐,不同级语句要有缩进;二是尽量多用子程序(即过程)。

比如下面的程序段(这次以ASP为例)

'--------用户登录程序---------

If Resquest.form("UserName")="" then

'用户直接输入地址进入,必须将其引导到Login.asp

Response.Redirect "login.asp"

Else

'从表单进入

If Resquest.form("TeacherPass")="1234567" then

'教师身份

Application("Teacher")=Application("Teacher")+1

Session("TeacherNumber")=Application("Teacher")

Response.Redirect "main.asp"

Else

'学生身份

Application("Student")=Application("Student")+1

Session("StudentNumber")=Application("Student")

Response.Redirect "main.asp"

End if

End if

以上这个ASP程序段是我写这篇文章时随手写的,没有什么功能。从这段程序中,我们可以看出其中的缩进,给日后修改时减少了许多麻烦。

再来看下面一个程序,下面的程序的功能是在打印机上打印两行文字:

'----------打印程序----------

Printer.CurrentX=2500

Printer.CurrentY=1000

Printer.Fontname="黑体"

Printer.FontSize=32

Printer.print "给同学们的一封信"

Printer.CurrentX=100

Printer.CurrentY=3000

Printer.Fontname="宋体"

Printer.FontSize=16

Printer.print StrNameOfStudent & "同学:你好"

Printer.Enddoc

以上这段程序非但可读性差,语句量大,而且日后修改起来麻烦,如果改用下面这种方法就好多了:

'----------打印程序例二----------

PrintText(2500,1000,"黑体",32,"给同学们的一封信")

PrintText(100,3000,"宋体",16,StrNameOfStudent & "同学:你好")

Printer.Enddoc

Private Sub PrintText(Byval PTX as Singel,Byval PTY as Singel,Byval PTFN as String,Byval PTFS as Singel,Byval PTStr As String)

'打印内容子过程

'PTX,PTY是打印位置

'PTFN是字体,PTFS是字号

'PTStr是打印内容

'你还可以跟据需要加入粗体、斜体等参数

Printer.CurrentX=PTX

Printer.CurrentY=PTY

Printer.Fontname=PTFN

Printer.FontSize=PTFS

Printer.print PTStr

End Sub

五、不要用GOTO

这是多年前的问题了,如今却实大多数人已经不用GOTO语句了,但是,不可否认还有些人在死守着那些老古董不肯放。用了GOTO语句的程序就像面条一样,日后是很难把它理清楚的。

我97年开始从GW Basic向True Basic转时碰到了很大的难度,因为我已经非常习惯于GOTO语句了,但是,我一直坚持一个也不用。现在,我已经习惯了没有GOTO的程序。前两天,一位朋友把他编的程序给我看,程序本身很好,功能也很强,就是里面用了几个If...Then Goto语句,让我很受不了。都这么多年过去了,这些东西应该丢掉了。

最近才着手学习程序设计的朋友应该不会滥用GOTO,因为现在的任何一本材料中都不介绍GOTO的使用。也许你们都没听说过还有这样的语句,这样更好了。

不过,有一个例外:On Error Goto语句不用丢弃它。但是我不喜欢用数字做行号,我的朋友在他的程序里除了几个“Goto 100”,“Goto 200”之类的语句,还有“On Error Goto 1000”。如果用“On Error Goto KillErr”,采用字符串做行标记,日后看程序时总比看到数字舒服。万一你还没看到“On Error Goto”而先看到行号呢?用数字不就麻烦了些?

六、在应用中学习

许多人学程序设计只是照着书本的例子做,一本书啃完了,再买一本继续,这样做永远没有主动。要想学得深一些,学一些有用的东西,可以先拿一本书学学其中的例子,大体有点会后就放开书本自己编。

自己编的时候,不要只想着程序语言能实现的功能,而要想其它应用软件能实现的功能,甚至其它应用软件还没有实现的功能,然后想办法用程序去完成它。

自己编的时候,要么不编,要编就编一个完整的程序。这样的话,接触到的问题会多一些。编什么呢?不用想:小时候玩过七巧板吗?玩过飞行棋吗?现在你需要一个好的通讯录吗?都可以编啊。把这些都编出来就行了。

也许你要说,这些程序网上都有,还要我编干什么?错!网上是有,而且网上的比你即将编出来的更好。但是,我们并不是要一个程序,而是要学习。

我现今用Visual Basic编程序时从来不翻书,碰到不会的怎么办?用F1就行了。MSDN里讲得比任何一本书都完整,当然,MSDN里并不介绍算法,并不介绍模块的组合。但那是你早该解决的问题。

【发表评论】

编程天地栏目只发表偷猫(Tomorrow)个人的作品与感想,转载时请注明《偷猫之家》,谢谢合作。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有