第5章 數(shù)組和方法_第1頁
第5章 數(shù)組和方法_第2頁
第5章 數(shù)組和方法_第3頁
第5章 數(shù)組和方法_第4頁
第5章 數(shù)組和方法_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

學習目標使用一維數(shù)組處理相同數(shù)據(jù)類型的數(shù)據(jù)使用二維數(shù)組處理相同類型數(shù)據(jù)的行列、矩陣等問題選用不同參數(shù)類型的方法處理問題理解委托的概念,能根據(jù)條件使用委托調(diào)用不同的方法來解決問題訂閱事件,利用事件處理相應的任務第五章數(shù)組和方法25.1數(shù)組第五章數(shù)組和方法在C#中,數(shù)組具有如下一些特點:數(shù)組是一種引用數(shù)據(jù)類型,由若干個相同類型的元素組成。數(shù)組可以有一個或多個維,每個維都有一個長度,每個維的元素的下標都是從0開始的,它的最后一個元素的下標比該維的長度少1。數(shù)組元素由數(shù)組的所有維的下標共同唯一確定,數(shù)組中元素個數(shù)等于該數(shù)組所有維的長度的連乘積。數(shù)組元素可以是任何類型,包括數(shù)組類型。在C語言中數(shù)組名代表一塊可尋址連續(xù)內(nèi)存區(qū)域的首地址,而在C#中,由于.NET是面向?qū)ο蟮?,故?shù)組名可以看成是對象名,數(shù)組是抽象基類型Array的派生類型,故任何數(shù)組名都可以使用Array類的部分屬性和方法,這樣就極大地方便了數(shù)組的操作。下表5-1僅列出了Array類常用的一些屬性和方法。35.1數(shù)組第五章數(shù)組和方法屬性說明Length表示數(shù)組的所有維中元素的總數(shù)。Rank獲取數(shù)組的維數(shù)。方法說明Reverse反轉(zhuǎn)一維數(shù)組或部分數(shù)組中元素的順序。Sort對一維數(shù)組對象中的元素進行排序。表5-1Array類的部分屬性和方法45.1數(shù)組5.1.1一維數(shù)組【學一學】一維數(shù)組的定義分為兩步:第一步是聲明數(shù)組,第二步是為數(shù)組分配空間并初始化數(shù)組元素。(1)一維數(shù)組的聲明一維數(shù)組聲明的語法格式如下:數(shù)據(jù)類型[]數(shù)組名;上述語法中的數(shù)據(jù)類型可以是任何類型,甚至可以是數(shù)組類型。通過上述語法即聲明一個長度不確定的一維數(shù)組。下面的代碼段聲明了兩個一維數(shù)組。

int[]nums;//定義了一個一維整型數(shù)組,數(shù)組名為nums;string[]stuNames;//定義了一個一維字符串數(shù)組,數(shù)組名為stuNames;

第五章數(shù)組和方法55.1數(shù)組5.1.1一維數(shù)組(2)一維數(shù)組的創(chuàng)建及初始化一維數(shù)組的創(chuàng)建是指利用new運算符為數(shù)組分配內(nèi)存空間,初始化指的是在創(chuàng)建數(shù)組的時候用指定的值為數(shù)組元素賦初值,如果沒有用指定的值初始化數(shù)組元素,就用默認值進行初始化。創(chuàng)建一維數(shù)組的語法格式如下:數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度];這里的數(shù)組長度必須是常量或常量表達式,或者是已經(jīng)賦值的變量。創(chuàng)建數(shù)組及初始化數(shù)組元素主要有以下幾種方法:①在聲明數(shù)組的同時創(chuàng)建數(shù)組并用默認值初始化數(shù)組元素。如果數(shù)組元素類型為值類型,則默認值為0;如果數(shù)組類型為引用類型,則默認值為空引用null。以下代碼創(chuàng)建了初值為0的具有5個元素nums[0]~nums[4]的整型數(shù)組grade。

int[]grade=newint[5];以下代碼創(chuàng)建了初值為null、有5個元素的字符串數(shù)組name。string[]name=newstring[5];第五章數(shù)組和方法65.1數(shù)組5.1.1一維數(shù)組②在聲明數(shù)組的同時創(chuàng)建數(shù)組并用指定的值初始化數(shù)組元素,初始化的值放在花括號"{}"中,見下列示例代碼。

int[]grade=newint[5]{50,60,70,80,90};//創(chuàng)建一個整型數(shù)組,其中數(shù)組元素stu[0]~stu[4]的值分別初始化為50、60、70、80、90。下列代碼創(chuàng)建一個字符串數(shù)組,其中的數(shù)組元素stuName[0]~stuName[2]分別初始化為字符串常量"Beijing"、"Nanjing"、"Shanghai"。

string[]citys=newstring[3]{"Beijing","Nanjing","Shanghai"};上述代碼中可以在new運算符后不寫元素個數(shù),但如果指定了個數(shù),則必須要與花括號"{}"中數(shù)據(jù)的個數(shù)一致,否則編譯會出錯。因此上述的兩個代碼段也可以使用以下的形式替代。

第五章數(shù)組和方法75.1數(shù)組5.1.1一維數(shù)組

int[]grade={50,60,70,80,90};//隱含創(chuàng)建了一個整型數(shù)組

