在C语言习题中我们会遇到很多图形输出题,由此我总结了一些基本方法来解决此类题目,在我们面对图形输出题时,我们要注意图形是倒立的还是正立的,如果是倒立的我们在控制打印行数的循环中从n(给的高度)开始,若是正立的话,我们就从1开始,同时我们也要注意一下每一行打印的空格和其他符号与控制行高的循环变量的关系。
如下以n=3为例,列举一些比较基本的例题:
题1 输入一个正整数n(1<=n<=9),打印一个高度为n的,由“*”组成的等腰三角形,当n=3时,输出
如下的等腰三角形图案
代码如下:
#include <stdio.h>
int main()
{
int i, j, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)//用于控制行数
{
for (j = n - i; j > 0; j--)//此循环用于控制打印每行前面的空格
{
printf(" ");
}
for (j = 1; j <= 2 * i - 1; j++)//此循环用于控制每行“*”的打印
{
printf("*");
}
printf("\n");//完成每行的打印后进行换行
}
return 0;
}
打印如下图形:
#include <stdio.h>
int main()
{
int i, j, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)//用于控制行数
{
for (j = 1; j <= i ; j++)//此循环用于控制每行“*”的打印
{
printf("*");
}
printf("\n");//完成每行的打印后进行换行
}
return 0;
}
打印如下图形;
代码如下:
#include <stdio.h>
int main()
{
int i, j, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)//用于控制行数
{
for (j = n - 1; j > 0; j--)//控制每一行的空格
{
printf(" ");
}
for (j = 1; j <= i ; j++)//此循环用于控制每行“*”的打印
{
printf("*");
}
printf("\n");//完成每行的打印后进行换行
}
return 0;
}
以上是一些正着放置的图形,接下来我们一起来看一下倒立的图形
打印如下图形:
代码如下;
int main()
{
int i, j, n;
scanf("%d", &n);
for (i = n; i > 0; i--)//倒立的图形与正立的图型区别在这里,倒立从n开始比较
//简单,正立从1开始比较简单
{
for (j = n - i; j > 0; j--)//控制每一行的空格
{
printf(" ");
}
for (j = 1; j <= i ; j++)//此循环用于控制每行“*”的打印
{
printf("*");
}
printf("\n");//完成每行的打印后进行换行
}
return 0;
}
打印如下图形:
代码如下:
#include <stdio.h>
int main()
{
int i, j, n;
scanf("%d", &n);
for (i = n; i > 0; i--)//控制打印的行数
{
for (j = n - i; j > 0; j--)//控制每一行的空格
{
printf(" ");
}
for (j = 1; j <= 2*i-1 ; j++)//此循环用于控制每行“*”的打印
{
printf("*");
}
printf("\n");//完成每行的打印后进行换行
}
return 0;
}
法一;
#include <stdio.h>
int main()
{
int n, i, j, m;
scanf("%d", &n);
m = (n + 1) / 2;//将图形分成两部分进行打印
if (n % 2 != 0) {
for (i = 1; i <= m; i++)//打印上半部分的图形,类似于打印正立的图形
{
for (j = m - i; j > 0; j--)
printf(" ");
for (j = 1; j <= 2 * i - 1; j++)
{
if (j == 1 || j == 2 * i - 1)//解决空心问题
printf("*");
else printf(" ");
}
printf("\n");
}
for (i = n - m; i > 0; i--)//解决下半部分
{
for (j = m - i; j > 0; j--)
printf(" ");
for (j = 1; j <= 2 * i - 1; j++)
{
if (j == 1 || j == 2 * i - 1)
printf("*");
else printf(" ");
}
printf("\n");
}
}
else printf("Error\n");
return 0;
}
法二;利用函数对代码进行分装,简化主函数
#include <stdio.h>
void space (int k);//用space函数来打印空格
void start (int k);//用start函数来打印"*"号
int main()
{
int n,m,i;
scanf("%d",&n);
if(n%2)
{
m=(n+1)/2;
for(i=1;i<=m;i++)
{
space(m-i);
start(2*i-1);
}
for(i=m-1;i>0;i--)
{
space(m-i);
start(2*i-1);
}
}
else printf("Error\n");
return 0;
}
void space(int k)
{
int i;
for(i=0;i<k;i++)
printf(" ");
}
void start(int k)
{
int i;
for(i=1;i<=k;i++)
{
if(i==1||i==k)
{
printf("*");
}
else printf(" ");
}
printf("\n");
}
#include <stdio.h>
int main()
{
int i, j, m, n;
scanf("%d", &n);
m = n / 2;//对图形进行分割处理
for (i = m + 1; i >= 1; i--)//打印上半部分,倒立的三角形.
{
for (j = m + 1 - i; j > 0; j--)
{
printf(" ");
}
for (j = 1; j <=2 * i - 1; j++)
{
printf("*");
}
printf("\n");
}
for (i = 2; i <= m + 1; i++)// 打印下半部分,正立的去顶点三角形
{
for (j = m + 1 - i; j > 0; j--)
{
printf(" ");
}
for (j = 1; j <= 2 * i - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
代码如下:
#include <stdio.h>
int main()
{
int n, i, j;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
for (j = n - i; j > 0; j--)
printf(" ");
for (j = 1; j <= 2 * i - 1; j++)
{
if (i == n || j == 1 || j == 2 * i - 1)
printf("*");
else printf(" ");
}
printf("\n");
}
return 0;
}
代码如下:
#include <stdio.h>
int main()
{
int w, h, i, j;
scanf("%d %d", &w, &h);//w为宽度,h为高度
for (i = 1; i <= h; i++)//循环控制打印的高度
{
for (j = h - i; j > 0; j--)
{
printf(" ");
}
for (j = 1; j <= w; j++)
{
if (j == 1 || j == w || i == 1 || i == h)//控制打印星号,第一行和
//最后一行全为星号,其他的每行的第一个和最后一个为星号,其余为空格。
printf("*");
else printf(" ");
}
printf("\n");
}
}
在做图形输出的题时我们要注意图形是正立还是倒立的,然后通过与外循环建立联系,对内循环进行操作,有的题目,我们可以将其转化为我们熟悉的题,如菱形,我们可以看成两个三角形,一个正立,一个倒立,然后再进行输出,将复杂问题简单化。同时,在遇到比较复杂的题时,我们可以写函数,通过函数调用,让主函数更加简洁。