C_and_CPP 板


LINE

※ 引述《fjf1980 (Yes We Can!)》之铭言: : 我今天无聊自己玩画一个图形,就是给定高及宽都是奇数,画一个类似以下图形 : 1 *********** : 2 ***** ***** : 3 **** **** : 4 *** *** : 5 ** ** : 6 * * : 7 ** ** : 8 *** *** : 9 **** **** : 10***** ***** : 11*********** : 花了我好久时间,写出来一个程式,但是感觉真的是很逊的程式 : 在底下,请问有没有高手能对这图形有比较好的写法 比较好的写法小弟不清楚, 但是看到这题不知道为什麽就手很痒.... 然後就写了一个有点恶心加些恶搞的版本, 字串加递回胡搞瞎搞版XD == #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSTAR 79 int length = 21; void print_star(char *StarLine, char *StarLeft, char *StarRight, int level) { char StarPrint[MAXSTAR] = { 0 }; int left = length/2+1, right = length/2; strncat(StarPrint, StarLeft, left); strncat(StarPrint, StarRight, right); printf("%s\n", StarPrint); if(level >= length/2) return; else print_star(StarLine, StarLeft+1, StarRight-1, level+1); printf("%s\n", StarPrint); StarPrint[0] = '\0'; } int main(void) { char *StarLeft, *StarRight; char StarLine[MAXSTAR*2] = { 0 }; int i, j; for(i=0; i<=length/2; ++i) StarLine[i] = '*'; StarLeft = &StarLine[0]; for(i=length/2+1, j=0; j<length-2; ++j) StarLine[i+j] = ' '; StarRight = &StarLine[i+j+1]; for(i=i+j, j=0; j<length/2+1; ++j) StarLine[i+j] = '*'; StarLine[i+j] = '\0'; print_star(StarLine, StarLeft, StarRight, 0); system("PAUSE"); return 0; } == 感觉应该可以再省掉几个变数, length在不超过MAXSTAR的情况下可以改.... 因为偷懒所以没有做奇偶数检查, 跑到console的最大奇数宽79还不会爆喔:) == 简单的说, main函数在产生一个特殊的char string - StarLine[]; 接着设定一左一右两个指标指着它, 然後递回边印边移动指标送.... Ex: length = 11 时.... [length-2的' '] / [左右各为length/2+1的'*'] StarLine[]内容为: "****** ******" ^ ^ 左指标 右指标(右指指在右半第二个*没错喔) 递回每一轮, 从左指标印length/2+1个char, 从右指标印length/2个char.... 於是就刚好印出: [左]"******"[右]"*****" => "***********" 这里我用strncat()做是因为不用回圈我不知道怎麽指定印N个char....Orz print_star()里的StarPrint正好就拿来当strncat()的temp.... 自己有一份独立的空间好处是後面下半部就可以直接印(stack没爆的话~_~) 印完以後递回呼叫时, 左指标右移一个char, 右指标左移一个char.... 於是第二轮会印: [左]"***** "[右]"*****" => "***** *****" 然後第三轮会印: [左]"**** "[右]" ****" => "**** ****" 印到第length/2+1层的时候递回就不需要再呼叫下去了.... (其实这里也可以用右指标-左指标>=length-2来判断, 但懒得改了^^||) == 说恶搞, 也不过是把印的回圈藏在strncat里.... 把上下对称反转的部份藏在递回里cover掉啦.... 一开始的发想是总觉得"****** ******"这东西好像可以利用.... 然後想一想, 推一推, 画画图, 还被左右*怎麽对称与不对称卡了好久.... 最後又把递回给加上去就变成这付德性了, 还请大大们鞭小力一点<(_ _)> --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.174.98 ※ 编辑: VictorTom 来自: 220.132.174.98 (10/27 01:06)
1F:→ VictorTom:递回终止照文章()里写的有错, 反正推一下就有了XDD 10/27 01:25
Edit: 忘了用BBSCode标色工具, 补用一下....@_@" ※ 编辑: VictorTom 来自: 220.132.174.98 (10/27 01:50)
2F:推 fjf1980:V大真的太强了@@ 这是我无聊想到的一个图形 想写写看 10/27 08:59
3F:→ fjf1980:但我写不出来V大 还有上面另一位高手的漂亮写法呀 >"< 10/27 08:59
4F:→ VictorTom:s大的写法才是比较简单的写法, 小弟这写法只是在搞怪XD 10/27 09:00
5F:→ VictorTom:主要的想法是, 这图形里左右上下对称(不考虑奇数中间), 10/27 09:01
6F:→ VictorTom:怎麽把做印'*'与印' '判断的地方有效率的"写成code":) 10/27 09:02
7F:→ VictorTom:即, 找出规律, 合并相关算式, 然後组合成像s大那样@_@" 10/27 09:03
8F:→ VictorTom:如果有些其他(奇怪)的idea, 就是努力实作看看如何罗^^ 10/27 09:05
9F:推 fjf1980:我觉得这就是逻辑思考好坏的差别 我逻辑差 所以写不好 >"< 10/27 09:06
10F:→ VictorTom:小弟我觉得这种能力是可以训练的, 多做多练习些题目应该 10/27 09:13
11F:→ VictorTom:会比较有感觉(像ACM?), 虽然可能和那些聪明的不能比Q_Q~ 10/27 09:14
12F:→ VictorTom:总觉得那些去参加比赛的人都利害到不知该崇拜还是敬畏^^ 10/27 09:16







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP