/*
* 打印程序主要是针对图形算法的考察
* 怎样安排字符的位置,对于图形主要是怎样安排象素的位置
* 终端程序有个特点,只能按序输出
* 当然可以使用'\b'来回退一个字符,但是也限于行内
* 你也可以直接操作终端,但是这个不在考察范围内
*/
/*
* 根据上面的分析可知,使用二维数组模型是最好的存储结构
* 在数组中安排相应元素的位置
* 但是终端使用的是按行输出,所具体的元素的位置可以在输出的时候进行计算
* 所以可以使用线性表的结构来做为无素的存储结构
* 这里我个人认为双端队列比较好用
*/
// 打印星星
// *
// * *
// * * *
// * * * *
//* * * * *
// * * * *
// * * *
// * *
// *
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int n = 5;
char **star;
int len = n + n - 1;
star = (char **)malloc(sizeof(char*) * len);
for (int i=0; i<len; ++i) {
star[i] = (char *)malloc(sizeof(char) * len);
memset(star[i], ' ', sizeof(char) * len);
}
for (int i=0; i<len; ++i) {
int star_num = i<n-1 ? i+1 : n+n-i-1;
int j = i<n-1 ? n-1-i : i-n+1;
for (int k=0; k<star_num; ++k) {
star[i][j] = '*';
j += 2;
}
}
for (int i=0; i<len; ++i) {
for (int j=0; j<len; ++j) {
putchar(star[i][j]);
}
putchar('\n');
}
for (int i=0; i<len; ++i) {
free(star[i]);
}
free(star);
return 0;
}
没有使用数组的情况
#include <stdio.h>
int main() {
int n = 5;
int len = n + n - 1;
for (int lv=0; lv<len; ++lv) {
int star_num = lv < n-1 ? lv+1 : n + n - lv - 1;
int pos = lv < n-1 ? n-1-lv : lv-n+1;
printf("%*s", pos, "");
for (int i=0; i<star_num; ++i) {
putchar('*');
putchar(' ');
}
putchar('\n');
}
return 0;
}
虽然打印程序的第二种情况看似简单一点,其实和第一个程序和第二程序的核心算法是一致的, 但是第一种算法实现了一个计算和输出的分离,这个思想在图形算法中经常用到的!!!