当前位置: 代码迷 >> C语言 >> 打印菱形问题代码整理(五种解法)
  详细解决方案

打印菱形问题代码整理(五种解法)

热度:382   发布时间:2008-04-20 12:44:19.0
打印菱形问题代码整理(五种解法)
整理了下下这两天关于输出菱形的代码,希望可以打开大家的思路
举一反三对初学者来说是制胜的法宝,希望可以加精让更多的人学习。
PS:
除了解法四、解法五是我写的,其他是引用广陵绝唱和雨中飞燕的代码。
如果代码作者对我的引用感到不快,请给我站内信,我会删掉
如果有时间我再把菱形大小做成可以控制的
/**************************************
问题:输出如下一个菱形
      *
    *   *
  *       *
*           *
  *       *
    *   *
      *
**************************************/

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

[[it] 本帖最后由 moonwalker 于 2008-4-20 18:22 编辑 [/it]]
搜索更多相关的解决方案: 解法  菱形  打印  代码  

----------------解决方案--------------------------------------------------------
代码没有高亮不好看!!
----------------解决方案--------------------------------------------------------
/**************************************
解法一:
    常规思路解法
    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;
}




[[it] 本帖最后由 雨中秣燕 于 2008-4-20 13:27 编辑 [/it]]
----------------解决方案--------------------------------------------------------
汗44444  怎么 2 3两中解法我接受不了呢 看定义我就云了
----------------解决方案--------------------------------------------------------
学习 里..........................
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]yd4433[/un] 在 2008-4-20 13:27 的发言:[/bo]

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

不要把宏定义看的那么可怕,就是字符的替换
她的ABS就是判断是否负数,然后给ABS起个别名方便表示
----------------解决方案--------------------------------------------------------
你们注释喜欢用 /* */ 吗?
为什么不多使用 // 呢?


----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]雨中秣燕[/un] 在 2008-4-20 13:48 的发言:[/bo]

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

http://blog.programfan.com/upfile/200804/2008040611237.gif

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

回://的确是很好的注释,不过多行的话/**/也不错啊,就喜欢用
//*
//*/
这样子的,不过现在都改用
#if 0
#else
#endif
了………………
----------------解决方案--------------------------------------------------------
/* */和#if 在调试用合理使用可以提高调试效率
当然,/* */不能嵌套,所以,我现在会尽量使用//而不用/* */
/* */偶是调试时才用的,用于屏蔽大段的代码
当然,等效的可以用#if

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


----------------解决方案--------------------------------------------------------
  相关解决方案