?? 第12章 函數(一).htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0049)http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm --><HTML><HEAD><TITLE>教學--第十二章 函數(一)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節標題 {
FONT-WEIGHT: bold; FONT-SIZE: 12pt
}
TD {
FONT-SIZE: 9pt
}
.tdtitle {
FONT-SIZE: 20pt
}
.celltopline {
BORDER-TOP: #000000 1px solid
}
.menucell {
FONT-SIZE: 10pt
}
#glowtext {
FONT-SIZE: 10pt; FILTER: glow(color=red,strength=1); WIDTH: 100%
}
A:link {
FONT: 10pt 宋體; COLOR: blue; TEXT-DECORATION: none
}
A:visited {
FONT: 10pt 宋體; COLOR: purple; TEXT-DECORATION: none
}
A:active {
FONT: 10pt 宋體; COLOR: red; TEXT-DECORATION: underline
}
A:hover {
COLOR: blue; TEXT-DECORATION: underline
}
</STYLE>
<META content="MSHTML 6.00.2900.2769" name=GENERATOR></HEAD>
<BODY>
<CENTER>
<TABLE height=154 cellSpacing=4 cellPadding=4 width=760 border=0>
<TBODY>
<TR>
<TD
style="FONT-SIZE: 10pt; MARGIN-LEFT: 12px; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; MARGIN-RIGHT: 12px; FONT-FAMILY: 宋體"
width="100%" height=148>
<H2>第十二章 函數(一)</H2>
<P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.1">12.1
函數的引入</A>
<P><A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2">12.2 學會調用函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.1">12.2.1
哪些函數可調用?</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.1.1">12.2.1.1
庫函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.1.2">12.2.1.2
操作系統的 API 函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.1.3">12.2.1.3
VCL 庫函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.2">12.2.2
調用者必須能“找”得到被調用者</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.3">12.2.3
調用者必須傳遞給被調用者正確的參數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.4">12.2.4
如何得到函數的運行結果</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.2.5">12.2.5
調用庫函數的實例</A>
<P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.3">12.3
自定義函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.3.1">12.3.1
函數的格式</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.3.2">12.3.2
自定義函數實例</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.3.2.1">12.3.2.1
小寫字母轉換為大寫字母的函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.3.2.2">12.3.2.2
使用函數改寫“統計程序”</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.3.2.3">12.3.2.3
求多種平面形狀的面積</A>
<P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.4">12.4
主函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.4.1">12.4.1
DOS程序的主函數</A>
<P> <A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.4.2">12.4.2
Windows程序的主函數</A>
<P><A href="http://www.d2school.com/bcyl/bhcpp/newls/ls12.htm#12.5">12.5
小結</A> </P>
<P> </P>
<P>函數是C語言的一個重點和難點,我們此次將連續兩章進行講解。本章重點在于徹底理解函數的作用,學會調用函數,學會自已編寫函數。</P>
<P>秉承我們“以人為本:)”的學習方法,我們學習函數第一件事就是問話:干嘛讓我學習函數?反過來說就是:函數能為一個程序員做些什么?</P>
<H3><A name=12.1>12.1</A> 函數的引入</H3>
<P>家里地板臟了怎么辦?</P>
<P>拿起掃帚,自個兒掃唄。當然,在掃之前要對地板上的各種“臟”東西定好數據類型,針對不同的“數據類型”,我們需要進行不同的處理,比如是廢紙,則無情地掃到垃圾桶;但若是在地上發現一張百元大鈔,則應該脈脈含情地撿起放在胸口:“你讓我找得好苦”。</P>
<P>在掃地的過程中,當然也無處不在使用“流程控制”。比如家里有三間房子,則應該是一個循環。而每一間房子的打掃過程也是一個循環過程:從某個角落的地板開始,向另一個角落前進,不斷地重復掃把的動作。中間當然還需進行條件判斷:比如前面所說的對地面臟物的判斷,再如:if
(這一小塊地面不臟),則 continue 到下一塊地面……</P>
<P> </P>
<P>我們學了“數據類型、常量、變量”,所以我們有了表達問題中各種數據的能力;</P>
<P>我們還學了“流程控制”,所以我們還會針對各個問題,用正確的流程組合解決問題的步驟,從而形成解決問題的方法。</P>
<P> </P>
<P>看起來我們已經擁有了從根本上解決任何問題的能力。但--</P>
<P>家里電視壞了怎么辦?</P>
<P>呃?這個,我不是學電器專業的。我只會看電視,我不會修理電視。</P>
<P>這時候我們的辦法是:打一個電話請專業的修理師上門修理。</P>
<P>還有很多問題的解決辦法都是和修電視類似,即:我們自已沒有這個能力,但我們可以<B>調用</B>一個具備這一能力的人來進行。</P>
<P>函數在程序中就相當于:具備某些功能的一段相對獨立的,可以被調用的代碼。是的,函數也就是一段代碼,代碼也就是我們前面的學的“變量,常量,流程控制”等寫成的一行行語句。這些語句以一種約定形式存在著,等待我們去調用它。</P>
<P>其實我們已經用過函數了:給你一個數:2.678,能幫我們求出它的正弦值嗎?想起來了嗎?我們在<A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls11.htm#11.4.4">上一章中學過sin()函數</A>。</P>
<P>一段用以被調用的代碼,這是函數的本質。當然,使用函數在程序中還有許多其它的作用,但我們將從這個最關鍵的地方講起:怎樣調用一個函數?</P>
<P> </P>
<H3><A name=12.2>12.2</A> 學會調用函數</H3>
<P> 這一節的任務是通過學會如何調用一個函數,從使用者的角度來了解函數各個重要知識點。從而,也為下一節學習如何寫一個函數打下基礎。我們相信這樣的安排是科學的,因為在生活中,我們也往往是先是一個“使用者”,然后才是一個“<BR>創造者”或“提供者”。</P>
<H4><A name=12.2.1>12.2.1</A> 哪些函數可調用?</H4>
<P>在學會如何調用函數之前,不妨先看看有哪些現成的函數可以調用。</P>
<H5><A name=12.2.1.1>12.2.1.1</A> 庫函數</H5>
<P>C++ Builder
提供了數百個庫函數。之所以稱為“庫”函數,是因為這些函數被集中在一個或幾個文件里,這些文件就像存放函數倉庫,當我們需要時,程序就可以從“庫”中調用。</P>
<P>庫文件又分為兩種形式:</P>
<P>第一種是把不同的函數分門別類地放在不同的文件里。比如和數學計算有關的,放到一個文件,和I/O操作有關的,放到另一個文件。這樣做的結果是:文件很多,但每個文件都比較小。這種庫我們稱為“靜態庫”。</P>
<P>使用靜態庫的好處是:當我們的程序調用到某一庫的函數是,C++ Builder
可以將這個庫文件直接和我們的程序“合并”到一起。這樣,我們提供給用戶程序時,只需要提供一個可執行文件(比如叫:A.exe)。用戶得到這個程序時,不用安裝其它文件,就可以運行了。</P>
<P>使用靜態庫的壞處是:假如你需要向用戶提供兩個可執行文件,比如A.exe和B.exe,兩個文件可能都用到同一庫文件,所
以同一個庫函數既被“合并”入A.exe,也被合并入B.exe,造成了事實上的空間浪費。另外,雖然說每人靜態庫的文件都比較小,但如果一個程序“合并”了不少庫文件,那么這個程序的可執行文件體積仍然不可避免地變得比較大。</P>
<P> </P>
<P>和靜態庫相對,另外一種庫稱為“動態庫”。它的做法是:把所有函數不管三七二十一,都放在一個文件里。這樣做的結果:庫文件只有一個,但體積很大。</P>
<P>使用動態庫的壞處是:動態庫不允許“合并”到你的程序中--顯然也不適于合并,因為動態庫太大了。所以若你使用動態庫,在發布你的應用程序時,你必須向你的用戶提供動態庫文件。</P>
<P>使用動態庫的好處在于:如果你向用戶提供的是一套程序,比如有A.exe,B.exe,C.exe...,那么這些可執行文件都可以使用同一個動態庫,所以盡管你需額外提供一個很大的動態庫,但你的各個應用程序卻都很小。當然,采用動態庫發布程序時,一般來說你還需要向用戶提供一個安裝程序,很多動態庫要被安裝到Windows目錄的system或system32子目錄下。</P>
<P> </P>
<P>什么時候使用靜態庫,什么時候使用動態庫?當你只是寫一個小小應用程序時,顯然大多數人喜歡只提供一個單獨.exe文件。比如情人節到了,你覺得通過網絡向你的girlfriend發一個電子賀卡太俗(前幾年還很風雅呵:),同時也不能突顯你作為一個程序員的實力--風水輪流轉啊,前年搞網絡的人還笑話程序員是“傳統工業”--所以你決定用C++
Builder寫一個電子賀卡,這時你可不能用動態庫啊,否則擠爆了女友的信箱,嘿嘿,這個情人節就有你好受的了……</P>
<P>相反,一個稍大點軟件系統,你就應該采用動態庫。大的如整個Windows操作系統,就徹頭徹尾是使用動態庫;再如一整套MS
Office,還有WPS,這些都是。一般地說(不絕對),那些提供了安裝程序的軟件,都是使用動態庫的。總之,使用動態庫是專業程序的做法。</P>
<P>(又有人舉手打斷我的課程,說我們什么時候才能自已寫個電子賀卡?回答是下一部教程《白話Windows編程》,順便說說,下部教程很貴很貴的--嚇你的:)</P>
<P> </P>
<P>不管使用動態或靜態的庫,寫程序時都是一樣的。只有在最后要鏈接程序時,我們通過CB設置不同的選項即可。嗯?我說到了“鏈接”(link)這個詞?對了,它就是我們一直加引號的“合并”一詞的專業說法。你可以把前面課程上所有的“合并”一詞替換為鏈接,并且不用加引號了。</P>
<P> </P>
<P>現在我們來看看CB主要提供哪些類別的庫函數(以下內容僅供了解):</P>
<P> </P>
<P><B>1、分類判斷函數:</B></P>
<P>這類函數主要用對判斷一個字符是什么類型的。就像我們上一章做的“<A
href="http://www.d2school.com/bcyl/bhcpp/newls/ls11.htm#11.4.2">判斷用戶輸入字符的類型</A>”的例子。不使用函數,我們可以這樣的條件判斷一個字符是否為小寫字母:</P>
<P>if ( ch >= 'a' && ch <= 'z' )</P>
<P> cout << ch << "是一個小寫字母。" <<
endl;</P>
<P>我們也可以直接使用相關的庫函數 islower:</P>
<P>if ( islower(ch) )</P>
<P> cout << ch << "是一個小寫字母。" <<
endl;</P>
<P> </P>
<P><B>2、控制臺輸入輸出函數:</B></P>
<P>像我們總是使用的getchar(),及getche();這兩個函數用來接受用戶在控制臺程序中的按鍵輸入。另外還有不和輸入輸出函數。當然,在輸出方面,我們幾乎都采用 cout
來往屏幕輸出內容。cin, cout這是C++的方法,如果寫C程序(而不是C++),則輸出更常用的是printf();比如:</P>
<P>printf("Hello world!");</P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -