?? 教學(xué)--第十二章 函數(shù)(一).htm
字號(hào):
<P>char path[50];</P>
<P>這里涉及到了“數(shù)組”的知識(shí)。針對(duì)本例,你可以這樣理解:</P>
<P>char ch; </P>
<P>這一行我們能看懂,定義了一個(gè)字符類型的變量,ch。ch變量的空間是1個(gè)字節(jié),能存儲(chǔ)一個(gè)字符,因此你可以用它存儲(chǔ)諸如:'A','2','H'等,但現(xiàn)在我們要輸入的是:"c:\abcd"這么一句話,所以變量ch無法勝任。C,C++提供了數(shù)組,我們可以通過定義數(shù)組來存儲(chǔ)同一類型的多個(gè)數(shù)據(jù)。如:</P>
<P>char path[50];</P>
<P>本行定義了path這個(gè)數(shù)組,它可以存儲(chǔ)50 個(gè) char類型的數(shù)據(jù)。</P>
<P>注意,path只能存儲(chǔ)最多50個(gè)字符。所以在運(yùn)行本例時(shí),不要輸入太長(zhǎng)的文件夾名稱。</P>
<P>另外,Windows對(duì)新建文件夾的名稱有一些特殊的要求,所以如果文件夾名稱含了一些非法字符,操作將失敗。</P>
<P>以下是我運(yùn)行的一個(gè)結(jié)果:<BR></P>
<P><IMG height=220 src="教學(xué)--第十二章 函數(shù)(一).files/ls12.h8.jpg" width=416
border=0></P>
<P> </P>
<H3><A name=12.3>12.3</A> 自定義函數(shù)</H3>
<P>學(xué)會(huì)如何調(diào)用別人的函數(shù),現(xiàn)在我們來學(xué)習(xí)如何自已寫一個(gè)函數(shù)。首先迅速看看函數(shù)的格式:</P>
<H4><A name=12.3.1>12.3.1</A> 函數(shù)的格式</H4>
<P>定義一個(gè)函數(shù)的語法是:</P>
<P> </P>
<P>返回類型 函數(shù)名(函數(shù)參數(shù)定義)</P>
<P>{</P>
<P> 函數(shù)體</P>
<P> </P>
<P> return 結(jié)果;</P>
<P>}</P>
<P> </P>
<P>其中:</P>
<P>1、返回類型: 指數(shù)據(jù)類型,如:int ,float,double, bool char ,void
等等。表示所返回結(jié)果的類型。如果是void則表示該函數(shù)沒有結(jié)果返回。</P>
<P>2、函數(shù)名:命名規(guī)則和變量命名一樣。注意要能夠表達(dá)出正確的意義。如果說一個(gè)變量命名重在說明它“是什么”的話,則一個(gè)函數(shù)重在說明它要“做什么”。比如一個(gè)函數(shù)要實(shí)現(xiàn)兩數(shù)相加,則可以命名為:AddTwoNum,這樣有助于閱讀。</P>
<P>3、函數(shù)參數(shù)定義:關(guān)于參數(shù)的作用,我們前面已說。現(xiàn)在看它的格式:</P>
<P>int AddTwoNum(int a,int b);</P>
<P>函數(shù)參數(shù)的定義有點(diǎn)類似定義變量,先寫參數(shù)的數(shù)據(jù)類型,上例中是int,然后再寫參數(shù)名。下面是不同之處:</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">3.1
多個(gè)參數(shù)之間用逗號(hào)隔開,而不是分號(hào)。最后一個(gè)變量之后則不需要符號(hào)。 請(qǐng)對(duì)比:</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">普通變量定義:</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">int a;
//<--以分號(hào)結(jié)束</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">int b;</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">函數(shù)中參數(shù)定義:</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">(int a, int b )
//以逗號(hào)分隔,最后不必以分號(hào)結(jié)束</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px"> </P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">3.2
兩個(gè)或多個(gè)參數(shù)類型相同時(shí),并不能同時(shí)聲明,請(qǐng)對(duì)比:</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">普通變量定義:</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">int a,b;
//多個(gè)類型相同的變量可以一起定義。</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">函數(shù)中參數(shù)定義:</P>
<P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">AddTwoNum(int a, b)
//這是錯(cuò)誤的。</P>
<P>4、函數(shù)體:函數(shù)體用一對(duì){}包括。里面就是函數(shù)用以實(shí)現(xiàn)功能的代碼。</P>
<P>5、return 結(jié)果:return
語句其實(shí)屬于函數(shù)體。由于它的重要性,所以單獨(dú)列出來講。“return”即“返回”,用來實(shí)現(xiàn)返回一個(gè)結(jié)果。“結(jié)果”是一個(gè)表達(dá)式。記住:當(dāng)函數(shù)體內(nèi)的代碼執(zhí)行到return語句時(shí),函數(shù)即告結(jié)束,如果后面還有代碼,則后面的代碼不被執(zhí)行。依靠流程控制,函數(shù)體里可以有多個(gè)return語句。當(dāng)然,對(duì)于不需要返回結(jié)果的函數(shù),可以不寫return
語句,或者寫不帶結(jié)果的return語句。這些后面我們都將有例了演解。return 返回的結(jié)果,類型必須和前面“返回類型”一致。</P>
<P>一個(gè)最簡(jiǎn)單的例子,也比一堆說明文字來得直觀,下面我寫一個(gè)函數(shù),用于實(shí)現(xiàn)兩個(gè)整數(shù),返回相加的和。這當(dāng)然是一個(gè)愚不可及的函數(shù),兩數(shù)相加直接用+就得,寫什么函數(shù)啊?</P>
<P> </P>
<P>//愚不可及的函數(shù):實(shí)現(xiàn)兩數(shù)相加</P>
<P>//參數(shù):a:加數(shù)1,b:加數(shù)2;</P>
<P>//返回:相加的和</P>
<P>int AddTwoNum(int a, int b)</P>
<P>{</P>
<P> return a + b;</P>
<P>}</P>
<P> </P>
<P>例子中,誰是“返回類型”,誰是“函數(shù)名”?誰是“參數(shù)定義”?哪些行是“函數(shù)體”?這些你都得自已看明白。這里只想指出:這是個(gè)極簡(jiǎn)單的函數(shù),它的函數(shù)體內(nèi)只有一行代碼:即return
a+b;語句,直接返回了a+b的結(jié)果。</P>
<P> </P>
<P>最后說明一點(diǎn):C,C++中,不允許一個(gè)函數(shù)定義在另一個(gè)函數(shù)體內(nèi)。</P>
<P> </P>
<P>void A()</P>
<P>{</P>
<P> void B() //錯(cuò)誤:函數(shù)B定義在函數(shù)A體內(nèi)。</P>
<P> {</P>
<P> ....</P>
<P> }</P>
<P> </P>
<P> ...</P>
<P>}</P>
<P> </P>
<P>如上代碼中,函數(shù)B“長(zhǎng)”在函數(shù)A體內(nèi),這不允許。不過有些語,如Pascal則允許這樣定義函數(shù)。</P>
<P> </P>
<H4><A name=12.3.2>12.3.2</A> 自定義函數(shù)實(shí)例</H4>
<P>下面我們將動(dòng)手寫幾個(gè)函數(shù),并實(shí)現(xiàn)對(duì)這些函數(shù)的調(diào)用。從中我們也將進(jìn)一步理解函數(shù)的作用。</P>
<H5><A name=12.3.2.1>12.3.2.1</A> 小寫字母轉(zhuǎn)換為大寫字母的函數(shù)</H5>
<P><B>實(shí)例二:</B>自定義小寫字母到大寫字母的轉(zhuǎn)換函數(shù)。</P>
<P> </P>
<P>盡管這個(gè)功能很可能已經(jīng)有某個(gè)庫函數(shù)實(shí)現(xiàn)了,但像這種小事,我們不妨自已動(dòng)手。</P>
<P>之所以需要這個(gè)函數(shù),緣于最近我們寫程序時(shí),經(jīng)常用到循環(huán),而循環(huán)是否結(jié)束,則有賴我們向用戶提一個(gè)問題,然后判斷用戶的輸入;如果用戶輸入字母Y或y,則表示繼續(xù),否則表示退出。</P>
<P>每次我們都是這樣判斷的:</P>
<P> </P>
<P>if(ch == 'Y' || ch == 'y')</P>
<P>{</P>
<P> ...</P>
<P>}</P>
<P> </P>
<P>平常我們的鍵盤一般都是在小寫狀態(tài),因?yàn)橛脩粲锌赡懿恍⌒呐龅芥I盤的“Caps
Lock”,造成他所輸入的任何字母都是大寫的--盡管鍵盤上有個(gè)大小寫狀態(tài)指示燈,但有誰會(huì)去那么注意呢?所以如果你的程序僅僅判斷用戶是否輸入‘y'字母,那么這個(gè)用戶敲了一個(gè)‘Y',結(jié)果程序卻“很意外”的結(jié)束了?顯然這會(huì)讓用戶很小瞧你:才三行程序就有BUG。</P>
<P> </P>
<P>(一般不傳之秘笈:用戶就像女友一樣,需要“哄”:有時(shí)你發(fā)現(xiàn)軟件中存在一項(xiàng)潛在的,系統(tǒng)級(jí)的嚴(yán)重BUG,你自已驚出一身冷;但在用戶那里,他們卻糾纏你立即改進(jìn)某個(gè)界面上的小小細(xì)節(jié),否則就要拋棄這個(gè)軟件--就像你的女友,天天和你吃蘿卜秧子沒有意見,但情人節(jié)那天忘了送花,她就對(duì)你失望透了。)</P>
<P> </P>
<P>言歸正傳!現(xiàn)在問題,我討厭每回寫那行條件都既要判斷大寫又要判斷小寫。解決方法是,在判斷之前,把用戶輸入的字母統(tǒng)統(tǒng)轉(zhuǎn)換為大寫!</P>
<P> </P>
<P>下面是將用戶輸入字符轉(zhuǎn)換為大寫的函數(shù)。要點(diǎn)是:</P>
<P>1、用戶輸入的字符不一定是小寫字母,說不定已經(jīng)是大寫了,甚至可能根本就不是字母。所以在轉(zhuǎn)換之前需要判斷是否為小寫字母。</P>
<P>2、小寫字母‘a(chǎn)’的ASCII值比大寫字母‘A'大32,這可以從<A
href="http://d2school.com/bcyl/bhcpp/newls/ls05.htm#美國信息交換標(biāo)準(zhǔn)碼">第五章的ASCII碼表</A>中查到。不過我不喜歡查表,所以最簡(jiǎn)單的方法就是直接減出二者的差距。所有字母的大小之間的差距都一樣。這是我們得以轉(zhuǎn)換大小寫字母的前提。</P>
<P> </P>
<P>//函數(shù):小寫字母轉(zhuǎn)換為大寫字母。</P>
<P>//參數(shù):待轉(zhuǎn)換的字母,可以不為小寫字母;</P>
<P>//返回:如果是小寫字母,返回對(duì)應(yīng)的大寫字母,否則原樣不動(dòng)返回。</P>
<P> </P>
<P>char LowerToUpper(char ch)</P>
<P>{</P>
<P> //判斷是否為小寫字母:</P>
<P> if(ch >= 'a' && ch <= 'z')</P>
<P> {</P>
<P> ch -= ('a' - 'A'); //相當(dāng)于 ch -= 32; 或 ch
= ch - 32;</P>
<P> }</P>
<P> </P>
<P> //返回:</P>
<P> return ch;</P>
<P>}</P>
<P> </P>
<P>這個(gè)函數(shù)也再次提醒我們,在ASCII表里,大寫字母的值其實(shí)比小寫字母小。所以,小寫字母轉(zhuǎn)換為大寫,用的是“減”。小寫字母減去32,就搖身一變成了大寫。</P>
<P> </P>
<P>現(xiàn)在,有了這個(gè)函數(shù),假設(shè)我們?cè)儆錾弦袛嘤脩糨斎胧恰痽'或‘n’的情況,我們就方便多了。</P>
<P>作為一種經(jīng)歷,我們此次采用將函數(shù)放在要調(diào)用的代碼之前。</P>
<P> </P>
<P>//------------------------------------------------------------------------</P>
<P>//函數(shù):小寫字母轉(zhuǎn)換為大寫字母。</P>
<P>//參數(shù):待轉(zhuǎn)換的字母,可以不為小寫字母;</P>
<P>//返回:如果是小寫字母,返回對(duì)應(yīng)的大寫字母,否則原樣不動(dòng)返回。</P>
<P> </P>
<P>char LowerToUpper(char ch)</P>
<P>{</P>
<P> //判斷是否為小寫字母:</P>
<P> if(ch >= 'a' && ch <= 'z')</P>
<P> {</P>
<P> ch -= ('a' - 'A'); //相當(dāng)于 ch -= 32; 或 ch
= ch - 32;</P>
<P> }</P>
<P> </P>
<P> //返回:</P>
<P> return ch;</P>
<P>}</P>
<P>//------------------------------------------------------------------------</P>
<P>int main(int argc, char* argv[])</P>
<P>{</P>
<P> char ch;</P>
<P> do</P>
<P> {</P>
<P> cout << "繼續(xù)嗎?(Y/N)";</P>
<P> cin >> ch;</P>
<P> </P>
<P> //調(diào)用函數(shù),將可能小寫字母轉(zhuǎn)換為大寫:</P>
<P> ch = LowerToUpper(ch);</P>
<P> }</P>
<P> while(ch == 'Y');</P>
<P> </P>
<P> return 0;<BR> }</P>
<P>//------------------------------------------------------------------------</P>
<P> </P>
<P>完整的代碼見相應(yīng)例子文件。例子只是為了演示如何自已定義函數(shù),并調(diào)用。運(yùn)行時(shí)它問一句“繼續(xù)嗎?”你若輸入大寫或小寫的‘y'字母,就繼續(xù)問,否則結(jié)束循環(huán)。</P>
<P>函數(shù)的返回值也可以直接拿來使用。上面代碼中的do...while循環(huán)也可以改寫的這樣:</P>
<P> </P>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -