| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2619 人关注过本帖, 1 人收藏
标题:两个小时写的两行代码(打印菱形问题)
取消只看楼主 加入收藏
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏(1)
 问题点数:0 回复次数:8 
两个小时写的两行代码(打印菱形问题)
看有人问输出菱形块的问题,用格式字符串写了
这两行花了整整两个多小时,看来还是不够熟练
辛苦成果忍不住拿来秀一下,明天来把注释加上

/************************************************
今天加上注释(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\n",4-m,"    "+m-1,2*m-1,"*\0* *\0*   *\0*     *"+m*(m-1));
    return 0;
}

[[it] 本帖最后由 moonwalker 于 2008-4-20 10:05 编辑 [/it]]
搜索更多相关主题的帖子: 菱形 打印 代码 
2008-04-20 00:04
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
[bo]以下是引用 [un]雨中飛燕[/un] 在 2008-4-20 00:26 的发言:[/bo]

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

http://blog.

嗯,我也觉得,主要是因为这个字符串不能重用,/0实在是太丑了,呵呵
如果重用的情况可以整齐一点点
#include<stdio.h>

int main()
{
    int i,j;
    for(i=1,j=13;i<7;i++,j--,j--)
    printf("%*s\n",11+i,"* * * * * * * *"+j);
    return 0;
}

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 00:38
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
很感谢,从你这个代码有了不少启发
发现我的思路有时候比较僵化。
为了用一个循环搞定,花了很大功夫想怎么映射
却没有想到用负数

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 01:02
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
终于找到用一个字符串的办法了,一会整理一下
希望能抛砖引玉,打开大家的思路

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 12:20
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
我在1楼写了一些说明
*是printf函数的一个修饰符,用于用变量控制输出宽度
例如
printf("%*s",10,"string");
表示输出字符串占用长度为10,好处是你可以用变量i来替代10,
这样你的输出长度可以变化了

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 16:39
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
[bo]以下是引用 [un]yaozidm124[/un] 在 2008-4-20 16:26 的发言:[/bo]

算法m=i-(i/4)×(i mod 4)×2
里面的(i/4)可以不要吗?

对于函数m=f(i);做映射
你依次带入i=0,i=1,...,i=7看看m=?就明白了

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 16:43
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
%s是输出字符串,你可以去看看我那个整理的帖子,
第五个解法对字符串做了一些改进

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 16:56
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
这个是为了让字符串终止的,不然会一直把所有的字符都输出

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 17:14
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
[bo]以下是引用 [un]yaozidm124[/un] 在 2008-4-20 17:30 的发言:[/bo]

刚看了你的第5个解法,看起来很简洁,唯一不懂的就是
("%s%*s\n",p+m,2*m-2,p-2*m+8)
能解释一下括号内用逗号隔开的4段起什么作用?

三个参数
param1:对应%s,是常量字符串指针加偏移
param2: 对应%*s中的*,指定param3输出的位数
param3: 对应%*s中的s,类同param1
其实每行也是用两个字符串拼的,你改成下面这样看看
printf("%s\n",p+m);

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 17:47
快速回复:两个小时写的两行代码(打印菱形问题)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017938 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved