本题要求编写程序,打印一个高度为n的、由 “*” 组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号 “*” 组成的菱形,如样例所示。每个星号后跟一个空格。
输入样例:
7
输出样例:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#include <stdio.h>
int main()
{
int i,j,n;
scanf("%d",&n);
int k=(n+1)/2;
for(i=1;i<=k;i++){
for(j=1;j<=n-2*i+1;j++){
printf(" ");
}
for(j=1;j<=2*i-1;j++){
printf("* ");
}
printf("\n");
}
for(i=n-k;i>=1;i--){
for(j=1;j<=n-2*i+1;j++){
printf(" ");
}
for(j=1;j<=2*i-1;j++){
printf("* ");
}
printf("\n");
}
return 0;
}
运行结果:
题目解析:
- 看到此题目,要想到用循环的嵌套来解决此问题;
- 嵌套的循环可以构成一个平面图案,用 i 控制行, j 控制列;
- 用一个外循环来打印行,此题目需要我们打印一个菱形图案,可以将图案分为上下两个部分,并对上下两个部分的图行进行仔细分析,找出一行中空格和 * 号的数量规律。
- 以输出的样例为题目,总共由7行,先分析第一行到第四行的规律:第一行:6个空格,一个* ;6=7-(2*1-1) 。第二行:4个空格,3个* ;4=7-(2*2-1) 。第三行:2个空格,5个* ;2=7-(2*3-1) 。 第四行:0个空格,7个* ; 0=7-(2*4-1) 。因此,可以找出列号(j)和行号(i)、空格之间的关系:j<=n-2*i+1; 列号(j)和行号(i)、* 号之间的关系:j<=2*i-1。
for(i=1;i<=k;i++){ //打印行 for(j=1;j<=n-2*i+1;j++){ //打印空格 printf(" "); } for(j=1;j<=2*i-1;j++){ //打印*和空格 printf("* "); } printf("\n"); //换行 }
- 分析图形的下半部分,第5行到第六行,可以再用一个for循环来控制,外循环的i从 n-(n+1)/2开始,这里需要注意的地方是每一行图形的数量是依次减少的,空格的数量是依次增加的,同样找出图形的规律,用循环的嵌套将此图形实现。
二 、习题延申
上面打印的图形,每两个 * 号之间有一个空格,且写的代码用了两个循环的嵌套,针对此类题目做一个优化,接下来写的代码,和此题目类似,区别是用一个循环的嵌套来输出图形。此代码输出的图形每两个*号之间没有空格,只要找准(*)星号,空格,n之间的关系,解决此类题目的方法都一样。
#include <stdio.h>
#include<math.h>
int main()
{
int n,i,j,k;
scanf("%d",&n);
k=(n+1)/2;
for(i=1;i<=n;i++){ //打印行
for(j=1;j<=abs((n+1)/2-i);j++){
printf(" "); //打印空格
}
for(j=1;j<=n-abs((k-i))*2;j++){
printf("*"); //打印*
}
printf("\n"); //换行
}
return 0;
}
1、abs()函数:绝对值函数;
2、以n=9为例,给出下列解题思路。
三、
打印空的菱形,空菱形的特点是只有第一个和最后一个位置上需要打印*,其余打印空格。
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int n,i,j,k;
scanf("%d",&n);
k=(n+1)/2;
for(i=1;i<=n;i++){ //打印行
for(j=1;j<=abs((n+1)/2-i);j++){
printf(" "); //打印空格
}
for(j=1;j<=n-abs((k-i))*2;j++){
if(j==1||j==n-abs((k-i))*2){
printf("*"); //打印*
}else{
printf(" "); //打印*号中间的空格
}
}
printf("\n"); //换行
}
return 0;
}