Gdzie jest błąd w moim rozumowaniu?

0

Witam!
Proszę się nie zrazić, ale mój problem będzie pewnie dla większości banalny, jednakże nie potrafię zrozumieć co robię źle.

Otóż szukając zadań z c++ już na samym początku trafiłem na takie, którego nie potrafię wykonać (teraz już tak, ale nie rozumiem dlaczego się tak dzieje).

Otóż zadaniem jest "napisanie" wykorzystując pętle czegoś takiego:

X
XX
XXX
XXXX
XXXXX 

I kod (poprawny) wygląda tak:

 #include <iostream>


using namespace std;



int main()
{

for (int i=0; i<5; i++)
{
  for(int j=0; j<=i; j++)

        cout << "X";
      cout << endl;


}

    return 0;
}

Otóż gdzie jest błąd w moim rozumowaniu? Ano tutaj, że nie do końca rozumiem dlaczego w kolejnym wersie zawsze jest o jeden "x" więcej niż w poprzednim.

Jeśli na samym początku i=0 to j=0 powoduje, że program wypisze "X" oraz enter:

 X
(enter)

Kolejno i=1, a skoro j=0 to pętla wykona się 2 razy powodując, że program wpisze "X" enter "X" enter

X
X  <------- tu wczesniej byl enter
(enter)
X
(enter)

Później i=2, a skoro j=1 to pętla wykona się również 2 razy powodując to samo co wyżej, czyli: "X" enter "X" enter

X
X
(enter)
X
X <------- tu wczesniej byl enter
(enter)
X
(enter)

Może mi ktoś wytłumaczyć, jak powinienem rozumieć tą pętlę w pętli?

0

cout << "X"; tutaj NIE wypisuje sie enter
cout << endl; tutaj tak.
Zauważ że ten kod to jest:

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

Więc jak widać nowa linia wypisuje się tylko raz za każdym obiegiem pętli zewnętrznej. W pętli wewnętrznej wypisują sie same X.

0

Tak jak napisał Shalom, mylącą sprawą w tej pętli wewnętrznej dla Ciebie było zapewne to, że brakowało klamerek (ta pętla zawiera tylko jedną instrukcję - wypisanie "X" na ekranie). Teraz już wszystko jasne :)

0
Shalom napisał(a):

cout << "X"; tutaj NIE wypisuje sie enter
cout << endl; tutaj tak.
Zauważ że ten kod to jest:

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

Więc jak widać nowa linia wypisuje się tylko raz za każdym obiegiem pętli zewnętrznej. W pętli wewnętrznej wypisują sie same X.

Hmm.. no ok, ale jeszcze coś.

Pytanie 1:
A co jeśli chciałbym, żeby pętla wewnętrza wypisywała X oraz enter? Wstawiając county jeden pod drugim okazalo sie, ze jeden dotyczy petli wewnetrznej, a drugi petli zewnetrznej

Pytanie 2:
Dlaczego moge wyswietlic w konsoli i, natomiast nie moge j?

Pytanie 3:
Jeśli
i=0 oraz j=0 więc wypisuje się X i przechodzi do endl czyli powstaje:

X
(enter)

i=1 oraz j=0 więc wypisuje się X 2 razy i przechodzi do endl czyli mamy:

X
XX    <------ tu wcześniej był enter
(enter)

i=2 oraz j=1 więc wypisuje się X 2 razy i przechodzi do endl czyli mamy:

X
XX    <------ tu wcześniej był enter
XX    <------ tu wcześniej był enter
(enter)

W moim rozumowaniu figura wyglądałaby tak:

X
XX
XX
XX
XX

Wyjaśnienem byłoby to, że j po okrążeniu zawsze się zeruje. Czyli:
i=0 j=0 jedno napisanie X oraz enter
i=1 j=0 dwukrotne napisanie X oraz enter
i=2 j=0 trzykrotne napisanie X oraz enter
..
itd.
Czy to jest odpowiedź na moje pytanie?

0

Oczywiście że sie zeruje, przecież masz to w warunku początkowym pętli:
for(int j=0; j<=i; j++)
Taki zapis oznacza:
for(wykonaj przed całą pętlą; sprawdź przed każdym obiegiem pętli i wykonuj tylko jeśli prawdziwe; wykonaj po każdym obiegu pętli)

0
5S25 napisał(a):

Pytanie 1:
A co jeśli chciałbym, żeby pętla wewnętrza wypisywała X oraz enter? Wstawiając county jeden pod drugim okazalo sie, ze jeden dotyczy petli wewnetrznej, a drugi petli zewnetrznej

Pytanie 2:
Dlaczego moge wyswietlic w konsoli i, natomiast nie moge j?

  1. Wypisałoby:
X
X
X
X
X
X
...
  1. Możesz, wewnątrz drugiej pętli, ponieważ zmienne tworzone w "nawiasie" pętli są zmiennymi (tak jakby) lokalnymi.
0
Shalom napisał(a):

Oczywiście że sie zeruje, przecież masz to w warunku początkowym pętli:
for(int j=0; j<=i; j++)
Taki zapis oznacza:
for(wykonaj przed całą pętlą; sprawdź przed każdym obiegiem pętli i wykonuj tylko jeśli prawdziwe; wykonaj po każdym obiegu pętli)

AA już rozumiem, za każdym razem kiedy j dogania i to się zeruje. Czyli:
i=0 j=0 wypisanie x 1 raz (koniec petli wewnetrznej)
i=1 j=0 wypisanie x 2 razy (koniec petli wewnetrznej)
i=3 j=0 wypisanie x 3 razy...

Spróbuje sobie odpowiedzieć na 1. pytanie

 #include <iostream>
 
 
using namespace std;
 
 
 
int main()
{
 
for (int i=0; i<5; i++)
{
  for(int j=0; j<=i; j++)
 
        cout << "X";
      cout << endl;
 
 
}
 
    return 0;
} 

Powodem, dla którego jeden cout dotyczył pętli wewnętrznej a drugi zewnętrznej jest to, że usuwając nawiasy powoduje się, że jeden wers jest przeznaczony dla jednej pętli, a drugi dla drugiej?

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

==

for(int i=0; i<5; i++)
{
	cout << "X";
}
cout << "Y";
for(int i=0; i<5; i++)
	for(int j=0; j<=i; j++)
		cout << "X";
cout << "Y";

==

for(int i=0; i<5; i++) 
{
	for(int j=0; j<=i; j++)
	{
		cout << "X";
	}
}
cout << "Y";

Jak dobrze używasz tabulacji(układania kodu) to lepiej widać niektóre rzeczy :)

0
for (int i=0; i<5; i++)
{
  for(int j=0; j<=i; j++)

        cout << "X";
      cout << endl;


}

możesz sobie rozpisać na:

int i = 0;

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

cout << endl;

i = 1;

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

cout << endl;

i = 2;

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

cout << endl;

i = 3;


}

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