⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第12章 函数(一).htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      <P>这行代码在屏幕上打出一行:"Hello world!"。</P>
      <P>除了教学上,或其它一些特殊要求,我们几乎不写控制台式的程序了,我们最终目标是写Windows下的GUI(图形用户界面)程序,而这些控制台输入输出函数,都不能用在GUI程序中。所以,当课程例中用到的某个控制台库函数,我会临时解释一下,其它的,大家就不必花时间了。</P>
      <P> </P>
      <P><B>3、转换函数:</B></P>
      <P>这类函数完成各种数据类型之间的转换,比如把字符串“123”转换数字123,或把小写字母转换为大写字母等等。</P>
      <P> </P>
      <P><B>5、目录管理函数:</B></P>
      <P>目录就是我们现在常说的“文件夹”啦。这些函数可以建立,删除,切换文件夹。一般地,我们已经不再使用,转而使用Windows提供的相关函数。请参看下面的Windows 
      API函数说明。</P>
      <P> </P>
      <P><B>6、数学函数:</B></P>
      <P>例如我们前面说的sin()函数,其它的各种三角函数,还有求整,求绝对值,求随机数,求对数等。</P>
      <P>这些函数大都枯燥无味,其中的随机函数倒是有趣点。很多游戏程序都要使用到它。这里粗略讲讲。</P>
      <P>什么叫随机?大白话说就是:一件事情的结果有几种相同概率的可能。比如你扔一个硬币到地上,可能是正面,也可能是反面朝上,两种可能的概率都是50%。但如果你要考虑硬币还有“立”着在地上的可能,那么这种可能就不属于随机的范畴了。下面的程序随机生成一个0~99的数,然后要求你输入一个0~99之间的数,如果这你输入的和它生成的数相等(概率为1%),就表示你中奖了。</P>
      <P> </P>
      <P>//虽然属于数学类函数,但随机函数其实放在标准库(stdlib)里:</P>
      <P>#include &lt;stdlib.h&gt;</P>
      <P>#include &lt;iostream.h&gt;</P>
      <P> </P>
      <P>int main(int argc, char* argv[])</P>
      <P>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在第一次调用随机数之前,要调用一次这个函数,</P>
      <P>&nbsp;&nbsp; //这个函数称为“随机种子函数”</P>
      <P>&nbsp;&nbsp; randomize();</P>
      <P></P>
      <P>&nbsp;&nbsp; //随机函数:random(int n)的用法:</P>
      <P>&nbsp;&nbsp; //随机返回一个 0~ (n-1) 之间的整数,</P>
      <P>&nbsp;&nbsp; //如: int x = random(100),则x值将是0到99之间的一个数。</P>
      <P> </P>
      <P>&nbsp;&nbsp; int x = random(100);</P>
      <P> </P>
      <P>&nbsp;&nbsp; int y;</P>
      <P> </P>
      <P>&nbsp;&nbsp; cout &lt;&lt; "请输入一个0~99的整数:";</P>
      <P>&nbsp;&nbsp; </P>
      <P>&nbsp;&nbsp; cin&nbsp; &gt;&gt; y;</P>
      <P> </P>
      <P>&nbsp;&nbsp; if( x == y) //可能性为1%</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "恭喜!您中奖了!" &lt;&lt; 
      endl;</P>
      <P>&nbsp;&nbsp; else</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "谢谢使用。" &lt;&lt; endl;</P>
      <P>}</P>
      <P> </P>
      <P><B>7、字符串函数:</B></P>
      <P>我们在学习字符串时将用到。</P>
      <P><B>8、内存管理管理函数:</B></P>
      <P>我们在学习内存管理时将用到。</P>
      <P><B>9、杂七杂八的其它函数。</B></P>
      <P>这个且不说。</P>
      <H5><A name=12.2.1.2>12.2.1.2</A> 操作系统的 API 函数</H5>
      <P>大家总该知道什么叫操作系统吧?Windows就是一套操作系统,另外如UNIX,Linux也是,当然我们最常用的是前者。操作系统有两个主要任务:</P>
      <P>第一是给普通用户提供一套界面,比如桌面啦,任务条啦,及任务条上的开始按钮,桌面上的图标;还有资源管理器等等。这一些我们都称为“用户界面”。它的作用是让用户“用”这台电脑。因此我们也可以称它为用户与电脑之间的“接口”。</P>
      <P>第二就是给我们这些程序员的接口,我们所写的程序是运行在操作系统上,就必须和操作系统有着千丝万缕的关系。比如我们想在屏幕上显示一个窗口,那么我们所做的事是“请求操作系统为我们在屏幕上画一个窗口”,同样在有了窗口后,我们想在窗口上画一条直线,那么也是“请求操作系统在座标(2,1)-(100,200)之间画一条直线”。</P>
      <P>那么,这些“请求”是如何实现的呢?其实也是调用函数,调用操作系统为我们准备的各种函数。这些函数同样是放在库文件里,当然,由于这些库文件是操作系统提供的,每一台装有相同操作系统的电脑都有这些库,所以它不用安装,所以它当然采用了动态库的形式。 
      对于我们正在用的Windows,这些库一般都放在Windows的安装目录:Windows,主要是Windows\System或System32下。那里有一堆的.dll,其中有不少文件就是操作系统的动态库文件。</P>
      <P>我们写的程序,一般称为“应用程序”(Application 
      Program),所以Windows为我们提供的库函数也就称为“应用程序接口”(Application Program 
      Interface),缩写即:API。</P>
      <P>在本部教程,我们主要学习C++语言本身,只有学好C、C++语言,才有可能学会用C、C++语言来和操作系统打交道。要知道所有在API函数都声明为C语言的形式,这是因为,Windows本身也是主要用C语言写成的。结论是:学习C、C++语言非常重要,并且,如果想在操作系统上写程序,那么学习C、C++当然最合算!</P>
      <H5><A name=12.2.1.3>12.2.1.3</A> VCL 库函数</H5>
      <P>VCL意为:可视化控件库(Visual Component 
      Library),事事都直接和Windows的API打交道,编程效率将非常的低。主要表现两个方面:第一,由于使用API编程是非可视化的,我们将不得不花费非常冗长的时间在处理界面显示的事务上,而界面显示其实不是我们程序的主要逻辑。第二,有关显示等工作的大量代码事实上有很大的相似性,大量重复。我们要么仍受每写一个程序就重复写一堆千篇一律的代码,要么像早期的Windows程序员一样自已动手写一套的类库用来“包装”这段代码,以求每次可以得重复利用。但这是件庞大而灵活的工作,显然我们不值得这样做,事实上也不具备这样的能力。笔者在Windows3.1下写程序时,曾经购买过国人高手写的一套这种类库,事实上钱花得不值。很快笔者转向了当时Borland提供的类库:OWL和微软的MFC。</P>
      <P>VCL提供的也主要是类库,我们暂未学到“类”的概念,所以这时且不详谈。</P>
      <P> </P>
      <H4><A name=12.2.2>12.2.2</A> 调用者必须能“找”得到被调用者</H4>
      <P> </P>
      <P>调用函数前提之一:调用者必须能看到被调用者。</P>
      <P> </P>
      <P>一个“者”字,可能让你以为这里说的是“人”,其实不是,这里说的调用者指的是当前程序,而被调用者当然是“将被调用”的函数。</P>
      <P>不过,确实,这里拿人来比喻是再合适不过了。</P>
      <P>就拿前面说的“找电视修理工”的例子来说:</P>
      <P> </P>
      <P>要修电视,显然要能找到电视修理工。这个道理很明显。</P>
      <P>所以本小节的重点其实是:程序如何才能找到要调用的函数呢?</P>
      <P> </P>
      <P>有三种方法:</P>
      <P> </P>
      <P><B>第一种、将被调用的函数写在当前代码前面</B></P>
      <P> </P>
      <P>修理工正在我家喝茶呢!是啊,我有个朋友是干这活的,有一天他来我家串门,而我家电视正好坏了。</P>
      <P> </P>
      <P>下面我先写一个函数,这个函数的大部分代码我没有写出来--根本写不出来。我只是要用它表示一个叫“修理电视”的功能。</P>
      <P> </P>
      <P>//本函数实现“修理电视”</P>
      <P>void XiuliDianshi()</P>
      <P>{</P>
      <P>&nbsp;&nbsp; ......</P>
      <P>}<BR></P>
      <P>尽管我们稍后才能学如何自已写函数,但你现在要记住了,上面那几行代码就是一个函数,它的函数名为:XiaoliDianshi,意为“修理电视”。</P>
      <P> </P>
      <P>好!有了“修理电视”的函数了,如何调用它呢?下图表示的是正确的情况:</P>
      <P><IMG height=290 src="第12章 函数(一).files/ls12.h2.gif" width=384 
      border=0></P>
      <P>当我们写程序要调用一个函数,而这个函数位于我们现在在写的代码前面时,我们就可以直接调用它,这就像修理工就在我们家里一样。注意这里的前面并非仅限于“跟前”,如果你的代码很多行,这个函数在“很前面”,也不妨碍我们调用它。</P>
      <P>要注意的是另一面:当函数在我们的代码后面时,代码就“看”不见这个函数了。下面即为这种错误情况:</P>
      <P><IMG height=256 src="第12章 函数(一).files/ls12.h3.gif" width=384 
      border=0></P>
      <P><B>第二种、将被调用的函数声明写在当前代码前面</B></P>
      <P> </P>
      <P>修理工不在我家,不过,他曾经留给我一张名片,名片上写着:“张三,电视修理工,Tel:1234567,住址:……”。所以我们也能知道他会修理电视,并且知道他的电话和住址,这样就不愁找不到他了,对不?</P>
      <P> </P>
      <P>函数也可以有名片,在程序中我们称为函数的“声明”。</P>
      <P> </P>
      <P>下面的代码演示了什么叫函数的“声明”,及它所起的作用:</P>
      <P><IMG height=256 src="第12章 函数(一).files/ls12.h6.gif" width=384 
      border=0></P>
      <P> </P>
      <P><B>第三种:使用头文件</B></P>
      <P> </P>
      <P>当我们手里有了电视修理工的名片,有了冰箱修理工的名片,有了电脑修理工的名片……名片多了,我们可以将名片整理到一个名片夹。这样做至少有两个好处:</P>
      <P>其一:便于管理。家里任何电器坏了,只需找“家用电器修理工名片”的名片夹即可。</P>
      <P>其二:便于多人共用,比如隔壁家想找一个电视修理工,只需上你家借名片夹即可。</P>
      <P> </P>
      <P>C,C++中,类似“名片夹”功能的文件,称为“头文件”。头文件的扩展名为 
      .h(head)。头文件是放置函数声明的好地方。如何写函数声明下面再说,现在要明白,“函数声明”就是给编译器看的函数说明,或曰函数的“自我介绍”。至于为什么叫“头”文件呢?是因为它总是要在程序代码文件的开头。就你我们在交谈时,开头总是大家各作一番介绍一样。(该说法未经证明,仅供参考:)</P>
      <P>说千道万,不如先简单地看一眼真实的头文件吧。</P>
      <P>启动C++ Builder。然后新建一个控制台应用工程。在CB6里,新建控制台工程在File | New | Others 
      去找,别忘了。</P>
      <P><FONT color=#c0c0c0>(CB6启动为什么这么慢啊!我且先上趟洗手间)</FONT></P>
      <P> </P>
      <P>然后在代码窗口里,加上一行:</P>
      <P>#include &lt;stdlib.h&gt;</P>
      <P>并且用鼠标在这一行点一下,现在代码窗口里的内空看起来如下:</P>
      <P><IMG height=158 src="第12章 函数(一).files/ls12.h1.gif" width=421 
      border=0></P>
      <P> </P>
      <P>确保输入光标在单词“stdlib.h” 上面闪烁!现在按 <B>Ctrl + 回车</B>,CB将打开光标所在处的文件。</P>
      <P>(如果你出现的是一个文件打开对话框,那有两点可能,其一是你没有把光标移到指定的单词上,另一可能是你安装CB时没有选择“Full”模式的安装,造成CB没有安装源文件。)</P>
      <P>以下就是打开的 stdlib.h 头文件:</P>
      <TABLE width="100%" border=0>
        <TBODY>
        <TR>
          <TD width="62%"><IMG height=179 src="第12章 函数(一).files/ls12.h4.gif" 
            width=411 border=0></TD>
          <TD width="38%"><IMG height=97 src="第12章 函数(一).files/ls12.h5.gif" 
            width=234 border=0> 
            <P>(选择ReadOnly可以把当前文件设置为只读)</P></TD></TR></TBODY></TABLE>
      <P> </P>
      <P>打开的文件是C++ Builder工程师为我们所写的头文件,请注意千万不要有意无意地改动它!为了保险起见,通过右键菜单,选择Read 
      Only将当前文件设置为只读(如上面右图)。请大家将这当作一条准则来执行:不管出于什么原因打开CB提供的源文件,立即将其设置为只读。</P>
      <P>好,我们说过“只看一眼”的。关于头文件,在讲完函数以后,还会专门讲到头文件在工程中应用。现在重复头文件的目的:</P>
      <P><B>函数可以统一在一个头文件中声明,代码中需要使用这些函数,只需通过“include”语句包含这个头文件,就可以让编译器找到函数。</B></P>
      <P>用一句大白话讲就是:要想用函数?请包含它所在的名片夹(头文件)。</P>
      <P> </P>
      <P>函数的“声明”有时被称为函数的“原型”,比如在讲到编译过程时。当我们阅读其它文章时,如果看到“函数原型”一说,希望大家也能明白。</P>
      <P> </P>
      <H4><B><A name=12.2.3>12.2.3</A> 调用者必须传递给被调用者正确的参数</B></H4>
      <P>现在,我能找到修理工,而且他已经到我家。</P>
      <P>“电视呢?”他说。</P>
      <P>“就是它”我指着家里的苏泊尔高压锅,“劳驾,把它修修,最近它总漏气。”</P>
      <P>“可是,我好象是来修理电视的?”</P>
      <P>“知道,现在你先修高压锅。”</P>
      <P>“好吧,我试试……先用电笔试试它哪里短路。”</P>
      <P> </P>
      <P>显然我这是在胡搅蛮缠。电视修理工要开始干活,就得给他电视。给他一只高压锅他不能开工。</P>
      <P>函数也一样,函数的目的是实现某个特定功能,当我们调用它时,我们一般需要给它一些数据,这些数据可能是让它直接处理,也可能是辅助它实现具体的功能。</P>
      <P>当然有些函数不需要任何外部数据,它就能完成任务。这也很好理解,修理工修理电视是得有台电视,但叫一位歌手到家里随便哼几句歌,你就不用给他什么。</P>
      <P>关键一句话:<B>函数要不要外部传给它数据,要什么类型的数据,要多少数据,由函数本身决定,而非调用者决定</B>。本例中,电视修理工需要一台电视,这是他决定的,不能由请他的人决定。</P>
      <P>传给函数的数据,我们称为“参数”,英文为:parameter。</P>
      <P> </P>
      <P>基于此,我们发现所写的 
      XiuliDianshi()函数有很大的不足,那就是它没有参数。现在我们假设有一种数据类型为“电视机”,嗯,就假设这种数据类型叫作:TDianshi。</P>
      <P>加入参数的XiuliDianShi()函数变为:</P>
      <P> </P>
      <P>XiuliDianshi (TDianshi ds)</P>
      <P>{</P>
      <P>}</P>
      <P> </P>
      <P>看一个实际的例子。上一章我们曾经学过sin()函数。现在我们来看看sin()函数的声明。看看它声明需要什么参数。</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -