📄 第14章 程序的文件结构.htm
字号:
<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="第14章 程序的文件结构.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="第14章 程序的文件结构.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 + -