555555555解析:该程序的功能是输出由字符构成的图形。通过外循环控制输出字符的行数,其循环变量i取1~~5,对应行号。用两个平行的内循环实现一行字符的输出。第一个内循环变量k取值1~5-i,控制输出5-i个空格,即第1行输出4个空格,第2行输出3个空格,以此类推。第二个内循环变量i取值1~2*i-1,控制输出2*i-1个字符,即第1行输出1个字符,第2行输出3个字符,以此类推。字符的值是0+i,即行号i取1时对应的字符是1,行号i取2时对应的字符是2',以此类推。输出一行字符之后进行换行。五、改错题1.解析:该程序利用循环求20个数中的最大数。每输人一个数,就存人变量x中,然后将x与变量max比较大小,并将较大数存人变量max中。程序的总体思路是止确的但在实现细节上有错误。问题在于在循环之前变量max未赋初值,导致第一次判断if(x>max)时,变量max的值是一个随机值。如果输人的20个数恰好都小于这个随机值,那么变量max的值将保持该随机值不变,从而得到错误的结果。那么应该如何给变量max赋初值呢,在循环之前给max赋初值为0可以吗?假如限定这批数都是正数,给max赋初值为0是可行的。因为每个x的值都是正数,第一次执行if(x>max)max=x;之后max的初值0即被第一个x的值取代,从而不会影响最后求得的最大数。不过,假如不限定这批数的正负而输入的20个数恰好都是负数,那么变量max的值将保持初值0不变,从而得到错误的结果。所以,正确的方法是首先将输入的第一个数存人max中,然后循环输人剩余的19个数,并与max进行比较。这样就避免了由于max的初值不确定而带来的错误结果。改正后的源程序:#include <stdio.h>int main(void){intx,max,i;printf("请输人20个整数:In");scanf("%d",&max):/*第一个数直接赋给max*for(i=l;i<=19;i++)(scanf("d",&x)if(x>max)max=x;c语printf("最大数=%dkn",max);言return 0;程序2.解析:在该程序中,判断m是否为素数的方法是判断m能否被2~m-1的整数i整设除。若m能被某一个i整除,则m不是素数,随即输出相应结论;若所有的i都不能整除计m,则m是素数,在退出循环之后输出相应结论。训该程序思路看似正确,其实还存在隐患。例如,当输入6时,会先输出“6不是素数”,练然后输出“6是素数”。这是因为在循环体中,当if条件m%i==0为真时,会输出“不是素教程数”的结论,然后跳出循环体,接着执行循环之后的printf语句,再次输出“是素数”的54
结论。一种改正的方法是,将break语句改为return语句,这样当m能被i整除时,先输出“不是素数”的结论,然后直接执行return语句,从而退出当前程序;当所有的i都不能整除m时,在退出循环之后输出“是素数”的结论。另一种改正的方法是,当m能被i整除时,暂不输出“不是素数”的结论,而是直接跳出循环。然后在退出循环之后,再通过判断i与m的大小关系,得出“是素数”或“不是素数”的结论。改正后的源程序之一:#include <stdio.h>int main(void)(int m,i;printf("请输人一个大于1的正整数:");scanf("%d",&m);for(i=2;i<m;i++)版社(if(mgi==0)(printf("%d不是素数\n",m);return O;11printf("gd是素数In",m)return O;改正后的源程序之二:#include<stdio.h>int main(void){int m,i;printf("请输人一个大于1的正整数:");scanf("%d",&m);for(i-2;i<m;i++)(if(mgi==0)break;1if(i==m)printf("%d是素数ln",m);第else5printf("%d不是素数\n",m);章return 0;循3.解析:在本程序中,用两个变量f1、f2存储数列中相邻的两项,f1、f2的初值都是1。环因为一旦求得第3项,第1项的值即不再需要保存,故求出第3项之后存人f1中,即fl=f1+f2;。结再求出第4项并存入f1中,即f1=f1+f2;。以此类推,直至求出第30项,构该程序思路看似正确,其实存在问题。当运行该程序时,将会发现从第5项开始的结果程序都是错误的。这是因为在循环中,f2的值始终都是1,从而导致求得的fI的值是增1序列。设改正的方法是先求出第3项并存入f1中,即f1=f1+f2;。再求出第4项并存人f2中,计55