入职C语言例子一(6)
前面第(3)节中,列举了一个很优雅的实现,一些朋友提醒我该程序输出不正常,自己测试了一下,确实如此。
当时写程序时,是直接以文档的方式写的,一些例程也是小伙写的程序中拷贝出来的,重在意图表现,所有的程序代码都没有测试过,缺乏了严谨性,优化如下:
for (x = -m+1; x < m; x++)
{
for (y = -m+1; y < m; y++)
{
t = abs(x) + abs(y);
if (t >= n && t < m)
printf("*");
else
printf(" ");
}
printf("\n");
}
◇
咱们书接上节,言归正传,在上一节中,新人磕磕碰碰的,终于写出了符合技术要求的程序,皆大欢喜,以为要完工了,可惜,路依旧漫漫。
此时,我会给大家分享该题目的标准答案,让大家同自己写的程序进行比对,以前的程序都是以片段方式提供的,标准答案以完整的格式提供,示意如下:
/********************************************************************
*
* Copyright (C), 1999-2004, xxxxxx. Co., Ltd.
*
* 文件名称:diamond.c
* 软件模块:空心菱形输出
* 版 本 号:1.0
* 生成日期:2003/3/23
* 作 者:xiaomaer
* 功 能:空心菱形输出,该程序占用内存小,但计算稍大,可修改为"内存换资源"算法
*
*********************************************************************/
#include <stdio.h>
/* 菱形最大高度 */
#define MAX_DIAMOND_HEIGHT 16
/* 提前申明 */
int myGreater(int n);
/* 主程序 */
int main()
{
int n, nRow;
int nIn, nOut;
int nCount1, nCount2, nCount3;
/* 输入内外菱形高度,并进行合法判断 */
for (;;)
{
printf("输入内外菱形高度(最大%d行):外菱形高度,内菱形高度:\n", MAX_DIAMOND_HEIGHT - 1);
scanf("%d,%d", &nOut, &nIn);
if (nIn < nOut && nOut < MAX_DIAMOND_HEIGHT && nIn >= 0)
break;
printf("输入不合法,请重新输入:\n\n");
}
/* 循环输出菱形 */
nIn = nOut - nIn; /* 调整为菱形内外差值 */
for (nRow = -nOut+1; nRow < nOut; nRow++)
{
//行号
printf("%-010d", nRow);
/* 输出前导空格 */
nCount1 = nRow >= 0 ? nRow : -nRow; /* 取绝对值 */
for (n = 0; n < nCount1; n++)
printf(" ");
/* 输出左边星号 */
nCount1 = nOut - nCount1; /* 外三角部分,后续迭代使用 */
nCount2 = myGreater(nCount1 - nIn); /* 内三角部分,后续迭代使用 */
nCount3 = nCount1 - nCount2; /* 内外之差为实际需要输出 */
for (n = 0; n < nCount3; n++)
printf("*");
/* 输出中间空格 */
nCount3 = 2 * nCount2 - 1; /* 由三角形拓展为菱形 */
for (n = 0; n < nCount3; n++)
printf(" ");
/* 输出右边星号 */
nCount1--; /* 外三角部分 */
nCount2 = myGreater(nCount1 - nIn); /* 内三角部分 */
nCount3 = nCount1 - nCount2; /* 内外之差为实际需要输出 */
for (n = 0; n < nCount3; n++)
printf("*");
/* 输出换行 */
printf("\n");
}
return 0;
}
/* 取大于0的数 */
int myGreater(int n)
{
if (n < 0)
return 0;
return n;
}
不知正在阅读的你看到这个标准答案的感觉,能否寻找出和自己程序的差异的地方,下一节我们以此程序为起点,给大家介绍一些真实产品中的代码特点。
我是小马儿,一个渴望良知与灵魂的工程师,欢迎您的陪伴与同行。
|