用循环打印菱形_C语言算法
2012-07-10 16:12
225 查看
菱形打印
打印菱形在控制台的思路是,把菱形上下拆分,分两段很接近的代码来打印, 其实这样代码很不好看,并且不好阅读 我们知道,要打印的图案是这种:
*
***
*****
***
*
满足上下对称,左右对称,那么,你能不能也弄一个二重循环,同样是对称的? 很简单,首先我们要抛开习惯性思维,for循环不一定要在0开始或者0结束 我们可以让循环从 -c 到 c ,这样不就轻松产生一个对称的吗?(只要取个绝对值) 我们把菱形的中心看成是坐标0,0,那么,会输出星号的坐标,是 |x| + |y| <= c 的点。
#include <stdio.h>
#define IABS(x) ( (x) >= 0 ? (x) : -(x) )
//定义一个计算绝对值的宏
void print(int
size) // size是这个菱形的半径,直径会是size * 2 + 1
{
int x, y;
for (y = -size; y <=
size; y++)
{ for (x = -size; x <=
size; x++)
{ if ( IABS(x) +
IABS(y) <= size
) //x和y各自的绝对值的和,即 |x| + |y| <= size
putchar('*');
else putchar(' ');
}
putchar('\n');
}
}
int main()
{ print(5); //输出一个半径为5的菱形
return 0;
}
如果我需要得到空心菱形呢?非常非常简单,因为菱形边界上的点,满足的是|x| + |y| == c 所以,我们只要把那个if里的小于等于号,改成双等于号 == 就可以了。
再类似地,如果我不要*号,我要最外层是字母A,然后里一层是B这样呢?
即:
A
ABA
ABCBA
ABA
A
那么,我们只要在putchar那里做一个字符计算:
void print(int
size) // size是这个菱形的半径,直径会是size * 2 + 1
{ int x, y;
for (y = -size; y <=
size; y++)
{ for (x = -size; x <=
size; x++)
{ if ( IABS(x) +
IABS(y) <= size
) //x和y各自的绝对值的和,即 |x| + |y| <= size
putchar( 'A'
+ (size - IABS(x) -
IABS(y)) ); //留意这里的计算方法
else putchar(' ');
} putchar('\n');
}
}
类似地,如果我们要打印的是X形:
* *
* *
*
* *
* *
同样可以利用这个思路完成。
打印菱形在控制台的思路是,把菱形上下拆分,分两段很接近的代码来打印, 其实这样代码很不好看,并且不好阅读 我们知道,要打印的图案是这种:
*
***
*****
***
*
满足上下对称,左右对称,那么,你能不能也弄一个二重循环,同样是对称的? 很简单,首先我们要抛开习惯性思维,for循环不一定要在0开始或者0结束 我们可以让循环从 -c 到 c ,这样不就轻松产生一个对称的吗?(只要取个绝对值) 我们把菱形的中心看成是坐标0,0,那么,会输出星号的坐标,是 |x| + |y| <= c 的点。
#include <stdio.h>
#define IABS(x) ( (x) >= 0 ? (x) : -(x) )
//定义一个计算绝对值的宏
void print(int
size) // size是这个菱形的半径,直径会是size * 2 + 1
{
int x, y;
for (y = -size; y <=
size; y++)
{ for (x = -size; x <=
size; x++)
{ if ( IABS(x) +
IABS(y) <= size
) //x和y各自的绝对值的和,即 |x| + |y| <= size
putchar('*');
else putchar(' ');
}
putchar('\n');
}
}
int main()
{ print(5); //输出一个半径为5的菱形
return 0;
}
如果我需要得到空心菱形呢?非常非常简单,因为菱形边界上的点,满足的是|x| + |y| == c 所以,我们只要把那个if里的小于等于号,改成双等于号 == 就可以了。
再类似地,如果我不要*号,我要最外层是字母A,然后里一层是B这样呢?
即:
A
ABA
ABCBA
ABA
A
那么,我们只要在putchar那里做一个字符计算:
void print(int
size) // size是这个菱形的半径,直径会是size * 2 + 1
{ int x, y;
for (y = -size; y <=
size; y++)
{ for (x = -size; x <=
size; x++)
{ if ( IABS(x) +
IABS(y) <= size
) //x和y各自的绝对值的和,即 |x| + |y| <= size
putchar( 'A'
+ (size - IABS(x) -
IABS(y)) ); //留意这里的计算方法
else putchar(' ');
} putchar('\n');
}
}
类似地,如果我们要打印的是X形:
* *
* *
*
* *
* *
同样可以利用这个思路完成。
相关文章推荐
- C语言用for循环打印菱形
- Java多重循环算法问题:(九九乘法表、打印平行四边形、打印空心菱形、打印菱形、搬砖问题、斐波那契数列、猴子吃桃问题、回文数、1!+2!+...+20!)
- 运用递归搞定单次循环打印菱形的问题
- C语言打印菱形
- 偶数支足球队进行单循环比赛,按照指定算法打印每轮的对阵形势
- C语言空心菱形 *号打印图形
- 用for循环打印菱形
- 【C语言】把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句。
- c语言打印菱形
- java 打印菱形算法
- 菱形打印程序——谈如何学习算法
- C语言实现打印各种菱形
- if--else的练习,for练习,算法,金字塔,菱形打印
- 打印一个菱形(C语言)
- C语言 打印一个用字符表示的菱形或正(倒)三角形
- 用c语言在屏幕上打印出一个菱形
- C语言打印菱形的几种方法
- 使用C语言,利用for循环打印菱形(每个相邻菱形都要带空格)
- 循环打印算法:不拘一格编程序之一 推荐
- for循环图形打印(三角形菱形实心/空心,字母K)