Romb z kwadratem w środku c++

0

Cześć. Mam zadanie z informatyki, żeby napisać program, który będzie rysował romb z gwiazdek, ale z kwadratem w środku. Siedzę trochę nad tym, ale zupełnie nie mam pojęcia z której strony zacząć, a co dopiero jak to zrobić. Liczę na rychłą odpowiedź, bo zadanie na jutro.

0

Romb z kwadratem w środku, tak bez żadnych ograniczeń :P? Kwadrat jest rombem; rysuj kwadrat z kwadratem w środku i z głowy

0

@DonStefano: Ojjj gdyby to było takie proste:D. niestety pan nie powiedział mi że mam tak zrobić, pan pokazał zdjęcie jak to ma wyglądać... jeden kwadrat(ten większy) ma być przekrzywiony tak, żeby dookoła kwadratu powstały cztery trójkąty... kwadrat w kwadracie dałbym radę sam zrobić, ale to zadanie to dla mnie już wyższa matematyka.

0

@P4weł: Czyli większy jest obrócony o 45 stopni? Wrzuć zdjęcie, łatwiej będzie...

0

Dokładnie tak, ale niestety zdjęcia nie mam, tak to bym od razu wysłał...

0

Narysuj na kartce szkic, zrób zdjęcie (lub zeskanuj) i pokaż.

0

20220111_201516.jpg

0

@P4weł:

Cześć. Mam zadanie z informatyki, żeby napisać program, który będzie rysował romb z gwiazdek, ale z kwadratem w środku.

Ja tam z matematyki byłem kiepski, ale to są dwa kwadraty nie?

Siedzę trochę nad tym, ale zupełnie nie mam pojęcia z której strony zacząć, a co dopiero jak to zrobić. Liczę na rychłą odpowiedź, bo zadanie na jutro.

No ja bym zaczął od rysowania tego większego romba kwadrata.

0

@.andy: no właśnie, tylko że nie wiem jak to zrobić...

0

#include <iostream>
#include <ctime>
#include <iomanip>
#include <cmath>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
int a;
cout<<"Podaj nieparzysta szerokosc/wysokosc: ";
cin>>a;

//--------------------------------------

for(int i=0;i<a;i++)
cout<<"X";

cout<<endl;
//--------------------------------------
int b=0;
int c=a-4;
for(int i=0;i<(a-3)/2;i++)
{
cout<<"X";
for(int j=0;j<b;j++)
cout<<" ";
cout<<"X";
for(int j=0;j<c;j++)
cout<<" ";
cout<<"X";
for(int j=0;j<b;j++)
cout<<" ";
cout<<"X"<<endl;
b++;
c=c-2;
}
//--------------

cout<<"X";
for(int i=0;i<(a-3)/2;i++)
cout<<" ";
cout<<"X";
for(int i=0;i<(a-3)/2;i++)
cout<<" ";
cout<<"X"<<endl;
//-------------
b=(a-5)/2;
c=1;
for(int i=0;i<(a-3)/2;i++)
{
cout<<"X";
for(int j=0;j<b;j++)
cout<<" ";
cout<<"X";
for(int j=0;j<c;j++)
cout<<" ";
cout<<"X";
for(int j=0;j<b;j++)
cout<<" ";
cout<<"X"<<endl;
b--;
c=c+2;
}
for(int i=0;i<a;i++)
cout<<"X";
//--------------

system("PAUSE");
return 0;
}

na razie osiągnąłem coś takiego, i to jest ten kwadrat w środku.

1

Z prostokątem byłoby łatwiej, niż z kwadratem...
Konsola ma inną szerokość i wysokość znaków + odstępy między linijkami :(
Masz tu filmik dla rombu:

Musisz tylko odfiltrować wypełnienie i połączyć środkowe gwiazdki wszystkich boków.

1

Masz za darmo ;)

#include <iostream>
#include <cmath>

class romb_w_kwadracie
{
private:
    struct punkt
    {
        int x,y;
    };
    int rzad;
    static int metryka1(const punkt p1, const punkt p2) { return abs(p1.x-p2.x)+abs(p1.y-p2.y); }
    static int metryka2(const punkt p1, const punkt p2) { return std::max(abs(p1.x-p2.x),abs(p1.y-p2.y)); }
public:
    romb_w_kwadracie(int nowy_rzad);
    void narysuj() const;
};

romb_w_kwadracie::romb_w_kwadracie(int nowy_rzad): rzad{nowy_rzad}
{
}

void romb_w_kwadracie::narysuj() const
{
    for (int i=0; i<2*rzad+1; i++)
    {
        for (int j=0; j<2*rzad+1; j++)
        {
            std::cout << ((metryka1(punkt{i,j},punkt{rzad,rzad}) == rzad || metryka2(punkt{i,j},punkt{rzad,rzad}) == rzad/2) ? '*' : ' ');
        }
        std::cout << "\n";
    }
}

int main()
{
    romb_w_kwadracie r{10};
    r.narysuj();
    return 0;
}
1

@Paweł Biernacki: Zbawco mój!

0

@Paweł Biernacki: romb_w_kwadracie r{10};
r.narysuj();
return 0;
gdy kompiluję program, to dokładnie w tym miejscu r{10}; program się zatrzymuję. Znasz może źródło problemu?

1

Jeszcze (tak dla zabawy) napisałem wersję w Perlu:

sub max { return $_[0]>$_[1]?$_[0]:$_[1]; }

print join("", map { my $y = $_; join("", map { my $x = $_; abs($x-11)+abs($y-11) == 10 || max(abs($x-11),abs($y-11))==5 ? "*" : " "} 1..21)."\n" } 1..21);

..i w Pytonie (3):

print("".join(("".join("*" if abs(x-10)+abs(y-10)==10 or max(abs(x-10),abs(y-10))==5 else " " for x in range(21))) + "\n" for y in range(21)))
3

Bezklasowa wersja ;)

#include <iostream>

using namespace std;

void display( int size )
{
    auto rhombus = [=]( int a , int b ){ return abs(a) == abs(b+size) || abs(a) == abs(size-b); };
    auto square = [=]( int a , int b ){ return ( abs(a) == size/2 && abs(b)<=size/2 ) || ( abs(b) == size/2 && abs(a)<=size/2 ); };

    for( int i {-size} ; i<=size ; ++i )
    {
      for( int j {-size} ; j<=size ; ++j ) cout << ( rhombus(i,j) || square(i,j) ? '*' : ' ' );
      cout << '\n';
    }
}

int main()
{
    display(12);
}

https://godbolt.org/z/P36bbdWzh

1 użytkowników online, w tym zalogowanych: 0, gości: 1