教她写代码的那些日子 4 Java程序结构

或许是所学内容需要时间消化,也或许是忙着其他要忙的事情,总之她好几天都没找我给她讲写程序了,这倒是让我觉得有些失落。每次她来找我,我都以为是要请教我写程序的事,但每次都是工作的事情,最终我终于忍不住问:“你最近怎么都不问我写程序的事了?都能自学了吗?”

“没有,这几天忙的昏头转向的,哪有时间学写程序啊。”她说着,转身走了,留下我独自承受着失落。之所以这样,是我觉得在给她讲写程序的时候,我才是自信的。我是农村出来的,而她是城里人,因此在她面前,我似乎天生就有一种自卑感。

终于闲下来了,她捧着笔记本电脑,到我的工位找我。

“java语言基础那一章我基本上都掌握了,我还自己写了很多例子呢。”她说着,脸上情不自禁地流露出自豪感。

“你真的很棒。”我附和着。

“哈哈,不,是你教得好。”她笑着说。

我知道她是觉得我们互相吹捧有点好笑,我也觉得好笑。

“好了,我们就不要互相夸奖了,难得你今天有空,我们该学java程序结构这一章了。”

说完这句,我突然痛恨起自己来,我真是一个一点也不风趣的人,我除了会写程序,什么也不会,除了和她聊写程序,我什么也不会聊。

“嗯,是呀,所以我就来找你了啊。”她似乎没有注意到我突然的情绪低落,看来她真的是准备学好编程了。按她的话说,有一技傍身,就不怕找不到工作,她有很强的危机意识。

我正不知该说什么时,她又说:“我一直有一个疑问。”

她说着抬起头来看我,正好遇上我的目光,我慌忙避开她的目光,却听到她继续说着。

“你不是说,每条语句后面都要加分号吗,为什么这些地方不加?”

uploading.4e448015.gif

我看了,她画着问号的地方,不觉好笑,但很快又意识到她是一个刚刚接触写程序的小白,有这些问题很正常,于是我耐着性子给她讲:“这个大括号包起来的是一段代码,不是一条语句,一段代码就用大括号包起来,大段里面可以包含很多小段,所以你看这里大括号也是有包含关系的。”

“明白了没有?”末了,我问。

“嗯,大概似乎明白了。”她说。

“还有一个问题。”她又说,“这里为什么变成了LineUp呢?你不是说程序都要写在那个Hello什么里面的吗?”

uploading.4e448015.gif

那个经典的HelloWorld程序:

uploading.4e448015.gif

“哦,这个类名是可以变成你想要的的任何名字的。”我说,我不知道怎么解释了,只能这么说。

“哦。那什么是类名呢?”她接着问。

“类名就是类的名字。”

“那......”

“关于类是什么,后面我们再讲,现在讲你也不一定明白。”没等她说完,我赶忙截住她的话,我怕她要刨根问到底了。

“好吧。”她像一个受了委屈的孩子一样。

但我知道,她那只是装着可爱而已,女孩子似乎都喜欢这样。

于是,我说:“java的程序结构有几种?你看过书了吗?”

“有三种。”她立刻又得意起来,“分别是顺序结构,分支结构和循环结构。”

“说得没错,那你能分别概述一下这三种结构吗?”

“嗯,这个,嗯,你等一下。”说着,她一溜烟跑了。过了一会儿,她拿着书出现在我面前。

“顺序结构用于表示解决按照时间顺序进行的操作。比如,将大象放入冰箱总共分三步,第一步打开冰箱,第二步,将大象放入冰箱,第三步,关上冰箱。这种运行步骤就是一个顺序结构,在顺序结构中每一步必须依次运行,而且每一步只能运行一次。

分支结构用于表示解决问题时在同一个步骤有多种解决方式时的运行结构。类似于,如果今天下雨我就坐车回家,否则我就走路回家。这种问题都可以使用分支结构解决。

循环结构用于表示需要反复运行某些步骤才可以解决问题的顺序。类似于,每天吃三次要,知道病好为止。这样的问题就可以使用循环流程来解决。“

