?? 教學--第十四章 程序的文件結構.htm
字號:
<P>... ...</P>
<P>int main(int argc, char* argv[])
<P>{
<P> char ch;
<P> int count; //求總和或平均值時,需要輸入的成績個數
<P>
<P>
<P> do
<P> {
<P> cout << "1)求總和" << endl;
<P> cout << "2)求平均" << endl;
<P>
<P> cout << "請選擇(1 或 2)";
<P> cin >> ch;
<P>
<P> //輸入有誤,重輸:
<P> if(ch != '1' && ch != '2')
<P> {
<P> cout <<
"輸入有誤,請重新輸入!" << endl;
<P> continue;
<P> }
<P>
<P> cout << "請輸入個數:";
<P> cin >> count;
<P>
<P> //根據用戶的選擇,調用不同函數:
<P> switch(ch)
<P> {
<P> case '1' :
<P>
CalcTotal(count); <FONT color=#ff0000>//需要調用的函數之一</FONT>
<P>
break;
<P> case '2' :
<P>
CalcAverage(count); <FONT color=#ff0000>//需要調用的函數之一</FONT>
<P>
break;
<P> }
<P>
<P> //是否繼續:
<P> cout << "是否繼續?(y/n)";
<P> cin >> ch;
<P>
<P> //確保轉換為大寫:
<P> ch = ToUpper(ch); <FONT
color=#ff0000>//需要調用的函數之一</FONT>
<P> }
<P> while(ch == 'Y');
<P>
<P> return 0;
<P>}
<P> </P>
<P>代碼中,紅色部分的注釋表明,主函數main()需要調用到三個自定義函數。但現在我們一個也沒有定義。和往常把所有的函數定義在同一個代碼文件中不同,今天我們需要把它們分開到不同的代碼文件。</P>
<P> </P>
<P><B>第二個文件:mainfunc.cpp</B> 存放和計算有關的兩個過程(函數)。</P>
<P>先看:CalcTotal()和CalcAverage()。這兩個函數我們將在mainfunc.cpp文件內定義。你可能又忘了“定義”這個術語?呵,就是“實現”,更白點,就是在mainfunc.cpp文件內“寫”這兩個函數。</P>
<P> </P>
<P>下面是mainfunc.cpp的內容。在我們輸入以下代碼時,mainfunc.cpp已經有了一些必要的內容,下面的代碼,除了“#include
..”一行在文件最首外,其它均在原有內容之后添加。</P>
<P> </P>
<P>#include <iostream.h> //在文件最首行</P>
<P>... ...</P>
<P>//---------------------------------------------------------------------------
<P>//求總和的過程
<P>//參數:n 用戶需要輸入的個數
<P>void CalcTotal(int n)
<P>{
<P> int num;
<P> int sum = 0;
<P>
<P> for(int i=0;i<n;i++)
<P> {
<P> cout << "請輸入第" << i+1
<<"個整數:";
<P> cin >> num;
<P>
<P> sum += num;
<P> }
<P>
<P> cout << "總和為:" << sum << endl;
<P>}
<P>//---------------------------------------------------------------------------
<P>//求平均值的過程
<P>//參數:n 用戶需要輸入的個數
<P>void CalcAverage(int n)
<P>{
<P> int num;
<P> int sum = 0;
<P> float ave;
<P>
<P> for(int i=0;i<n;i++)
<P> {
<P> cout << "請輸入第" << i+1
<<"個整數:";
<P> cin >> num;
<P>
<P> sum += num;
<P> }
<P>
<P> //注意不要除0出錯:
<P> if( n >=0 )
<P> {
<P> ave = (float)sum / n;
<P> cout << "平均值:" << ave
<< endl;
<P> }
<P> else
<P> {
<P> cout << "個數為0,不能求平均。" <<
endl;
<P> }
<P>}
<P>//---------------------------------------------------------------------------
<P>
<P><B>第三個文件:assifunc.cpp</B> 用以存放輔助作用的函數,現在只有一個。
<P>現在還差一個函數:ToUpper()。這個函數用來將用戶輸入的某個小寫字母轉換為大寫。當然,如果用戶輸入的不是小寫字母,那就不用轉換。和上面的兩個函數不同,它需要返回值。
<P>我們把ToUpper()函數單獨放在assifunc.cpp里。同樣,下面的代碼加在該文件中原有的代碼之后。不過本文件不需要include
<iostream.h> ,因為沒有用到 cin,cout等。
<P>
<P>//小寫字母轉換為大寫 </P>
<P>//參數: c 待轉換的字符 </P>
<P>//返回值: 轉換后的字符,如果原字符不是小寫字母,則為原字符</P>
<P>char ToUpper(char c) </P>
<P>{ </P>
<P> int ca = 'A' - 'a'; //大寫字母和小寫字母之間差距多少?<BR><BR></P>
<P> if(c >= 'a' && c <= 'z') </P>
<P> c += ca;<BR> </P>
<P> return c; </P>
<P>}</P>
<P>
<P>至此,所有自定義函數都已完成<B>定義</B>(實現),而三個文件的主要內容也以確定。讓我們看看示意圖:
<P>
<P><IMG src="教學--第十四章 程序的文件結構.files/ls14.h4.gif" border=0></P>
<P> </P>
<P>main.cpp中的main()函數調用了三個函數。回憶我們學習過的“如何調用函數”的知識,當前代碼在調用一個函數時,必須能“看到”這個函數。盡管CalcTotal()、CalcAverage()、ToUpper()三個函數所在文件都在同一工程里,但是在main.cpp里的代碼,還是看不到它們。想一想我們以前說的“請修理工”的比喻。現在情況是:在你所住的小區,甚至就是同一樓道里,就有一個電視修理工,但可惜你們互不認識,所以當你電視壞了,想“調用”一個修理工時,你還是找不到修理工。哎!要是有它的名片就好了。</P>
<P>讓我們試試看,按Ctrl + F9,編輯該工程。出錯!</P>
<P><IMG src="教學--第十四章 程序的文件結構.files/ls14.h5.gif" border=0></P>
<P>正好是三個錯。分別告訴我們調用了三個沒有定義的函數(Call to undefined function ...)。</P>
<P> </P>
<P>(如果你出現的是一堆錯,那有可能是你沒有在前兩個文件內最首行寫:</P>
<P>“#include <iostream.h>”</P>
<P>或者是你有些代碼輸入有誤。)</P>
<P> </P>
<P>如何消除這三個錯?兩種方法。</P>
<P>第一種方法就是以前我們在講“如何調用函數”的時候所說的,直接在調用直接聲明要調用的函數。這里寫出代碼,算做是一次復習,然后我們將講該方法不好之處。</P>
<P> </P>
<P>在 main.cpp 的 main()函數之前加入如下三行函數聲明:</P>
<P> </P>
<P><B>void CalcTotal(int n);</B></P>
<P><B>void CalcAverage(int n);</B></P>
<P><B>char ToUpper(char c);</B></P>
<P> </P>
<P>int main(int argc, char* argv[])</P>
<P>{</P>
<P> ... ...</P>
<P>}</P>
<P> </P>
<P>(上例中,盡管你可以將三行函數聲明寫在 main()函數體內,但不建議這樣做)。</P>
<P> </P>
<P>如果你一切輸入正確的話,現在按Ctrl + F9 或 F9將可以完成編譯或運行。</P>
<P>對于現在這個工程,這種方法確實也不能指責它有何不利之處。問題在于,如果我們還有其它文件中代碼需要調用到這三個函數,我們就不得不在其它文件中也一一寫上這三行聲明。所以另一種方法是:把源文件中需要對外“共享”的函數聲明統一寫到某個頭文件,然后凡是需要用到的其它文件,直接使用“#include"語句來包含該頭文件,從而獲得這些函數聲明。</P>
<P> </P>
<H3><A name=14.3>14.3</A> 如何寫頭文件</H3>
<P> </P>
<P>在CB中,如果你通過上小節的方法新建個單元文件,那么CB將自動同時生成源文件和頭文件。其實在CB里,源文件和頭文件合稱為單元文件,它們有相同的文件名,而擴展名一者為.cpp,另一為.h。</P>
<P> </P>
<H4><A name=14.3.1>14.3.1</A> 在頭文件內加入函數聲明</H4>
<P> </P>
<P><B>頭文件:mainfunc.h</B></P>
<P>CalcTotal()和CalcAverage()函數定義在
mainfunc.cpp文件里,所以它們的聲明最好寫在對應的頭文件mainfunc.h內。</P>
<P>下面我們就來看如何在頭文件mainfunc.h 內增加函數聲明。</P>
<P>一開始,頭文件內有以下這些代碼。另外,我增加了一行用于標明我們新加的代碼應寫在哪里。</P>
<P>//---------------------------------------------------------------------------<BR><BR></P>
<P>#ifndef mainfuncH </P>
<P>#define mainfuncH </P>
<P>//---------------------------------------------------------------------------
</P>
<P><FONT color=#ff0000>/* !!!頭文件中,我們新增的代碼必須寫在此處!!! */</FONT></P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -