如何实现C语言编程输出空心菱形
下面以 5 行 ,n=5, 作为对称轴的空心菱形为例一起来寻 如何实现 C 语言编程输出空心菱形 。 根据在 C 当中写代码的经验, 一般打印菱形等图案时, 常 C 语言是一种通用的程序设计语言 。 结 构 简 单 , 数 据 。 观察图形和累积经验, 这个空心菱形应 规思路是分模块打印, 运算灵活方便, 用它编写的程序表达能力强, 目标 类型丰富 , 进而上下两部分和行列之间有什么 该分上下两个部分来打印, 可移植性好, 既具有高级语言的优点, 又具有低 代码效率高, 仔细来观察图 2, 首先标示出每一行和每一列的行号 联系呢, 利用它能够有效地编制各种系统软件和应用软 级语言的特点, 其次寻上半部分之间的联系。 观察图 2 中 1-5 行的 和列号, 是比较流行的一门语言。 件规律, ,假设行号用 i 表示, 列号用 j 表示,
在 C 语言地中, 顺序、 循环和选择结构的交替使用是频率 表 1 。 很多初学者在上机实践的时候往往会看到下面类似 比较高的
的题目, 编程打印下列钻石图形 ,如图 1,。 行号星号所在的列
i j
1 5 5 2 4 6 3 3 7 4 2 8 5 1 9 行列关系6-i 4+i 与 值关系 n+1-i n-1+i n
观察表 1, 不难写出以下语句, if(j=n+1-i || j=n-1+i)
printf("*");
else
printf(" "); 然后, 再结合行列的循环关系即有, 图 1
for(i=1;i<=n;i++)
{
for(j=1;j<=n+i-1;j++)
if(j==n+1-i || j==n-1+i)
printf("*");
else
printf(" ");
printf("\n");
}
紧接着, 观察图 2 中 6-9 行的规律。 为了使寻到的规律
中和行列号建立的关系数值相对简单且小, 假使行号重新从 1
开始排列, 即寻的是下半部分的 1-4 行的规律, 如表 2 所示。
图 2 表 2
行号星号所在的列有的题目还会追加要求 ,比如:用 printf 语句打印出一个星 i j 号或一个空 格 , 尽可能少地使用 printf 语句或者其他的要求 , 1 2 8 由键盘输入正数 n, 要求输出 2*n+1 行的空心菱 形 图 案 。 , 初 2 3 7 , 往往感到很头痛, 不知从何入手。 而大多 学者遇到这类题目3 4 6 4 5 5 对于该类题目只给出代码 , 并没有过多的解 数 C 语言教材 , 行列关系i+1 9-i 释, 初学者看了以后竟然不知所云。与 值关系 n 2n-1-i 那么针对此类问题究竟应该从何入手分析呢。 观察图形得
观察表 2, 不难写出以下语句, , 每一行和每一列的星号和空格, 它们出现的位置并非杂乱 知
, 都呈现出一定的规律。 现在的问题转化为如何出这 无章的if(j=i+1 || j=2*n-1-i)
些星号和空格以及行列之间的某种规律 。 只 要 这 个 规 律 到 printf("*");
else , 那么问题就迎刃而解了。 了
printf(" ");
2011. 01 91
然后, 结合行列的循环关系即有,后, 程序通常不会自动终结, 而是继续运行, 最后给出一些似
数非数、 没有用处的计算结果 , 如 , -1.#QNAN0000000000, 0 for(i=1;i<n;i++)
1.#IND000000000000 等 , 暂 且 称 其 为 “ 异 常 值 ” 。 如 果 能 -{
在 程 序 运行过程中截获异常值 , 并 退 出 程 序 , 则 能 避 够for(j=1;j<=2*n-1-i;j++)
机 时 的 浪 费 。 为了做到这一点 , 首 先 简 单 了 解 一 下 C + + 免if(j==i+1 || j==2*n-1-i)
浮点数的两种类型 , 单 精 度 float 型 和 双 精 度 dou ble 型 的 printf("*");
储 格 式 。 存else
printf(" ");
printf("\n");
}
怎么用printf输出bool函数值如此一来, 把整个空心菱形模块划分解析以后, 就变得简 1 单精度浮点数的存储格式 图 单明了了, 剩下的问题就是在刚写出的核心代码上添加 C 函数
, 的头部和尾部就可以了单 精 度 float 型 占 据 32 位 , 即 4 个 字 节 , 存 储 格 式 如 图 1
所示。 其中, S 字段占据 1 位, 表示数的正负, 0 为 正 , 1 为 #include<stdio.h>
负, Exp 字段占据 8 位, 表示指数部分, Frac字段占 据 23 位, main()
表示小数部分。 通常情况下, Exp 字段的所有位是不全为 ‘1’ {
的, 这种格式表示的浮点数数值可由下面的公式给出, int i,j,n;
clrscr();
printf("pleaseinput your number:"); scanf("%d",&n); 但是, 如果出现了上述的运算异常 , 系 统 会 把 float 型 运 for(i=1;i<=n;i++) 算结果的 Exp 字段的所有位设置为 ‘1’, 使该字段变为 0xFF, { 此时的运算结果就成为-1.#QNAN00,0 -1.#IND0000 之 类 的 异 for(j=1;j<=n+i-1;j++) , 而不能用上面的公式给出。 常值if(j==n+1-i || j==n-1+i)
printf("*");
else printf(" "); 双精度浮点数的存储格式图 2 printf("\n");
} 双精度 double型占 据 64 位, 即 8 个字节, 存储格式如图 for(i=1;i<n;i++) 2 所示。 其中, S 字段占据 1 位, 表示数的正负, 0 为正, 1 为 { , Exp 字 段 占 据 11 位 , 表 示 指 数 部 分 , Frac字 段 占 据 52 负for(j=1;j<=2*n-1-i;j++) 位 , 表 示 小 数 部 分 。 通 常 情 况 下 , Exp 字 段 所 有 位 是 不 全 为 if(j==i+1 || j==2*n-1-i)