Potrzebuję pomocy | zadanie w C++

0

Witam!
Ostatnio postanowiłem rozpocząć naukę programowania w C++. Jestem na etapie pętli while,for itp. Znalazłem takie zadanie:

Napisz program drukujący na ekranie wieżę z literek O:
O
OO
OOO
OOOO
OOOOO

I kompletnie nie wiem jak się za to zabrać a bardzo interesuje mnie jak wygląda taki program. Dlatego mam prośbę czy ktoś może mi po przysłać albo po prostu dać jakąś wskazówkę co musi zawierać się w pętli?

2

Zauważ że n-ta linia to n liter "O".
Możesz więc zrobić dwie pętle for - jedna dla ilości linii, druga do wypisywania "O". Druga pętla musi być w środku tej pierwszej.
Warunek drugiej pętli musi być taki, aby pętla wykonała się i razy, gdzie i to obecna linia (podpowiedź: i będzie zmienną pierwszej pętli).

1
#include <iostream>

using namespace std;

int main()
{
    

for (int i = 0; i < 6; i++)
{
  for (int j = i; j < 6; j++)
  {
    cout << "O";   
   }   
   cout << endl;
}
     
       
 
    
    getchar();
    getchar();
    return 0;
}

Tylko, że to pisze odwrotnie tzn wydruk jest taki:

OOOOOO
OOOOO
OOOO
OOO
OO
O

Ale mam nadzieję, że dojdziesz jak zmienić aby był wydruk w drugą stronę

W drugą stronę czyli tak jak w przkładzie:

for (int i = 6; i > 1 ; i--)
{
  for (int j = i; j < 6; j++)
  {
    cout << "O";   
   }   
   cout << endl;
}
     
0

Wielkie dzięki. Mam nadzieję że uda mi się to zrobić

0

Trochę się męczyłem ponieważ po odwróceniu kolejności pierwszej pętli "O" pokazywało się dopiero w 2 linijce i kończyło na "OOOO" zamiast "OOOOO". Ale na szczęście po zastąpieniu 6 siódemką w drugiej pętli wszytko jest tak jak powinno. Tu kod jeśli ktoś by go potrzebował:

#include <iostream>
using namespace std;

int main()
{

for (int i=6; i>1; i--)
{
for (int j = i; j < 7; j++)
{
cout << "O";
}
cout << endl;
}

return 0;

}

1

Można to zrobić na jwdnwj pętli:

#include <iostream>

using namespace std;

int main()
{
    string s {""};
    
    for (int i=0; i!=5; ++i) {
        s.push_back('O');
        cout << s << endl;
    }
    return 0;
}
0
Smutny Jeleń napisał(a):

Można to zrobić na jwdnwj pętli:

#include <iostream>

using namespace std;

int main()
{
    string s {""};
    
    for (int i=0; i!=5; ++i) {
        s.push_back('O');
        cout << s << endl;
    }
    return 0;
}

Nie trzeba dodać jakiejś biblioteki czy coś aby komenda "push_back" działała. Mam taki błąd
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11|
error: in C++98 's' must be initialized by constructor, not by '{...}'|

1

I bardzo dobrze że sam napisałeś :-) Tak więc program rozumiesz i wiesz co robi.
Tu masz o 1 krok dalej. Poczytaj o std::string tu: http://en.cppreference.com/w/cpp/string/basic_string
Oraz o dostępnych od C++11 pętlach z auto: http://en.cppreference.com/w/cpp/language/range-for

To bonus więc nie od razu wszystko zrozumiesz.

#include <iostream>
#include <string>

int main() {
    for(auto i = 1U; i <= 5; ++i) {
        std::cout << std::string(i, 'O') << '\n';
    }
}

Działający przykład online: https://wandbox.org/permlink/WStVYVDiB7PYKEB2

0

Miałem problem z tym błędem:
'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
Na szczęście udało mi się to rozwiązać jak teraz wiem w łatwy sposób ale trochę musiałem się tego naszukać. Niestety jak ten sam program na 2 pętlach jest już dla mnie jasny tak tego dalej do końca nie rozumiem mimo zapoznania się z przesłanymi przez cb artykułami. Gdybyś mógł mi wyjaśnić tą część pętli: "auto i = 1U;" oraz co powoduje: " '\n' "

1

U to skrót od unsigned, a \n to po prostu następna linia.

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