您的位置:首页 > 编程语言 > C语言/C++

C语言中输出菱形图的一点感悟

2012-03-16 19:23 176 查看
C语言输出菱形图的一点感悟

有这么一道题:编制输出以下图案的的程序。



或许对于刚学过C语言的新手朋友来说,这是一个很简单的题,编写多个printf输出语句不就能够得到它嘛,不错,的确如此,但当我问你当我们中间最长的那排数字很大时,是不是也用同样的方法去获得呢?上述方法显然是不可取的,我们有多重方法可以实现它,这就是C的灵活性,这里介绍一个很简单的方法,废话不多说,首先贴出源码,咱们再依照他解释:



下面对代码进行解释:

首先定义两个宏用MIDDLE值得第一个*在40列出输出,而STAR则代表多个“*”或“0”的字符,11行输入n值,则输出的行数为和中间最宽的那一行均为2*n-1,第一个for循环用于输出上三角,第二个则输出下三角。相对应的输出sp-1个空白符的时候,同时输出2*i-1个“*”或“0”字符,这个有我们自己定,这里有必要解释一下,关于17行语言的代码:

printf("%*c %.*s\n", sp - 1, ' ', 2*i-1, STAR);
首先说一下关于%*中的*号,在这里叫做赋值抑制符。他的作用是:标准说法:星号(赋值抑制符)对赢的输入项按要求被扫视输入,但结果不存贮,带星号的说明不对应输入数据存贮地址,用它来跳出一个输入数据项(这是向对于scanf输入来说的),

在这里,对于printf来说,以11行代码为例,%*c字符“*”表示输出域由对应的输出项来确定,上述“*”对应的输出项是sp-1(假设sp-1等于4),那么%*c就相当于%4c,那么他就以%4c的格式输出' ' (空格)。 同样的对应%.*s也相类似,但这里注意了为%.*s而非%*s

(里面有点'.'),如果你误写成后者,这样会得不到正确的结果哦!那么%.*s 和%*s到底有什么区别呢?%*s用法类似于%*c,

c输出元值为其ASCII码的字符,而s则代表输出的一个字符串,
(1)用格式符“%c”输入或输出一个字符,即逐个字符输入输出。
(2)用“%s”,则将整个字符串一次输入或输出。
举例:如果S = ABCDEF
那么对于printf("%3s, %4.2s, %-7.4s, %.5s", s, s, s, s);则输出
ABCDEF, AB,ABCD ,ABCDE
如果懂了这个,相信大家也就知道%.*s怎么用了吧!

这里值得一提的是,对于宏STAR的定义里面的字符数必须做够多,否则当我们把n输入很多后,可能自得不到我们预期的结果,即输出的可能就不会是菱形了,这个大家可以验证一下,那么这是为什么了,因为%.*s的输出总要依赖于STAR,当前要求输入很大时,而STAR有不够提供,那么当然会出现问题了,

利用STAR的字符数多少,我们还可以相应的变换输出的图案,可以实现多种不同的图形哦,有兴趣不妨试一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: