注册 登录
编程论坛 C++教室

这题目对初学者的我们有点难

孤魂居士 发布于 2007-05-21 22:07, 2030 次点击
各位师兄师姐,今天在学C+的时候有个问题难住了我
有个同学问我这个题目怎么编写,我当时做了几乎半个小时还是想不出来
知道论坛师兄师姐们都是强人,所以在此问下,希望能帮助我下````谢谢啦

题目: 打印此图形


*
***
*****
*******
*********
*******
*****
***
*

设中间的*数量为n 要编写活程序 从键盘输入n ,n越大打印出来的图形对应就越大!!

   希望师兄师姐能尽快帮助我下````在此谢谢啦``
30 回复
#2
孤魂居士2007-05-21 22:09
请师兄师姐多多帮助下师弟我下```我同学可还是等着我回答呢```
#3
kisscjy2007-05-21 22:36

以前写了一个~~
现在发给你看看~~~

#include<iostream.h>
void main()
{
int lines,line;
char x;
cout<<"请输入你所想要的行数"<<endl;
cin>>lines;

cout<<"请输入你所想要的图案"<<endl;
cin>>x;

for(line=1;line<=lines;line++)
{for(int i=1;i<=lines-line+1;i++)
{cout<<" ";}
for(int j=1;j<=2*line-1;j++)
{cout<<x;}
cout<<endl;
}

for(line=lines-1;line>=1;line--)
{
for(int i=1;i<=lines-line+1;i++)
{
cout<<" ";
}
for(int j=1;j<=2*line-1;j++)
{
cout<<x;
}
cout<<endl;
}
}

格式有点不对称,凑合着看一下吧~~

#4
孤魂居士2007-05-22 00:12
谢谢谢谢```这个程序写的很好 我能看的懂 写的蛮好 就是你那外面的for循环内用到的变量为什么用line变量列?用i,j,k不是简单点吗?就是这点搞不懂? 哎现在才知道自己好渺小哦 高手好多好多 真要多向各位大哥大姐多学习学习```还望以后多多帮助 谢谢  
#5
孤魂居士2007-05-22 00:18

假如刚刚说到的问题如果有点菜,不要笑话我哦```我知道那line是"行"的意识```但是i,j,k我觉得还是简单点`` 师兄师姐你说列?

#6
kisscjy2007-05-22 00:35
这是我以前写的,当时没有想这么多~~~

现在写的话变量就不会那么混乱啦!
#7
孤魂居士2007-05-22 00:48
哦 其实我也是瞎说的啦 不要介意哦  嘿嘿 师兄  你现在是不是上班啦  哎``
我们还是刚刚进大学,不知道以后能干什么?不知道以后编程这条路还走不走的通
#8
kisscjy2007-05-22 00:54
呵呵,我也是上大学的~~~
#9
孤魂居士2007-05-22 00:57

嘿嘿 那现在还不睡觉啊``嘿嘿把你的QQ告诉我哦 师兄 我很想认识编程的师兄师弟哦 好不?师兄?在这上面聊天,管理员会说的``

#10
yuziguang2007-05-22 07:36

我也尝试着写了一个,不过没有上面那样好啊!
#include<iostream.h>
void main()
{
for(int i=1;i<=5;i++)
{
for(int j=1;j<=6-i;j++)
cout<<' ';
for(int k=1;k<=2*i-1;k++)
cout<<'*';
cout<<endl;
}

for(int x=1;x<=4;x++)
{
for(int y=1;y<=x;y++)
cout<<' ';
for(int z=1;z<=9-2*x;z++)
cout<<'*';
cout<<endl;
}
}

#11
孤魂居士2007-05-22 17:01
10的兄弟写的程序简洁易懂
但是```这程序是死的 ```不是活的哦 ```
#12
孤魂居士2007-05-22 17:02
10楼的兄弟写的程序简洁易懂
但是```这程序是死的 ```不是活的哦 ```
#13
aipb20072007-05-22 17:36
以下是引用孤魂居士在2007-5-22 17:02:01的发言:
10楼的兄弟写的程序简洁易懂
但是```这程序是死的 ```不是活的哦 ```

死的活的?
你是指可以根据输入运行代码吧?

呵呵,你改改他的不就成活的了!
我也写过有个,给你当参照,不过有一点点不一样,你凑合看看吧!

#include <iostream>
using namespace std;


void print_up(int n){
static int nc = n/2;
if (n > 0){
print_up(n-2);
for (int i = 0;i < nc-n/2;++i)
cout << " ";
for (int j = 0;j < n;++j)
cout << "*" ;
cout << endl;
}
}

void print_down(int n){
static int nc = n/2;
if (n > 0){
for (int i = 0;i < nc-n/2;++i)
cout << " ";
for (int j = 0;j < n;++j)
cout << "*";
cout << endl;
print_down(n-2);
}
}

int main()
{
int n;
cin >> n;
print_up(n);
print_down(n);
system("pause");
}

#14
孤魂居士2007-05-22 17:42
哇 `````````````我刚刚运行了下
13楼的兄弟你是我的偶象哦``````````````
太棒了````
#15
aipb20072007-05-22 17:44

偶什么象?不过就是用递归写的,等你动用递归了,你就发现very easy了!
#16
孤魂居士2007-05-22 17:47
哦 我是说有点看不懂哦``原来这东西我还没有学```现在才知道```我就是那传说中的新手```
不知道还要等多久``我才会象大哥一样牛B```
#17
leeco2007-05-22 19:45

这个简单


#include <stdio.h>


int main()
{
   printf(\"                  *\n\
                 ***\n\
                *****\n\
               *******\n\
              *********\n\
               *******\n\
                *****\n\
                 ***\n\
                  *\n\
\");
}

#18
孤魂居士2007-05-22 21:27
这你都好意思打印出来?
别人都是用循环打的``假如我要把*形状改动下 把中间的数加大 那你岂不是又要改程序```??``
要打印出活的``
#19
leeco2007-05-22 22:58
回复:(孤魂居士)[em26] 这你都好意思打印出来? 别...

被鄙视了啊……

程序代码:

#include <stdio.h>


void printspaces(int n)
{
    if(n){
        putchar(' ');
        printspaces(n-1);
    }
}


void printstars(int n)
{
    if(n){
        putchar('*');
        printstars(n-1);
    }
}


void printkofn(int k,int n)
{
    if(k<2*n){
        printspaces(k<n?2*n-k:2*n-(2*n-k));
        printstars(k<n?2*k-1:2*(2*n-k)-1);
        putchar('\n');
        printkofn(k+1,n);
    }
}


void printrhombus(int n)
{
    printkofn(1,n);
}



int main()
{
    int n;
    scanf(\"%d\",&n);
    printrhombus(n);
}

#20
孤魂居士2007-05-22 23:04
恩 这才到位了嘛```
刚刚17楼的那个程序没有价值``嘿嘿 ``
兄弟``你很棒```
#21
aipb20072007-05-23 09:23
回复:(leeco)回复:(孤魂居士)[em26] 这你都好意...
感觉你c语和算法很强呢!

我想问问, c和c++在语法上最大的区别是什么?
怎么我感觉就是输入和输出啊?那个printf我至今弄不明白!

不好意思,我没学c哈!

还有,算法怎么学的?
#22
leeco2007-05-23 13:18
回复:(aipb2007)回复:(leeco)回复:(孤魂居士)...
C++包含了所有的C的语法,并增加了很多新的特性,比如函数重载,运算符重载,inline,const,new,delete,template,最重要是C++提供面向对象的编程,语法不是主要的。采取面向对象的程序设计方法和非面向对象是完全不同的思想,并不是说用了class就是面向对象,它是一个思想方法。如果你采用的是非面向对象的方法,算法和数据结构是相当重要的,如果你采用的是面向对象的方法,设计模式是相当重要的,再具体到某个类的某个方法的实现时,算法和数据结构依然是相当重要的。
重要的是1。你能不能解决问题;2。你的解决方法是不是妥善、高效的;
(从软件工程的角度还要考虑更多,比如你的代码是否便于维护,是否具有良好的复用性。)

学习算法主要是熟练掌握常用的算法,学会设计算法。我觉得后者更加重要。
#23
leeco2007-05-23 13:25
我在一些帖子里使用了不必要的递规(可以简化为迭代的),只是卖弄一下自己罢了,其实这样的程序是低效的,如果递规可以化简为迭代并且不需要使用栈,那么尽量不要使用递规。
#24
aipb20072007-05-23 13:27
回复:(leeco)回复:(aipb2007)回复:(leeco)回...

oop编程,这个我当然知道!呵呵!我就是比较好奇那个printf而已!

关于算法,谢谢你的指教!

#25
aipb20072007-05-23 13:29
以下是引用leeco在2007-5-23 13:25:36的发言:
我在一些帖子里使用了不必要的递规(可以简化为迭代的),只是卖弄一下自己罢了,其实这样的程序是低效的,如果递规可以化简为迭代并且不需要使用栈,那么尽量不要使用递规。

同意,但是有些时候非用递归不可啊!递归能简单的做到迭代做不了的事,或者做起来很烦琐的事!

#26
yushui2007-05-23 17:19

用迭代增加了空间代价 可是减少了时间代价
具体的时候就看需要了

#27
leeco2007-05-23 20:55
回复:(yushui)用迭代增加了空间代价 可是减少了时间...
一般迭代不增加空间代价,反而是递规需要把现场压入堆栈空间代价比较大
#28
孤魂居士2007-05-29 23:45

这个题目新手还是多进来看看哦``

#29
aipb20072007-05-30 11:37
以下是引用yushui在2007-5-23 17:19:54的发言:

用迭代增加了空间代价 可是减少了时间代价
具体的时候就看需要了

多数时候,递归总是低于迭代的的效率,无论时间上还是空间上。
很多时候是因为低归比较容易理解和coding。

#30
wfpb2007-05-30 15:18
printf的实现代码你可以看看,就是未知参数的函数实现.
你看下MSDN上的va_arg, va_end, va_start, va_list, va_dcl(UNIX only), va_alist(UNIX only)应该好理解些。
#31
aipb20072007-05-30 15:38
谢谢ls的,有时间也去看看 c 的东西!
1