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     }

解法二:直接打印

 1 void printGraph(char c)

 2 {

 3     

 4     int sizeUp, sizeDown, size, m, n;

 5     //获取构造字符串的大小

 6     size = ((c + 1) - 'A') * 2;

 7     //计算上半部分的行数

 8     sizeUp = sizeDown = size / 2;

 9     char b = 'A';

10     m = n = sizeUp - 1;

11     //此部分用于打印上半部分图形

12     //此循环用于控制打印的行数

13     for (int k = 1; k <= sizeUp; k++) {

14         //控制空格数

15         for (int m = 0; m < sizeUp - k; m++) {

16             printf(" ");

17         }

18         //控制每一行的第一个字符为A

19         b = 'A';

20         //控制每一行打得字符数

21         for (int j = 0; j < 2 * k - 1; j++) {

22             //控制当打印字符到正中间前,字符递增

23             if (j < k) {

24                 printf("%c", b++);

25                 //当字符到正中间时字符减1

26                 if (j == k - 1) {

27                     b--;

28                 }

29             }else{

30                 printf("%c", --b);

31             }

32         }

33         printf("\n");

34        

35         m--;

36         n++;

37     }

38     //此部分用于控制打印下半部分图形

39     //此循环用于控制打印行数

40     for (int i = sizeDown; i > 0; i--) {

41         //此循环用于控制每行的空格数

42         for (int j = sizeDown; j > i; j--) {

43             printf(" ");

44         }

45         //控制每次打印的第一个字符递减

46         char temp = c--;

47         //控制每一行打印的字符个数

48         for (int k = 0; k < 2 * i - 1; k++) {

49             //当k 小于字符'A出现的位置时

50             if (k < i - 1) {

51                 printf("%c", temp--);

52             }else{

53                 printf("%c", temp++);

54             }

55         }

56         printf("\n");

57     }

58 }

 

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

输入:"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 }

 

你可能感兴趣的:(C语言)