打印菱形问题代码整理.docx
- 文档编号:10850744
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:13
- 大小:21.09KB
打印菱形问题代码整理.docx
《打印菱形问题代码整理.docx》由会员分享,可在线阅读,更多相关《打印菱形问题代码整理.docx(13页珍藏版)》请在冰豆网上搜索。
打印菱形问题代码整理
打印菱形问题代码整理(五种解法)
整理了下下这两天关于输出菱形的代码,希望可以打开大家的思路
举一反三对初学者来说是制胜的法宝,希望可以加精让更多的人学习。
PS:
除了解法四、解法五是我写的,其他是引用广陵绝唱和雨中飞燕的代码。
如果代码作者对我的引用感到不快,请给我站内信,我会删掉
如果有时间我再把菱形大小做成可以控制的
/**************************************
问题:
输出如下一个菱形
*
* *
* *
* *
* *
* *
*
**************************************/
/**************************************
解法一:
常规思路解法
codeby广陵绝唱
**************************************/
#include
intmain(void)
{
inti,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();
}
/**************************************
解法二:
基于条件判断输出不同字符
codeby雨中飞燕
**************************************/
#include
#defineABS(a) (a<0?
-a:
a)
#defineN 3
intmain()
{
inti,j;
for(i=-N;putchar('\n'),i<=N;++i)for(j=-N;j<=N;++j)
if(ABS(i)+ABS(j)==N)putchar('*');elseputchar('');
return0;
}
/**************************************
解法三:
基于格式字符串
codeby雨中飞燕
**************************************/
#include
#defineABS(a) (a<0?
-a:
a)
#defineJ ABS(i)
#defineN 3
intmain()
{
inti;char*p="*";
for(i=-N;i<=N;++i)
printf("%*s%*s\n",J+1,p,(N-J)*2,&p[J==N]);
return0;
}
/**************************************
解法四:
基于格式字符串
codebymoonwalker
说明:
开始没有想到好的办法,用了这个
超常的字符串读取字符
**************************************/
#include
intmain()
{
inti,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));
return0;
}
/**************************************
解法五:
基于格式字符串
codebymoonwalker
说明:
解法四的改进版,只用一个字符串
可以实现
**************************************/
#include
intmain()
{
inti,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);
return0;
}
闲着无聊俺也写了一个:
程序代码:
#include
#define ABS(x) ((x)>0?
(x):
(-(x)))
#define N 10
intmain()
{
inti,j;
for(i=0;i<2*N-1;i++)
{
j=ABS(N-i-1);
printf("%*c%-*c\b*\n",j+1,'',2*(N-j)-1,'*');
}
return0;
}
偶也玩一个
main(o,O,Q){o==1&&(o=(O=scanf("%d",&Q)-1)+2,Q+=2),printf("%*c%*c\n",Q-o+2,42,2*o-4,o-2?
42:
0),(O=o==Q-1?
1:
O)?
main(o-1,O,Q):
main(o+1,O,Q);}
请用TC
玩递归main有意思吗?
不过是隐藏for循环中的显式迭代把程序变难看而已.
程序代码:
#include
#define ABS(x) ((x)>0?
(x):
(-(x)))
#define N 10
intmain(inti)
{returni<2*N?
printf("%*c%-*c\b*\n",ABS(N-i)+1,'',2*(N-ABS(N-i))-1,'*'),main(++i):
0;}
可以输入随意数的代码:
(vc++6.0编译通过)
#include
intmain(void)
{
inti,j,number;
printf("Inputyournumber:
");
scanf("%i",&number);
for(i=0;i<(2*number-1);++i)
{
if(i { for(j=0;j<(2*number-1);++j) { if(j==number-1-i ||j==number-1+i) printf("*"); else printf(""); } printf("\n"); } elseif(i==number-1) { for(j=0;j<(2*number-1);++j) { if(j==number-1-i ||j==number-1+i) printf("*"); else printf(""); } printf("\n"); } else { for(j=0;j<(2*number-1);++j) { if(((i-number)==(j-1))||((i-number)==(2*number-3-j))) printf("*"); else printf(""); } printf("\n"); } } return0; } 两个小时写的两行代码(打印菱形问题) 看有人问输出菱形块的问题,用格式字符串写了 这两行花了整整两个多小时,看来还是不够熟练 辛苦成果忍不住拿来秀一下,明天来把注释加上 /************************************************ 今天加上注释(printf函数*的使用) 算法说明: 把printf函数作为一个m的函数f(m),用两个字符串拼成 每行要输出的格式,一个字符串是空格字符组成,另一个 存放*号,因为字符无法重用,所以每个字段都加上了 字符串结束符。 为了方便思考,所有的位置控制都用m控制。 而m是循环变量i的一个映射。 这个映射就想了有一个小时。 对于i从1到7,m分别是1,2,3,4,3,2,1 借助整数除法不进行四舍五入的特性,终于找到下面 一个式子表示这个折线: m=i-(i/4)×(imod4)×2 ************************************************/ #include intmain() { inti,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)); return0; } 嗯,我也觉得,主要是因为这个字符串不能重用,/0实在是太丑了,呵呵 如果重用的情况可以整齐一点点 #include intmain() { inti,j; for(i=1,j=13;i<7;i++,j--,j--) printf("%*s\n",11+i,"********"+j); return0; } 我在1楼写了一些说明 *是printf函数的一个修饰符,用于用变量控制输出宽度 例如 printf("%*s",10,"string"); 表示输出字符串占用长度为10,好处是你可以用变量i来替代10, 这样你的输出长度可以变化了 刚看了你的第5个解法,看起来很简洁,唯一不懂的就是 ("%s%*s\n",p+m,2*m-2,p-2*m+8) 能解释一下括号内用逗号隔开的4段起什么作用? 三个参数 param1: 对应%s,是常量字符串指针加偏移 param2: 对应%*s中的*,指定param3输出的位数 param3: 对应%*s中的s,类同param1 其实每行也是用两个字符串拼的,你改成下面这样看看 printf("%s\n",p+m); #include #definep(x)putchar(x) intmain(void)//实心菱形版本 { for(intn=(scanf("%d",&n),n/2),t=0,d=1;t>=0;t+=(t-n)? d: d=-1) for(inta=0,b=1;a>=0||(p(10)&0);a+=(a-n)? b: b=-1) (a>=n-t)? p(42): p(32); return0; } 输入宽度,然后就会输出对应的菱形(请不要用TC编译) #include"stdio.h" #include"math.h" main() { inti,j,m=6; for(i=-m;i<=m;i++) for(j=-m,puts("");j<=m;j++)//puts("")起换行作用! ! ! abs(i)+abs(j)==m? printf("*"): printf(""); } #include voidmain() { inti,j,k,l; printf("entermaxline: ");/*输入最大行数*/ scanf("%d",&j); for(i=-j/2;i<=j/2;i++) {if(i<0)l=-i; elsel=i; for(k=0;k printf("");/*输出每一行的空格*/ if(i>0)l=-i; elsel=i; for(k=0;k<(l+j/2)*2+1;k++) printf("*");/*输出每一行的星号*/ printf("\n");/*输出第一行的回车*/ } getch(); } /*只需要一重循环的代码*/ #include intmain(void){ charstar[30]="****************************\n",blank[30]=""; inti=1,k=3,flag=0; do{ printf("%s%s",blank+29-i-k,star+28-i); (flag==0&&i<7)? (i+=2,k-=3): (flag=1,i-=2,k+=3); }while(i>0); return0; } /*把上面也改成四行版本,请用CPP编译器,勿在TC下编译! 并且只需要一重循环! ! ! */ #include intmain(void) { charstar[30]="****************************\n",blank[30]=""; for(inti=1,k=3,flag=0;i>0;(flag==0&&i<7)? (i+=2,k-=3): (flag=1,i-=2,k+=3)) printf("%s%s",blank+29-i-k,star+28-i); return0; } //帮你写了一个,谨作参考 程序代码: #include #include #defineN20 intmain(void) { inti,n; charf[]="**************************************************************"; printf("Inputn: \n"); while((scanf("%d",&n))==1&&n<=N) { n/=2; for(i=-n;abs(i)<=n;++i) { printf("%*c%.*s\n",abs(i)+1,'',(n+1-abs(i))*2-1,f); } } return0; } 9楼的代码通用性不好 用燕姐的方法...这是我第一次来bccn学习燕姐的第一个代码 程序代码: #include intmain() { //freopen(path,"r+",stdin); intn; while(scanf("%d",&n)! =EOF) { //打印实心的 for(inti=n/2;i>=-n/2;--i,putchar('\n')) for(intj=-n/2;j<=n/2;++j) (abs(i)+abs(j)<=n/2)? putchar('*'): putchar(''); //打印空心的 for(inti=n/2;i>=-n/2;--i,putchar('\n')) for(intj=-n/2;j<=n/2;++j) (abs(i)+abs(j)==n/2)? putchar('*'): putchar(''); putchar('\n'); } return0; } #include"stdio.h" voidmain() { intpass1,pass2;/*遍历*/ intk1,k2;/*空格*/ intx1,x2;/*星号*/ ints;/*边长*/ intb;/*边距*/ printf("\ninput边长: "); scanf("%d",&s); printf("\ninput边距: "); scanf("%d",&b); for(pass1=1;pass1<=s;pass1++){ for(k1=1;k1<=(-1)*pass1+s+b;k1++){ printf(""); } for(x1=1;x1<=pass1;x1++){ printf("*"); } printf("\n"); } for(pass2=1;pass2<=s-1;pass2++){ for(k2=1;k2<=pass2+b;k2++){ printf(""); } for(x2=1;x2<=(-1)*pass2+s;x2++){ printf("*"); } printf("\n"); } } 回复楼主yumen07 #include"stdio.h" main() { inti,j,k; for(i=1;i<=8;i++) {if(i<=4) {k=6-i; for(j=1;j<=k;j++) printf(""); for(j=1;j<=i;j++) printf("*"); printf("\n"); } else { for(j=1;j<=i-2;j++) {printf("");} for(j=1;j<9-i;j++) {printf("*");} printf("\n"); } } } 又是一种解法 main() {intm,k,i,j,h,n; k=0;m=4;h=2;n=7; for(i=0;i<7;i++) { if(i<4) { for(j=0;j<7;j++) { while(j==m) { if(k>i)break; printf("*"); m=m+1;k++; } printf(""); } m=4;m=m-i-1;k=0; printf("\n"); } else { for(j=0;j<7;j++) { while(j==h) { if(n-i<=0)break; printf("*"); h=h+1;n--; } printf(""); } h=4;h=i-h+3;n=7; printf("\n"); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 打印 菱形 问题 代码 整理
![提示](https://static.bdocx.com/images/bang_tan.gif)