她一口气将书上概述这三种结构的文字念完,然后说:”书上是这么写的。“

”那你理解吗?“我问。

”理解是理解,可是具体到程序要怎么写呢?“她说。

“顺序结构很好理解,就是按照你的程序的语句的顺序逐条运行,你前面写的那些都只是顺序结构的。”

“这个我知道。”她说,“你就讲讲分支结构和循环结构吧。”

“好吧。”我说,“那先来一个分支结构的例子吧。”

说着,我拿过她的笔记本电脑,把她刚刚念过的书上的例子,简单写出来:

uploading.4e448015.gif

编译,运行:

uploading.4e448015.gif

“看到没?分支结构的一种方式是通过if和else这两个关键字来实现。”我一边让她看代码一边说。

“嗯,知道了,这个很简单嘛。”她说。

“哈哈,是很简单的,那么你来写一个。”我说。

“好,你看我的。”她说,“不过,写什么呢?”

“就写这个,你妈妈叫你出去买1斤苹果,又说遇到卖梨子的就买两斤,遇到卖桃子的就买三斤。”

“好呢。”

说着,她开始埋头写起代码来。她一边写,一边又不时翻翻书,虽然显得笨拙,但最终程序还是写了出来:

uploading.4e448015.gif

“写完了,写得不错吧,快夸我。”她笑着说,然后熟练的编译运行:

uploading.4e448015.gif

“不错,不错,连else if 都会用了。”我说,“但你这个写得不够简洁。”

“哈哈,我有书。”她晃了晃手里的书说,“不过,你说不够简洁,那要怎么写才简洁?”

“嗯,这样。”我说着,拿过笔记本电脑,改了改她写的代码:

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“是不是简洁很多?”我问。

“是简洁些,我知道了。”她说。

“知道什么了呢?”我追问,我想知道她是不是真的明白这样写就简洁了。

“就是要用变量嘛,是不是?”她说。

“你确实很聪明。”我夸她。

她则回应我以开心的笑:“我早说过我不笨的。”

“但是你知不知道,分支结构还有一种写法呢?”我说。

“还有......”她说着翻开书去查找相应的内容,“还有switch。”

“没错,那么刚刚那个例子,用switch该怎么写呢?你试试。”

“好”

于是,就看到她又是一边敲键盘一边翻书,偶尔还歪着头思考一下。10来分钟过去了,她写好了代码:

uploading.4e448015.gif

“嗯,不错,不过你知道那个break是干嘛的吗?为什么又要写一个default?”我说。

“break是用来中断顺序执行的,比如w=2;下面不跟一个break的话,就会接着顺序执行w=3;"看我没有说什么,她接着说:"default是上面那些条件都不满足时执行的默认语句。”

“完全正确,看来分支结构这块你基本上都掌握了哦”我说。

“嗯,没问题了。”

“对了,我们最开始写那个if...else...的例子还有一种更简洁的写法,你知道吗?”我突然想起来,还有一个三元表达式没有涉及到。

“不知道。”她回答得很干脆。

“额,好吧。”我说,然后将那个if...else...的例子改成三元表达式:

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“是不是比if...else...更简单,只需要一条语句就可以了。”我一边让她看代码,一边说。

“是简洁多了,快给我讲讲这个是怎么写的。”她说着,显出一些兴奋。

“这个叫三元表达式,你注意看,它的结构是这样的:变量=布尔表达式?表达式1:表达式2,运行过程是这样的,当布尔表达式的结果是真的时候执行表达式1,当布尔表达式的结果是假的时候执行表达式2。在上面那个例子中当b是true的时候执行'go home by bus'这个语句并将结果赋值给gh,当b是false的时候执行'walk home'并把结果赋值给gh。你看运行出来的结果也是这样的。”

“嗯,明白了,其实就是一个省掉了if和else关键字的if...else...的分支结构。”

“可以这么说吧。”

