麻辣堂|资源主站|开发论坛|在线手册
首页注册帮助 
Delphi for php 交流论坛
  您现在的位置:Unix5开源世纪 > U5编程社群 > 详细内容
待解决
两个小时写的两行代码(打印菱形问题)
悬赏分:20 - 2008-04-20 00:04:00

两个小时写的两行代码(打印菱形问题)

看有人问输出菱形块的问题,用格式字符串写了

这两行花了整整两个多小时,看来还是不够熟练

辛苦成果忍不住拿来秀一下,明天来把注释加上



/************************************************

今天加上注释(printf函数*的使用)

算法说明:

把printf函数作为一个m的函数f(m),用两个字符串拼成

每行要输出的格式,一个字符串是空格字符组成,另一个

存放*号,因为字符无法重用,所以每个字段都加上了

字符串结束符。

为了方便思考,所有的位置控制都用m控制。

而m是循环变量i的一个映射。这个映射就想了有一个小时。

对于i从1到7,m分别是1,2,3,4,3,2,1

借助整数除法不进行四舍五入的特性,终于找到下面

一个式子表示这个折线:

m=i-(i/4)×(i mod 4)×2

************************************************/

#include<stdio.h>



int main()

{

    int i,m;

    for(i=1,m=1;i<8;i++,m=i-(i/4)*(i%4)*2)

        printf("%*s%*s
",4-m,"    "+m-1,2*m-1,"** **   **     *"+m*(m-1));

    return 0;

}



[[it] 本帖最后由 moonwalker 于 2008-4-20 10:05 编辑 [/it]]
提问者:moonwalker 2008-04-20 00:04:00
答复
[quote][bo]以下是引用 [un]yaozidm124[/un] 在 2008-4-20 17:30 的发言:[/bo]

刚看了你的第5个解法,看起来很简洁,唯一不懂的就是
("%s%*s ",p+m,2*m-2,p-2*m+8)
能解释一下括号内用逗号隔开的4段起什么作用? [/quote]
三个参数
param1:对应%s,是常量字符串指针加偏移
param2: 对应%*s中的*,指定param3输出的位数
param3: 对应%*s中的s,类同param1
其实每行也是用两个字符串拼的,你改成下面这样看看
printf("%s ",p+m);
回答者:moonwalker - 2008-04-20 17:47:00
刚看了你的第5个解法,看起来很简洁,唯一不懂的就是
("%s%*s ",p+m,2*m-2,p-2*m+8)
能解释一下括号内用逗号隔开的4段起什么作用?
回答者:yaozidm124 - 2008-04-20 17:30:00
这个是为了让字符串终止的,不然会一直把所有的字符都输出
回答者:moonwalker - 2008-04-20 17:14:00

回复 16# 的帖子

继续问个SB问题
  代表什么?
回答者:yaozidm124 - 2008-04-20 17:12:00
%s是输出字符串,你可以去看看我那个整理的帖子,
第五个解法对字符串做了一些改进
回答者:moonwalker - 2008-04-20 16:56:00

回复 12# 的帖子

%*s   中的s是格式控制字符吗?这个我在书上没有看到,只看到%d   %4d  %c
回答者:yaozidm124 - 2008-04-20 16:52:00

回复 13# 的帖子

哦,知道了,只看i大于4的情况去了,没有看到i<4的时候,这个映射写得好啊
回答者:yaozidm124 - 2008-04-20 16:48:00
[quote][bo]以下是引用 [un]yaozidm124[/un] 在 2008-4-20 16:26 的发言:[/bo]

算法m=i-(i/4)×(i mod 4)×2
里面的(i/4)可以不要吗?
[/quote]
对于函数m=f(i);做映射
你依次带入i=0,i=1,...,i=7看看m=?就明白了
回答者:moonwalker - 2008-04-20 16:43:00
我在1楼写了一些说明
*是printf函数的一个修饰符,用于用变量控制输出宽度
例如
printf("%*s",10,"string");
表示输出字符串占用长度为10,好处是你可以用变量i来替代10,
这样你的输出长度可以变化了
回答者:moonwalker - 2008-04-20 16:39:00
补充一下,,主要不知道这个("%*s%*s    是什么意思?
回答者:yaozidm124 - 2008-04-20 16:28:00
看不很懂  LZ 能详细解释一下
for(i=1,m=1;i<8;i++,m=i-(i/4)*(i%4)*2)
printf("%*s%*s ",4-m,"   "+m-1,2*m-1,"** **   **     *"+m*(m-1));
吗?还有飞燕的,好简单,更是看不懂了!论坛里面其他的关于菱形问题的帖子我也看了,显得复杂多了,不过对于新手的我来说还是容易懂点
算法m=i-(i/4)×(i mod 4)×2
里面的(i/4)可以不要吗?

[[it] 本帖最后由 yaozidm124 于 2008-4-20 16:36 编辑 [/it]]
回答者:yaozidm124 - 2008-04-20 16:26:00
终于找到用一个字符串的办法了,一会整理一下
希望能抛砖引玉,打开大家的思路
回答者:moonwalker - 2008-04-20 12:20:00
这规律找的。。。
回答者:yxwsbobo - 2008-04-20 08:36:00
很感谢,从你这个代码有了不少启发
发现我的思路有时候比较僵化。
为了用一个循环搞定,花了很大功夫想怎么映射
却没有想到用负数
回答者:moonwalker - 2008-04-20 01:02:00
[color=#ff0000]#include [/color][color=#000000]<stdio.h>[/color]
[color=#ff0000]#define [/color][color=#000000]ABS(a)  (a<[/color][color=#800080]0[/color][color=#000000]?-a:a)[/color]
[color=#ff0000]#define [/color][color=#000000]J       ABS(i)[/color]
[color=#ff0000]#define [/color][color=#000000]N       [/color][color=#800080]3[/color]
[color=#0000ff]int [/color][color=#000000]main()[/color]
[color=#000000]{[/color]
    [color=#0000ff]int [/color][color=#000000]i;[/color][color=#0000ff]char[/color][color=#000000]*p=[/color][color=#ff00ff]"*"[/color][color=#000000];[/color]
    [color=#0000ff]for[/color][color=#000000](i=-N;i<=N;++i)[/color]
    [color=#000000]printf([/color][color=#ff00ff]"%*s%*s "[/color][color=#000000],J+[/color][color=#800080]1[/color][color=#000000],p,(N-J)*[/color][color=#800080]2[/color][color=#000000],&p[J==N]);[/color]
    [color=#0000ff]return [/color][color=#800080]0[/color][color=#000000];[/color]
[color=#000000]}[/color]

[img]http://blog.programfan.com/upfile/200804/2008040611237.gif[/img][color=white]

[[it] 本帖最后由 雨中飛燕 于 2008-4-20 00:57 编辑 [/it]]
回答者:雨中飛燕 - 2008-04-20 00:53:00
那我也写点东西吧

[img]http://blog.programfan.com/upfile/200804/2008040611237.gif[/img]
回答者:雨中飛燕 - 2008-04-20 00:42:00
[quote][bo]以下是引用 [un]雨中飛燕[/un] 在 2008-4-20 00:26 的发言:[/bo]

看起来感觉不是很好。。。

http://blog.programfan.com/upfile/200804/2008040611237.gif [/quote]
嗯,我也觉得,主要是因为这个字符串不能重用,/0实在是太丑了,呵呵
如果重用的情况可以整齐一点点
#include<stdio.h>

int main()
{
        int i,j;
        for(i=1,j=13;i<7;i++,j--,j--)
        printf("%*s ",11+i,"* * * * * * * *"+j);
        return 0;
}
回答者:moonwalker - 2008-04-20 00:38:00
看起来感觉不是很好。。。

[img]http://blog.programfan.com/upfile/200804/2008040611237.gif[/img]
回答者:雨中飛燕 - 2008-04-20 00:26:00
汉...........
回答者:bianfeng - 2008-04-20 00:17:00
我也来回答:
不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

为防止灌水,您需要计算一道数学题: 答案:
82 + 47 = ? 请将计算结果填在上面

 
[]
©2007 PhpRes.COM