打印菱形钻石图案
第一篇博客。
说明:大一C语言作业题——打印菱形钻石图案,初版代码略微规范了一下命名和代码格式。
先附2020初版代码:关键点是行数在 (line+1)/2 上下分段处理打印。
#include <stdio.h>
#include <stdlib.h>
//打印钻石图案
int main() {
//定义变量 line是总行数,row是当前行,col是列
int line, row, col;
//实现简单交互
printf("please input line(odd needed):"); //偶数的even 奇数的odd
//接收输入
scanf("%d", &line);
while (getchar() != '\n') {;}
//打印图案功能实现
//相关条件的公式均是由以中间行为x轴,左边第一个为原点建直角坐标系找函数关系得出
//首先是图案上半部打印
for (row = 1; row <= (line + 1) / 2; row++) {
for (col = 1; col <= (line + 1) / 2 - row; col++) {
printf(" ");
}
for (col = col; col <= (line - 1) / 2 + row; col++) {
printf("*");
}
printf("\n");
}
//图案下半部打印
for (row = row; row <= line; row++) {
for (col = 1; col <= row - (line + 1) / 2; col++) {
printf(" ");
}
for (col = col; col <= (line - 1) / 2 + (line + 1 - row); col++) {
printf("*");
}
printf("\n");
}
//强制暂停,避免闪退
system("pause");
return 0;
}
附运行结果截图:
输入偶数情况时:可以打印输出图案,但不太好看。下半部分需重新设计满足美观的需求。
2021改进思路:加一次条件判断,使输入奇数时正常打印题目要求的图案,输入偶数时打印美观的伪菱形钻石图案。
改进后代码:关键点是 if (line%2 != 0) 判断总行数奇偶后分别处理。其余部分略有变化。
#include <stdio.h>
#include <stdlib.h>
//打印钻石图案
int main() {
//定义变量 line是总行数,row是当前行,col是列
int line, row, col;
//实现简单交互
printf("please input line(odd needed):");
//接收输入
scanf("%d", &line);
while (getchar() != '\n') {;}
//打印图案功能实现
//相关条件的公式均是由以中间行为x轴,左边第一个为原点建直角坐标系找函数关系得出
if (line % 2 != 0) {
//行数是奇数时打印
for (row = 1; row <= (line + 1) / 2; row++) {
for (col = 1; col <= (line + 1) / 2 - row; col++) {
printf(" ");
}
for (col = col; col <= (line - 1) / 2 + row; col++) {
printf("*");
}
putchar(10); //等价于printf("\n");
}
for (row = row; row <= line; row++) {
for (col = 1; col <= row - (line + 1) / 2; col++) {
printf(" ");
}
//col <= (line - 1) / 2 + (line + 1 - row)
for (col = col; col <= 3 * (line + 1) / 2 - row - 1; col++) {
printf("*");
}
putchar(10);
}
}
else {
//行数是偶数时打印
printf("line is even.--打印伪菱形钻石图案\n");
for (row = 1; row <= line; row++) {
if (row <= line / 2) {
for (col = 1; col <= line / 2 - row; col++) {
printf(" ");
}
for (col = col; col <= line / 2 + row - 1; col++){
printf("*");
}
putchar(10);
}
else {
for (col = 1; col <= row - line / 2 - 1; col++) {
printf(" ");
}
for (col = col; col <= 3 * line / 2 - row; col++) {
printf("*");
}
putchar(10);
}
}
}
//强制暂停,避免闪退
system("pause");
return 0;
}
附运行结果截图:
特殊的情况:
有关奇偶数的范围讨论众说纷纭,但至少我小学时学习的是对自然数(非负整数)才讨论数的奇偶之分,0是偶数,负数不讨论。
最后,代码的改进永无止境,我的代码如何再改进优化,欢迎读者留言,促进我进步。
-待优化-