我很惊讶她的理解总结能力,而她则得意得看着我,目光在跟我说:“我聪明吧?”

“分支结构学会了,那我们来看看循环结构吧,循环结构就是让电脑重复执行某一段代码。”说着,我看向她,她眼里的光芒暗淡了一些,显然她因我没有夸奖她而有些失落,但我却没有注意到那么多细节,我只是想她或许在心里说我说的是废话,因为我自己都觉得自己在说废话,于是我想,应该举个例子。

“对你男朋友说一句我爱你。”我说。

“我没男朋友呢。”她对我的话感到莫名奇妙,但随后她就明白了,“是让我写程序输出这么一句话,对吧?”

我其实知道她没男朋友,只是从她的口中得到了确切的答案,我还是禁不住有些激动,我说:“那么写一个看看呢。”

我按捺住心中的窃喜,极力装着面无表情,这倒是显得刻意不自然,不过她似乎没有看出来,也或许习以为常了。

“这个简单。”她说着,三下五除二,很快就写出了代码:

uploading.4e448015.gif

我不用看就知道她写得没问题,因为实在是太简单了,但我要引导她去使用循环结构,于是我说:“那让你说10遍呢?”

“写10条输出语句就是了。”

“那100遍,1000遍呢?”

“......”

她不说话了,我则趁热打铁地说:“这个时候就用上循环结构了。”

说着,我把程序改成循环输出1000遍我爱你:

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

”你看我是不是说了1000遍我爱你?”程序运行后,我指着电脑屏幕上那满屏的“我爱你”说。

“我数数。”她说着作势要数屏幕上究竟是不是1000个我爱你。

我被她故意做出来的呆萌样子逗笑了,我连忙打断了她,”别数了,这么多数到什么时候啊,我还是给你讲讲这个循环结构吧。“

“好。”她不再准备去数那屏幕上的“我爱你”是不是有1000个,她等着我继续说下去。

“循环结构就是重复执行一段代码,就像你刚刚看到的那个例子一样。循环结构有三种,for循环、while循环以及do...while循环。刚刚那个例子是for循环的,我们就先来说说for循环吧。”

说完,我看向她,她没有说话,示意我继续。

“for循环的形式是这样的。”说着,我拿过一张纸,在上面写出for循环的结构来:

for(初始化表达式;条件表达式;迭代表达式){

循环体

}

“其中,初始化表达式一般用于初始化一个迭代变量,条件表达式用于判断是否满足条件执行循环体的内容,迭代表达式一般是用来对迭代变量进行累加或累减。”我接着说。

她显出一脸茫然,显然这些生硬的理论表达,让她无法理解,于是我说:“我们还是来看刚刚的例子吧。”

“在这个例子中,我们首先定义了一个变量i并将它赋值为0,然后程序会运行条件表达式,发现0是小于1000的,所以就运行下面大括号括起来的循环体,也就是输出我爱你三个字,然后再运行迭代表达式,将i的值自加1,就变成2了,接着再运行条件表达式,发现2小于1000,所以继续执行循环体,然后i再自加1,变成3,然后再判断是不是小于1000,如此循环,直到i的值是1000时,不再小于1000,这时就不执行循环体了,退出了这个循环,执行下面的语句了。”

“嗯,让我理一下。”她说。

我没有说话,等着她去理解这个对我来说很自然而对她来说有些复杂的事情。

“变量i是用来计数的,对不对?”她突然问。

“是的。”

“那变量i的初始化可以写在外面吗,那样好理解一些。还有那个计数的累加一定要写到那个迭代表达式那里吗,写道循环体的最后,应该更好理解一些,表示循环完成了一次,计数加1。”

听了她的话,我投去了赞许的目光,她是一个善于思考的女孩,而这样的特质能让她学得很快。我为她高兴,也为我能在教她的过程中轻松很多而高兴。

“当然可以,”我说,“你试试不就知道了。”

于是,她笨拙地敲起键盘来,不一会儿,她让我看她改过的代码:

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

