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

📄 第12章 函数(一).htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      <H3><A name=12.3>12.3</A> 自定义函数</H3>
      <P>学会如何调用别人的函数,现在我们来学习如何自已写一个函数。首先迅速看看函数的格式:</P>
      <H4><A name=12.3.1>12.3.1</A> 函数的格式</H4>
      <P>定义一个函数的语法是:</P>
      <P> </P>
      <P>返回类型&nbsp; 函数名(函数参数定义)</P>
      <P>{</P>
      <P>&nbsp; 函数体</P>
      <P> </P>
      <P>&nbsp; return 结果;</P>
      <P>}</P>
      <P> </P>
      <P>其中:</P>
      <P>1、返回类型: 指数据类型,如:int ,float,double, bool char ,void 
      等等。表示所返回结果的类型。如果是void则表示该函数没有结果返回。</P>
      <P>2、函数名:命名规则和变量命名一样。注意要能够表达出正确的意义。如果说一个变量命名重在说明它“是什么”的话,则一个函数重在说明它要“做什么”。比如一个函数要实现两数相加,则可以命名为:AddTwoNum,这样有助于阅读。</P>
      <P>3、函数参数定义:关于参数的作用,我们前面已说。现在看它的格式:</P>
      <P>int AddTwoNum(int a,int b);</P>
      <P>函数参数的定义有点类似定义变量,先写参数的数据类型,上例中是int,然后再写参数名。下面是不同之处:</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">3.1 
      多个参数之间用逗号隔开,而不是分号。最后一个变量之后则不需要符号。 请对比:</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">普通变量定义:</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">int a;&nbsp; 
      //&lt;--以分号结束</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">int b;</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">函数中参数定义:</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">(int a, int b ) 
      //以逗号分隔,最后不必以分号结束</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px"> </P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">3.2 
      两个或多个参数类型相同时,并不能同时声明,请对比:</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">普通变量定义:</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">int a,b; 
      //多个类型相同的变量可以一起定义。</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">函数中参数定义:</P>
      <P style="MARGIN-LEFT: 10px; TEXT-INDENT: 40px">AddTwoNum(int a, b) 
      //这是错误的。</P>
      <P>4、函数体:函数体用一对{}包括。里面就是函数用以实现功能的代码。</P>
      <P>5、return 结果:return 
      语句其实属于函数体。由于它的重要性,所以单独列出来讲。“return”即“返回”,用来实现返回一个结果。“结果”是一个表达式。记住:当函数体内的代码执行到return语句时,函数即告结束,如果后面还有代码,则后面的代码不被执行。依靠流程控制,函数体里可以有多个return语句。当然,对于不需要返回结果的函数,可以不写return 
      语句,或者写不带结果的return语句。这些后面我们都将有例了演解。return 返回的结果,类型必须和前面“返回类型”一致。</P>
      <P>一个最简单的例子,也比一堆说明文字来得直观,下面我写一个函数,用于实现两个整数,返回相加的和。这当然是一个愚不可及的函数,两数相加直接用+就得,写什么函数啊?</P>
      <P> </P>
      <P>//愚不可及的函数:实现两数相加</P>
      <P>//参数:a:加数1,b:加数2;</P>
      <P>//返回:相加的和</P>
      <P>int AddTwoNum(int a, int b)</P>
      <P>{</P>
      <P>&nbsp;&nbsp; return a + b;</P>
      <P>}</P>
      <P> </P>
      <P>例子中,谁是“返回类型”,谁是“函数名”?谁是“参数定义”?哪些行是“函数体”?这些你都得自已看明白。这里只想指出:这是个极简单的函数,它的函数体内只有一行代码:即return 
      a+b;语句,直接返回了a+b的结果。</P>
      <P> </P>
      <P>最后说明一点:C,C++中,不允许一个函数定义在另一个函数体内。</P>
      <P> </P>
      <P>void A()</P>
      <P>{</P>
      <P>&nbsp;&nbsp; void B()&nbsp; //错误:函数B定义在函数A体内。</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp; ....</P>
      <P>&nbsp;&nbsp; }</P>
      <P> </P>
      <P>&nbsp;&nbsp; ...</P>
      <P>}</P>
      <P> </P>
      <P>如上代码中,函数B“长”在函数A体内,这不允许。不过有些语,如Pascal则允许这样定义函数。</P>
      <P> </P>
      <H4><A name=12.3.2>12.3.2</A> 自定义函数实例</H4>
      <P>下面我们将动手写几个函数,并实现对这些函数的调用。从中我们也将进一步理解函数的作用。</P>
      <H5><A name=12.3.2.1>12.3.2.1</A> 小写字母转换为大写字母的函数</H5>
      <P><B>实例二:</B>自定义小写字母到大写字母的转换函数。</P>
      <P> </P>
      <P>尽管这个功能很可能已经有某个库函数实现了,但像这种小事,我们不妨自已动手。</P>
      <P>之所以需要这个函数,缘于最近我们写程序时,经常用到循环,而循环是否结束,则有赖我们向用户提一个问题,然后判断用户的输入;如果用户输入字母Y或y,则表示继续,否则表示退出。</P>
      <P>每次我们都是这样判断的:</P>
      <P> </P>
      <P>if(ch == 'Y' || ch == 'y')</P>
      <P>{</P>
      <P>&nbsp;&nbsp;&nbsp; ...</P>
      <P>}</P>
      <P> </P>
      <P>平常我们的键盘一般都是在小写状态,因为用户有可能不小心碰到键盘的“Caps 
      Lock”,造成他所输入的任何字母都是大写的--尽管键盘上有个大小写状态指示灯,但有谁会去那么注意呢?所以如果你的程序仅仅判断用户是否输入‘y'字母,那么这个用户敲了一个‘Y',结果程序却“很意外”的结束了?显然这会让用户很小瞧你:才三行程序就有BUG。</P>
      <P> </P>
      <P>(一般不传之秘笈:用户就像女友一样,需要“哄”:有时你发现软件中存在一项潜在的,系统级的严重BUG,你自已惊出一身冷;但在用户那里,他们却纠缠你立即改进某个界面上的小小细节,否则就要抛弃这个软件--就像你的女友,天天和你吃萝卜秧子没有意见,但情人节那天忘了送花,她就对你失望透了。)</P>
      <P> </P>
      <P>言归正传!现在问题,我讨厌每回写那行条件都既要判断大写又要判断小写。解决方法是,在判断之前,把用户输入的字母统统转换为大写!</P>
      <P> </P>
      <P>下面是将用户输入字符转换为大写的函数。要点是:</P>
      <P>1、用户输入的字符不一定是小写字母,说不定已经是大写了,甚至可能根本就不是字母。所以在转换之前需要判断是否为小写字母。</P>
      <P>2、小写字母‘a’的ASCII值比大写字母‘A'大32,这可以从<A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls05.htm#美国信息交换标准码">第五章的ASCII码表</A>中查到。不过我不喜欢查表,所以最简单的方法就是直接减出二者的差距。所有字母的大小之间的差距都一样。这是我们得以转换大小写字母的前提。</P>
      <P> </P>
      <P>//函数:小写字母转换为大写字母。</P>
      <P>//参数:待转换的字母,可以不为小写字母;</P>
      <P>//返回:如果是小写字母,返回对应的大写字母,否则原样不动返回。</P>
      <P> </P>
      <P>char LowerToUpper(char ch)</P>
      <P>{</P>
      <P>&nbsp;&nbsp; //判断是否为小写字母:</P>
      <P>&nbsp;&nbsp; if(ch &gt;= 'a' &amp;&amp; ch &lt;= 'z')</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch -= ('a' - 'A'); //相当于 ch -= 32; 或 ch 
      = ch - 32;</P>
      <P>&nbsp;&nbsp; }</P>
      <P> </P>
      <P>&nbsp;&nbsp; //返回:</P>
      <P>&nbsp;&nbsp; return ch;</P>
      <P>}</P>
      <P> </P>
      <P>这个函数也再次提醒我们,在ASCII表里,大写字母的值其实比小写字母小。所以,小写字母转换为大写,用的是“减”。小写字母减去32,就摇身一变成了大写。</P>
      <P> </P>
      <P>现在,有了这个函数,假设我们再遇上要判断用户输入是’y'或‘n’的情况,我们就方便多了。</P>
      <P>作为一种经历,我们此次采用将函数放在要调用的代码之前。</P>
      <P> </P>
      <P>//------------------------------------------------------------------------</P>
      <P>//函数:小写字母转换为大写字母。</P>
      <P>//参数:待转换的字母,可以不为小写字母;</P>
      <P>//返回:如果是小写字母,返回对应的大写字母,否则原样不动返回。</P>
      <P> </P>
      <P>char LowerToUpper(char ch)</P>
      <P>{</P>
      <P>&nbsp;&nbsp; //判断是否为小写字母:</P>
      <P>&nbsp;&nbsp; if(ch &gt;= 'a' &amp;&amp; ch &lt;= 'z')</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch -= ('a' - 'A'); //相当于 ch -= 32; 或 ch 
      = ch - 32;</P>
      <P>&nbsp;&nbsp; }</P>
      <P> </P>
      <P>&nbsp;&nbsp; //返回:</P>
      <P>&nbsp;&nbsp; return ch;</P>
      <P>}</P>
      <P>//------------------------------------------------------------------------</P>
      <P>int main(int argc, char* argv[])</P>
      <P>{</P>
      <P>&nbsp;&nbsp; char ch;</P>
      <P>&nbsp;&nbsp; do</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "继续吗?(Y/N)";</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; ch;</P>
      <P> </P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用函数,将可能小写字母转换为大写:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = LowerToUpper(ch);</P>
      <P>&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp; while(ch == 'Y');</P>
      <P>&nbsp;&nbsp;&nbsp;</P>
      <P>&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; }</P>
      <P>//------------------------------------------------------------------------</P>
      <P> </P>
      <P>完整的代码见相应例子文件。例子只是为了演示如何自已定义函数,并调用。运行时它问一句“继续吗?”你若输入大写或小写的‘y'字母,就继续问,否则结束循环。</P>
      <P>函数的返回值也可以直接拿来使用。上面代码中的do...while循环也可以改写的这样:</P>
      <P> </P>
      <P>&nbsp;&nbsp; do</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "继续吗?(Y/N)";</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; ch;</P>
      <P>&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp; while(LowerToUpper(ch) == 'Y');</P>
      <P> </P>
      <P>&nbsp; 功能完全一样,但看上去更简洁。请大家进行对比,并理解后面的写法。</P>
      <P> </P>
      <P>本例中的“小写转换大写”的函数,虽然我们已经成功实现,但我们并没有将它的声明放到某个头文件,所以,如果在别的代码文件中,想使用这个函数,还是不方便。确实,我们很有必要为这个函数写一个头文件,在讲完函数后,我们将去做这件事。</P>
      <P>实例二代表了一种函数的使用需求:我们将一些很多代码都要使用的某个功能,用一个函数实现。这样,每次需要该功能时,我们只需调用函数即可。这是函数的一个非常重要的功能:代码重用。通过函数,不仅仅是让你少敲了很多代码,而且它让整个程序易于维护:如果发现一某个功能实现有误,需要改正或改进,我们现在只需修改实现该功能的函数。如果没有函数?那将是不可想像的。</P>
      <P> </P>
      <P>但是,只有那些一直要使用到的代码,才有必要写成函数吗?并不是这样。有些代码就算我们可能只用一次,但也很有必</P></TD></TR></TBODY></TABLE></CENTER></BODY></HTML>

⌨️ 快捷键说明

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