C语言图形打印题总结

此帖用于总结最近在C语言学习中遇到的图形打印题,还望大牛们指正

1.等腰三角形打印

输入一个数,打印倒等腰三角形。

如输入:5

打印:

*****

 ***

   *

分析:对于此类题目应先着手分析,查找规律

行号  空格  星号

 1   0    5

 2     1       3

 3     2       1

行数:n = (输入数字 + 1) /  2;

空格与行数的关系:空格数 = 行数 - 1;

星号:  行数 * 2 - 1;(行数由大到小控制输出)

代码如下:

复制代码
 1 void exam4()
 2 {
 3     int n, num, i, j;
 4     printf("请输入等腰三角形底边长度:");
 5     scanf("%d", &n);
 6     //计算行数
 7     num = (n + 1) / 2;
 8     //控制行数(行号倒序)
 9     for (i = num; i > 0; i--) {
10         //控制空格
11         for (j = 0; j < num - i; j++) {
12             printf(" ");
13         }
14         //控制星号
15         for (j = 2 * i - 1; j > 0; j--) {
16             printf("*");
17         }
18         printf("\n");
19     }
20 }
复制代码

2.传入一个字母,打印图形(10分)

传入:'D' ,打印如下图形:

        A

      ABA

    ABCBA

  ABCDCBA

  DCBABCD

    CBABC

      BAB

        A

分析:观察图形不难发现将图形分为上下部分打印更为简单

此图形上半部分最外层全为A,内层为B,然后为C,可以考虑先从最外层往内层打印。

观察下半部分可以发现:下半部分的图形为“DCBABCD”字符串依次往少打印两端的字符

代码如下:

复制代码
 1 void printGraph(char c)
 2 {
 3     int sizeUp, sizeDown, size, i, m, n;
 4     //获取构造字符串的大小
 5     size = ((c + 1) - 'A') * 2;
 6     //计算上半部分的行数
 7     sizeUp = sizeDown = size / 2;
 8     //构造数组
 9     char array[size][size];
10     char b = 'A';
11     m = n = sizeUp - 1;
12     //先将数组中所有位置置为空格,后面就只需要赋值
13     for (i = 0; i < sizeUp; i++) {
14         for (int j = 0; j < size; j++) {
15             array[i][j] = ' ';
16         }
17     }
18     //思考先从外而内进行赋值,即先赋值A,然后到指定字母
19     for (int k = 0; k < sizeUp; k++) {
20         for (i = k; i < sizeUp; i++) {
21             for (int j = 0; j < size; j++) {
22                 if (i + j == n || j - i == m) {
23                     array[i][j] = b;
24                 }
25             }
26         }
27         b++;
28         m--;
29         n++;
30     }
31     //输出上半部分
32     for (int i = 0; i < sizeUp; i++) {
33         for (int j = 0; j < size; j++) {
34             printf("%c", array[i][j]);
35         }
36         printf("\n");
37     }
38     
39     //构造下半部分数组
40     char fuck[size];
41     int p = 0, q = size - 2;
42     while (p <= q) {
43         fuck[p] = fuck[q] = c;
44         c--;
45         p++;
46         q--;
47     }
48     fuck[size] = '\0';
49     char array2[sizeDown][size];
50     for (i = 0; i < sizeDown; i++) {
51         strcpy(array2[i], fuck);
52     }
53     //控制打印
54     for (i = 0; i < sizeDown; i++) {
55         for (int k = 0; k < i; k++) {
56             printf(" ");
57         }
58         for (int j = i; j < size - i - 1; j++) {
59             printf("%c", array2[i][j]);
60         }
61         printf("\n");
62     }
复制代码

三、实现函数,根据输入的内容打印图形

输入:"1234567"

打印:

1234567

  2     6

   3  5

     4

   3  5

  2     6

1234567

观察图形可以发现,可以考虑遍历输入的字符串,同时设置两个标记值k, m,分别指向数组第二个和倒数第二个数,遍历数组当下表和标记值相等时,则打印出

数组中对应的字符,同时移动标记值,k++,m--;

复制代码
 1 void print()
 2 {
 3     char a[20];
 4     gets(a);
 5     int size = (int)strlen(a);
 6     int i = 0, j = 0, k = 1, m = size - 2;
 7     puts(a);
 8     for (i = 0; i < size - 2; i++) {
 9         for (j = 0; j < size; j++) {
10             if(j != k && j!= m){
11                 printf(" ");
12                 
13             }else{
14                 printf("%c",a[j]);
15             }
16         }
17         k++;
18         m--;
19         printf("\n");
20     }
21     puts(a);
22 }
复制代码

 

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值