《C#面向對象程序設計》第4章:數組與方法.ppt
《《C#面向對象程序設計》第4章:數組與方法.ppt》由會員分享,可在線閱讀,更多相關《《C#面向對象程序設計》第4章:數組與方法.ppt(31頁珍藏版)》請在裝配圖網上搜索。
1、第4章 數組與方法,主要內容與學習目標 4.1 數組 4.2 多維數組 4.3 值類型與引用類型 4.4 方法,主要內容與學習目標,主要內容: (1)聲明數組、創(chuàng)建對象數組、數組元素的引用。 (2)數組的Length屬性。 (3)數組初始化。 (4)可變長度的數組的聲明。 (5)foreach語句。 (6)數組對象的賦值運算。 (7)多維數組的聲明和創(chuàng)建、多維數組初始化。 (8)二維數組應用舉例。 (9)值類型與引用類型。 (10)方法。 (11)傳值方式、以傳值方式傳遞值類型參數、以傳值方式傳遞引用類型參數。 (12)傳引用方式、以傳引用方式傳遞值類型參數、以傳引用方式傳遞引用類型參數。 (
2、13)值傳遞方式與引用傳遞方式比較。 學習目標: (1)使用方法,以模塊方式構造程序。 (2)理解在方法之間傳遞信息的機制。 (3)理解如何聲明數組、初始化數組,以及引用數組的單獨元素。 (4)聲明和操縱多下標數組。,4.1 數組,數組是同一類型的一組變量,數組允許你通過同一名稱引用這一系列的變量,并使用一個稱為“索引”或“下標”的數字來進行區(qū)分。數組中包含的變量(又稱數組的元素)具有相同的類型,該類型稱為數組的元素類型。 如果程序中要存儲一個月中每一天的日常開銷,可以創(chuàng)建一個含有 30 個元素的數組,而不必聲明30個變量。數組中的每個元素都存有一個值,可通過指定元素的索引進行訪問。 例如,如
3、果要用數組number表示5個整數的集合(26, 86, 98, 12, 68),可以這樣創(chuàng)建數組number: int[] number = new int[5]; 任務4.1:計算月平均降雨量 問題描述:編寫程序,從輸入對話框中輸入12個月中每個月的實際降雨量,計算月平均降雨量及月實際降雨量與月平均降雨量的偏差。并將結果輸出。 4.1.1 數組初始化 4.1.2 可變長度的數組的聲明,4.1.1 數組初始化,C#通過將初始值括在大括號({})內,為在聲明時初始化數組提供了簡單而直接了當的方法。特別要注意的是,如果聲明時未初始化數組,則數組成員自動初始化為該數組類型的默認初始值。 任務4.2
4、:顯示月名稱 問題描述:修改計算月平均降雨量的程序,使命令窗口中的輸入提示是“一月”而不是“1月”,如圖4.3所示。,圖4.3 從命令窗口中輸入值,4.1.2 可變長度的數組的聲明,在前面的例子中,我們利用常數指定數組的大小,例如下面的語句中的常數12: double[] difference = new double[12]; 利用常數聲明數組大小不總占用有效的存儲空間。例如,假設我們聲明大小為100的整數數組: int[] numbers = new int[100]; 我們把利用常數聲明數組稱為“定長數組聲明”。利用定長數組聲明可能產生兩個問題:第1個問題是程序最多處理100個數,如果我
5、們需要處理的數多于100(例如,需要處理101個數),則必須修改程序后重新編譯,第2個問題是可能產生未充分利用空間的問題,上面的聲明語句分配100個空間而忽略這些空間是否被使用。假設程序平均處理20個數,那么該程序的平均空間利用率只有20%。C#并不限于定長數組聲明,還可以在每次運行程序時聲明不同長度的數組。下面的代碼提示用戶輸入數組的長度,然后創(chuàng)建指定長度的數組: int size; Console.WriteLine("請輸入要創(chuàng)建的數組的元素的個數:"); size = Int32.Parse(Console.ReadLine()); numbers = new int[size]; 任
6、務4.3:創(chuàng)建數組 問題描述:①在創(chuàng)建數組時,元素個數是否能為變量。②數組的Length屬性。 編寫一控制臺應用程序,先輸入要創(chuàng)建的數組的元素的個數,然后輸入每個元素的值,最后將數組輸出(如圖4.4所示)。,圖4.4 創(chuàng)建數組,4.2 多維數組,4.2.1 多維數組的聲明和創(chuàng)建 4.2.2 多維數組初始化 4.2.3 二維數組應用舉例,4.2.1 多維數組的聲明和創(chuàng)建,除一維數組之外,C#還支持多維數組。一維數組由排列在一行中的所有元素組成,它只有一個索引。從概念上講,二維數組就像一個具有行和列的表格一樣??紤]以下考試成績的表格(表4.1),它有5行2列,5行代表5個學生,2列代表2次考試,第
7、1列代表第1次考試的成績,第2列代表第2次考試的成績。 我們可以用一個二維數組表示這個表。先聲明并創(chuàng)建一個二維數組Score: int[,] Score = new int[5, 2]; 其中5表示行數,2表示列數。二維數組有兩個索引(索引號從0開始),其中一個表示行,一個表示列,如我們要將第1行第2列的元素賦值為88,表示為: Score[0, 1] = 88; Score [0, 1]表示學生1的考試2成績,Score[0, 0]表示學生1的考試1成績。,表4.1 學生考試成績表,4.2.2 多維數組初始化,可以在聲明數組時將其初始化,如下所示: int[,] myArray = new
8、int[,] {{1,2}, {3,4}, {5,6}, {7,8}}; 如果在聲明數組時提供了初始值設定項,可省略 new 語句: int[,] myArray = {{1,2}, {3,4}, {5,6}, {7,8}}; 如果要聲明一個數組變量但不將其初始化,必須使用 new 運算符將數組分配給此變量,例如: int[,] myArray; myArray = new int[,] {{1,2}, {3,4}, {5,6}, {7,8}}; // 正確 myArray = {{1,2}, {3,4}, {5,6}, {7,8}}; // 錯誤 可以給數組元素賦值,例如: myArray[
9、2, 1] = 25; 也可以讀取數組元素的值,例如: int aNumber = myArray1[0, 1];,4.2.3 二維數組應用舉例,任務4.4:二維數組 主要知識點:①二維數組的聲明、創(chuàng)建、初始化。②輸出二維數組每個元素的值。③將初始化的數組作為參數傳遞給方法。④獲得數組每維的長度。 問題描述:創(chuàng)建一簡單程序,演示二維數組的聲明、創(chuàng)建、初始化,并將創(chuàng)建的數組對象以調用輸出數組的方法輸出。 任務4.5:學生考試成績統計 主要知識點: 二維數組的應用。 問題描述:假定5個學生參加了兩門課的考試,試統計出全部學生的最高分和全部學生的最低分及每個學生的平均成績,并輸出(如圖4.6所示)。
10、,圖4.6 成績統計,4.3 值類型與引用類型,前面講的基本數據類型都是值類型,到目前為止學過的數組、String、類是引用類型。如果某個數據類型在自己的內存分配中包含數據,則該數據類型是“值類型”?!耙妙愋汀焙兄赶虬瑪祿钠渌麅却嫖恢玫牡刂?。也就是說,值類型變量的值是該變量包含的實際數據,該實際數據存儲在值類型變量的存儲位置中。引用類型變量的值為一地址,該變量包含的數據存儲在該地址指向的內存位置中。 下面我們介紹把一個變量的值賦給另外一個變量時發(fā)生的情況,考慮下列使用整數的賦值語句: int num1, num2; num1 = 14; num2 = num1; num1 += 5;
11、其中,變量聲明語句int num1, num2;分配了存儲了一個類型為int的值的存儲位置,同時命名這個位置為num1;分配了存儲了一個類型為int的值的另一個存儲位置,同時命名這個位置為num2(如圖4.7所示)。 為了在存儲位置為num1的存儲位置存儲一個整數值,即把一個整數值賦給變量num1,我們寫出的語句為: num1 = 14; 圖4.8說明了此賦值語句執(zhí)行之后內存的狀態(tài)。 為了在存儲位置為num2的地方存儲一個與存儲位置為num1的地方所存儲的值同樣的整數值,即把num1變量的值賦給變量num2,我們寫出的語句為: num2 = num1; 圖4.9說明此賦值語句執(zhí)行之后內存的狀態(tài)
12、。 執(zhí)行語句“num1+=5;”后內存的狀態(tài)如圖4.10所示。,圖4.7 聲明整型變量的結果,圖4.8 整型變量賦值的結果一,圖4.9 整型變量賦值的結果二,圖4.10 整型變量賦值的結果三,4.4 方法,方法是用來實現可以由對象或類執(zhí)行的計算或操作。 在前面幾章中,我們已經嘗試過如何在自己定義的類中定義自己的Main方法,也定義過事件處理方法,用它們指定我們在程序中發(fā)生的操作,在我們的方法中調用.NET框架類庫(FCL)中的一些類的方法以執(zhí)行特定的任務,如MessageBox類的Show方法、Int32類的Parse方法、Math類的Pow方法等。 應用程序中的每行代碼都必須在某個方法的內部
13、,如Main、Calculate或button1_Click。 可以把在一個程序中多次用到的某個任務定義為方法,如常用的計算、文本和控件的操作。方法對執(zhí)行重復或共享的任務很有用,可以在代碼中的許多不同位置調用方法,因此可以將方法作為應用程序的生成塊。 用方法構造代碼有以下優(yōu)點: 方法允許將程序分為不連續(xù)的邏輯單元。調試單獨的單元與調試不包含方法的整個程序相比要容易得多。 可以在其他程序中使用為某個程序開發(fā)的方法,而通常只需進行少量修改,甚至不需要修改。 4.4.1 傳值方式 4.4.2 以傳值方式傳遞值類型參數 4.4.3 以傳值方式傳遞引用類型參數 4.4.4 傳引用方式 4.4.5 以傳引
14、用方式傳遞值類型參數 4.4.6 以傳引用方式傳遞引用類型參數,4.4.1 傳值方式,如果聲明方法的參數時,參數前沒有ref或out修飾符,則調用方法時,以傳值方式向方法傳遞參數。在C#中默認為通過值傳遞參數。 所謂“傳值”,就是在方法調用時,將實參的值傳遞給形參。如果實參的類型為值類型,則實參的值為該參數包含的數據。如果實參的類型為引用類型,則實參的值為地址。 如參數是以傳值方式傳遞,形參將創(chuàng)建新的存儲位置,在該存儲位置存儲形參接收的值。也就是說,被調用的方法將接收實參的一個副本。傳值時,如果對被調用的方法的值的副本進行修改(也就是形參的值進行修改),不會影響實參變量的值。也就是說,傳值時,
15、允許在方法體內將新值賦給形參。這樣的賦值只影響由形參表示的局部存儲位置的值——它們不影響在方法調用中給出的實參的值,這是因為參數以傳值方式傳遞時,形參和實參的存儲位置不同。以傳值方式時,形參的初始化是通過復制對應實參的值來完成的。 在這里我們再給出一個概念:值參數。值參數以傳值方式進行傳遞。注意,不要將值參數和值類型參數弄混淆。值參數既可是值類型參數也可以是引用類型參數。 值參數在調用方法時出現,并由調用中給定的參數值初始化。值參數也是局部變量,它和局部變量一樣,當所在方法返回時消失。,4.4.2 以傳值方式傳遞值類型參數,值類型參數的值為該參數包含的實際數據,以傳值方式傳遞值類型參數時,當形
16、參接收到實參的值后,形參變量和實參變量就不再有任何關系。 任務4.6:移動矩形 問題描述:創(chuàng)建一個Rectangle類來描述矩形,矩形有兩個基本屬性即位置和大小。并定義一個方法,將矩形的位置調整指定的量。,4.4.3 以傳值方式傳遞引用類型參數,引用類型參數的值是地址,該地址表示的存儲位置存儲的是該引用類型變量引用的對象。以傳值方式傳遞引用類型參數時,形參分配獨立的存儲位置,該存儲位置與實參的存儲位置不同。形參接收到的值為一地址并將其存儲在形參表示的存儲位置中,形參所引用的對象存儲在形參的值表示的存儲位置中。 因此,以傳值方式傳遞引用類型參數時,將創(chuàng)建實參值(地址)的副本,而不是實參引用對象的
17、副本。 數組是引用類型,數組變量的值是一地址,該地址表示的存儲位置存儲的是該數組變量所引用的數組對象。 要向方法傳遞一個數組參數,需要在省略括號的前提下指定數組名。如任務4.1中調用printArray方法采用如下方式: printArray(app.rainfall); 任務4.7:以傳值方式傳遞數組 主要知識點: 通過傳值方式傳遞引用類型變量。 下面的例子使用任務4.1中的代碼,修改printArray方法。該例子演示:向printArray方法傳遞引用類型的參數app.rainfall。由于該參數是對app.rainfall數組對象的引用,所以printArray方法有可能更改數組元素的
18、值。但是,將形式參數aArray重新分配到不同的內存位置時,該操作僅在方法內有效,并不影響原始變量app.rainfall。 解決方案: (1)打開任務4.1的項目,然后打開其代碼文件。將MonthActualApp類的printArray方法修改如下(修改處見帶底紋部分): (2)按Ctrl+F5鍵運行該應用程序,仍然按圖4.1所示輸入數據,可得到如圖4.19所示的輸出。 (3)再次將printArray方法修改如下(修改處見帶底紋部分): (4)按Ctrl+F5鍵運行該應用程序,仍然按圖4.1所示輸入數據,可得到如圖4.20所示的輸出。,圖4.19 程序運行結果,圖4.20 程序運行結果,
19、4.4.4 傳引用方式,以傳值方式傳遞引用類型的參數時,有可能更改引用所指向的數據,如數組元素的值。但是無法更改引用本身的值;也就是說,在方法內不能使用new運算符對原始數組進行重新分配內存。若要這樣做,那該怎么辦呢?如果希望通過傳遞一個值類型參數,在方法內對該參數的修改能夠返回給原始參數,那又該怎么辦呢?為實現這樣的編程,C#提供了關鍵字ref和out。 ref和out關鍵字指出一個值類型變量或引用類型變量應該以傳引用方式傳遞。如果使用關鍵字ref和out通過引用傳遞變量,則方法能夠修改變量本身。具體說來,如果參數為對象變量,則在方法內可以給它分配新的對象。這種重新分配也會影響到調用程序中的
20、對象變量。如果參數為值類型變量,在方法中對參數所做的任何更改都將反映在該變量中,因此參數使用ref和out關鍵字后被調用的方法能夠修改原始變量。 若要使用 ref 參數,必須將參數作為 ref 參數顯式地傳遞到方法。ref 參數的值被傳遞到 ref 參數。傳遞到 ref 參數的參數必須最先初始化。 out指定一個輸出參數,被調用的方法會向其賦值。通常,當方法收到一個未初始化的值時,會發(fā)生編譯錯誤,如在參數前添out關鍵字,可要求被調用的方法對其進行初始化,并防止發(fā)生未初始化變量的錯誤。若要使用out參數,必須將參數作為out參數顯式傳遞到方法。out參數的值不會傳遞到out參數。不必初始化作為
21、out參數傳遞的變量。然而,必須在方法返回之前為out參數賦值。out參數通常用于產生多個返回值的方法中。,4.4.5 以傳引用方式傳遞值類型參數,1. ref參數 任務4.8:調用方法獲得多個值(使用ref參數) 主要知識點:通過傳引用方式傳遞值類型變量。 問題描述:在矩形Rectangle類中,聲明方法getXYWH,用戶調用該方法時,可一次獲得表示矩形位置的x、y坐標和矩形的寬度(Width)、高度(Height)。 解決方案: (1) 創(chuàng)建一個空項目Testref,向該項目添加如下代碼文件 (2) 添加System.Windows.Forms.dll引用后。按Ctrl+F5鍵執(zhí)行該應用
22、程序,可得到如圖4.24所示的輸出。 2. out參數 任務4.9:調用方法獲得多個值(使用out參數) 主要知識點:使用out參數。 問題描述:使用out參數修改上一個示例,使其完成同樣的任務。 解決方案: 使用out參數調用方法時,不必對out參數初始化,由被調用的方法為其賦值。 編譯并運行程序,可得到如圖4.25所示的輸出。 3. ref參數與out參數的比較 任務4.10:改變矩形位置 主要知識點: ref參數與out參數的區(qū)別。 問題描述:聲明一矩形類,在矩形類中聲明一方法ChangePos,該方法將矩形的位置坐標x、y改變?yōu)閰抵付ǖ牧?,并將修改后的矩形的位置坐標x、y返回。 解決
23、方案:由于要求方法返回兩個值,因此必須使用傳引用方式傳遞參數,因為方法要使用傳遞參數的值,所以必須采用ref參數。 (1)創(chuàng)建一個空項目Testref1,在該項目中添加如下類: (2)編譯并運行程序,可得到如圖4.26所示的輸出。,圖4.24 程序運行結果,圖4.25 程序運行結果,圖4.26 程序運行結果,4.4.6 以傳引用方式傳遞引用類型參數,以傳值方式傳遞引用類型的參數時,有可能更改引用所指向的數據,如數組元素的值。但是無法更改引用本身的值;也就是說,在方法內不能使用new運算符對原始數組進行重新分配內存??墒褂肅#提供的ref或out關鍵字解決這一問題。我們再次強調,ref或out關
24、鍵字告訴編譯器,形參將不創(chuàng)建新的存儲位置,形參指向與正被傳遞的參數(實參)相同的存儲位置。這樣如果被調用方法修改了形參的值并且返回,調用代碼的變量(實參)的值就被修改了。 注意:修改了引用類型變量的值,該變量就引用一個新的對象,也就是給該變量創(chuàng)建了一個新的對象。 下面的示例演示了采用傳引用方式傳遞引用類型參數的使用。 任務4.11:調用方法為實參創(chuàng)建新的對象 主要知識點:通過傳引用方式傳遞引用類型變量。 問題描述:修改任務4.1中的代碼和printArray方法,演示通過引用傳遞方式向printArray方法傳遞引用類型的參數app.rainfall。由于采用引用傳遞方式傳遞參數,實參和形參存儲位置相同,因此在方法中對形參重新創(chuàng)建對象(形參的值被修改)后,實參也被重新分配對象,也就是在被調用方法中為實參創(chuàng)建了一個新對象。 解決方案: (1) 打開任務4.1的項目及其代碼文件。將MonthActualApp類的printArray方法修改 (2) 修改Main方法中調用printArray方法的參數類型 (3) 按Ctrl+F5鍵來運行程序,還是按圖4.1所示輸入數據,可得到如圖4.27所示的輸出。,圖4.27 以傳引用方式傳遞引用類型參數,
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結+在機關“弘揚憲法精神推動發(fā)改工作高質量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結
- 2024-2025年秋季第一學期初中歷史上冊教研組工作總結
- 2024年小學高級教師年終工作總結匯報
- 2024-2025年秋季第一學期初中物理上冊教研組工作總結
- 2024年xx鎮(zhèn)交通年度總結
- 2024-2025年秋季第一學期小學語文教師工作總結
- 2024年XX村陳規(guī)陋習整治報告
- 2025年學校元旦迎新盛典活動策劃方案
- 2024年學校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農村規(guī)劃管控述職報告