PTA习题4-9 打印菱形图案 (15分)

本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:

输入在一行中给出一个正的奇数n。

输出格式:

输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

      * 
    * * * 
  * * * * * 
* * * * * * * 
  * * * * * 
    * * * 
      * 

代码如下:

#include <stdio.h>
#include <math.h>
int main () {
	int n,i,j,k,t;
	scanf("%d",&n);
	for(int i=0; i<n*2; i+=2) {
		for(int j=0; j<abs(n-i-1); j++) {
			printf(" ");
		}
		if(i>n) {
			t=n*2-i-2;
		}else{
			t=i;
		}
		for(int k=0; k<=t; k++) {
			printf("* ");
		}
		printf("\n");
	}
	return 0;
}

 注:像这种什么金字塔什么菱形之类的,就是把整个图案切分来看。这道题先把前面的空格和后面的*号分割开来看,空格在有序减少,*号在有序增加(菱形的上半部),这就需要两个小循环然后外面套一个大循环的结构了。

        然后菱形下方跟菱形上方正好是相反的结构,这就需要在大循环里分情况讨论了,这里每个人的做法就各自有别了。我的方法是:观察到空格的数量是由高到低再到高,想到了数轴正—>0—>负,用绝对值函数把负数转成正正好可以对应这种结构。于是就有了j<abs(n-i-1)这样的判断,通过外层循环i的变化可以实现输出的空格由高到低再到高的过程。不过*号由低到高再到低这个过程就不是很好实现了,没法单纯的用一个绝对值函数来搞定,只能是分情况讨论了,当i<=n(也就是菱形上半部分)时,输出*号的数量可以正向对应i。当i>n时,输出*号的数量就有另一套对应法则了。

发布了52 篇原创文章 · 获赞 0 · 访问量 1231

猜你喜欢

转载自blog.csdn.net/qq_38501880/article/details/105303611