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

📄 subject_63676.htm

📁 vc
💻 HTM
字号:
<p>
序号:63676 发表者:badboy 发表日期:2003-12-05 14:08:18
<br>主题:函数接受错误类型的参数,我们要不要先预防一下?
<br>内容:下面是个进行阶乘运算的函数。函数可以接受整形数,但,用户偏偏就是不输入整形数,而是输入了字母。我们是不是在这个函数里也要对函数所能接受的数进行筛选一下,即进行分支处理。起码给个错误提示,提示用户输入了错误信息。或者抛出一个异常错误给调用此函数的代码。 <BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>#include &lt;iostream&gt;<BR>using namespace std;<BR>int jiechen(int x)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int jieguo=1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(x&lt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else if(x==1 || x==0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;do<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jieguo=jieguo*x;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}while(x!=1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return jieguo;<BR>}<BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int y;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cin&gt;&gt;y;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;jiechen(y)&lt;&lt;endl;<BR>}<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-12-05 15:46:44
<br>内容:像你这样写,当然要检查,因为如果那个x是&lt;0的,你应该抛出一个异常的。比较聪明的做法是,把原型写成unsigned int jiechen(unsigned int x),如果0!=1的话,那么,你什么都别检查了,直接计算,如果传进来的数字有问题,那是调用者的事情。<BR>cin&gt;&gt;y;这里,你应该检查cin的状态的,这样可以保证y被正确输入。<BR>至于在jiechen里面打印出错信息,在调试的时候可以用用,但是觉得不能作为错误的处理方法,你知道你的函数会被用在哪里?很可能没输出的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-12-05 17:22:17
<br>内容:unsigned int jiechen(unsigned int x)<BR><BR>&nbsp;&nbsp;您的意思,现在这个阶乘函数的参数要求必须为unsigned ,这个函数只负责接收处理unsigned数,如果传进来的数是其他不符合要求的(比如是字母或者是负数),这都是调用者的责任。想要避免传进来的参数不符合要求,调用者必须做好过滤工作,即在“cin&gt;&gt;y;”上做些改进,使得y必须是unsigned型数。我们可以在“cin&gt;&gt;y;”这句代码上进行审查,如果,y不是unsigned型数,我们就抛出异常!您说的“应该检查cin的状态的”是不是就是这个意思?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-12-05 18:07:13
<br>内容:你都是unsigned int了,用户如果把一个负数传进来,那么你接受到的也是一个正数。这当中引起的问题由调用者承担。<BR>并且,你的y也应该声明成unsigned int y;这样,输入错误的数字的责任,就由最终用户承担了。<BR>unsigned int y;<BR>cin&gt;&gt;y;<BR>如果用户输入的不是一个unsigned int,cin就毁了。你检测了,抛出异常也好,打印出错信息也好,都可以,因为这是外部代码。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-12-05 23:12:58
<br>内容:如果用户输入的不是一个unsigned int,cin就毁了<BR> <BR>&nbsp;&nbsp;&#34;cin就毁了&#34;什么意思? 没有啊!&nbsp;&nbsp;您说,“毁了”,是不是说,结果出现了不预期值?就象下面这个程序,我输入y=-3,可打印出来的结果是4294967293 <BR>void main()<BR>{<BR>unsigned int y;<BR>cin&gt;&gt;y;<BR>cout&lt;&lt;y;<BR>}<BR><BR><BR>&#34;y也应该声明成unsigned int y;这样,输入错误的数字的责任,就由最终用户承担了。&#34;&nbsp;&nbsp;这个最终用户,您指的是谁?是输入数字的用户吗?(即使用此程序的人)&nbsp;&nbsp;我觉得程序员写的程序应该有责任告戒用户以及只能接受规定范围内的数,如果不是规定范围的数,程序应该拒绝计算以免输出错误结果,这样,似乎更友好,也更人性化一些。因为,使用程序的人总有可能出错的。用户不小心输入了个字母,而我们的程序仍然给出个错误结果,好象比较郁闷。这个责任虽然是用户的,但,作为程序的缔造者,好象不太爽!<BR><BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:dsadsdas 回复日期:2003-12-06 11:55:53
<br>内容:cin你可以peek一把,看看是不是'-',如果不是,那么输入后,如果不是数字,cin的状态就不是good了。<BR>我没说你不要检测错误,而是你应该在最外部检测错误。用户输错了,你在最外部就给出一个错误提示就可以了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-12-10 17:55:46
<br>内容:”cin你可以peek一把,看看是不是'-',如果不是,那么输入后,如果不是数字,cin的状态就不是good了。“<BR><BR>   这句话太高深了!老大!cin的状态 good ?<BR>&nbsp;&nbsp;另外,您说的最外部检查错误,是不是,就是cin&gt;&gt;y;之后,我们写些代码对y进行检查,判断y是不是满足条件,然后再把y传给指定的函数。<BR><BR>&nbsp;&nbsp;另外,”cin你可以peek一把,看看是不是'-',如果不是,那么输入后,如果不是数字,“<BR>&nbsp;&nbsp;&nbsp;&nbsp;cin 对输入进来的东西进行判断是不是数字怎么做?cin有这个成员函数?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

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