如何实现:输入一个数,以星号打印出一个三角形,如输入..

dzmiao 2004-07-31 03:16:18
例如:输入4,然后显示("="为空格):

===*
==*=*
=*===*
*******


说说我的思路(以输入数字4为例):

1,首先输出左边的空格(=),随后加上一个*:
===*
==*
=*
*

2,从第二行开始到倒数第二行结束(也就是2,3行),输出空格(=),输出完毕后,
从第二行开始到最后一行(2,3,4行)加上一个*:
=*
===*
?????*

经过以上两部,完成的图案只剩下问号(?)部分:
===*
==*=*
=*===*
*?????*

3,这步解决上图中的"?"



以下是我写的一个方法,在VC6通过测试
个人感觉十分臃肿,请教各位有没有更简单易懂的方法!

#include <stdio.h>
void main()
{
int i,j,k,m,num;
scanf("%d",&num);
for (i=1;i<=num;i++)
{

for (j=1;j<=num-i;j++)
{
printf(" ");
}
printf("*");

if (i!=1)
{
if (i!=num)
{
for (k=1;k<=2*i-3;k++)
{
printf(" ");
}
}

else
for (m=1;m<=2*num-3;m++)
{
printf("*");
}
printf("*");
}
printf("\n");
}
}
...全文
3542 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuxiang123 2004-08-01
  • 打赏
  • 举报
回复
采用递归算法,可以结省复杂度,实现代码如下:
#include <iostream.h>
#include <conio.h>

void print(int i,const int j) //i当前打印层数,j输入系数
{
int k=0,m=0,n=0,s=0;
if(j==i)
{
for(k=0;k<2*i-1;k++)
cout<<"*";
cout<<endl;
}
else
{
for(m=0;m<j-i;m++)
cout<<" "; //打印空格
cout<<"*"; //打印星号
for(int n=0;n<2*(j-m-1)-1;n++)
{
cout<<" "; //打印中间空格
s=1;
}
if(s)
cout<<"*";
cout<<endl;
print(++i,j);
}
}

void main()
{
int iheight;
cout<<"输入你的系数";
cin>>iheight;
print(1,iheight);
cout<<"打印结束"<<endl;
getch();
}
dzmiao 2004-08-01
  • 打赏
  • 举报
回复
还是没弄懂
kinglonghr 2004-07-31
  • 打赏
  • 举报
回复
或者用字符串赋值
dzmiao 2004-07-31
  • 打赏
  • 举报
回复
天啊,你说的都那么容易,可是我都看不懂你们的代码?


能说一下解题思路吗?
kinglonghr 2004-07-31
  • 打赏
  • 举报
回复
这题目就是循环了
hellwolf 2004-07-31
  • 打赏
  • 举报
回复
我也喜欢antijpn的代码!
RookieStar 2004-07-31
  • 打赏
  • 举报
回复
antijpn的代码我喜欢!!
kudoxinyiji 2004-07-31
  • 打赏
  • 举报
回复
以前曾经写过一画菱形的。其实就是画了两个三角形。
再有,这种题我认为用不用指针没啥区别。
qingyuan18 2004-07-31
  • 打赏
  • 举报
回复
哪有那么复杂??
void print()
{
int i,j;
int n;
printf("输入阶数:\t");
scanf("%d",&n);
fflush(stdin);
pre_i=0;pre_j=0;
for(i=0;i<n;++)
{
for(j=0;j<n;j++)
{
if(i==0&&j==i/2)
{
printf("*");
pre_i=i;
pre_j=j;
}
else if(i>0&&i<n-1)
{
if((i==pre_i+1&&j==pre_j-1)||(i==pre_i+1&&j==pre_j+1))
printf("*");
pre_i=i;pre_j=j;
}
else if(i==n-1)
{
printf("*");
}
else return;
}
}
hellwolf 2004-07-31
  • 打赏
  • 举报
回复
这个写法确实很巧妙。

最经典的" "+i 什么意思呢?" "是一个字符串常量,+i代表这个常量的基地址+i:也就是少打印i个空格。
antijpn 2004-07-31
  • 打赏
  • 举报
回复
上面的代码生成的是10行的

说实话,这种东西对数学的要求比对计算机的要求高的多,数学水平越高,写出来的代码越是简单
antijpn 2004-07-31
  • 打赏
  • 举报
回复
给你一个变态一点的代码
const int iRow=10;
for(int i=0;i<iRow;i++)
cout<<" "+i<<'*'<<((i==(iRow-1))?"******************":" *")+2*(iRow-1)-2*i<<endl;

呵呵,很变态吧?
iidj 2004-07-31
  • 打赏
  • 举报
回复
cout<<" "+i<<'*'<<((i==(iRow-1))?"******************":" *")+2*(iRow-1)-2*i<<endl;
fflush(stdin);
看不懂。请高手指:
antijpn 2004-07-31
  • 打赏
  • 举报
回复
给你一个完全版本的,不过这种做法牺牲了不少空间为代价
#define MAXLEN 0x20
#include <stdio.h>
#include <assert.h>
void main()
{
int iRow,i,BufLen[3];
char *Str[3],*ptr[3];
scanf("%d",&iRow);
fflush(stdin);
assert(iRow<MAXLEN);
for(i=0;i<3;i++)
{
BufLen[i]=(i?1:0)*(MAXLEN-1)+(MAXLEN-1)+1;
Str[i]=(char*)malloc(BufLen[i]);
Str[i][BufLen[i]-1]='\0';
memset(Str[i],(i%2)?'*':' ',BufLen[i]-1);
Str[i][BufLen[i]-2]=i?'*':' ';
ptr[i]=Str[i]+BufLen[i]-1-(iRow-1)*(i?2:1);
}
for(i=0;i<iRow;i++)
{
printf("%s*%s\n",ptr[0]+i,(i==(iRow-1)?ptr[1]:ptr[2])+2*(iRow-1)-2*i);
}
}
dzmiao 2004-07-31
  • 打赏
  • 举报
回复
我初学C,还没学指针,数组的,请问各位这题是不是用指针跟数组比较容易实现?
dzmiao 2004-07-31
  • 打赏
  • 举报
回复
关键是我不懂C++,思路即使一样我也改不过来:(
hellwolf 2004-07-31
  • 打赏
  • 举报
回复
上面的改成c应该不是问题吧
snow810211 2004-07-31
  • 打赏
  • 举报
回复
搂主,你好,其实就前面的基础部分,c/c++基本一样的,尤其是思路就更一样了,就是那些循环啦,条件啦,什么的,c中用scanf/printf,c++用cin/cout,所以“ woxiangfang(小黑黑脸) ”他说得可以采纳~~~
dzmiao 2004-07-31
  • 打赏
  • 举报
回复
楼上的怎么说到C++里去了?

我想知道用C有什么好的思路?
淡蓝冰 2004-07-31
  • 打赏
  • 举报
回复
這種問題太簡單了﹐只要思路清晰﹐函數學得很熟﹐會很好的運用他﹐那就是小菜一盤。const int iRow=10;
for(int i=0;i<iRow;i++)
cout<<" "+i<<'*'<<((i==(iRow-1))?"******************":" *")+2*(iRow-1)-2*i<<endl;

上面的方法很簡單﹐但真正的解答也不是只有這一種﹐還有很多很多的編法。
可以從不同的角度去想想。最好用函數﹐比較簡單

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