{ for(j=1; j<=n; j++) printf(\printf(\} } 【4.24】分析:此题的关键还是要找到输出数字aij和行列数i、j的关系。为此将图形分为四个区域如下图: 3 3 3 3 3 3 2 2 2 3 3 2 1 2 3 3 2 2 2 3
3 3 3 3 3 (此图n为5)
在左上区域,即i<=(n+1)/2、j<=(n+1)/2时,输出数字为(n+1)/2-i+1和(n+1)/2-j+1中的大者,记为max{(n+1)/2-i+1,(n+1)/2-j+1};在右上区,即i<=(n+1)/2、j>(n+1)/2时, 输出数字为max{(n+1)/2-i+1,j-n/2};在左下区,即i>(n+1)/2、j<=(n+1)/2时,输出数字为max{i-n/2,(n+1)/2-j+1};在右下区,即i>(n+1)/2、j>(n+1)/2时,输出数字为max{i-n/2,j-n/2}。 参考答案:
#define max(x,y) ((x)>(y)?(x):(y)) main( ) { int i,j,n;
printf(\; scanf(\; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) if(i<=(n+1)/2) if(j<=(n+1)/2)
printf(\; else
printf(\; else if(j<=(n+1)/2)
printf(\; else
printf(\; printf(\; } }
【4.25】分析:前面我们已经见到过上下对称的图形,这是一个左右对称的图形,垂直中心
线上的数字恰好是行号,在每行位于图形垂直中心线左方的数字是逐渐增加的,而右方是逐渐减小的。j==i是分区的标志,左方输出数字就是列数j,而右方的数字从i开始逐步减小1。 参考答案: main() { int i,j;
for(i=1;i<=9;i++)
{ for(j=1;j<=9-i;j++) printf(\; for(j=1;j<=i;j++) printf(\; for(j=i-1;j>=1;j--) printf(\; printf(\; } }
【4.26】分析:这类输出字符的图形和输出数字的图形考虑是近似的,因为字符的ASCII码就是一个整数。在字符码值的变化过程中,应该注意应该判断码值是否超出字符的范围,进行必要的处理,为了保持程序的简洁,本题没有考虑这个问题,在下题里对这个问题进行了处理。 参考答案: main( ) { char c='Z'; int i,j,n;
printf(\; scanf(\; for(i=1;i<=n;i++) { for(j=1;j<=n+i-2;j++) if(j==n-i+1) printf(\; else printf(\; printf(\; }
for(i=1;i{ for(j=1;j<=2*(n-1)-i;j++) if(j==i+1) printf(\; else printf(\; printf(\; } }
【4.27】分析:此题与上题相近,区别在于输出时字符的ASCII码值的变化在图形的中间一行为最大,同时一行的两个字符是相同的。程序考虑在输入字符时设计了一个循环,保证输入的是英文字母。字符变化后进行了处理,程序中使用条件运算。在字符码值增加的过程中,
首先判断是大写还是小写字符,然后判断字符码值是否超出英文字母z(或Z),如果超出则重新赋为a(或A);在输出图象下半部分时,ASCII码值减少用同样的思路进行判断。在判断字符大小写(条件语句的第一个判断)时,用的是两个不同的值,请读者自行思考为什么,用同一个值是否可以? 参考答案: main( ) { char c; int i,j,n; do
{ printf(\; scanf(\;
}while(c<'A'||c>'Z'&&c<'a'||c>'z'); for(i=1;i<=n;i++) { for(j=1;j<=n+i-2;j++) if(j==n-i+1) printf(\; else printf(\; printf(\;
c=c<'a'?(c>'Z'?'A':c):(c>'z'?'a':c); } c-=2;
c=c<'Z'?(c<'A'?'Z':c):(c<'a'? 'z':c); for(i=1;i{ for(j=1;j<=2*(n-1)-i;j++) if(j==i+1) printf(\; else printf(\; printf(\;
c=c<'Z'?(c<'A'?'Z':c):(c<'a'? 'z':c); } }
【4.28】参考答案:
#define max(x,y) ((x)>(y)?(x):(y)) main( ) { char c; int i,j,n; do
{ printf(\,char:\; scanf(\;
}while(c<'A'||c>'Z'&&c<'a'||c>'z'); for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++) if(i<=(n+1)/2) if(j<=(n+1)/2)
printf(\; else
printf(\; else
if(j<=(n+1)/2)
printf(\; else
printf(\; printf(\; } }
【4.29】参考答案:
#define max(x,y) ((x)>(y)?(x):(y)) main( ) { char c; int i,j,n; do
{ printf(\,char:\; scanf(\;
}while(c<'A'||c>'Z'&&c<'a'||c>'z'); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) if(i<=(n+1)/2) if(j<=(n+1)/2)
printf(\; else
printf(\; else
if(j<=(n+1)/2)
printf(\; else
printf(\; printf(\; } }
【4.30】参考答案: #include main() { int i, j; for(i=1;i<10;i++) printf(\;
printf(\; for(i=1;i<10;i++) { for(j=1;j<10;j++) if(j
printf(\; } }
【4.31】参考答案: #include main( ) { int i,j; for(i=1;i<10;i++) printf(\; printf(\; for(i=1;i<10;i++) { for(j=1;j<10;j++) if(j<10-i) printf(\; else printf( \; printf(\; } } 【4.32】参考答案: #include \main() { int flag=0; float a,b,c,s; do { printf(\; scanf(\; if(a>b+c || b>a+c || c>a+b) flag=1; }while(flag); s=(a+b+c)/2; printf(\;