《Visual C# NET案例教程》課件第5章_第1頁(yè)
《Visual C# NET案例教程》課件第5章_第2頁(yè)
《Visual C# NET案例教程》課件第5章_第3頁(yè)
《Visual C# NET案例教程》課件第5章_第4頁(yè)
《Visual C# NET案例教程》課件第5章_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章方法

5.1任務(wù)描述5.2聲明與調(diào)用方法5.3遞歸5.4學(xué)生成績(jī)管理系統(tǒng)的模塊化5.5習(xí)題對(duì)學(xué)生成績(jī)管理系統(tǒng),我們已經(jīng)實(shí)現(xiàn)了其菜單功能,也能夠利用數(shù)組完成系統(tǒng)的主要功能,但還沒(méi)有將這些功能有條理地組合起來(lái)。大型程序可能很復(fù)雜,這就需要把問(wèn)題分解,即將程序分成獨(dú)立的段,逐段編寫(xiě)與調(diào)試,然后像搭積木一樣實(shí)現(xiàn)一個(gè)系統(tǒng)。

在程序設(shè)計(jì)中,C#?提供了方法這種語(yǔ)法來(lái)實(shí)現(xiàn)程序的模塊化搭建。方法是具有某種功能的獨(dú)立程序段。

當(dāng)復(fù)雜的應(yīng)用程序被分割成方法時(shí),就能方便靈活地維護(hù)和調(diào)試代碼??梢詫?duì)方法多次調(diào)用。

學(xué)生成績(jī)管理系統(tǒng)的模塊調(diào)用如圖5-1所示。5.1任務(wù)描述圖5-1學(xué)生成績(jī)管理系統(tǒng)的模塊調(diào)用圖5.2.1聲明方法

聲明方法的一般格式如下:

訪問(wèn)修飾符返回類(lèi)型方法名(參數(shù)列表)

{

方法主體

}5.2聲明與調(diào)用方法其中:

●訪問(wèn)修飾符:確定方法可訪問(wèn)的范圍。

●返回類(lèi)型:方法返回值的類(lèi)型,可以是任何有效的類(lèi)型,如果沒(méi)有返回值時(shí)用void。

●方法名:是一個(gè)合法的C#標(biāo)識(shí)符。

●參數(shù)列表:用于傳遞和接收來(lái)自方法的數(shù)據(jù),它在圓括號(hào)之間。即使沒(méi)有參數(shù),也要有圓括號(hào)。參數(shù)之間以逗號(hào)分隔。

●方法主體:操作所需的指令集。注意以下方法定義的代碼段:

classCalculator

{

publicintAddNumber(intnum1,intnum2)

{

intresult;

result=num1+num2;

returnresult;

}

}5.2.2調(diào)用方法

當(dāng)調(diào)用一個(gè)方法時(shí),執(zhí)行流程就跳轉(zhuǎn)到該方法開(kāi)始執(zhí)行。當(dāng)執(zhí)行到return語(yǔ)句或到達(dá)方法的終點(diǎn)后,執(zhí)行流程就返回到調(diào)用該方法的地方。

注意:當(dāng)調(diào)用方法時(shí),在返回類(lèi)型、參數(shù)個(gè)數(shù)、參數(shù)順序以及參數(shù)類(lèi)型等方面要實(shí)現(xiàn)精確匹配。

從方法被調(diào)用的位置,可以分為在方法聲明的類(lèi)定義中調(diào)用該方法和在方法聲明的類(lèi)定義外部調(diào)用該方法。在方法聲明的類(lèi)定義中調(diào)用該方法的語(yǔ)法格式為:

方法名(參數(shù)列表)

在方法聲明的類(lèi)定義外部調(diào)用該方法實(shí)際上是通過(guò)對(duì)象調(diào)用該方法,其格式為:

對(duì)象名.方法名(參數(shù)列表)【例5-1】計(jì)算圓面積的方法。

usingSystem;

classProgram

{

staticvoidCalculateArea(intr)

{

doublearea;

area=r*r*Math.PI;

Console.WriteLine("面積為{0:0.00}",area);

}

publicstaticvoidMain()

{

intradius=1;

CalculateArea(radius);

}

}

運(yùn)行結(jié)果如圖5-2所示。圖5-2例5-1運(yùn)行結(jié)果5.2.3使用返回值

當(dāng)需要方法向調(diào)用者返回一個(gè)值時(shí),可以使用關(guān)鍵字return,其格式如下:

return表達(dá)式;

