如何输出以下图形?
分析(以第1个图形为例):
假设行号为i,则i行的空格数为i-1,*号个数是i
对应的程序是这样的:
#include <stdio.h>
#define N 5
int main()
{
int i,j;
for (i=1;i<=N;i++)
{
for (j=1;j<=i-1;j++)
printf(" ");
for (j=1;j<=i;j++)
printf("*");
printf("\n");
}
}
将程序进行通用性处理,以适应其他两个图形:
#include <stdio.h>
#define N 5
print(int nspace,int nmul1,int nimage,int nmul2,char cimage) {
for (int i=1; i<=N; i++) {
for (int j=0; j<nmul1*i+nspace; j++)
printf(" ");
for (int j=0; j<nmul2*i+nimage; j++)
printf("%c",cimage);
printf("\n");
}
}
int main() {
print(-1,1,0,1,'*');
printf("\n");
print(5,-1,-1,2,'*');
printf("\n");
print(-1,1,11,-2,'*');
}
其中:nmul1*i+nspace和nmul2*i+nimage分别表示空格数和图形数。
考虑到程序中稳定的重复关系,程序也可以用递归来实现输出:
#include <stdio.h>
#define N 5
void print(int n) {
if(n==0)return;
else {
for(int i=0; i<N-n; i++)
printf(" ");
for(int i=0; i<N-n+1; i++)
printf("*");
printf("\n");
print(n-1);
}
}
int main() {
print(N);
}
这个程序输出图形1,将程序通用化处理,代码如下:
#include <stdio.h>
#define N 5
void print(int n,int nspace,int nmul1,int nimage,int nmul2,char cimage) {
if(n==0)return;
else {
for(int i=0; i<nmul1*(N-n+1)+nspace; i++)
printf(" ");
for(int i=0; i<nmul2*(N-n+1)+nimage; i++)
printf("%c",cimage);
putchar('\n');
print(n-1,nspace,nmul1,nimage,nmul2,cimage);
}
}
int main() {
print(N,-1,1,0,1,'*');
printf("\n");
print(N,5,-1,-1,2,'*');
printf("\n");
print(N,-1,1,11,-2,'*');
}
注意,空格数和图形数表达式作了调整:
nmul1*(N-n+1)+nspace
nmul2*(N-n+1)+nimage
这是因为递归是逆序的,前面程序中的i是递增,这里n是递减,所以i(1,2,3,4,5)改成N-n+1(1,2,3,4,5)
在“编程思维训练8:玩转指针1”中,增加了几个利用指针输出图形的程序,供参考学习。