![]() |
|
首页│注册│帮助 | |||
相关问题
| • | vfp的前途 |
| • | 高手帮我完成一个程序好么 上机要用 |
| • | [求助!!急]关于datagridview中行的选中问题 |
| • | 如何实现每天早上八点自动给注册用户发邮件功能?? |
| • | [求助]能否给几个frm控件给小弟用用,现谢了 |
| • | [求助]datagrid怎样完整显示日期和时间 |
| • | [分享]算法导论第二版习题答案 |
| • | 分享经验,+群吧5609869 |
待解决
两个小时写的两行代码(打印菱形问题)
看有人问输出菱形块的问题,用格式字符串写了这两行花了整整两个多小时,看来还是不够熟练
辛苦成果忍不住拿来秀一下,明天来把注释加上
/************************************************
今天加上注释(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);
刚看了你的第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段起什么作用?
("%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=?就明白了
算法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,
这样你的输出长度可以变化了
*是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]]
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]]
[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]
[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;
}
看起来感觉不是很好。。。
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]
[img]http://blog.programfan.com/upfile/200804/2008040611237.gif[/img]
回答者:雨中飛燕 -
2008-04-20 00:26:00
汉...........
回答者:bianfeng -
2008-04-20 00:17:00

