本章中,我主要學到了如何使用陣列,包括一維陣列、二維陣列的定義及初始化、陣列的排序和查詢等知識。
我學到了乙個很巧妙的查詢方法——二分查詢法。這就好比是要找一本書的某一頁,先翻開它的任意一頁,如果這一頁比目標頁大(小),那麼就向前(後)翻,後面的步驟亦是如此,就這樣把查詢範圍不斷縮小,直到達到目的。使用這種方法的其中乙個好處就是,可以避免超時。就拿作業4中的一道題來講:
題目要求在給定的n個互不相等的正整數中,尋找可以形成a*b=c的等式(a,b,c互不相等)的數目。
我最開始是使用了三層巢狀的for迴圈,並且每一次迴圈都從0開始。這樣的程式雖然可以得到正確的結果,但不幸超時了,因為陣列中的數的個數最多可以達到1000個,像我這樣迴圈可能會迴圈到10的9次方次。於是我又把原陣列排序,並使每層迴圈從不一樣的地方開始:
for(a=0;afor(b=a+1;b<=n;b++)
for(c=b+1;c<=n;c++)
這樣總算可以節省一部分時間,但仍不是最好的方法。最後,在老師的指導下,我發現可以使用二分查詢的方法:讓m[c]=m[a]*m[b],之後在陣列裡面查詢m[c]。此時,要是m[a]*m[b]的值在陣列裡面,sum值就加1。這樣最多迴圈10的7次方次,可以節省很多時間。
另外,做本次作業時,我也遇到了一些其他的問題,並且有了一些感悟。比如:
1.陣列的名字不能跟其他變數定義相同,雖然是很小兒科的問題,但是我經常在此犯錯。
2.在做「做遊戲」一題的時候,我遇到乙個令自己頭疼的地方,就是迴圈到最後乙個數的時候總是出問題,不能得到加上第乙個數的解,而是變成了乙個隨機的數。後來我發現,我把迴圈寫成了:
for(i=1;i<=m;i++)
a[i]=a[i]+a[i+1]%100;
if(i= =m)
a[i]=a[i]+a[1]%100;
我原以為因為a[m+1]不存在,那樣a[i]=a[i]+a[i+1]%100;就會因為執行不下去了而自動停止,開始執行if(i= =m)a[i]=a[i]+a[1]%100;但其實它是報錯了。應該分為
if(i= =m)
a[i]=a[i]+a[1]%100;
else
a[i]=a[i]+a[i+1]%100;
但即使是這樣也不行,因為此時if(i==m)時加上的a[1]已經不是之前的a[1]了,它已經加上了a[2]%100。要解決這個問題,就要再定義乙個新的陣列,使它隨著陣列a更新,而且其中的a[i]不是上輪的,而是本輪加數之前的a[i]。
遇到錯誤了,先要自己反覆研讀(走查,甚至在紙上寫出每一步的迴圈過程),分析**有沒有問題。有時怎樣也找不出錯誤,看的頭疼,是因為沒有跳出之前的**,一直在原來的**中,讀來讀去也感覺沒有問題。這時要及時跳出自己的**,回去再看看題,而看題的時候,要當成新題來讀,以免陷入原來的**中。同時要多次回去分析題目要求,因為在分析原題的過程中,往往會產生新的想法。然而,遇到問題也不要走另乙個極端——反覆想也想不出來,仍然反覆的想,這樣雖然看起來很堅持,但也浪費時間。
另外,檢查程式的時候,如果有資料,要首先檢查陣列的編號是否一致、語法是否有錯誤。
但是再怎樣細緻的檢查都不如最初寫**時的仔細來的重要,所以不論寫什麼樣的**,都應該仔仔細細,不在細節上犯馬虎。
第八章 陣列
一 含義 1.識別符號 用於區分不同陣列的變數名 2.陣列元素 陣列中存放的資料 3.陣列下標 對陣列進行的編號 4.元素型別 即資料型別 二 語法,步驟 1.宣告變數 資料型別 s陣列名 資料型別 陣列名 2.分配空間 陣列名 new 資料型別 陣列長度 資料型別 陣列名 new int 陣列長度...
第八章 陣列
第八章 陣列 1 陣列的基本操作 1 陣列也是一種復合型別資料型別,它由一系列相同型別的元素組成。2 定義陣列int count 4 整個陣列佔了4個相鄰的整數的儲存空間,方括號的4表示陣列的長度,而陣列元素是從0開始的,count i 位於從陣列開頭跳過4 i個位元組的儲存位置,這個陣列下標的表示...
第八章 陣列
第八章 陣列 1.陣列是一組具有相同型別的變數集合,可使用乙個統一的名字來標識這組相同型別的資料,這個名字稱為陣列名,構成陣列的每個資料項稱為陣列元素.例 用如下陣列來儲存五個學生的成績 int score 5 int代表該陣列的基型別。即陣列中元素的型別.score後方括號內的數字代表陣列元素的個...