教她寫代碼的那些日子 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的和,輸出計算結果的位數。”我說出我精心設計的課後作業。

”好。“她說。

我以爲她會問這個該怎麼做,沒想到她乾脆地說好,這讓我有些意外,但看她信心滿滿的樣子,我想她應該是真的掌握了今天所學的內容。

”晚點給你看我寫的程序。“她又說,然後還沒等我說什麼,就抱着她的筆記本電腦走了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章