教她寫代碼的那些日子 6 數組

學習寫程序其實是一個不斷練習,最終熟能生巧的過程,她顯然是在我的多次嘮叨後明白這一點了的。於是,她的熱情便幻化成勤奮,回到家往往會做很多練習,當然練習多,出現的問題也多。那天我正躺牀上悠閒地看着電視劇呢,突然手機屏幕上彈出一個微信消息:“快幫我看看,怎麼出錯了。”,緊接着是她發來的代碼截圖:

uploading.4e448015.gif

以及運行時報的錯:

uploading.4e448015.gif

看了她的這個代碼我不覺莞爾,新手就是新手啊,出這樣的錯似乎也是理所當然的。於是,我不得不放下我心愛的電視劇,耐心給她講爲什麼。

“還記得數據的類型不?”我問她。

“當然記得。”她說。

“那你知道你錯在哪裏了嗎?”我再問她。

“數據類型不對?”她試着找出問題。

“可以這麼說吧。”我說,雖然問題的本質不是這樣,但也可以從這個方向去解決這個問題,所以我才這麼說。

“我知道了。”她說。

然後我們的對話就此中斷了,想來她是去改代碼去了。

果然,幾分鐘後她發來消息:“哈哈,進行一下強制類型轉換就可以了。”。

接着這句話的後面是她發過來的程序截圖:

uploading.4e448015.gif

“這樣解決問題沒錯,但是你沒有找到本質問題。”我說。

“什麼本質問題?”她問。

“這個要不明天再給你講吧。”我說,因爲我終於還是放不下我心愛的電視劇,緊張刺激的情節剛剛開始,讓我放下不看,真是一種煎熬。

“好吧,那你早點休息。”她回。

雖然我從這句話中讀出了她的有些不高興,但我依然回了一句:“嗯呢,你也早點休息,晚安。”

第二天,她倒是忘掉了昨晚的不高興,還沒下班,就興沖沖地就找我:“快給我講講,昨天那個本質問題是什麼?”。

我不知道她昨晚是否因爲這個而失眠,但能肯定的是這成功地吊起了她的胃口。

“你這學習的勁頭真是高漲啊。”我笑着說。

“呵呵,我現在覺得編程還挺有意思的呢。”她說。

“覺得有意思很好,學起來就事半功倍了。”我說了一個事實,不都說興趣是最好的老師嗎。

她點了點頭,表示贊同,於是我接着說:“這裏的本質問題是你使用的佔位符用錯了。”

“佔位符?那個%.2f?”她疑惑地問。

“對。“

”那個有什麼問題,你不是也這麼寫的嗎?“

”那是因爲被格式化的對象是一個小數,當格式化的對象不是小數時就不能用%f了,要用數據類型對應的佔位符。比如這裏,你要格式化的對象是一個整數,那麼就要用%d這個佔位符。“

”是嗎?我試試。“她一邊說着,一邊動手改起她的程序來。

她改過的程序:

uploading.4e448015.gif

運行結果:

uploading.4e448015.gif

看到程序沒有報錯,她高興地說:”哈哈,還真是呢,換個佔位符就好了。“

”懂了吧,這纔是問題的本質。“

”嗯,懂了,那其他數據類型是不是有其他的佔位符?“

”你說得一點沒錯,你看看這個表就基本知道所有的佔位符了。“我說着在電腦上打開一個表格給她看:

佔 位 符

說    明 

示    例

%s

字符串類型

"mingrisoft"

%c

字符類型

'm'

%b

布爾類型

true

%d

整數類型(十進制)

99

%x

整數類型(十六進制)

FF

%o

整數類型(八進制)

77

%f

浮點類型

99.99

%a

十六進制浮點類型

FF.35AE

%e

指數類型

9.38e+5

%g

通用浮點類型(f和e類型中較短的)

 

%h

散列碼

 

%%

百分比類型

%n

換行符

 

%tx

