打印菱形问题代码整理(五种解法)
整理了下下这两天关于输出菱形的代码,希望可以打开大家的思路举一反三对初学者来说是制胜的法宝,希望可以加精让更多的人学习。
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;
}
解法一:
常规思路解法
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两中解法我接受不了呢 看定义我就云了
汗44444 怎么 2 3两中解法我接受不了呢 看定义我就云了
不要把宏定义看的那么可怕,就是字符的替换
她的ABS就是判断是否负数,然后给ABS起个别名方便表示
----------------解决方案--------------------------------------------------------
你们注释喜欢用 /* */ 吗?
为什么不多使用 // 呢?
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]雨中秣燕[/un] 在 2008-4-20 13:48 的发言:[/bo]
你们注释喜欢用 /* */ 吗?
为什么不多使用 // 呢?
http://blog.programfan.com/upfile/200804/2008040611237.gif
你们注释喜欢用 /* */ 吗?
为什么不多使用 // 呢?
http://blog.programfan.com/upfile/200804/2008040611237.gif
是为了考虑移植性,在一些早期嵌入式的编译器中
不支持//这个C99的新特性
当然,函数内部用//比用/* */好
不过现在整个函数的注释我都用#if 0
----------------解决方案--------------------------------------------------------
恩,这些解法都用过,哈哈哈~~~~~
回://的确是很好的注释,不过多行的话/**/也不错啊,就喜欢用
//*
//*/
这样子的,不过现在都改用
#if 0
#else
#endif
了………………
----------------解决方案--------------------------------------------------------
/* */和#if 在调试用合理使用可以提高调试效率
当然,/* */不能嵌套,所以,我现在会尽量使用//而不用/* */
/* */偶是调试时才用的,用于屏蔽大段的代码
当然,等效的可以用#if
不过偶在想,现在的编辑器能不能选定一段代码然后加一快捷键
就自动在两边加#if 0 ... #endif呢?这样会超级方便的
----------------解决方案--------------------------------------------------------