| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8822 人关注过本帖
标题:用C语言编五角星.请高手指教.
只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
= =结帖了,不然我还想写一个的~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 10:51
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
回复 21楼 StarWing83
来一个嘛,就算结贴也能继续。
不用图形,就以DOS下输出一格为一个像素点画不出完美的五角星(星的面积不能太大),我倒觉得我那个算是漂亮的了(但还是很丑)。

努力—前进—变老—退休—入土
2009-11-07 11:32
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
纯数学方法,如果缩放很小会很难看……(其实好像一直都很难看= =)不过绝对是标准的五角星……

输入边长就能输出五角星:
程序代码:
#include <stdio.h>
#include <math.h>
#define MIN(x, y) ((y) < (x) ? (y) : (x))
#define MAX(x, y) ((x) < (y) ? (y) : (x))
#define RAD(x) ((x) * M_PI / 180.0)
#define F1(x) (tan(RAD(162)) * (x) + 1 + cos(RAD(72)))
#define F2(x) (tan(RAD(18)) * (x) + 1 + cos(RAD(72)))
#define F3(x) (tan(RAD(54)) * (x) - sin(RAD(72)) * tan(RAD(54)))
#define F4(x) (tan(RAD(126)) * (x) + 2 + 2 * cos(RAD(72)) \
                + sin(RAD(72)) * tan(RAD(54)))
void draw_star(int scale)
{
    int i, end = rint(scale * sin(RAD(72)) / 2), end2;
    for (i = 0; i <= end; ++i)
    {
        int y1 = rint(F1(i*2.0/scale)*scale),
            y2 = rint(F2(i*2.0/scale)*scale);
        if (y1 != y2)
            printf("%*c%*c\n", y1 + 1, '*', y2 - y1, '*');
        else
            printf("%*c\n", y1 + 1, '*');
    }
    for (i = 0; i < scale; ++i)
        putchar('*');
    end2 = rint(scale * cos(RAD(72)) * 2);
    for (i = 0; i <= end2; ++i)
        putchar(' ');
    for (i = 0; i < scale; ++i)
        putchar('*');
    putchar('\n');
    for (i = end + 1; ; ++i)
    {
        int y1 = rint(F1(i*2.0/scale)*scale),
            y2 = rint(F2(i*2.0/scale)*scale),
            y3 = rint(F3(i*2.0/scale)*scale),
            y4 = rint(F4(i*2.0/scale)*scale);
        if (y4 <= y1 || y3 >= y2)
        {
            printf("%*c%*c\n", y1 + 1, '*', y2 - y1, '*');
            break;
        }
        if (y3 < y4)
        {
            int ymin = MIN(y1, y3);
            printf("%*c%*c\n", ymin + 1, '*', MAX(y2, y4) - ymin, '*');
        }
        else
            printf("%*c%*c%*c%*c\n", y1 + 1, '*', y4 - y1, '*',
                                     y3 - y4, '*', y2 - y3, '*');
    }
}
int main(void)
{
    int scale;
    while (scanf("%d", &scale) == 1)
        draw_star(scale);
    return 0;
}
/* - cc: flags+='-lm' */

输入13的输出结果:
13
                 *
                * *
                * *
               *   *
              *     *
              *     *
             *       *
*************         *************
  *                             *
     *                       *
        *                 *
           *            *
          *             *
         *               *
         *     *   *     *
        *    *        *   *
       *  *             *  *
       *                   *



[ 本帖最后由 StarWing83 于 2009-11-7 12:27 编辑 ]

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 12:20
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
另:rint是C99规范的函数,不清楚TC和VC有没有,如果没有请自行定义:
#define rint(x) ((int)((x) + 0.5))

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 12:22
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 

图片附件: 游客没有浏览图片的权限,请 登录注册

回复:StarWing83
哈哈,也是丑星呀。只是你的星比我的星苗条了一点。

努力—前进—变老—退休—入土
2009-11-07 12:38
chinasmu
Rank: 2
等 级:论坛游民
帖 子:50
专家分:22
注 册:2009-10-31
收藏
得分:0 
回复 17楼 chinasmu
你来摆摆看,不是那么容易的
2009-11-07 12:48
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
以下是引用UserYuH在2009-11-7 12:38:58的发言:



回复:StarWing83
哈哈,也是丑星呀。只是你的星比我的星苗条了一点。

你再试试,我更新了代码,第一次的代码有些数字有点误差。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 12:51
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 27楼 StarWing83
图片附件: 游客没有浏览图片的权限,请 登录注册

角边的地方总有点别扭
    中间的处理稀疏好看点

我可好玩啦...不信你玩玩^_^
2009-11-07 13:07
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
额= =说句实话……用DOS字符模式输出五角星简直就是费时费力…………

如果有人愿意的话,用别的方式(比如GDI阿,graphics阿什么的)来做吧。

或者不用星号了,换别的符号,应该好点。

中间的部分?你改吧~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 13:12
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 29楼 StarWing83
dos画星星还是14楼的好
    瞟一眼就知道他要干什么   

我可好玩啦...不信你玩玩^_^
2009-11-07 13:16
快速回复:用C语言编五角星.请高手指教.
数据加载中...
 
   



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

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