回复 8楼 hanucvb
嗯,不能得到正确的输入了是吧。你看写的代码,scanf("%d%d", &a, &n),两个%d%d是紧密连在一起的,意思是如果你希望输入a=1、n=2,那么将被视为12,但问题是12也是整数,因此scanf()函数事实上无法判断你输入的是什么,所以,它会把12当作是一个数,得到a=12,然后等待你输入n的值。这就是你必须敲一下回车,输入另一个数字,程序才能继续执行下去的原因。因此,你这里修改,明确告诉scanf()分隔符是什么,改为如scanf("%d,%d", &a, &n),这样,你输入时用逗号隔一下就行,而原先的那个,也可以用空格、TAB或回车等分隔。这些scanf()的古怪规律,是你用scanf()函数时必须掌握的(但你掌握不等于别的人也掌握,当你的程序给别人用时更要注意)。
由于你使用的a、n是int数据类型,所以要注意不要输入超越int许可范围的数字,否则,会得到不确定的结果(C语言并没有规定int是多少字节,也没规定超越范围时怎么裁剪为适合的值,这些是编译器的自由领域,不同编译器有不同的处理办法,不要想当然一定是这样或那样,总之要警戒这种错误发生)。这就是你那个结果的原因。
知道以上问题的可能性,就可以进入下面的步骤了。for循环,无非是起始条件、终止条件、循环动作,你的for没有起始条件,但有终止条件。那么你要把自己当作是计算机,你在执行程序,这很重要!终止条件要检测是否k!=0,那么,第一次进入for时,k是多少呢?然后它将是多少?最终又应该是多少?根据初始条件,能进入这个循环吗?根据循环中的代码,会出现终止的条件吗?这些问题,都要在代码中寻找、要明确,带着这些问题进入循环体中,检查代码,得到全部答案为止。最基本的办法,是假定自己输入的a、n分别是多少,一步一步把整个循环执行一遍,确信得到正确的结果;然后改变一下a、n的值,再执行一次;再试另外很明显差异的数据。三五次之后,程序的正确性基本得到保障了,才完成这个循环的审查。
在审查的过程,随时提醒自己在做什么题目、希望得到怎样的结果、是否确实得到了希望的东西。比如,你要s=a+aa+aaa+……,第一次得到a了吗?第二次得到aa了吗?得到的东西给s了吗?如何知道真的是a、aa、aaa?把数据打印出来看看。验证、验证、再验证。任何简单的程序,都不是看起来那么简单,步进式检查,确保到目前为止是对的,再进行下面的编码,不要一气把程序写完,随时把握程序的动向,一定要非常非常清楚程序在任何时候、在什么情景中将会做什么、在做什么。
写程序的一个基本观点是,你的程序面对的是任何情况都可能发生的环境,假设越少,程序越强壮。不要想当然用scanf()接受输入时用户会按照你的知识体系行事,检查除数不能为零是你程序的责任,不是用户的责任,他什么数据都敢往里灌,程序抗不抗得住是你程序员的本事。因此,程序员写程序时必须要能够变换角色,把自己转换为用户,亲自使用一下自己的产品,看有什么问题,须知,最终用户比你还要严格、变态得多,如果你自己都不能过关,就不要幻想用户那关能过,被退货打回头是迟早的事,与其如此,宁愿迟交货也不要被回炉,交货迟了可以解释为精益求精,但经常被退货则被视为办事不牢,感观是截然相反的。一个优秀的程序员(即使是求伯君那样的高手),也不保证能一次写出没有错误的程序,他们改错的时间比你想象中的多得多。
[
本帖最后由 TonyDeng 于 2011-9-23 14:13 编辑 ]