string[]citys={"Beijing","Nanjing","Shanghai"};//隱含創(chuàng)建了一個字符串數(shù)組上述形式的代碼沒有使用new運算符,隱含地為數(shù)組分配內(nèi)存空間,并且數(shù)組的元素個素由花括號"{}"中數(shù)據(jù)的個數(shù)決定。③聲明數(shù)組后,再用new運算符創(chuàng)建數(shù)組及初始化數(shù)組元素。詳見下列代碼。

int[]grade;grade=newint[5]{50,60,70,80,90};string[]citys;

citys=newstring[3]{"Beijing","Nanjing","Shanghai"};在C#中,數(shù)組名是一個引用變量,可以和另一個類型相同的數(shù)組名相互賦值,如下列代碼所示。

int[]grade=newint[]{50,60,70,80,90};//創(chuàng)建一維整型數(shù)組grade

int[]score=grade;//此時score與grade代表的是同一個數(shù)組。第五章數(shù)組和方法85.1數(shù)組5.1.1一維數(shù)組【試一試】[任務5-1]:把從控制臺錄入的某門課程的成績放在數(shù)組中,按降序排序,將排序后的結(jié)果以及課程的最高分、最低分和平均分輸出。解決思路:1.將輸入的課程成績保存在一個數(shù)組中;2.對數(shù)組中的元素按降序進行排序;3.找出第一個元素和最后一個元素(即最高分和最低分);4.求數(shù)組所有元素的平均分;5.輸出排序后的成績、最高分、最低分和平均分。完成步驟:(1)創(chuàng)建一個控制臺應用程序,項目名稱為“chapter5_1”,在該項目中添加一個名為Score.cs的類文件(2)在類Score中添加以下兩個私有成員。float[]arrayScore;//聲明了一個float型的數(shù)組

intcount;//定義一個整型變量,用于記錄數(shù)組元素的個數(shù)第五章數(shù)組和方法95.1數(shù)組5.1.1一維數(shù)組(3)在類Score中添加一個公有方法InputScore(),用于輸入成績。代碼如下:publicvoidInputScore(){

Console.Write("請輸入該班學生人數(shù):");count=int.Parse(Console.ReadLine());

arrayScore=newfloat[count];

inti;for(i=0;i<count;i++){

Console.Write("請輸入第{0}個學生的成績:",i+1);

arrayScore[i]=float.Parse(Console.ReadLine());}}第五章數(shù)組和方法105.1數(shù)組5.1.1一維數(shù)組(4)在類Score中添加一個公有方法DispAverage(),用于計算并輸出平均成績。代碼如下:publicvoidDispAverage(){floatavg,sum=0;

foreach(floatkinarrayScore){sum+=k;}

avg=sum/count;

Console.WriteLine("該班學生的平均分為{0:f2}",avg);}

上述代碼中的“{0:f2}”是一個格式字符串,表示變量avg帶兩位小數(shù)輸出。第五章數(shù)組和方法115.1數(shù)組5.1.1一維數(shù)組(5)在類Score中添加一個公有方法DispMaxandMin(),用于輸出最高分和最低分。代碼如下:publicvoidDispMaxandMin(){floatmax,min;max=arrayScore[0];min=arrayScore[0];for(inti=1;i<count;i++){if(arrayScore[i]>max)max=arrayScore[i];if(arrayScore[i]<min)min=arrayScore[i];}

Console.WriteLine("最高分為{0:f2}",max);

Console.WriteLine("最低分為{0:f2}",min);}第五章數(shù)組和方法125.1數(shù)組5.1.1一維數(shù)組求數(shù)組中最大值的基本算法如下:定義變量max,將數(shù)組的第一個元素賦給max,接下來通過循環(huán)遍歷剩余的所有元素,一旦發(fā)現(xiàn)某個元素的值比max大,就將該值賦給max,循環(huán)結(jié)束后max的值就是所有元素中的最大值,用類似的算法可求數(shù)組中的最小值。(6)在類Score中添加一個公有方法Sort(),用于對數(shù)組中的成績按降序排序,并輸出排序后的結(jié)果。代碼如下:publicvoidSort(){

Array.Sort(arrayScore);

Array.Reverse(arrayScore);

Console.WriteLine("成績排序后的結(jié)果為:");for(inti=0;i<count;i++)Console.WriteLine("{0:f2}",arrayScore[i]);}第五章數(shù)組和方法135.1數(shù)組5.1.1一維數(shù)組注意上述代碼中調(diào)用Array類的Sort方法將指定的數(shù)組中的元素按升序排序,要實現(xiàn)成績從高到低排序,還必須使用Array類的Reverse方法反轉(zhuǎn)元素的次序。對數(shù)組排序可以采用雙重循環(huán)實現(xiàn),排序的方法有冒泡法、選擇法等,具體的實現(xiàn)可以參考相關書籍。在C#中,對數(shù)組排序非常簡單,可以直接采用Array類的靜態(tài)方法Sort和Reverse來實現(xiàn)排序。(7)在主方法Main中,編寫如下代碼,以創(chuàng)建類Score的實例,并依次調(diào)用前面創(chuàng)建的方法,完成成績的排序,輸出最高分、最低分和平均分。staticvoidMain(string[]args){Scorescore=newScore();

score.InputScore();

score.Sort();

score.DispMaxandMin();

score.DispAverage();}第五章數(shù)組和方法145.1數(shù)組5.1.1一維數(shù)組運行程序,按提示輸入成績,執(zhí)行后的結(jié)果如圖5.1所示。

第五章數(shù)組和方法圖5.1程序的執(zhí)行結(jié)果155.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法【學一學】二維數(shù)組的定義跟一維數(shù)組一樣,分為兩步:第一步是聲明一個二維數(shù)組,第二步是為該二維數(shù)組分配空間并初始化數(shù)組元素。(1)二維數(shù)組的聲明二維數(shù)組聲明的語法格式如下:數(shù)據(jù)類型[,]數(shù)組名;上述語法中的數(shù)據(jù)類型,即數(shù)組元素類型同一維數(shù)組一樣也可以是任何類型。數(shù)組的兩個維之間用逗號隔開,也就是說一個逗號表示兩個維,依次類推,如果有n個逗號,則表示n+1維。以下代碼演示了二維數(shù)組的聲明。

int[,]score;//聲明了一個可以存放多名學生多門課程的成績的二維數(shù)組

string[,]book;//聲明了一個可以存放多層書架上的多本書籍名稱的二維數(shù)組165.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法

(2)二維數(shù)組的創(chuàng)建及初始化與一維數(shù)組一樣,二維數(shù)組的創(chuàng)建指的就是利用new運算符為數(shù)組分配內(nèi)存空間,初始化指的是在創(chuàng)建數(shù)組的時候,用指定的值為數(shù)組元素賦初值,如果沒有用指定的值初始化數(shù)組元素,就用默認值初始化。創(chuàng)建二維數(shù)組的語法格式如下:二維數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度1,數(shù)組長度2];這里的數(shù)組長度1和數(shù)組長度2分別表示二維數(shù)組第一維和第二維的長度,它們必須是常量或常量表達式,或者是已經(jīng)賦值的變量。欲訪問二維數(shù)組中的元素,可以使用以下語法格式:數(shù)組名[下標1,下標2]。其中下標1對應到行,下標2對應到列,下標1、下標2的最小值為0,下標1、下標2的最大值分別為二維數(shù)組的行數(shù)-1、列數(shù)-1。創(chuàng)建二維數(shù)組及初始化二維數(shù)組元素的方法主要有以下3種方式:175.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法

①在聲明數(shù)組的同時創(chuàng)建數(shù)組,并用默認值初始化數(shù)組元素。如果數(shù)組元素類型為值類型,則默認值為0;如果數(shù)組類型為引用類型,則默認值為空引用null。以下代碼創(chuàng)建了一個行數(shù)為5,列數(shù)為3的整型二維數(shù)組,其中行表示學生,列表示課程,元素之一score[2,1]存放的第3個學生的第2門課程的成績,所有的成績都初始化為0。

int[,]score=newint[5,3];以下代碼創(chuàng)建了一個行數(shù)為5,列數(shù)為10的字符型二維數(shù)組,元素之一book[2,3]存放的是書架第3層中第4本書的名稱,所有數(shù)組元素都初始化為null。string[,]book=newstring[5,10];②在聲明二維數(shù)組的同時創(chuàng)建數(shù)組,并用指定的值初始化數(shù)組元素。為每行指定的值放在花括號"{}"中,而所有行的值再放在外圍的一個花括號"{}"中。 以下代碼是創(chuàng)建一個二維數(shù)組score,來存放三個學生的四門課程的成績。

int[,]score=newint[3,4]{{93,78,83,90},{92,73,63,82},{53,83,93,60}};內(nèi)部三個大括號中的數(shù)據(jù)分別為三行的數(shù)組元素賦初值,3個內(nèi)部大括號內(nèi)的元素的個數(shù)必須相同。185.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法下列代碼是創(chuàng)建一個二維數(shù)組book,來保存兩層書架上放置的書名。string[,]book=newstring[2,3]{{"C語言程序設計","VB編程基礎","Delphi編程基礎"},{"政治經(jīng)濟學","貨幣銀行學","市場經(jīng)濟學"}};new運算符后可以不指定行和列的長度,但如果要指定長度,則必須與花括號"{}"中用作初始化的數(shù)據(jù)的行數(shù)和列數(shù)保持一致,如下列代碼所示。string[,]book={{"C語言程序設計","VB編程基礎","Delphi編程基礎"},{"政治經(jīng)濟學","貨幣銀行學","市場經(jīng)濟學"}};book數(shù)組表示的元素可以用表5-2來表示。書序號書架號0120C語言程序設計VB編程基礎Delphi編程基礎1政治經(jīng)濟學貨幣銀行學市場經(jīng)濟學表5-2book數(shù)組中的元素195.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法

③聲明數(shù)組后,再用new運算符創(chuàng)建數(shù)組及初始化數(shù)組元素。見下列代碼所示。

int[,]score;score=newint[3,4]{{93,78,83,90},{92,73,63,82},{53,83,93,60}};string[,]book;book=newstring[2,3]{{"C語言程序設計","VB編程基礎","Delphi編程基礎"},{"政治經(jīng)濟學","貨幣銀行學","市場經(jīng)濟學"}};205.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法【試一試】[任務5-2]:錄入各商品在指定地區(qū)的銷售額,統(tǒng)計各地區(qū)所有商品的銷售總額,統(tǒng)計各類商品在所有地區(qū)的銷售總額,并以表格的形式將統(tǒng)計結(jié)果輸出。解決思路:1.以地區(qū)作為行、商品作為列來構(gòu)建一個二維數(shù)組,將輸入的某一商品在某一地區(qū)的銷售額作為一個元素,保存在二維數(shù)組中;2.依次輸出各行的元素值,匯總各行的元素值并輸出;3.依次按列匯總各列的元素值,并輸出。與此同時匯總所有列的元素值,匯總完后輸出。完成步驟:創(chuàng)建該程序的步驟如下:1.創(chuàng)建一個名為chapter5_2的控制臺應用程序,向項目中添加一個名為Sell.cs的類文件。2.在類Sell中添加三個私有成員變量:

215.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法

int[,]sellAmount;//存放商品的銷售額

string[]area;//存放銷售的地區(qū)

string[]goods;//存放銷售的商品3.在類Sell中添加一個構(gòu)造函數(shù)Sell(),用于初始化銷售地區(qū)和銷售商品名,代碼如下。

publicSell(){area=newstring[]{"上海","北京","廣州"};goods=newstring[]{"彩電","冰箱","空調(diào)"};

sellAmount=newint[3,3];}4.在類Sell中添加一個公有方法InputAmount(),用于輸入銷售額,代碼如下。publicvoidInputAmout(){

225.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法

for(inti=0;i<3;i++)//行對應地區(qū)

for(intj=0;j<3;j++)//列對應商品

{

Console.Write("請輸入{0}在{1}的銷售額:",goods[j],area[i]);

sellAmount[i,j]=int.Parse(Console.ReadLine());}}5.在類Sell中添加一個公有方法Statistics(),先按行統(tǒng)計各地區(qū)所有商品的銷售總額,再按列統(tǒng)計各類商品在所有地區(qū)的銷售額,最后將數(shù)組中所有的元素值一并匯總并輸出。代碼如下。publicvoidStatistics(){Console.WriteLine("\n{0,20}","商品銷售情況統(tǒng)計表");//輸出表標題

235.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法Console.WriteLine("{0,12}{1,6}{2,6}{3,6}",goods[0],goods[1],goods[2],"合計");//輸出表頭

int[]temp=newint[3];//保存各列的總和

inttotal=0;//保存所有銷售額的總和

for(inti=0;i<3;i++)//此循環(huán)按行統(tǒng)計各行的銷售額

{Console.Write("{0,-8}",area[i]);

intcount=0;for(intj=0;j<3;j++){Console.Write("{0,-8}",sellAmount[i,j]);count+=sellAmount[i,j];}Console.WriteLine("{0,-8}",count);//輸出該行的總和

}

245.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法Console.Write("{0,-8}","合計");//輸出統(tǒng)計行的列頭

for(inti=0;i<3;i++)//此循環(huán)按列統(tǒng)計各列的銷售額

{

intcount=0;for(intj=0;j<3;j++){count+=sellAmount[j,i];total+=sellAmount[j,i];}Console.Write("{0,-8}",count);//輸出該列的總和

}Console.WriteLine("{0,-8}",total);//輸出所有銷售總額

}

255.1數(shù)組5.1.2二維數(shù)組

第五章數(shù)組和方法

上述代碼中,格式字符串“{0,-8}”是指變量在輸出時,所占的長度是8個字符且左對齊,不足部分用空格補齊。

6.在Program.cs文件的主方法Main中,編寫如下代碼,實例化類Sell的一個對象sell,調(diào)用前面創(chuàng)建的方法,來完成銷售額的統(tǒng)計任務。staticvoidMain(string[]args){Sellsell=newSell();

sell.InputAmout();

sell.Statistics();}7.按Ctrl+F5健,運行程序,按提示輸入銷售額數(shù)據(jù),程序的執(zhí)行結(jié)果如圖5.2所示。圖5.2程序的執(zhí)行結(jié)果

265.2方法5.2.1方法的定義

第五章數(shù)組和方法

【學一學】

在使用方法前,首先要定義方法。方法的定義包含兩個部分:方法頭和方法體。方法頭是定義方法的第一行,即左花括號“{”前的語句。方法體位于花括號對中,是調(diào)用方法時要執(zhí)行的語句。定義方法的語法格式如下: 修飾符返回值類型方法名(參數(shù)列表){ //方法體}修飾符可以是static、public、private、protected、internal、virtual、override、abstract或extern,關于這些修飾符的含義將在后面有較為詳細的介紹。方法的返回值類型設置了方法要返回的值的數(shù)據(jù)類型,它可以是前面介紹的任意的數(shù)據(jù)類型,也包括自定義的數(shù)據(jù)類型。如果方法沒有返回值,就用關鍵詞void指定。

275.2方法5.2.1方法的定義

第五章數(shù)組和方法方法名是在程序中調(diào)用方法的名稱,它的命名規(guī)則與變量的命名規(guī)則相同。在給方法命名時,要注意見名知義,也就是方法的名稱能反應方法的功能,以提高程序的可讀性。參數(shù)列表用于在調(diào)用方法時給方法傳遞內(nèi)容,每個參數(shù)包括參數(shù)名和參數(shù)類型。參數(shù)名用于在方法體中訪問傳遞給方法的數(shù)據(jù)項,方法中可以沒有參數(shù)列表。下面定義了一個方法Square,該方法用于計算n的平方值。staticpublicint

Square(intn){returnn*n;}以下代碼是在主方法Main中調(diào)用上述方法Square,以輸出1~9的平方值。285.2方法5.2.1方法的定義

第五章數(shù)組和方法staticvoidMain(string[]args){for(inti=1;i<10;i++){

Console.WriteLine(i+"的平方="+Square(i));}}上述代碼中,整數(shù)n是在定義方法時的參數(shù),整數(shù)i是在調(diào)用方法時,傳遞給方法的變量。這里要明確兩個概念:形參和實參。形參是指定義方法時方法中的形式參數(shù),實參是指是在調(diào)用方法時,傳遞給方法、與形參對應的有實際值的變量或常量。在調(diào)用方法時,有時會向方法傳遞參數(shù),例如Math類中有一個求絕對值的方法Abs:publicstaticshortAbs(shortvalue);295.2方法5.2.1方法的定義

第五章數(shù)組和方法在該方法中value就稱為形參,而如果在程序中使用如下的代碼來調(diào)用該方法,則其中的短整型變量a就稱為實參。

shorta=5;

Console.WriteLine(Math.Abs(a));在調(diào)用方法時,實參傳遞給形參的方式有如下幾種:按值傳遞、按引用傳遞、按輸出參數(shù)傳遞。

305.2方法5.2.2參數(shù)按值傳遞

第五章數(shù)組和方法【學一學】

如在定義方法時形參未加任何修飾,則在調(diào)用方法時,是將實參的值傳給參數(shù)。也就是說,將含有實際數(shù)據(jù)的實參的一個副本傳給形參,形參和實參占據(jù)不同的內(nèi)存空間。在方法內(nèi)對形參變量的改變不會影響到實參。這種按值傳遞的方式應用最為廣泛。一般地在定義方法時,設置若干個按值傳遞的形參,并設定一個返回值類型,通過該方法獲得一個計算或處理的結(jié)果。參數(shù)按值傳遞又分為兩種情況:第一種情況是參數(shù)類型本身就是值類型,此時方法中形參變量的改變對實參沒有任何影響。第二種情況是參數(shù)類型本身就是引用類型,例如數(shù)組作為參數(shù)時,傳遞的是數(shù)組對象的引用而不是數(shù)組元素本身,此時可以通過該方法去更改引用所指向的數(shù)據(jù),如數(shù)組內(nèi)元素的值,但對形參引用本身的改變不會影響到實參。315.2方法5.2.2參數(shù)按值傳遞

第五章數(shù)組和方法【試一試】[任務5-3]:定義學生的人數(shù)、課程名和各學生的該課程成績。然后調(diào)用參數(shù)按值傳遞的方法來修改學生的人數(shù)、課程名和課程成績,并比較調(diào)用方法前后實參的變化。解決思路:1.定義三個變量(即實際參數(shù))來分別保存學生人數(shù)、課程名和各學生的該課程成績;2.定義一個方法OutputValues輸出上述三個變量保存的數(shù)據(jù);3.定義一個帶三個參數(shù)的方法Modify,用來修改參數(shù)的值,并將修改后的參數(shù)值輸出。方法中的這三個參數(shù)分別與1中定義的參數(shù)對應;4.定義另一個方法TestModify,在該方法中,首先調(diào)用方法OutputValues來輸出實參的值,然后調(diào)用方法Modify接收實參傳遞過來的值,輸出修改后的參數(shù)的值。最后再一次調(diào)用方法OutputValues輸出實參的值,以判斷在調(diào)用方法Modify后,是否對實參造成影響。

325.2方法5.2.2參數(shù)按值傳遞

第五章數(shù)組和方法完成步驟:1.創(chuàng)建一個名為chapter5_3的控制臺應用程序,然后向該項目中添加一個名為TestParam的類文件。2.在類TestParam中定義如下三個變量,作為實參來使用。stringcourse="C#";

intcount=5;

int[]score=newint[]{56,63,78,70,85};顯然變量course和score均是引用類型,而count是值類型變量。3.在類TestParam中定義一個方法OutputValues,用來輸出三個實參的值。具體代碼如下:

voidOutputValues(){

Console.WriteLine("課程:{0}",course);

Console.WriteLine("人數(shù):{0}",count);for(inti=1;i<=count;i++)

335.2方法5.2.2參數(shù)按值傳遞

第五章數(shù)組和方法

Console.WriteLine("第{0}個學生成績?yōu)閧1}",i,score[i-1]);}}5.在類TestParam中添加一個方法TestModify,用來調(diào)用方法OutputValues輸出實參的值,并將實參傳遞給方法Modify,調(diào)用方法Modify以輸出參數(shù)修改后的結(jié)果。再調(diào)用方法OutputValues輸出實參的值,比較調(diào)用方法Modify前后實參的變化。具體代碼如下:publicvoidTestModify(){

Console.WriteLine("以下是在調(diào)用方法\"Modify\"前各實參的值是:");

OutputValues();

Console.WriteLine("以下是傳遞實參后調(diào)用方法\"Modify\"的輸出結(jié)果:");Modify(course,count,score);

345.2方法5.2.2參數(shù)按值傳遞

第五章數(shù)組和方法

Console.WriteLine("以下是在調(diào)用方法\"Modify\"后各實參的值是:");

OutputValues();}6.在主方法Main中編寫如下代碼,來顯示參數(shù)的變化。staticvoidMain(string[]args){

TestParam

tp=newTestParam();

tp.TestModify();}運行程序,執(zhí)行結(jié)果如圖5.3所示。

圖5.3程序的執(zhí)行結(jié)果

355.2方法5.2.2參數(shù)按值傳遞

第五章數(shù)組和方法分析上述結(jié)果發(fā)現(xiàn):①學生的成績發(fā)生了改變,這是因為方法Modify通過傳過來的引用類型的數(shù)組名,改變了數(shù)組中元素的值,故實參數(shù)組的數(shù)組元素相應得到了改變。②按理說實參course也是引用類型,也屬于按值傳遞的引用類型,實參course指向的字符串內(nèi)容也應發(fā)生改變,但最后的輸出結(jié)果證明course并沒有變化。這是因為string引用類型比較特殊,在C#中不允許改變其內(nèi)容。在方法Modify中的以下代碼:course="ASP.NET";執(zhí)行的過程是在堆中另外分配空間存放字符串"ASP.NET",并使形參變量course指向該對象,即改變了引用本身,并沒有影響到原來的實參course,故輸出的course沒有變化。③count變量是值類型,所有形參的變化不會對原來的實參產(chǎn)生影響。365.2方法5.2.3參數(shù)按引用傳遞

第五章數(shù)組和方法【學一學】

在定義方法時,將ref關鍵字放在形參的變量類型標識符的前面,則該參數(shù)按照引用傳遞。在調(diào)用方法時也必須在對應實參前面使用ref關鍵字。按引用傳遞參數(shù),形參和實參在內(nèi)存中的位置是相同的,所以形參變量的改變就等同于實參變量的改變。按引用傳遞參數(shù)同樣有兩種情況:第一種情況是形參本身就是引用類型,即按引用傳遞引用類型,此時對形參的改變及對形參所指向的數(shù)據(jù)的改變均會反映到實參中;第二種情況是形參本身是值類型,即按引用傳遞值類型。在實際程序開發(fā)中用得最多的是按引用傳遞值類型。按引用傳遞參數(shù)的一個重要作用就是可以使方法能帶回多個值,突破了按值傳遞參數(shù)只能返回一個值的限制。使用ref關鍵字,使多個值類型實參得到更新成為可能。需要注意的是:按引用傳遞參數(shù)時實參在傳入前必須進行初始化。375.2方法5.2.3參數(shù)按引用傳遞

第五章數(shù)組和方法【試一試】[任務5-4]:輸入學生的成績,通過引用傳遞參數(shù)返回成績的最高分、最低分和平均分,并輸出。解決思路:1.將輸入的學生成績放在一個數(shù)組中;2.定義一個帶有四個參數(shù)的方法,其中第一個參數(shù)是數(shù)組類型參數(shù),用來接收要處理的成績,其它三個參數(shù)均是引用類型參數(shù),用來返回成績的最高分、最低分和平均分。3.在主方法中調(diào)用上述方法,并將引用參數(shù)的值輸出。完成步驟:1.創(chuàng)建一個名為chapter5_4的控制臺應用程序,并向該項目中添加一個名為DealGrade的類文件。2.在類DealGrade中添加一個方法InputScore,用來向數(shù)組中輸入學生的成績。方法的代碼如下。385.2方法5.2.3參數(shù)按引用傳遞

第五章數(shù)組和方法publicvoidInputScore(float[]score){for(inti=0;i<score.Length;i++){

Console.Write("請輸入第{0}個學生的分數(shù):",i+1);

score[i]=float.Parse(Console.ReadLine());}}3.在類DealGrade中添加一個方法GetMaxMinAvegByRef,來處理成績,返回最高分、最低分和平均分,代碼如下。publicvoidGetMaxMinAvegByRef(float[]score,reffloatmax,reffloatmin,reffloataveg){max=min=score[0];floattotal=0;395.2方法5.2.3參數(shù)按引用傳遞

第五章數(shù)組和方法for(inti=0;i<score.Length;i++){if(max<score[i])max=score[i];if(min>score[i])min=score[i];total+=score[i];}

aveg=total/score.Length;}上述方法中的參數(shù)max、min、average均是值類型,它們按引用傳遞,方法中對這三個變量的賦值將會直接改變實參變量。

405.2方法5.2.3參數(shù)按引用傳遞

第五章數(shù)組和方法

4.在主方法Main中編寫如下代碼,向數(shù)據(jù)score中輸入成績,調(diào)用方法GetMaxMinAvegByRef,并將實參的值輸出。具體代碼如下。staticvoidMain(string[]args){float[]score;floatmax=0,min=0,aveg=0;//要賦初值,否則編譯通不過

Console.Write("輸入學生人數(shù):");

intcount=int.Parse(Console.ReadLine());score=newfloat[count];

DealGradedg=newDealGrade();

dg.InputScore(score);//輸入成績

dg.GetMaxMinAvegByRef(score,refmax,refmin,refaveg);//調(diào)用方法,使用引用參數(shù)返回多個值

Console.WriteLine(“最高分是:{0},最低分是:{1},平均分是:{2}?!?max,min,aveg);//輸出受影響的實參的值}

415.2方法5.2.3參數(shù)按引用傳遞

第五章數(shù)組和方法按Ctrl+F5健運行程序,按提示輸入學生人數(shù)和各學生的成績,程序的執(zhí)行結(jié)果如圖5.4所示。

圖5.4按引用參數(shù)返回的多個值

從圖5.4可以看出,通過按引用傳遞參數(shù),使方法GetMaxMinAvegByRef返回了三個值。但在主方法Main中必須對變量max、min和aveg進行初始化,否則程序編譯將無法通過,而這種初始化有時是毫無意義的,為了不受該用法的限制,可以使用輸出參數(shù)來解決這個問題。425.2方法5.2.4參數(shù)按輸出參數(shù)傳遞

第五章數(shù)組和方法【學一學】

在定義方法時,將out關鍵字放在形參變量類型標識符的前面,則該參數(shù)按輸出參數(shù)傳遞。在調(diào)用該方法時必須在實參前面也使用out關鍵字。使用out關鍵字使輸出參數(shù)按引用傳遞,不過與按引用傳遞不同的是:按輸出參數(shù)傳遞參數(shù)時,在傳入?yún)?shù)前實參可以不必初始化,但在方法返回前必須為輸出參數(shù)賦一個值。435.2方法5.2.4參數(shù)按輸出參數(shù)傳遞