日期與時間類型(x代表不同的日期與時間轉換符

 

她一個一個佔位符認真看着,末了她轉過頭,看着我說:”有一點我不是很明白,%.2f這個佔位符不在這個表格內,它是%f的變體?“

”這都被你發現了,你真的是冰雪聰明。你說得沒錯,%.2f這個佔位符就是%f這個佔位符變來的,之所以要這樣變是因爲我們想要得到一個2位小數的字符串數字。如果不對佔位符做這樣的變化的話,那麼被格式化的數有多少位小數就會得到多少位小數的字符串數字,這顯然不是我們想要的。再比如我們要格式話一個整數,讓它佔4位,不足四位用0補齊,那麼佔位符就是%04d。”說了這一大堆,我停頓了一下,用詢問的眼神看向她。

她想了想說:“我大概明白了。那做這些變化,肯定有什麼規則的吧,是什麼樣的?”

“這個我們先要來說一下佔位符的構成。”說着,我找來一張紙,將佔位位符的構成寫下來。

 

常規類型、字符類型和數值類型的佔位符格式:

%[index$][標識][最小寬度][.精度]轉換符

日期和時間類型的佔位符格式:

%[index$][標識][最小寬度]轉換符

與參數不對應的佔位符格式:

%[標識][最小寬度]轉換符

其中index表示參數列表中的位置上的值

 

她仔細看着我寫完,然後向我投來迷惑的目光。

“首先%就不用說了,每個佔位符都是以%開頭的,結尾的轉換符也不用多說了,就是前面那個表格看到的那些f、d、s等等。接下來的index$用來確定這個佔位符是代表第幾個參數。”

說到這,我停下來轉頭看向她,果然從她的眼中看到了更多的問號。於是我說:“我們還是來看一個例子吧。”

uploading.4e448015.gif

編譯運行:

uploading.4e448015.gif

“哈,我明白了,當有多個參數時,通過這種方式可以控制每一個參數在字符串中出現的位置。”看了這個例子,她興奮地說。

“你很聰明。”我說,“接下來的標識,我們還是來看一個表。”

標識

含義

-

在最小寬度內左對齊,不可與0標識一起使用

0

若內容長度不足最小寬度,則在左邊用0來填充

#

對8進制和16進制,8進制前添加一個0,16進制前添加0x

+

結果總包含一個+或-號

空格

正數前加空格,負數前加-號

,

只用與十進制,每3位數字間用,分隔

(

若結果爲負數,則用括號括住,且不顯示符號

“這個表很好理解吧?”在她認真看了這個表後,我問她。

“嗯,還是有點不直觀,還是寫幾個例子來看看吧。”她說着拿過電腦開始敲起代碼來。

uploading.4e448015.gif

編譯運行:

uploading.4e448015.gif

“哈哈,這樣一看就很直觀了。”程序運行後,她對比着程序代碼、輸出結果以及我給她看過的表格看了看說。

我張了張嘴正要說點什麼,又聽她說:“好了,這個字符串的格式化我已經學會了,你可以講其他內容了。”

“真的都掌握了?”我問。

“那當然,沒看我都把程序寫出來了嗎?”她反問,一副自信滿滿的樣子。

“好吧,看來你是真的掌握了字符串的格式化。”我想以她的聰慧,應該是真的掌握了。

”不過,還有一點,這個字符串的格式化,還可以用到別的地方,比如在標準輸出時可以直接應用字符串格式化。“我突然想起這個知識點,於是給她說。

“是嗎?寫個例子看看唄。”她說,似乎已經掌握了學習編程的真諦,那就是多看例子,多寫例子。

“好的。”我答道,既然女神有令,我自然乖乖拿過電腦寫一個例子。

uploading.4e448015.gif

編譯運行:

uploading.4e448015.gif

“原來如此,很簡單嘛。”看了我寫的這個例子後,她說。

“是很簡單啊,只是將println改成printf就可以了。不過我要不講,你也不知道啊。所以,年輕人,你要學的東西還很多。”我裝出語重心長的口氣說。

“咦,幾眼沒見,你居然老了幾十歲。”她很認真地盯着我看了好幾秒後說。

“什麼意思?我變老了嗎?”我摸了摸我的臉說。

“沒有嗎?那你幹嘛像個老年人一樣說話。”她說。

我這才明白過來,她是在嘲弄我故作老成地說話,想到這,我不禁笑了,她還真是一點不吃虧的主啊。

”好了,不說這個了,我們還是來學習新的內容吧。“我趕緊轉移話題。

”今天學什麼?“她問,眼中迸射着期待的光芒。

“數組。”我說。

她沒有說話,而是眨巴着眼睛看着我,意思是說:“你繼續,我認真聽着呢。”

於是,我繼續說:“數組就是一組數據的組合。”

她依然用她那雙動人的眼睛看着我,不說一句話,但我從她的眼神中讀出兩個字來:“廢話。”

我的確是說了一句廢話,所以我不再說下去,而是陷入了沉思。

她或許對於我這樣的思考已經習以爲常了,所以她依然沒說話,於是又出現了一副定格畫面,不過這次是她看着我,而且是明目張膽地看着。

我被她看得不好意思了,於是我說:“你先練習練習字符串的格式化,我想想怎麼給你講數組。”

“好吧。”她說,然後拿過筆記本電腦,敲起代碼來。

就這樣,我成功地讓被盯着看的對象,由我變成了她,不過我卻沒有心思去欣賞她的美,此時的我滿腦子想的是,怎樣給她講清楚數組。

“假如有10個整數,現在要讓你找出其中最小的一個數,你會怎麼寫程序?”最終我想出這個找出最小數的例子來開始數組的教學。

她停下敲鍵盤的手,歪着頭想了想說:“先定義一個變量並將第一個整數賦值給它,然後依次拿這個變量和其他的整數進行比較,如果變量比當前比較的整數大,就把當前比較的整數賦值給變量,以此類推,和所有整數比較完了以後,最後變量的值就是需要的最小整數。”

沒想到她能清楚地說出算法來,這讓我有些意外,不過轉念一想,她本身就很聰明,再加上這些天來的勤奮學習,能想清楚這樣一個簡單的算法也不足爲奇了。

“說得很好,寫出來看看呢。”我說。

“沒問題。”她說着新建了一個文件,然後雙手在鍵盤上輕快的敲擊起來。

過了幾分鐘,她的想法已經以程序代碼的形式表現了出來:

uploading.4e448015.gif

編譯運行:

uploading.4e448015.gif

“哈哈,完美。”看到運行結果她興奮地說。

而我卻看着她的手說:“敲這麼多代碼,手累不?”

“手?”她擡起雙手看了看,說:“好像確實有點痠痛。”

“哈哈,”我笑了,“我要說1000個數,可能你的手就廢了。”

“不許笑!“她佯裝慍怒,轉而又柔聲說:”你一定有更好的方法,快給我講講。”

“這個時候該我們今天的主角數組出場了。”我說,“且讓我把代碼改上一改。”

我改過的代碼:

uploading.4e448015.gif

編譯運行:

uploading.4e448015.gif

“這樣就不用寫到手抽筋了。”我說。

“這樣確實是簡潔了很多。”她認真地點了點頭說。

“這就是數組的作用,我們可以把相同類型的數據按順序組成數組,然後通過數組名加下標來使用數組中的數據。”我說了一段純理論後看向她,期待她能理解我所說。

她顯然沒能一下子聽懂我說的話,歪着頭思考着。

“下標是中括號裏面的數字嗎?”思考了一會兒後,她問。

“對,沒錯。“我說,”因爲數據在數組中是按順序存放的,所以下標其實是表示數據在數組中的位置。這裏要注意的是,在數組中下標的是從0開始的,也就是說第一個數據的位置是0,第二個數據的位置是1,以此類推。“

”所以,在你寫的這個例子中,a=nums[0]就是取數組nums中的第一個數據,也就是12賦值給變量a,是不是這樣?“聽了我的講解,她搶着說出這個程序中一行代碼的意思來。

我不由得投去讚許的目光,她果真是聰明伶俐,一點就透。

”你說得沒錯,看來你已經學會數組了,那你就來解釋一下我寫這個程序唄。“我想我已經不用再講更多了,她基本上已經掌握了數組這個知識點。

”嗯,我試試,講錯了你要給我指正哦。“她說。

”好,那麼開始你的表演。“我答應她。

“數組可以看成一個變量,所以和變量一樣需要聲明,聲明一個數組的形式爲:數據類型 [] 數組名。”她想了想說,看我點了點頭後,她又繼續說,“數組的創建用‘new 數據類型{element1,element2,element3...}’這種形式進行。然後,需要從數組中取值的話就用'數據類型[下標]'這種形式取到指定序號的元素的值,我猜想給數組元素負責也是用下標指定元素進行賦值,形如這樣:數組名[下標]=一個相同類型的值。”

“你基本上說得不錯,”我向她投去讚許的目光,“但是有幾點我需要給你補充一下。1、數組的聲明還有一種形式,就是把中括號放最後,形如:數據類型 數組名[]。2、數組的初始化可以不指定具體的值,而只是指明數組的大小,就像這樣:new 數據類型[length],這裏這個length可以是一個常量也可以是一個變量,比如: new int[3]或者new[n],其中n是一個變量。3、如果聲明和初始化寫到一起的話,可以省掉‘new 數據類型’這幾個字符,形如:數據類型[] 數組名={element1,element2,element3...},所以剛那個例子其實可以寫成:int []nums ={12,1,23,13,34,5,-10,12,90,32,23,34545,-12}。4、除了這裏說的一維數組,還可以有多維數組,多維數組可以理解爲數組的數組,也就是數據類型是一個數組。所以多維數組我不用細講,你應該可以猜得到怎麼使用了。“

”嗯,“她想了想說,”我猜多維數組的聲明應該是這樣的:數據類型 [][]... 數組名,而它的初始化可以是這樣的:{{{}{}...}{{}{}...}...}。比如一個二維數組應該就是這樣的:int [][]nums={{1,2},{3,4}}或者是int nums [][]=new int [2][3]。“

“說得太對了,”對於她的聰慧,我已經不再驚訝了,“你真是聰明伶俐啊。”

“哈哈,那是當然。”她開心地笑着。

“那既然你已經學會了數組,我們就來寫個例子玩玩唄。”

“好啊,那你出題目,我來寫。”

“那我們來做一個排序的例子吧。假如有五個學生,他們的升高分別是1米、1.5米、1.2米、0.9米、1.4米,現在需要將五位學生的身高從低到高進行排序。”

“好的,小意思,看我的。”她說着就拿過電腦開始寫代碼了。

但她的手在鍵盤上敲擊了一會兒就停下了,她似乎高估了自己的能力,愁眉苦臉地轉過頭來看向我說:“這個排序該怎麼寫呢?”

“哈哈,不會了吧。”我不覺笑了起來。

“不許笑,快說怎麼寫。”

“遇到問題呢不要一上來就寫代碼,”我拿過紙筆,“我們先理好了思路再來寫代碼。”

她奇怪地看着我手裏的紙筆不說話,我只好一邊在紙上畫出五個小人來,一邊說:”你看,假如有這麼五個學生站在你面前,你會怎麼去給他們排序?“

“首先我會找到最矮的這個放到第一個位置,“她指着紙上的小人說,”然後再把第二矮的放在第2個位置,以此類推,直至排好位置。“

”很好,我來給你翻譯一下,首先你從第一個位置依次向後查找,找到最小的一個,然後把他移動到第一個位置,然後從第二個位置依次向後面查找,找到最小的放在第二個位置,依次類推,直至排好序。“

“是這樣。”她說,然後她想了想後突然笑起來:“哈哈,我知道怎麼寫程序了。”

“那麼就開始寫唄。”

她寫的程序 :

uploading.4e448015.gif

編譯運行:

uploading.4e448015.gif

“哈哈,這麼難的問題都被我解決了,我還是挺牛的是不是?”程序正確運行後,她笑着看向我說。

“嗯,你是我帶過最好的學生。”我笑着回答她。

“哈哈,我這樣優秀的學生帶起來是不是很省心?”

“確實。”

“不過呢,再優秀的學生肚子餓了也是學不好的,所以今天就到這吧。”

“既然這樣,不如我請你吃燒烤吧。”

“好啊,好啊。”她興奮地幾乎跳起來了。

 

 

 

 

 

 

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