她饶有兴致地数完屏幕上输出的‘我爱你’,然后兴奋地说:“哈哈,完全正确,正好10个。”

“能不能那个条件表达式也不写呢?或者说也移到别的地方?“我突然说。

她愣了一下,然后说:”这个我倒没想过,可以吗?“

她把问题又抛给了我。

”当然可以。“我回答道,然后麻利地修改了代码:

uploading.4e448015.gif

然后给她解释道:”如果条件表达式不写的话,默认结果是true,这个时候循环会一直循环下去,因为每次进行条件判断都是真,当然会一直循环下去。这个时候我们可以在循环体里面进行条件判断,就像这里一样,我们判断计数到10了,就用break关键字退出循环。“

”break不是在switch分支结构里面用的吗?这里也可以用啊?“她发现了新大陆。

”当然可以,break在这里是退出循环,还有一个关键字continue表示退出当前循环。“

”退出当前循环?“她疑惑地看向我。

”这样吧,我再改下代码,你就明白了。“

说完,我改了代码:

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

”明白了吗?“我问。

她一边看代码,一边数着输出,好一会儿,她才恍然大悟地说:”我明白了,退出当前循环是continue后面的语句不执行了,而是继续重头开始执行循环体,而退出循环是跳出整个循环,继续执行循环后面的语句。“

”完全正确,你真的很适合做程序员。“我说。

”哈哈,那是,我是天赋异禀。“她笑着,像朝阳下的一朵花,娇艳而又生机勃勃。

”其实这里和用while循环差不多了。“我将注意力从她让我心动的笑脸转移到程序上来,还有两种循环结构没讲。

然而在我把手放到键盘上准备修改代码时,她却推开了我的手,并说:”让我来试试。“

于是,我看到她翻了一会儿书,再敲了几下键盘,代码已经改了,其实就是把for改成了while,括号里面的两个分号改成了true:

uploading.4e448015.gif

编译运行,结果和没改之前一模一样。

”怎么样?我自学成才了。“她笑得更开心了。

”不错,那do...while结构也不用我讲了吧。“

”我试试。“

uploading.4e448015.gif

编译运行,结果和之前还是一模一样。

”while和do...while没有任何不同啊,干嘛还搞两种方式?“她看到结果,有些不解地说。

”在这个例子中是这样的,因为while后面跟着的条件表达式都是true。如果这个表达式不是true,你就能看出不同了。我给你写个例子,你就明白了。“我说着,在她电脑上开始写例子。

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

”看出不同来没?“我问。

”嗯...“她支吾着,显然没有一下子看出不同。

在她对照程序和输出结果反复看了几次后,她就突然明白过来,兴奋地说:”哈哈,我明白了。那个do...while结构不管条件满不满足都会执行一次循环体中的内容,然后才去判断要不要进行下一次循环。而while是先判断条件满不满足,不满足就不会执行循环体。“

”完成正确。“我说。

她很高兴,笑着说:“程序结构就这几种吧,我是不是全部都学会了啊?”

“是的,都学会了。”我回答。

“那今天任务完成。”她说,脸上显出轻松的表情来,像小学生听到了下课铃声一样。

我也感觉到一些轻松来,虽然不知道,她对于今天所学内容真正掌握了多少,但看到她开心的样子,想来真的是收获满满吧。

“给你布置一道课后作业吧。”我似乎真的变成了一个让学生讨厌的小学老师一样,下课了还要布置课后作业,但要学好写程序,是需要时间多练习的。

不过她不是讨厌作业的小学生,所以她听我这么说,倒是表现出很大的兴趣。

“什么课后作业?”她问。

“用循环计算1到n的和,输出计算结果的位数。”我说出我精心设计的课后作业。

”好。“她说。

我以为她会问这个该怎么做,没想到她干脆地说好,这让我有些意外,但看她信心满满的样子,我想她应该是真的掌握了今天所学的内容。

”晚点给你看我写的程序。“她又说,然后还没等我说什么,就抱着她的笔记本电脑走了。

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值