Romb z gwiazdek

0

Cześć, to mój pierwszy post, wiec proszę o wyrozumiałość :) Od dwóch tygodni uczę sie programowania, więc jeszcze więcej nie wiem, niż wiem a do jutra wieczora muszę skończyć ostatnie z zadań domowych. Mam napisać program, który po wpisaniu np. liczby 5 stworzy taki oto romb

..X..
.XXX.
XXXXX
.XXX.
..X..

a dla np. 6 ma on wyglądać następująco

..XX..
.XXXX.
XXXXXX
XXXXXX
.XXXX.
..XX..

Po wielu godzinach prób i błędów, szukania przez google, stworzyłem część kodu dla liczb n nieparzystych i wypisuje mi już dobrze górną część, przykładowo dla 7

#include <iostream>
using namespace std;

int main()
{
int n,i,j;
cin>> n;
        for (i=0; i<n/2+1; i++)
        {for (j=0; j<(n-1)/2-i; j++)
         cout<<".";
         for (j=(n-1)/2-i; j<(n+1)/2+i; j++)
         cout<<"X";
         for (j=(n+1)/2+i; j<n; j++)
         cout<<".";
         cout<< endl; }

return 0;}
7
...X...
..XXX..
.XXXXX.
XXXXXXX

proszę pomóżcie jakie pętle zrobić, aby dolną część też wypełniło :)

0

Dolna część jest dokładnie tym samym, co górna, tyle że iteruje się na odwrót. Dodatkowo, w przypadku nieparzystego n, romb posiada jedną linijkę w całości wypełnioną gwiazdkami, więc to też musisz brać pod uwagę.

Przy okazji – sformatuj ten kod, bo w obecnej postaci jest mało czytelny.

0

Dzięki za pomoc, pomogło, ale leży dla liczby parzystej po wpisaniu np. 6, romb wygląda następująco

......
..XX..
.XXXX.
XXXXXX
XXXXXX
.XXXX.
..XX..

co tu poprawić, żeby nie było tych kropek na górze? Wiem, kod niezbyt przejrzysty, ale kombinuje, żeby wynik wyszedł dobry, a później jakoś go uporządkuje

if (n%2==0)
for (i=0; i<n/2+1; i++)
        {for (j=0; j<n/2-i; j++)
         cout<<".";
         for (j=n/2-i; j<(n+1)/2+i; j++)
         cout<<"X";
         for (j=(n+1)/2+i; j<n; j++)
         cout<<".";
         cout<< endl; }

         for (i=n/2; i>0; i--)
        {for (j=0; j<n/2-i; j++)
         cout<<".";
         for (j=n/2-i; j<(n+1)/2+i; j++)
         cout<<"X";
         for (j=(n+1)/2+i; j<n; j++)
         cout<<".";
         cout<< endl;
0

Musi to być pętla for?

0

Sposób był dowolny, ale na razie większość programów na pętlach robię, bo tablic jeszcze sie nie uczyliśmy, więc dlatego w ten sposób od początku próbowałem. Ok, udało sie po zmianie w pętli z i=0 na i=1, po 5 godzinach program zrobiony :) Dziękuję za pomoc i pozdrawiam :)

0

ja zrobiłem tak

#include <iostream>

using namespace std;

void rysujWiersz(int ileKropek, int num);
void rysujSrodek(int num);
void rysujGore(int num);
void rysujDol(int num);

int main()
{
  int liczba;
  cin>>liczba;
  rysujGore(liczba);
  rysujSrodek(liczba);
  rysujDol(liczba);
  return 0;
}

void rysujWiersz(int ileKropek, int num)
{
  for (int i = 0; i < ileKropek; i++)
  {
    cout << ".";
  }
  for (int i = 0; i < num - ileKropek * 2; i++)
  {
    cout << "X";
  }

  for (int i = 0; i < ileKropek; i++)
  {
    cout << ".";
  }
  cout << endl;
}

void rysujSrodek(int num)
{
  if (num % 2 == 0)
  {
    for (int i = 0; i < 2; i++)
    {

      for (int j = 0; j < num; j++)
      {
        cout << "X";
      }
      cout << endl;
    }
  }
  else
  {
    for (int i = 0; i < num; i++)
    {
      cout << "X";
    }
    cout << endl;
  }
}

void rysujGore(int num)
{
  if (num % 2 == 0)
  {
    for (int ileKropek = num / 2 - 1; ileKropek > 0; ileKropek--)
    {
      rysujWiersz(ileKropek, num);
    }
  }
  else
  {
    for (int ileKropek = num / 2; ileKropek > 0; ileKropek--)
    {
      rysujWiersz(ileKropek, num);
    }
  }
}

void rysujDol(int num)
{
  if (num % 2 == 0)
  {
    for (int ileKropek = 1; ileKropek < num / 2; ileKropek++)
    {
      rysujWiersz(ileKropek, num);
    }
  }
  else
  {
    for (int ileKropek = 1; ileKropek <= num / 2; ileKropek++)
    {
      rysujWiersz(ileKropek, num);
    }
  }
}
0

Wygrałem! :D

#include <iostream>

int main()
{
  int size = 5;
  int i, j;
  
  for (i = (size + 1) % 2 + 1; i <= size - size % 2; i += 2)
  {
    for (j = 1; j <= (size - i) / 2; j++) std::cout << '.';
    for (j = 1; j <= i; j++)              std::cout << 'X';
    for (j = 1; j <= (size - i) / 2; j++) std::cout << '.';
    
    std::cout << '\n';
  }
  
  for (i = size; i > 0; i -= 2)
  {
    for (j = 1; j <= (size - i) / 2; j++) std::cout << '.';
    for (j = 1; j <= i; j++)              std::cout << 'X';
    for (j = 1; j <= (size - i) / 2; j++) std::cout << '.';
    
    std::cout << '\n';
  }
}

Kod testowałem tutaj – http://cpp.sh/3cgu2 – chyba nie jest taki zły (nie znam C++ zbyt dobrze).

Zmienna size ma hardkodowaną wartość, więc trzeba sobie przerobić na pobieranie danych od użytkownika. Kod nie jest zgodny z regułą DRY, jednak nie wiem czy pytacz zna już funkcje, stąd kopia pętli wypisujących dane na ekranie.

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