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

📄 第12章 函数(一).htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      <P>关闭刚才的工程,CB会问你是否存盘,统统不存(如果你要存,就存到别的什么地方去,不要存在CB默认的目录下)。然后重新创建一个空白的控制台工程。在代码窗口里加入以下两行黑体代码:</P>
      <P>//---------------------------------------------------------------------------</P>
      <P>//包含“数学库函数”的头文件,因为sin()函数的声明在这个头文件里:</P>
      <P><B>#include &lt;math.h&gt;</B></P>
      <P>#pragma hdrstop</P>
      <P>//---------------------------------------------------------------------------</P>
      <P>#pragma argsused</P>
      <P>int main(int argc, char* argv[])</P>
      <P>{</P>
      <P><B>&nbsp;&nbsp; double b = sin(3.14159);</B></P>
      <P>&nbsp;&nbsp; return 0;</P>
      <P>}</P>
      <P>//---------------------------------------------------------------------------</P>
      <P>并不需要编译及运行这个程序。因为我们只是想找到sin()函数的声明。</P>
      <P>本来,我们可以通过老办法来找到sin函数声明。按Ctrl+回车键打开math.h文件,然后通过Ctrl+F打开查找对话框,找到sin函数。不过CB为我们提供了一种更方便的查找函数声明的方法,有点像我们在网页点击链接:</P>
      <P>请按住Ctrl键不放,然后将鼠标移到代码中的 sin处,注意要准确在移到sin字母身上,发现什么?呵,sin出现了超链接效果:</P>
      <P><IMG height=40 src="第12章 函数(一).files/ls12.h8.gif" width=196 
      border=0></P>
      <P>点一下,CB将自动打开math.h头文件,并且跳转到sin函数的声明处。</P>
      <P>(以上操作的成功依赖于你正确地照我说的,在代码中加入#include&lt;math.h&gt;这一行,当然你在安装CB时也必须选择了安装源代码。最后,成功打动后,记得将math.h文件设置为只读。)</P>
      <P><IMG height=166 src="第12章 函数(一).files/ls12.h7.gif" width=443 
      border=0></P>
      <P> </P>
      <P>从图中我们看到,sin函数的参数只有一个:__x,类型要求是double(双精度浮点数,如果你忘了,复习<A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4">第四章</A>)。</P>
      <P>所以,当我们调用sin函数来求正弦值时,我们最好应该给它一个double类型的数,如:</P>
      <P>double x = 3.1415926 * 2;</P>
      <P>double y = sin(x);</P>
      <P> </P>
      <P>当然, 我们传给它一个整数:</P>
      <P>double y = sin(0);</P>
      <P>或者,传给它一个单精度浮点数:</P>
      <P>float x = 3.14;</P>
      <P>double y = sin(x);</P>
      <P>这些都是可以的。这并不违反“参数类型由函数本身决定,不能由调用者决定”的原则。因为在<A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls07.htm#7.2">第七章第二节讲算术类型转换</A>时,我们知道一个整数,单精度浮点数,都可以隐式地转换为双精度浮点数。并且属于安全的类型转换,即转换过程中,数据的精度不会丢失。(反过来。一个double类型转换为int类型,就是不安全的转换。比如3.14159转换为整型,就成了3。)</P>
      <P>有些函数并不需要参数,比如,我们用了许多次的控制台函数:getchar();。这个函数要做的事就是:等待用户输入一个字符并回车。前面讲数学函数时,举的随机数例子。要想让程序能够产生真正的随机数,需要让程序事先做一些准备。所以我们调用randmize()函数。这个函数也没有参数。因为我们调它的目的,无非是:喂,告诉你,我一会儿可能要用到随机数,你做好准备吧。</P>
      <H4><A name=12.2.4>12.2.4</A> 如何得到函数的运行结果</H4>
      <P>函数总是要实现一定的功能,所以我们也可以认为函数执行起来就像是在做一件事。</P>
      <P>做一件事一般会有个结果,当然,只是“一般会有”。有些事情真的会有结果吗?嗯?看来,这句话勾起某些同学一些旧事,他们陷入了深深的,似乎很痛苦的回忆之中……对此,为师我表示最大的理解,并有一言相送:“并非是一件事情不会有结果,只是,有时候,我们并不需要结果……”。</P>
      <P>写函数的人就是这样的啊。函数需要什么参数,由写函数的人决定,函数返回什么结果,也由他们决定。如果他们认定这个函数不需要什么结果,那么这个函数就将写成返回void类型。void是“无类型”之意,这就相当于这个函数没有返回结果。</P>
      <P>举修理电视的例子来说,我们认为它至少应该返回一个bool值,即真或假。真表示电视修好了,假表示电视修不好。</P>
      <P>bool XiuliDianshi(TDianshi ds);</P>
      <P>然后,我们如何得知结果呢?</P>
      <P>bool jg = XiuliDianshi(ds);</P>
      <P>看,我们也声明了一个bool变量,然后让它等于这个函数,这就可以得到函数的返回值。</P>
      <P> </P>
      <P>来看一个实例,仍然是sin函数。</P>
      <P>double x = 3.1415926;</P>
      <P>double y = sin(x);</P>
      <P>y值将是一个非常接近0的值。</P>
      <P> </P>
      <P>getchar();是一个不需要参数的函数,但它有返回值。它返回用户输入的字符(事实上它返回的是整型)。所以我们可以这样用:</P>
      <P>char c = getchar();</P>
      <P>c将得到用户输入的字符。</P>
      <P>而另一个例子: 
      randomize()函数,则赤条条地来,赤条条地走,潇洒得很。根本就不打算返回什么。连到底准备成功了吗?都不返回--因为它认定自已一定会执行成功。</P>
      <P> </P>
      <P>还需说明的是,有时函数是有返回值,但我们并不在意。还是getchar();我们不是一直在使用它来“暂时”停止程序,以期能看到DOS窗口上的输出结果吗?这时,用户输入什么键我们都不在意。所以我们总这么写:</P>
      <P>getchar();</P>
      <P>就完事,并没让谁去等于谁。</P>
      <P> </P>
      <P>最后一点针对学过PHP,JavaScript,Perl等脚本语言的学员:在C,C++里,一个函数返回值的类型,必须是确定的。不像脚本语言中的函数,可以返回不定类型的结果。</P>
      <H4><A name=12.2.5>12.2.5</A> 调用库函数的实例</H4>
      <P><B>实例一:</B>使用库函数创建或删除文件夹。</P>
      <P>(本例子中删除的文件夹将无法恢复!请大家操作时小心。)</P>
      <P> </P>
      <P>在本实例里,我们将“大胆地”在C盘根目录下创建指定的目录(文件夹),然后再把它删除。</P>
      <P>使用到两个函数:</P>
      <P>1、mkdir("文件夹名称")</P>
      <P>参数是一个字符串,即指定的文件夹名称。</P>
      <P>返回值比较特殊:整数:0表地成功,-1表示失败:比如那个文件夹已经存在,或者,你想让它一次创建多级目录,如:C:\abc\123,而C:\abc并不存在。</P>
      <P>2、_rmdir("文件夹名称")</P>
      <P>参数是一个字符串,即指定的文件夹名称。</P>
      <P>返回同样是0或-1。删除一个文件夹比较容易失败:比如文件夹内还有文件或其它子文件夹,比如该文件夹正好是当前文件夹,另外你也不能删除一个根目录,比如你想删除:"c:\" 
      !!!(想删除整个C盘?病毒?)</P>
      <P> </P>
      <P>两个函数都在“dir.h”文件里声明,所以我们需要include它。</P>
      <P> </P>
      <P>下面是完整的代码:</P>
      <P>//---------------------------------------------------------------------------</P>
      <P>#include &lt;dir.h&gt;</P>
      <P>#include &lt;iostream.h&gt;</P>
      <P>#pragma hdrstop</P>
      <P>//---------------------------------------------------------------------------</P>
      <P> </P>
      <P>#pragma argsused</P>
      <P>int main(int argc, char* argv[])</P>
      <P>{</P>
      <P>&nbsp;&nbsp; char path[50];</P>
      <P>&nbsp;&nbsp; char ch;</P>
      <P>&nbsp;&nbsp;&nbsp;</P>
      <P>&nbsp;&nbsp; do</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //让用户选择操作项:&nbsp;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "0、退出本程序" &lt;&lt; 
      endl;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "1、创建文件夹" &lt;&lt; 
      endl;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "2、删除文件夹" &lt;&lt; 
      endl;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "请选择:";</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; ch;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果输入字符'0',则结束循环以退出:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //请注意break在这里的用法:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch == '0')</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果输入的既不是1,也不是2,要求重新输入,</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //请注意continue在这里的用法:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch != '1' &amp;&amp; ch != '2')</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; 
      "输入有误,请重新选择!" &lt;&lt; endl;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
      <P> </P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不管是创建还是删除,总得要用户输入文件夹名称:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "请输入文件夹的绝对路径:" ;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; path;</P>
      <P> </P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //先定义一个bool变量,用来判断操作是否成功:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool ok;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //现在需要区分用户想做什么了:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch == '1') //创建文件夹:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = (0 == 
      mkdir(path)); //若mkdir返回结果等于0,表示操作成功</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else //否则就是要删除了!</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = (0 == 
      _rmdir(path)); //同样,_rmdir也是返回0时表示成功</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
      <P> </P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //给出结论:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ok)</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout 
      &lt;&lt; "恭喜!操作成功。" &lt;&lt; endl;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      cout &lt;&lt;"抱歉,操作失败,请检查您的输入。" &lt;&lt; endl;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp; while(true);</P>
      <P> </P>
      <P>&nbsp;&nbsp; return 0;</P>
      <P>}</P>
      <P>//---------------------------------------------------------------------------</P>
      <P> </P>
      <P>代码里头有一个do...while循环,一个continue,和break;另有几个if...else,这些相信你可以边运行程序,边看明白其间的逻辑。惟一陌生的是最开头的一句:</P>
      <P>char path[50];</P>
      <P>这里涉及到了“数组”的知识。针对本例,你可以这样理解:</P>
      <P>char ch;&nbsp;</P>
      <P>这一行我们能看懂,定义了一个字符类型的变量,ch。ch变量的空间是1个字节,能存储一个字符,因此你可以用它存储诸如:'A','2','H'等,但现在我们要输入的是:"c:\abcd"这么一句话,所以变量ch无法胜任。C,C++提供了数组,我们可以通过定义数组来存储同一类型的多个数据。如:</P>
      <P>char path[50];</P>
      <P>本行定义了path这个数组,它可以存储50 个 char类型的数据。</P>
      <P>注意,path只能存储最多50个字符。所以在运行本例时,不要输入太长的文件夹名称。</P>
      <P>另外,Windows对新建文件夹的名称有一些特殊的要求,所以如果文件夹名称含了一些非法字符,操作将失败。</P>
      <P>以下是我运行的一个结果:<BR></P>
      <P><IMG height=220 src="第12章 函数(一).files/ls12.h8.jpg" width=416 
      border=0></P>
      <P> </P>

⌨️ 快捷键说明

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