該表達(dá)式可能是數(shù)值、變量或算式,但是它的類(lèi)型必須與方法在聲明中指定的返回類(lèi)型一樣。

如果方法無(wú)返回值,在方法主體中可以不包含或包含一個(gè)不指定任何值的return語(yǔ)句,運(yùn)行return語(yǔ)句時(shí),程序立刻返回到調(diào)用方;如果沒(méi)有return語(yǔ)句,缺省的情況下,當(dāng)?shù)竭_(dá)方法中的最后一條語(yǔ)句后執(zhí)行程序才返回到調(diào)用方?!纠?-2】計(jì)算圓面積的方法,返回圓面積。

usingSystem;

classReturnTest

{

staticdoubleCalculateArea(intr)

{

doublearea;

area=r*r*Math.PI;

returnarea;

}

publicstaticvoidMain()

{

intradius=1;

Console.WriteLine("面積為{0:0.00}",CalculateArea(radius));

}

}

運(yùn)行結(jié)果如圖5-3所示。圖5-3例5-2運(yùn)行結(jié)果【例5-3】計(jì)算兩數(shù)之和的函數(shù)。

usingSystem;

classCalculator

{

publicintAddNumber(intnum1,intnum2)

{

intresult;

result=num1+num2;

returnresult;

}

staticvoidMain(string[]args)

{

Calculatorcal=newCalculator();

intvalue=cal.AddNumber(10,20);

Console.WriteLine("10+20={0}",value);

Console.ReadLine();

}

}

運(yùn)行結(jié)果如圖5-4所示。圖5-4例5-3運(yùn)行結(jié)果5.2.4傳遞參數(shù)

在方法聲明中使用的參數(shù)叫形式參數(shù)(形參),在調(diào)用方法中使用的參數(shù)叫實(shí)際參數(shù)(實(shí)參)。大多數(shù)情況下,為了方便計(jì)算和簡(jiǎn)化程序,往往需要在方法中帶有參數(shù),通過(guò)方法的形參將值傳遞給方法,從而實(shí)現(xiàn)有針對(duì)性的計(jì)算或操作。在調(diào)用方法時(shí),參數(shù)傳遞就是將實(shí)參傳遞給形參的過(guò)程,傳遞按照從左到右的順序發(fā)生,調(diào)用必須提供參數(shù)的正確數(shù)值和類(lèi)型。

C#?中方法的參數(shù)有以下四種類(lèi)型:

●值類(lèi)型參數(shù),不含任何修飾符。

●引用型參數(shù),以ref修飾符聲明。

●輸出參數(shù),以out修飾符聲明。

●數(shù)組型參數(shù),以params修飾符聲明。

1.值類(lèi)型參數(shù)

當(dāng)利用值向方法傳遞參數(shù)時(shí),編譯程序給實(shí)參的值做一份拷貝,并將拷貝傳遞給該方法。被調(diào)用的方法不會(huì)修改內(nèi)存中實(shí)參的值。定義含有值類(lèi)型參數(shù)方法的格式:

[修飾符]返回的數(shù)據(jù)類(lèi)型方法名(參數(shù)列表)

其中,值類(lèi)型參數(shù)的格式為:

參數(shù)類(lèi)型參數(shù)名【例5-4】值類(lèi)型參數(shù)。

usingSystem;

classProgram

{

publicstaticvoidAddOne(inta)

{

a++;

Console.WriteLine("a={0}",a);

}

staticvoidMain()

{

inta=3;

Console.WriteLine("調(diào)用AddOne之前,a={0}",a);

AddOne(a);

Console.WriteLine("調(diào)用AddOne之后,a={0}",a);

Console.ReadLine();

}

}

運(yùn)行結(jié)果如圖5-5所示。圖5-5例5-4運(yùn)行結(jié)果

2.引用型參數(shù)

和值類(lèi)型參數(shù)不同的是,引用型參數(shù)并不開(kāi)辟新的內(nèi)存區(qū)域,當(dāng)利用引用型參數(shù)向方法傳遞形參時(shí),編譯程序把實(shí)參的地址傳遞給方法。因此對(duì)引用參數(shù)的修改會(huì)影響對(duì)應(yīng)的實(shí)參,這種傳遞方式稱(chēng)為引用傳遞。

傳遞的參數(shù)格式:

ref參數(shù)類(lèi)型參數(shù)名

從格式上看,與值傳遞不同的是,引用型參數(shù)的數(shù)據(jù)類(lèi)型前加ref關(guān)鍵字。定義和調(diào)用引用型參數(shù)的方法時(shí),在形參和實(shí)參前都必須加ref關(guān)鍵字?!纠?-5】交換兩個(gè)變量的值。

usingSystem;

classTest

{

staticvoidSwap1(intx,inty) //數(shù)值參數(shù)

{

inttemp=x;

x=y;

y=temp;

}

staticvoidSwap2(refintx,refinty) //引用參數(shù)

{

inttemp=x;x=y;

y=temp;

}

staticvoidMain()

{

inta=3,b=4;

Swap1(a,b);

Console.WriteLine("a={0},b={1}",a,b);

a=13;b=14;

Swap2(refa,refb);

Console.WriteLine("a={0},b={1}",a,b);

}

}

運(yùn)行結(jié)果如圖5-6所示。圖5-6例5-5運(yùn)行結(jié)果提示:

C#?允許用戶(hù)像傳遞其他類(lèi)型的參數(shù)那樣將對(duì)象以參數(shù)形式傳遞給方法。但必須記住,類(lèi)是引用類(lèi)型,引用類(lèi)型變量的值為該變量引用對(duì)象的地址,當(dāng)把一個(gè)對(duì)象傳遞給一個(gè)方法的值參數(shù)時(shí),其實(shí)是把對(duì)象的地址傳遞給了該方法的值參數(shù)。對(duì)象參數(shù)總是按引用傳遞的,所以類(lèi)對(duì)象作參數(shù)傳遞時(shí)不需要使用ref關(guān)鍵字。

3.輸出型參數(shù)

C#?提供了一種特殊的參數(shù)傳遞方式,專(zhuān)門(mén)用于從方法返回?cái)?shù)據(jù),完成這種數(shù)據(jù)傳遞方式的輸出型參數(shù),用關(guān)鍵字out表示。

輸出型參數(shù)與引用型參數(shù)的差別在于:調(diào)用帶有out關(guān)鍵字參數(shù)的方法之前,不需要對(duì)傳遞給形參的實(shí)參值進(jìn)行初始化。注意輸出參數(shù)在方法中必須被賦值。

在定義和調(diào)用輸出型參數(shù)的方法時(shí),在形參和實(shí)參前都必須加上out關(guān)鍵字。

【例5-6】計(jì)算一個(gè)圓的面積,使用out關(guān)鍵字實(shí)現(xiàn)輸出型參數(shù)傳遞的方法。

usingSystem;

classProgram

{

staticvoidCalculateArea(intr,outdoublearea)

{

area=r*r*Math.PI;

}

publicstaticvoidMain()

{

intradius=1;

doublearea;

CalculateArea(radius,outarea);

Console.WriteLine("面積為{0:0.00}",area);

}

}

運(yùn)行結(jié)果如圖5-7所示。圖5-7例5-6運(yùn)行結(jié)果

4.數(shù)組型參數(shù)

在使用數(shù)組作為形參時(shí),C#提供了params關(guān)鍵字,使調(diào)用數(shù)組為形參的方法時(shí),既可以傳遞數(shù)組實(shí)參,也可以只傳遞一組數(shù)據(jù)。

params的使用格式為:

返回類(lèi)型方法名稱(chēng)(params類(lèi)型名稱(chēng)[]數(shù)組名稱(chēng)){}

說(shuō)明:

●需要傳遞的參數(shù)個(gè)數(shù)不確定時(shí),可以采用params關(guān)鍵字。

●帶有關(guān)鍵字params的數(shù)組型參數(shù)必須是方法的參數(shù)列表中最后一個(gè)參數(shù),否則會(huì)出現(xiàn)編譯錯(cuò)誤。

●數(shù)組型參數(shù)中的數(shù)組必須是一維數(shù)組類(lèi)型?!纠?-7】數(shù)組型參數(shù)。

usingSystem;

classProgram

{

staticintsumVals(paramsint[]vals)

{

intsum=0;

foreach(intvalinvals)

{

sum+=val;

}

returnsum;}

staticvoidMain(string[]args)

{

intsum=sumVals(1,2,9,8);

Console.WriteLine("1,2,9,8總和為:{0}",sum);

sum=sumVals(1,5,7);

Console.WriteLine("1,5,7總和為:={0}",sum);

}

}

運(yùn)行結(jié)果如圖5-8所示。圖5-8例5-7運(yùn)行結(jié)果

C#?程序中的方法能夠調(diào)用自身方法,這就是遞歸。

遞歸可以把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化,最終變成一個(gè)與原問(wèn)題類(lèi)似的簡(jiǎn)單問(wèn)題。利用遞歸算法只需要少量的操作就可以解決一個(gè)復(fù)雜的計(jì)算。遞歸是由遞歸出口和遞歸表達(dá)式兩大部分組成的。

5.3遞歸

(1)遞歸出口是遞歸結(jié)束的條件,也就是最終要變成的簡(jiǎn)單問(wèn)題。這個(gè)簡(jiǎn)單問(wèn)題的解決方法必須是已經(jīng)知道的,或者是已經(jīng)給出的計(jì)算結(jié)果。

(2)遞歸表達(dá)式是從遞歸出口到最終復(fù)雜問(wèn)題的轉(zhuǎn)化規(guī)律。

如求階乘問(wèn)題也可以使用遞歸方式來(lái)解決。其遞歸數(shù)學(xué)表達(dá)式為:

當(dāng)N=1時(shí),1!=1;當(dāng)N>1時(shí),N!=N*(N-1)!?!纠?-8】用遞歸方法計(jì)算5!。

遞歸公式:n!=n*(n-1)!如:5!=5*(4*3*2*1)=5*4!

usingSystem;

classProgram

{

staticvoidMain(string[]args)

{

Console.WriteLine("5!={0}",fact(5));

}

staticintfact(intn)

{

intresult;

if(n==1)

return1;

else

result=n*fact(n-1);

returnresult;

}

}

運(yùn)行結(jié)果如圖5-9所示。圖5-9例5-8運(yùn)行結(jié)果下面利用模塊化的思想改造學(xué)生成績(jī)管理系統(tǒng)V2.0,將輸入學(xué)生記錄、顯示所有成績(jī)、查詢(xún)學(xué)生成績(jī)、按語(yǔ)文成績(jī)排序分別用方法實(shí)現(xiàn),而不再是全部寫(xiě)在Main方法里。

學(xué)生成績(jī)管理系統(tǒng)V3.0代碼的實(shí)現(xiàn)步驟如下:5.4學(xué)生成績(jī)管理系統(tǒng)的模塊化usingSystem;

publicclassGradeManage

{

constintCOUNT=100; //最多處理100位學(xué)生信息

staticstring[,]student=newstring[COUNT,4];//student用于保存學(xué)生信息

staticintpos=0;

publicstaticvoidMain()

{

do

{Console.WriteLine(" ***學(xué)生成績(jī)管理系統(tǒng)***\n");

Console.WriteLine(" 1---輸入學(xué)生記錄");

Console.WriteLine(" 2---顯示所有成績(jī)");

Console.WriteLine(" 3---查詢(xún)學(xué)生成績(jī)");

Console.WriteLine(" 4---退出");

Console.Write(" 請(qǐng)選擇:");

intchoice=int.Parse(Console.ReadLine());

switch(choice)

{

case1:append();break;

case2:listStudent();break;

case3:query();break;

case4:return;

}

}while(true);

}//列出所有學(xué)生成績(jī)

publicstaticvoidlistStudent()

{

Console.WriteLine("顯示學(xué)生成績(jī):");

Console.WriteLine("學(xué)號(hào)\t姓名\t語(yǔ)文\t英語(yǔ)");

for(inti=0;i<pos;i++)

{

Console.WriteLine("{0}\t{1}\t{2}\t{3}",student[i,0],student[i,1],student[i,2],student[i,3]);

}

}

//輸入學(xué)生記錄publicstaticvoidappend()

{

if(pos>=COUNT)

{

Console.WriteLine("最多只能處理"+COUNT+"個(gè)學(xué)生!");

return;

}

do

{

//該循環(huán)確保輸入學(xué)號(hào)不重復(fù)

while(true)

{

Console.Write("請(qǐng)輸入學(xué)號(hào):");StringstudentNO=Console.ReadLine();

if(!exist(studentNO))

{

student[pos,0]=studentNO;

break;

}

Console.WriteLine("該學(xué)號(hào)已存在!");

}

Console.Write("請(qǐng)輸入姓名:");

student[pos,1]=Console.ReadLine();

Console.Write("請(qǐng)輸入語(yǔ)文成績(jī):");

student[pos,2]=Console.ReadLine();

Console.Write("請(qǐng)輸入英語(yǔ)成績(jī):");

student[pos,3]=Console.ReadLine();

pos++;

if(pos>=COUNT)

{

break;

}

Console.Write("是否繼續(xù)輸入?(y/n)");

}while(char.Parse(Console.ReadLine())=='y');

}

//判斷是否存在某學(xué)號(hào)的學(xué)生。stuNO為學(xué)號(hào)

publicstaticboolexist(stringstuNO)

{

for

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論