Rysowanie diamentu w C++

Odpowiedz Nowy wątek
2016-10-16 23:14
0

Wybaczcie że zalewam was takim prostym pytaniem, ale mam trudność z jednym ćwiczeniem. Mianowicie rysowaniem diamentu, a konkretnie czy jest jakiś sposób aby skrócić ten kod? Chodzi o narysowanie diamentu w polu 5x5. Wygląda to tak:

#include <iostream>
#include <string.h>

using namespace std;

int main()

{
int i,j;

for(i=1; i<=5; i++)
{

   for (j=1; j<=5; j++)

   {
       if((i==1 || i==5) && (j==3) || ((i==2 || i==4) && (j==2 || j==4) ) || ((i==3) && (j==1 || j==5) )     )

   cout<<"*";

   else
    cout<<" ";
   }

    cout<<endl;

}

Moje pytanie to: czy można w jakiś sposób skrócić ten warunek? Myślałem nad użyciem parzystości lub nieparzystości wierszy i kolumn, lecz nie wiem jak można wykluczyć skrajne miejsca i środek (bez wykluczenia ich powstaje szachownica).

edytowany 1x, ostatnio: Vicot3x, 2016-10-16 23:17

Pozostało 580 znaków

2016-10-16 23:41
1

Pomyśl o "diamencie" jako o kuli w przestrzeni z metryką miejską o środku w (2,2).

Pozostało 580 znaków

2016-10-17 00:07
kq
2

Masz tutaj znacząco przekombinowany kod:

enum TriangleDirection { Up, Down };

template<TriangleDirection Dir, typename Printer>
void printDiamondImpl(Printer p, int n, int width)
{
    auto recursive = [=]{ if(n > 2) printDiamondImpl<Dir>(p, n-2, width); };

    if(Dir == TriangleDirection::Up){
        recursive();
    }

    stringstream ss;
    string spaces((width - n) / 2, ' ');
    ss << spaces << string(n, '*') << spaces;
    p(ss.str());

    if(Dir == TriangleDirection::Down){
        recursive();
    }
}

void printDiamond(int n)
{
    auto printer = [](string const& s){ cout << s << endl; };

    printDiamondImpl<TriangleDirection::Up>(printer, n, n);
    printDiamondImpl<TriangleDirection::Down>(printer, n - 2, n);
}

Ale działa: http://melpon.org/wandbox/permlink/xc5cmbLE2GF9lB8V


Pozostało 580 znaków

2016-10-17 00:18
1

Masz kod kq powyżej, to jeszcze Twój przykład przerobiony tak, żeby działał:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
    int i, j;

    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            /*
             * Tutaj mamy typowe równanie kuli w przestrzeni z metryką miejską.
             */
            if (abs(i - 2) + abs(j - 2) <= 2)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

    return (0);
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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