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的字符数多少,我们还可以相应的变换输出的图案,可以实现多种不同的图形哦,有兴趣不妨试一下。
有这么一道题:编制输出以下图案的的程序。
或许对于刚学过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的字符数多少,我们还可以相应的变换输出的图案,可以实现多种不同的图形哦,有兴趣不妨试一下。
相关文章推荐
- C语言打印菱形的一点感悟
- c语言:输出一个菱形图
- c语言初学-输出菱形
- 用C语言输出由*组成的菱形
- 用C语言输出一个菱形
- C语言输出空心菱形的实现
- C语言 输入n,分别用*输出边长为n的实心菱形和空心菱形
- C语言输出菱形for循环
- 菱形的输出(C语言)
- C语言输出菱形
- [置顶] 【C语言】输出菱形星号图案
- 【C语言】使用递归的整数输出(高位到低位)/输出一个菱形(能够确定行数)
- [c语言]输入n,分别用*输出边长为n的实心菱形和空心菱形
- 用C语言输出一个菱形
- C语言输出一个菱形图案
- C语言输出菱形
- 在数组中输出汉字的一点感悟
- 【C语言】使用递归的整数输出(高位到低位)/输出一个菱形(能够确定行数)
- C语言之输出菱形
- 【C语言】用循环语句输出菱形