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

第一次写成功的程序,大家看看能不能改简单点

從霝開匙 发布于 2007-09-21 13:50, 514 次点击
前几天看到一个题目
*
* *
* * *
* * * *
* * *
* *
*
小弟自己写了个程序,这是小弟写成功的第一个,不过还不完善,大家看看什么地方能改简单点,还有只支持单的双的有点位移
#include<iostream>
using namespace std;
void main()
{
int n;
cout<<"please enter the value of n:";
cin>>n;
for(int i=0;i<=n;i++)
{
for(int j=0;j<n;j++)
{
if(i<=(n/2+1))
{
if (j>=(n/2-i)&&j<=(n/2+i))
{
if (i%2==0&&j%2==0||i%2!=0&&j%2!=0)
cout<<"*";
else
cout<<" ";}
else
cout<<" ";}
else if(i>(n/2+1))
{
if (j>=(n/2-(n-i))&&j<=(n/2+(n-i)))
{
if (i%2==0&&j%2==0||i%2!=0&&j%2!=0)
cout<<"*";
else
cout<<" ";}
else
cout<<" ";}
}
cout<<endl;} }

感觉程序太复杂了,有没有大哥给个简单点的程序

[此贴子已经被作者于2007-9-21 14:09:48编辑过]

4 回复
#2
远去的列车2007-09-21 14:48

建议这样取n的意义

最中间一行长为 2*n+1

才不会出现输入偶数时难以处理的情况

#3
远去的列车2007-09-21 15:09

#include <iostream>

using namespace std;

#include<iostream>
int main()
{
int i,j,k,n;
cout << "input n: ";
cin >> n;
cout << endl;

for (i=0; i<=2*n; ++i)
{
k = i>n ? 2*n-i : i; //以中间行对称
for (j=0; j<=2*n; ++j)
{
if (((k+j)%2==0) && (abs(j-n)<=k)) //以中间列对称
cout << "*";
else
cout << " ";
}
cout << endl;
}
}

用的是以前一位版主发的方法:红色部分 if(abs(j-n)==k) 得到空心的图形

#4
從霝開匙2007-09-21 16:06
if (((k+j)%2==0) && (abs(j-n)<=k))
这就是差距
呵呵,想不到这么好的解决办法
#5
远去的列车2007-09-21 16:09
不好意思,刚才发现虽然那种程序可以画出正确的图形,但n为奇数时偏移了(因为我画偶数n图案作例子来看的,呵呵)

改一下:

if (((k+j-n)%2==0) && (abs(j-n)<=k))

[此贴子已经被作者于2007-9-21 16:11:57编辑过]

1