标题:打印菱形问题代码整理(五种解法)
只看楼主
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
 问题点数:0 回复次数:34 
打印菱形问题代码整理(五种解法)
整理了下下这两天关于输出菱形的代码,希望可以打开大家的思路
举一反三对初学者来说是制胜的法宝,希望可以加精让更多的人学习。
PS:
除了解法四、解法五是我写的,其他是引用广陵绝唱和雨中飞燕的代码。
如果代码作者对我的引用感到不快,请给我站内信,我会删掉
如果有时间我再把菱形大小做成可以控制的
/**************************************
问题:输出如下一个菱形
      *
    *   *
  *       *
*           *
  *       *
    *   *
      *
**************************************/

代码见3#高亮后的
感谢雨中飞燕提供高亮代码

[[it] 本帖最后由 moonwalker 于 2008-4-20 18:22 编辑 [/it]]
搜索更多相关主题的帖子: 解法 菱形 打印 代码 
2008-04-20 12:44
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
代码没有高亮不好看!!
2008-04-20 12:56
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
/**************************************
解法一:
    常规思路解法
    code by 广陵绝唱
**************************************/
#include<stdio.h>
int main(void)
{
        int i,j;
        for(i=1;i<=4;++i)
        {
                for(j=1;j<=10-i;++j)
                        printf(" ");
                printf("*");
                for(j=1;j<=2*i-3;++j)
                        printf(" ");
                if(i==1)
                {
                        puts(" ");
                        continue;
                }
                printf("*");
                puts(" ");
        }
        for(i=3;i>=1;--i)
        {
                for(j=1;j<=10-i;++j)
                        printf(" ");
                printf("*");
                for(j=1;j<=2*i-3;++j)
                        printf(" ");
                if(i==1)
                        break;
                printf("*");
                puts(" ");
        }


        getch();
}

/**************************************
解法二:
    基于条件判断输出不同字符
    code by 雨中飞燕
**************************************/

#include <stdio.h>
#define ABS(a)  (a<0?-a:a)
#define N       3
int main()
{
    int i,j;
    for(i=-N;putchar('\n'),i<=N;++i)for(j=-N;j<=N;++j)
    if(ABS(i)+ABS(j)==N)putchar('*');else putchar(' ');
    return 0;
}

/**************************************
解法三:
    基于格式字符串
    code by 雨中飞燕
**************************************/

#include <stdio.h>
#define ABS(a)  (a<0?-a:a)
#define J       ABS(i)
#define N       3
int main()
{
    int i;char*p="*";
    for(i=-N;i<=N;++i)
    printf("%*s%*s\n",J+1,p,(N-J)*2,&p[J==N]);
    return 0;
}

/**************************************
解法四:
    基于格式字符串
    code by moonwalker
说明:开始没有想到好的办法,用了这个
超常的字符串读取字符
**************************************/

#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;
}

/**************************************
解法五:
    基于格式字符串
    code by moonwalker
说明:解法四的改进版,只用一个字符串
可以实现
**************************************/

#include<stdio.h>
int main()
{
    int i,m;
    char *p ="     *";
    for(i=1,m=1;i<8;i++,m=i-(i/4)*(i%4)*2)
        printf("%s%*s\n",p+m,2*m-2,p-2*m+8);
    return 0;
}


" border="0" />

[[it] 本帖最后由 雨中飛燕 于 2008-4-20 13:27 编辑 [/it]]
2008-04-20 12:58
yd4433
Rank: 1
等 级:新手上路
帖 子:404
专家分:0
注 册:2008-3-9
得分:0 
汗44444  怎么 2 3两中解法我接受不了呢 看定义我就云了

------...-.-..-...-----........-------.......----.....------....||- - !
2008-04-20 13:27
yd4433
Rank: 1
等 级:新手上路
帖 子:404
专家分:0
注 册:2008-3-9
得分:0 
学习 里..........................

------...-.-..-...-----........-------.......----.....------....||- - !
2008-04-20 13:29
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
得分:0 
[bo]以下是引用 [un]yd4433[/un] 在 2008-4-20 13:27 的发言:[/bo]

汗44444  怎么 2 3两中解法我接受不了呢 看定义我就云了

不要把宏定义看的那么可怕,就是字符的替换
她的ABS就是判断是否负数,然后给ABS起个别名方便表示

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 13:30
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
你们注释喜欢用 /* */ 吗?
为什么不多使用 // 呢?

" border="0" />
2008-04-20 13:48
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
得分:0 
[bo]以下是引用 [un]雨中飛燕[/un] 在 2008-4-20 13:48 的发言:[/bo]

你们注释喜欢用 /* */ 吗?
为什么不多使用 // 呢?

http://blog.

是为了考虑移植性,在一些早期嵌入式的编译器中
不支持//这个C99的新特性
当然,函数内部用//比用/* */好
不过现在整个函数的注释我都用#if 0

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-20 14:12
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
恩,这些解法都用过,哈哈哈~~~~~

回://的确是很好的注释,不过多行的话/**/也不错啊,就喜欢用
//*
//*/
这样子的,不过现在都改用
#if 0
#else
#endif
了………………

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-04-20 14:15
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
/* */和#if 在调试用合理使用可以提高调试效率
当然,/* */不能嵌套,所以,我现在会尽量使用//而不用/* */
/* */偶是调试时才用的,用于屏蔽大段的代码
当然,等效的可以用#if

不过偶在想,现在的编辑器能不能选定一段代码然后加一快捷键
就自动在两边加#if 0  ... #endif呢?这样会超级方便的

" border="0" />
2008-04-20 14:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-210034-1-1.html




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

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