此帖用于总结最近在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 }
时间: 2024-10-31 01:49:35