第五章數(shù)組和方法【試一試】[任務5-5]:下表5-3是氣象臺監(jiān)測到的某市1~12份的降雨量,請使用帶輸出參數(shù)的方法來計算最高降雨量、最低降雨量和月平均降雨量。表5-3某市1~12月份的降雨量(mm)解決思路:1.將12個月的降雨量存放到一個數(shù)組中;2.定義一個帶輸出參數(shù)的方法,來處理數(shù)組的元素,求出數(shù)組元素中的最大值、最小值和平均值,并用輸出參數(shù)返回;3.將輸出實參的值在控制臺輸出。

完成步驟:1.創(chuàng)建一個名為Chapter5_5的控制臺應用程序,向該項目中添加一個名為Rainfall的類文件。1月2月3月4月5月6月7月8月9月10月11月12月1025124532856640102763958445.2方法5.2.4參數(shù)按輸出參數(shù)傳遞

第五章數(shù)組和方法2.在類Rainfall中添加一個方法StatRainfall,用來計算數(shù)組中元素的最大值、最小值和平均值,具體代碼如下。publicvoidStatRainfall(float[]rain,outfloatmax,outfloatmin,outfloataveg){floatsum=0;max=rain[0];min=rain[0];

foreach(floatiinrain){

if(i>max)max=i;

if(i<min)min=i;sum+=i;455.2方法5.2.4參數(shù)按輸出參數(shù)傳遞

第五章數(shù)組和方法

}

aveg=sum/rain.Length;}3.在主方法Main中編寫如下代碼,來輸出降雨量的處理結(jié)果。staticvoidMain(string[]args){float[]rain=newfloat[]{10,25,12,45,32,85,66,40,102,76,39,58};floatmax,min,aveg;//實參

Rainfallrainfall=newRainfall();

rainfall.StatRainfall(rain,out

max,out

min,out

aveg);//通過實參返回計算的結(jié)果

465.2方法5.2.4參數(shù)按輸出參數(shù)傳遞

第五章數(shù)組和方法

Console.WriteLine("12個月中最大降雨量是{0}mm,最小降雨量是{1}mm,\n平均降雨量是{2}mm。",max,min,aveg);}由上述代碼可以看出,實參max、min和aveg在傳遞給方法StatRainfall前是沒有賦初值的,這一點與引用參數(shù)的使用是有區(qū)別的。 運行程序,執(zhí)行結(jié)果如圖5.5所示。

圖5.5降雨量的處理結(jié)果

475.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法【學一學】

委托的概念C#中的方法類似于C中的函數(shù),在內(nèi)存中有一個入口物理地址,它就是方法被調(diào)用的地址。方法的入口地址可以被賦給委托,通過委托來調(diào)用該方法,因此,從這個意義上來說,可以認為委托就是方法的指針。在C#中,委托具有如下一些特點:(1)委托是引用類型,它是對特定返回類型和參數(shù)列表的方法的引用,委托封裝了方法。(2)委托是用戶自定義類型,因此在定義委托的時候,并不是定義委托類型的變量,而是定義一個數(shù)據(jù)類型。(3)委托封裝的方法可以是靜態(tài)的方法也可以是實例的方法,對方法的名稱沒有任何特殊要求,也不限制方法能做什么。(4)調(diào)用委托其實就是調(diào)用委托所封裝的方法,委托相當于一個代理的角色。485.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法二.委托的定義定義委托時使用如下的語法格式:[訪問修飾符]delegate返回類型委托名(參數(shù)列表);其中訪問修飾符與類中普通成員的訪問修飾符含義相同,delegate是關鍵字,返回類型為該委托類型封裝的方法的返回類型,委托名是符合C#語法的標識符,參數(shù)列表為該委托類型封裝的方法的參數(shù)。下列代碼定義了一個封裝返回值為整型、帶有兩個整型參數(shù)的方法的委托類型。

delegateint

Compute(int

x,inty);三.委托的使用委托的典型使用步驟如下:定義委托類型;定義委托封裝的方法;495.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法

實例化委托;實例化委托就是使用new運算符創(chuàng)建一個該委托的對象,并將委托指向的方法名作為參數(shù)傳給委托對象。語法格式如下:委托名委托對象=new委托名(委托封裝的方法);這里傳遞的方法必須符合委托對方法的要求。調(diào)用委托。調(diào)用委托即調(diào)用委托中封裝的方法,語法格式如下:委托對象(參數(shù)列表);。505.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法

【試一試】[任務5-6]:輸入兩個整數(shù),根據(jù)用戶的提示,求出這兩個整數(shù)的和、差、積或商并輸出。解決思路:1.定義一個返回值類型為整數(shù)、帶兩個整數(shù)參數(shù)的委托,便于調(diào)用計算整數(shù)的方法;2.定義四個方法,分別用于計算兩個整數(shù)的和、差、積、商,將計算結(jié)果通過返回值返回;3.實例化委托,在程序運行時根據(jù)用戶的提示調(diào)用所需的方法,計算結(jié)果;4.將計算的結(jié)果輸出。完成步驟:1.創(chuàng)建一個名為chapter5_6的控制臺應用程序,向該項目中添加一個名為CalculateData.cs的類文件。2.在類CalculateData中定義一個委托類型delCalculate,代碼如下:publicdelegateint

delCalculate(int

x,inty);515.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法

3.在類CalculateData中添加如下四個方法,分別實現(xiàn)兩個數(shù)相加、相減、相乘和相除運算,代碼如下。

int

Add(int

x,inty)//相加

{returnx+y;}

int

Sub(intx,inty)//相減

{returnx-y;}

int

Mul(intx,inty)//相乘

{returnx*y;}

int

Div(intx,inty)//相除

{returnx/y;}525.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法

4.再在類CalculateData中添加一個ComputeData方法,來根據(jù)用戶的提示,通過委托動態(tài)調(diào)用對應的方法完成兩個數(shù)的運算,具體代碼如下。

publicint

ComputeData(string

flag,int

x,inty){

intresult;//保存計算的結(jié)果

flag=flag.ToLower();

delCalculate

obj;//聲明委托類型delCalculate的變量

switch(flag)//根據(jù)標記符flag來實例化委托,同時指明委托調(diào)用的方法名

{case"a":

obj=newdelCalculate(Add);break;case"s":

535.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法

obj=newdelCalculate(Sub);break;case"m":

obj=newdelCalculate(Mul);break;default:

obj=newdelCalculate(Div);break;}result=obj(x,y);//通過委托調(diào)用方法,計算結(jié)果

returnresult;}5.在主方法Main中編寫如下代碼,提示用戶輸入兩個整數(shù)和操作標記符,并將計算的結(jié)果輸出。

545.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法

staticvoidMain(string[]args){

intnum1,num2,result;stringflag;

Console.Write("請輸入第一個數(shù):");num1=int.Parse(Console.ReadLine());

Console.Write("請輸入第二個數(shù):");num2=int.Parse(Console.ReadLine());

Console.Write("請輸入一個字符(a表示兩數(shù)相加、s相減、m相乘、d相除):");flag=((char)Console.Read()).ToString();

CalculateData

cd=newCalculateData();result=cd.ComputeData(flag,num1,num2);

Console.WriteLine("兩數(shù)計算后的結(jié)果是:{0}",result);}555.3委托和事件5.3.1委托的概念和定義

第五章數(shù)組和方法運行程序,按提示輸入兩個整數(shù)和操作標記符,程序的執(zhí)行結(jié)果如圖5.6所示。

圖5.6通過委托調(diào)用方法的計算結(jié)果

565.3委托和事件5.3.2事件的概念和定義

第五章數(shù)組和方法【學一學】一.事件的定義在定義事件時,通常要將事件與某個委托相關聯(lián),這意味著該事件對應的處理程序必須是此委托指定的、具有特定返回類型和參數(shù)的方法。定義事件的語法格式如下:[訪問修飾符]event委托名事件名;其中訪問修飾符跟普通的類成員訪問修飾符含義相同,event是關鍵字,委托名為該事件相關聯(lián)的委托,事件名是符合C#語法的標識符。事件相關的委托可以是.NET類庫中已經(jīng)定義的,也可以是用戶自定義的。.NET類庫中已經(jīng)定義的事件委托具有如下形式:[訪問修飾符]delegatevoid委托名(objectsource,EventArgse);其中source表示事件源對象,e是EventArgs

類或是其派生類的一個實例,它包含事件的其它信息。在System.Windows.Forms命名空間中包含許多已定義好的事件處理委托,例如:

puclicdelegatevoidMouseEventHandler(object

source,MouseEventArgs

args);575.3委托和事件5.3.2事件的概念和定義

第五章數(shù)組和方法

上述定義的委托MouseEventHandler專門被用來處理鼠標事件。用戶自定義的事件委托不受任何限制,但返回類型一般為void類型。下列代碼段定義了一個自定義事件的委托及使用該委托的事件。publicdelegatevoidCompute(int

x,inty);//用戶自定義一個委托publiceventComputeRequestCompute;//定義使用委托Compute的事件RequestCompute二.事件的使用使用事件時的基本過程如下:①定義與事件相關聯(lián)的委托;定義事件委托跟定義普通委托相同,只不過要首先確定事件發(fā)生時應該有哪些參數(shù),然后再定義事件委托。②定義事件;③訂閱事件;585.3委托和事件5.3.2事件的概念和定義

第五章數(shù)組和方法

訂閱事件其實就是將事件和事件處理方法通過事件委托相關聯(lián),基本語法為:事件名+=new委托名(方法名);一個事件可以與多個方法相關聯(lián)。當然也可以通過運算符-=取消事件與事件處理方法的關聯(lián)。④觸發(fā)事件。觸發(fā)事件就是依次執(zhí)行與該事件相關聯(lián)的所有方法。觸發(fā)事件的語法格式為:事件名(事件參數(shù)列表);59

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論