题目:输入一个字符和整数n,不同字符表示不同花纹,n表示等腰三角形的高,底边长为n-1
第一种:用二维数组的方法
首先第一个双层循环将所有的位置都放满空格,因为第一行和最后一行比较特殊一点儿,就先把这两行处理了(第一行正中间是字符,最后一行全是字符)
第二个双层循环,打印除了第一行和最后一行以外的所有行,利用p-k,p+k和k++不断往下打印,容易看出,第一行字符打印位置是n-1,那么第二行的位置就是n-2和n+2(即是p-1和p-2)
最后一个双层循环用来打印前面已经放下的空格或者字符
缺点:过于复杂繁琐,并且打印的行列有限制(graph[35][70]进行了限制,数组大小范围已经确定)
第二种:无脑找规律法(基本上所有图形打印题都能套用)
与二维数组一样,我们将第一行和最后一行单独拿出来处理(注意,在第一行的处理的时候用一个contimue语句重新开始循环,否则会往下执行,打印空格和字符)
第一个双层循环用于打印三角形外左边的空格(右边的省略不管),外循环控制行数,内循环控制列,行数每加一行,打印的字符就往前一位,且根据第一行的字符在第n个位置,则第二行的空格需要打印n-2个,第n-1位打印字符(我们将打印字符放在外循环),依次类推
第二个循环用于打印三角形内部的空格,跟外部空格相反,随着行数增加,空格数也增加,找到空格出现的规律,即上面写的2*i-3,下一个位置打印字符并换行(同样放在循环外),这个循环代表着一行结束
最后一个单循环打印最后一行
与二维数组打印相比,这个方法循环较少,逻辑更加有顺序感,对逻辑思维不强的更加容易被接受,同时没有数据限制
第三种:高级规律法
第一个双层循环,外循环同样控制行数,内循环控制列,第一个if打印左半个三角形的字符,第二个if打印右半个三角形的字符,从特殊到一般,比如第一行,打印字符的位置是第n-1位,这时候i=0,j=n-1,则j-i=j+i=n-1(其中i+j对应左半个三角形的字符,j-i对应右半个三角形的字符),每往下一行,打印字符的位置就往两边移一列,所以i+j和j-i的值始终没变,每当等于n-1时就打印一个字符,else语句用于打印空格,用putchar(10)来换行,打印下一行,10是整数,在ASCLL码表中代表换行
最后一个循环用来特别打印最后一行,同样putchar换行
这种方法更加没有特殊性,需要发现字符位置变换而行列加减关系不变的规律打印字符,只需要将最后一行单独打印,循环更少