Może ja się po prostu nie nadaje do tego? Nie wiem, brak zdolności do myślenia logicznego? Albo po prostu te zagnieżdżanie mi słabo leży i jest trudne |
Może. A może po prostu dopiero zaczynasz i zamiast się przejmować powinieneś pisać? Jak czegoś nie wiesz to sprawdź, przecież nie chodzi o to, żeby wymyślać koło na nowo, tylko wiedzieć, jak coś zrobić w prosty sposób.
Rób tak: jeśli czegoś nie wiesz, sprawdź rozwiązanie, ale potem napisz podobny program, opierający się na tym, czego dotyczył poprzedni.
Wyobraź sobie, że masz pięć piłek i chcesz wylosować trzy z nich. Napisz program, który wypisze na ekranie wszystkie możliwe kombinacje piłek jakie można wylosować. Dane jakie powinny zostać wypisywane na ekranie: Najpierw plan. Mam 5 piłek i muszę wylosować 3 z nich.
Piłki numerujemy jako 1,2,3,4 i 5, przy czym oczywiste jest, że nie mogą się powtarzać w losowaniu(1, 2, 2 itd.). Jak to załatwić?
Załóżmy, że będziemy iść od najmniejszych wartości (tj. 1,2,3) i w ten sposób będzie to wypisywane, czyli pierwsza cyfra jest najmniejsza.
Skoro nie możemy pozwolić na 1,1,1 1,1,2 (będziemy to oznaczać jako i,j,k) to musimy "powiedzieć" kolejnym liczbą, że muszą być inne, niż jej poprzednicy.
Zaczynamy od i = 1, skoro 'i' jest równe jeden, to 'j' musi być równe 2 lub więcej, a 'k' 3 lub więcej.
zauważ, że i = 1, j = i+1, k = j+1
Kiedy już wypiszemy wszystkie opcje dla k ( pamiętamy, że k == j+1 && k <= 5) to czas zwiększyć zmienną j. j przyjmuje teraz wartość 2, a TO oznacza, że k przyjmuje wartość j+1, czyli 2+1. Teraz już zbiór liczb dla k to nie 1,2,3,4,5 tylko 2,3,4,5. Kiedy znowu zwiększy się j (3) to zbiór k skurczy sie jeszcze bardziej 4,5, a potem k zostanie tylko liczba 5 (1,4,5).
i = 1 j = i+1 k = j+1
i = 1 j = 2 k = 3
i = 1 j = 2 k = 4
i = 1 j = 2 k = 5
i = 1 j = 3 k = 4
i = 1 j = 3 k = 4
i = 1 j = 3 k = 5
i = 1 j = 4 k = 5
// uwaga, teraz j przybiera wartość 5, natomiast k o jeden większą. Jednak warunek nie pozwala nam, by k miało wartość 6 (bo jest tylko 5 piłek). Pętla 'k' więc od razu się kończy. 'j' przybiera
wartość 6, ale znowu okazuje się, że nie może tego zrobić, więc pętla się przerywa. Teraz to i zwiększa się o jeden
i = 2 j = 3 k = 4
i = 2 j = 3 k = 5
i = 2 j = 3 k = 5
i = 2 j = 4 k = 5
i = 3 j = 4 k = 5 // ostatni przypadek, potem przerywa się pętla k (bo k = 6), 'j' przyjmuje wartość 5, pętla 'k' znowu się przerywa (bo j+1 = 6), 'i' równa się 4, j = i+1 czyli 5, ale k = 6 i tak dalej się przerywa aż 'i' = 6 i następuje wyjście z ostatniej pętli i koniec programu
for( int i = 1; i < 6; i++ )
{
for( int j = i + 1; j < 6; j++ )
{
for( int k = j + 1; k < 6; k++ )
{
std::cout << i << " " << j << " " << k << "\n";
}
}
}
Nad każdym zadaniem trzeba trochę posiedzieć, myślę, że rok temu też bym miał z nim problem, chociaż znałem już zagnieżdżanie. Im więcej piszesz tym lepiej piszesz. To samo z zadaniami na myślenie.
PS. czterolinijkowe? To nieźle, bo pojedyncza pętla for z nawiasami i jedną instrukcją ma 4 linijki :o