C语言实现之控制台打印正六边形
来源:互联网 发布:mac系统信息查看 编辑:程序博客网 时间:2024/04/29 20:50
起因:
前一阵子做了一道题:
从控制台用‘*’打印正空心6边形。
我看完之后郁闷了半天,控制台字符是竖长的,增么也不可能呈现出正多边形的效果过,加空格的话,一旦打印变数边长效果也不明显,后来一想不对,应该就是边多长就打印几个‘*’。其实当时有点紧张没写完,也没分析下,用了个笨方法,今天用个简单的,我们先分析一下问题。
分析:
对于从控制台打印,说白了,我们需要控制‘ ’(空格)和‘*’(星)何时打印,打印多少。我们需要控制的地方主要有3处。
B * * * * * A * * * * * ** C * * * * * A * * * * * * * B
(1)B处,因为是一行一行打印,所以要单独控制第一行和最后一行的打印,其他行肯定每次打印都只有两颗星。
(2)A处,每一行打印时,控制台左边到第一颗‘*’(星)之间要补充多少‘ ’(空格)。
(2)C处,每一行打印时,除了第一行和最后一行两个边,其他边两颗星之间需要补充多少‘ ’(空格)。
控制台就是一个大矩阵,打印数量之间肯定有数量关系(废话)。可以把这个打印抽象成两个函数(数学上的函数,不是写程序里说的那个函数),者3个更或者4个,当然我们说最简单的2个的——就是第一行和最后一行一个函数,中间的一个函数。
思路:
我想单独用变量行号控制(当然还有边长,不过一旦确定是就不变了,所以是个常数),但对于补充的空格边上是先减后增,中间是先增后减,要用一个变量控制的话我们肯定想到绝对值函数(y=|x|),特殊就特殊在函数有一个非常明显的拐点,且以此点做垂直于横轴的线,将左右两部分图形对称,通过合理的控制它,我们就能实现用一个变量在某个特定的值前后对称增减了。
设行号为L,第一行行号为0,L属于非负整数,正六边形边长为N,N属于非负整数。
对于在控制台上打印,边长为N的正六边形要打印 2 * N - 1 行。
控制台左边到第一颗星之间要补充|N - L - 1|个空格(注意两旁的绝对值符号)。
除第一行和最后一行,中间每行在两个‘*’(星)之间要补充N + (N - 2) * 2 - ((|L + 1 - N|) * 2)个空格,化简一下3 * N - 4 - ((|L + 1 - N|) * 2)。
好了,我们有了需要的式子。
实现:
/**************************************函 数:void prt(char c, int count) **参 数:指定字符,打印数量 **功 能:打印指定数量的指定字符 **返 回:无 **************************************/void prt(char c, int count){ while(count--) { printf("%c", c); }}/**********************函 数:int main() **参 数:无 **功 能:主函数 **返 回:0 **********************/int main(){ int N, L = 0; scanf("%d", &N); //循环打印每一行 for(; L < 2 * N - 1; L++) { prt(' ', abs(N - L - 1)); //补充控制台到每行第一颗星的空格 //第一行和最后一行单独处理 if(0 == L || L == 2 * N - 2) { prt('*', N); } else { prt('*', 1); //prt(' ', N + (N - 2) * 2 -(abs(L + 1 - N) * 2)); prt(' ', 3 * N - 4 -(abs(L + 1 - N) * 2)); //补充中间的空格 prt('*', 1); } puts(""); //换行 } return 0;}
总结:
第一次我一上来就写,分了3段,用了3个变量,现在分析一下之后,找到数量关系貌似简单了不少,不到20行(去掉花括号)就搞定了,以后一定要先分析一下再做,能省不少功夫。
- C语言实现之控制台打印正六边形
- C语言打印正六边形
- c语言控制台 之 弹幕实现
- 正六边形
- 实现正六边形、圆形及带倒角正六边形的头像显示
- 输出正六边形
- scss/css正六边形
- canvas画正六边形
- 链表的正逆序打印 java语言实现
- C语言控制台打印3D爱心图案
- C语言之打印菱形
- C语言实现控制台背景闪烁
- Android系统C语言控制台工程实现
- 控制台开启邮箱--C语言实现
- python实现控制台打印
- 五刀均分正六边形
- iOS截取正六边形图片
- javascript实现“*”打印正菱形
- 电脑右击管理不管用
- 一滴泪水能够承载多少的爱?
- 使用NSOperationQueue简化多线程开发 (二) 队列的优先级
- 记录一下linux errno的定义位置
- 垂直SNS
- C语言实现之控制台打印正六边形
- 用数组顺序栈实现表达式运算(中缀表达式)
- Linux通过Samba服务器实现Windows文件共享
- 计算贷款还钱数
- 文件字节流与文件字符流
- 撞错
- Java迭代器(转)(iterator详解以及和for循环的区别)
- 爱的太深终究会是伤 莫沧分享伤感日志
- 简单封装一个供自己使用的工具类