?? 教學(xué)--第十二章 函數(shù)(一).htm
字號:
XiuliDianshi()函數(shù)有很大的不足,那就是它沒有參數(shù)。現(xiàn)在我們假設(shè)有一種數(shù)據(jù)類型為“電視機(jī)”,嗯,就假設(shè)這種數(shù)據(jù)類型叫作:TDianshi。</P>
<P>加入?yún)?shù)的XiuliDianShi()函數(shù)變?yōu)椋?lt;/P>
<P> </P>
<P>XiuliDianshi (TDianshi ds)</P>
<P>{</P>
<P>}</P>
<P> </P>
<P>看一個實(shí)際的例子。上一章我們曾經(jīng)學(xué)過sin()函數(shù)。現(xiàn)在我們來看看sin()函數(shù)的聲明。看看它聲明需要什么參數(shù)。</P>
<P>關(guān)閉剛才的工程,CB會問你是否存盤,統(tǒng)統(tǒng)不存(如果你要存,就存到別的什么地方去,不要存在CB默認(rèn)的目錄下)。然后重新創(chuàng)建一個空白的控制臺工程。在代碼窗口里加入以下兩行黑體代碼:</P>
<P>//---------------------------------------------------------------------------</P>
<P>//包含“數(shù)學(xué)庫函數(shù)”的頭文件,因?yàn)閟in()函數(shù)的聲明在這個頭文件里:</P>
<P><B>#include <math.h></B></P>
<P>#pragma hdrstop</P>
<P>//---------------------------------------------------------------------------</P>
<P>#pragma argsused</P>
<P>int main(int argc, char* argv[])</P>
<P>{</P>
<P><B> double b = sin(3.14159);</B></P>
<P> return 0;</P>
<P>}</P>
<P>//---------------------------------------------------------------------------</P>
<P>并不需要編譯及運(yùn)行這個程序。因?yàn)槲覀冎皇窍胝业絪in()函數(shù)的聲明。</P>
<P>本來,我們可以通過老辦法來找到sin函數(shù)聲明。按Ctrl+回車鍵打開math.h文件,然后通過Ctrl+F打開查找對話框,找到sin函數(shù)。不過CB為我們提供了一種更方便的查找函數(shù)聲明的方法,有點(diǎn)像我們在網(wǎng)頁點(diǎn)擊鏈接:</P>
<P>請按住Ctrl鍵不放,然后將鼠標(biāo)移到代碼中的 sin處,注意要準(zhǔn)確在移到sin字母身上,發(fā)現(xiàn)什么?呵,sin出現(xiàn)了超鏈接效果:</P>
<P><IMG height=40 src="教學(xué)--第十二章 函數(shù)(一).files/ls12.h8.gif" width=196
border=0></P>
<P>點(diǎn)一下,CB將自動打開math.h頭文件,并且跳轉(zhuǎn)到sin函數(shù)的聲明處。</P>
<P>(以上操作的成功依賴于你正確地照我說的,在代碼中加入#include<math.h>這一行,當(dāng)然你在安裝CB時也必須選擇了安裝源代碼。最后,成功打動后,記得將math.h文件設(shè)置為只讀。)</P>
<P><IMG height=166 src="教學(xué)--第十二章 函數(shù)(一).files/ls12.h7.gif" width=443
border=0></P>
<P> </P>
<P>從圖中我們看到,sin函數(shù)的參數(shù)只有一個:__x,類型要求是double(雙精度浮點(diǎn)數(shù),如果你忘了,復(fù)習(xí)<A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4">第四章</A>)。</P>
<P>所以,當(dāng)我們調(diào)用sin函數(shù)來求正弦值時,我們最好應(yīng)該給它一個double類型的數(shù),如:</P>
<P>double x = 3.1415926 * 2;</P>
<P>double y = sin(x);</P>
<P> </P>
<P>當(dāng)然, 我們傳給它一個整數(shù):</P>
<P>double y = sin(0);</P>
<P>或者,傳給它一個單精度浮點(diǎn)數(shù):</P>
<P>float x = 3.14;</P>
<P>double y = sin(x);</P>
<P>這些都是可以的。這并不違反“參數(shù)類型由函數(shù)本身決定,不能由調(diào)用者決定”的原則。因?yàn)樵?lt;A
href="http://d2school.com/bcyl/bhcpp/newls/ls07.htm#7.2">第七章第二節(jié)講算術(shù)類型轉(zhuǎn)換</A>時,我們知道一個整數(shù),單精度浮點(diǎn)數(shù),都可以隱式地轉(zhuǎn)換為雙精度浮點(diǎn)數(shù)。并且屬于安全的類型轉(zhuǎn)換,即轉(zhuǎn)換過程中,數(shù)據(jù)的精度不會丟失。(反過來。一個double類型轉(zhuǎn)換為int類型,就是不安全的轉(zhuǎn)換。比如3.14159轉(zhuǎn)換為整型,就成了3。)</P>
<P>有些函數(shù)并不需要參數(shù),比如,我們用了許多次的控制臺函數(shù):getchar();。這個函數(shù)要做的事就是:等待用戶輸入一個字符并回車。前面講數(shù)學(xué)函數(shù)時,舉的隨機(jī)數(shù)例子。要想讓程序能夠產(chǎn)生真正的隨機(jī)數(shù),需要讓程序事先做一些準(zhǔn)備。所以我們調(diào)用randmize()函數(shù)。這個函數(shù)也沒有參數(shù)。因?yàn)槲覀冋{(diào)它的目的,無非是:喂,告訴你,我一會兒可能要用到隨機(jī)數(shù),你做好準(zhǔn)備吧。</P>
<H4><A name=12.2.4>12.2.4</A> 如何得到函數(shù)的運(yùn)行結(jié)果</H4>
<P>函數(shù)總是要實(shí)現(xiàn)一定的功能,所以我們也可以認(rèn)為函數(shù)執(zhí)行起來就像是在做一件事。</P>
<P>做一件事一般會有個結(jié)果,當(dāng)然,只是“一般會有”。有些事情真的會有結(jié)果嗎?嗯?看來,這句話勾起某些同學(xué)一些舊事,他們陷入了深深的,似乎很痛苦的回憶之中……對此,為師我表示最大的理解,并有一言相送:“并非是一件事情不會有結(jié)果,只是,有時候,我們并不需要結(jié)果……”。</P>
<P>寫函數(shù)的人就是這樣的啊。函數(shù)需要什么參數(shù),由寫函數(shù)的人決定,函數(shù)返回什么結(jié)果,也由他們決定。如果他們認(rèn)定這個函數(shù)不需要什么結(jié)果,那么這個函數(shù)就將寫成返回void類型。void是“無類型”之意,這就相當(dāng)于這個函數(shù)沒有返回結(jié)果。</P>
<P>舉修理電視的例子來說,我們認(rèn)為它至少應(yīng)該返回一個bool值,即真或假。真表示電視修好了,假表示電視修不好。</P>
<P>bool XiuliDianshi(TDianshi ds);</P>
<P>然后,我們?nèi)绾蔚弥Y(jié)果呢?</P>
<P>bool jg = XiuliDianshi(ds);</P>
<P>看,我們也聲明了一個bool變量,然后讓它等于這個函數(shù),這就可以得到函數(shù)的返回值。</P>
<P> </P>
<P>來看一個實(shí)例,仍然是sin函數(shù)。</P>
<P>double x = 3.1415926;</P>
<P>double y = sin(x);</P>
<P>y值將是一個非常接近0的值。</P>
<P> </P>
<P>getchar();是一個不需要參數(shù)的函數(shù),但它有返回值。它返回用戶輸入的字符(事實(shí)上它返回的是整型)。所以我們可以這樣用:</P>
<P>char c = getchar();</P>
<P>c將得到用戶輸入的字符。</P>
<P>而另一個例子:
randomize()函數(shù),則赤條條地來,赤條條地走,瀟灑得很。根本就不打算返回什么。連到底準(zhǔn)備成功了嗎?都不返回--因?yàn)樗J(rèn)定自已一定會執(zhí)行成功。</P>
<P> </P>
<P>還需說明的是,有時函數(shù)是有返回值,但我們并不在意。還是getchar();我們不是一直在使用它來“暫時”停止程序,以期能看到DOS窗口上的輸出結(jié)果嗎?這時,用戶輸入什么鍵我們都不在意。所以我們總這么寫:</P>
<P>getchar();</P>
<P>就完事,并沒讓誰去等于誰。</P>
<P> </P>
<P>最后一點(diǎn)針對學(xué)過PHP,JavaScript,Perl等腳本語言的學(xué)員:在C,C++里,一個函數(shù)返回值的類型,必須是確定的。不像腳本語言中的函數(shù),可以返回不定類型的結(jié)果。</P>
<H4><A name=12.2.5>12.2.5</A> 調(diào)用庫函數(shù)的實(shí)例</H4>
<P><B>實(shí)例一:</B>使用庫函數(shù)創(chuàng)建或刪除文件夾。</P>
<P>(本例子中刪除的文件夾將無法恢復(fù)!請大家操作時小心。)</P>
<P> </P>
<P>在本實(shí)例里,我們將“大膽地”在C盤根目錄下創(chuàng)建指定的目錄(文件夾),然后再把它刪除。</P>
<P>使用到兩個函數(shù):</P>
<P>1、mkdir("文件夾名稱")</P>
<P>參數(shù)是一個字符串,即指定的文件夾名稱。</P>
<P>返回值比較特殊:整數(shù):0表地成功,-1表示失敗:比如那個文件夾已經(jīng)存在,或者,你想讓它一次創(chuàng)建多級目錄,如:C:\abc\123,而C:\abc并不存在。</P>
<P>2、_rmdir("文件夾名稱")</P>
<P>參數(shù)是一個字符串,即指定的文件夾名稱。</P>
<P>返回同樣是0或-1。刪除一個文件夾比較容易失敗:比如文件夾內(nèi)還有文件或其它子文件夾,比如該文件夾正好是當(dāng)前文件夾,另外你也不能刪除一個根目錄,比如你想刪除:"c:\"
!!!(想刪除整個C盤?病毒?)</P>
<P> </P>
<P>兩個函數(shù)都在“dir.h”文件里聲明,所以我們需要include它。</P>
<P> </P>
<P>下面是完整的代碼:</P>
<P>//---------------------------------------------------------------------------</P>
<P>#include <dir.h></P>
<P>#include <iostream.h></P>
<P>#pragma hdrstop</P>
<P>//---------------------------------------------------------------------------</P>
<P> </P>
<P>#pragma argsused</P>
<P>int main(int argc, char* argv[])</P>
<P>{</P>
<P> char path[50];</P>
<P> char ch;</P>
<P> </P>
<P> do</P>
<P> {</P>
<P> //讓用戶選擇操作項(xiàng): </P>
<P> cout << "0、退出本程序" <<
endl;</P>
<P> cout << "1、創(chuàng)建文件夾" <<
endl;</P>
<P> cout << "2、刪除文件夾" <<
endl;</P>
<P> cout << "請選擇:";</P>
<P> cin >> ch;</P>
<P> </P>
<P> //如果輸入字符'0',則結(jié)束循環(huán)以退出:</P>
<P> //請注意break在這里的用法:</P>
<P> if(ch == '0')</P>
<P> {</P>
<P> break;</P>
<P> }</P>
<P> </P>
<P> //如果輸入的既不是1,也不是2,要求重新輸入,</P>
<P> //請注意continue在這里的用法:</P>
<P> if(ch != '1' && ch != '2')</P>
<P> {</P>
<P> cout <<
"輸入有誤,請重新選擇!" << endl;</P>
<P> continue;</P>
<P> }</P>
<P> </P>
<P> //不管是創(chuàng)建還是刪除,總得要用戶輸入文件夾名稱:</P>
<P> cout << "請輸入文件夾的絕對路徑:" ;</P>
<P> cin >> path;</P>
<P> </P>
<P> //先定義一個bool變量,用來判斷操作是否成功:</P>
<P> bool ok;</P>
<P> //現(xiàn)在需要區(qū)分用戶想做什么了:</P>
<P> if(ch == '1') //創(chuàng)建文件夾:</P>
<P> {</P>
<P> ok = (0 ==
mkdir(path)); //若mkdir返回結(jié)果等于0,表示操作成功</P>
<P> }</P>
<P> else //否則就是要刪除了!</P>
<P> {</P>
<P> ok = (0 ==
_rmdir(path)); //同樣,_rmdir也是返回0時表示成功</P>
<P> }</P>
<P> </P>
<P> //給出結(jié)論:</P>
<P> if(ok)</P>
<P> {</P>
<P> cout
<< "恭喜!操作成功。" << endl;</P>
<P> }</P>
<P> else</P>
<P> {</P>
<P>
cout <<"抱歉,操作失敗,請檢查您的輸入。" << endl;</P>
<P> }</P>
<P> }</P>
<P> while(true);</P>
<P> </P>
<P> return 0;</P>
<P>}</P>
<P>//---------------------------------------------------------------------------</P>
<P> </P>
<P>代碼里頭有一個do...while循環(huán),一個continue,和break;另有幾個if...else,這些相信你可以邊運(yùn)行程序,邊看明白其間的邏輯。惟一陌生的是最開頭的一句:</P>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -