FIGUS Temat założony przez niniejszego użytkownika |
[Rozdział 30] Problem z pracą domową. » 2014-09-24 23:17:11 Witam Oto treść zadania: Wyobraź sobie, że masz pięć pudełek. W każdym pudełku możesz umieścić jedną liczbę całkowitą z przedziału od 1 do 3 włącznie. Napisz program, który wypisze na ekranie wszystkie możliwe kombinacje w jaki sposób można zapełnić pudełka. Fragment danych wypisywanych na ekranie: 1 1 1 1 1 1 1 1 1 2 1 1 1 1 3 1 1 1 2 1 1 1 1 2 2 1 1 1 2 3 1 1 1 3 1 ... 3 3 3 3 1 3 3 3 3 2 3 3 3 3 3 Gdy uruchamiam program, widzę pojawiające się w nieskończoność jedynki. Analizowałem kod chyba z kilkanaście razy i zawsze wydawał mi się logiczny, więc nie wiem co może być nie tak. Może to moja logika już o tej porze zawodzi, jednak proszę Was o pomoc, doradźcie coś, gdzie zrobiłem błąd, a może muszę pisać program od nowa... Prozę o pomoc :) Oto kod: #include <iostream>
int fb( int a, int & b ) { if( a == 3 ) { b++; } }
int fc( int b, int & c ) { if( b == 3 ) { c++; } }
int fd( int c, int & d ) { if( c == 3 ) { d++; } }
int fe( int d, int & e ) { if( d == 3 ) { e++; } }
int main() { for( int a = 1; a <= 3; a++ ) { for( int b = 1; b <= 3; fb( a, b ) ) { for( int c = 1; c <= 3; fc( b, c ) ) { for( int d = 1; d <= 3; fd( c, d ) ) { for( int e = 1; e <= 3; fe( d, e ) ) { std::cout << e << " "; } std::cout << d << " "; } std::cout << c << " "; } std::cout << b << " "; } std::cout << a << " " << std::endl; } return 0; }
A, i proszę nie mówić żebym zaczynał od nowa kurs, itp. bo jakoś dotąd robiłem wszystko dobrze, tylko tutaj mam nie lada problem :/ |
|
Mateus. |
» 2014-09-25 05:55:24 Nie potrzebne jest tyle warunków. Wypisuj wszystko w najbardziej zagnieżdżonej pętli. |
|
Leon90 |
» 2014-09-25 16:33:20 int main() { int a, b, c; a = b = c = 1; for (; a < 4; a++) { for (; b < 4; b++) { for (; c < 4; c++) { cout << a << b << c << endl; } c = 1; } b = 1; } system("pause"); }
itd |
|
Rashmistrz |
» 2014-09-25 17:27:20 Podpowiedzi i uwagi: 1.Przeczytaj jeszcze raz: Pętla for: "Inicjalizacja zmiennych w pętli for" ... taka zmienna będzie tworzona specjalnie dla pętli i po jej zakończeniu (pętli) będzie kasowana... 2.Najczęściej wykonywaną pętlą jest ta w samym środku, (zmienia kombinację) dlatego przenieś tam wypisywanie. ________________________________________________________ EDIT: 3.Możesz korzystać z innych typów zmiennych. np. short 4.Te funkcje u góry są powielone wystarczy jedna: void powieksz( int arg1, int & arg2 ) { if( arg1 == 3 ) arg2++; } 5.Moim zdaniem pozapominałeś niektóre rzeczy z poprzednich lekcyj. ________________________________________________________ EDIT 2: 6.Przestaw argumenty podczas wywoływania funkcji lub przepisz w funkcji argumenty w funkcji na odwrót. 7.Niepotrzebnie wstawiłeś a++, funkcja w "wewnętrzniejszej" pętli ją powiększa. 8.Do wykonania tego zadania wystarczą same pętle bez tych funkcji które zrobiłeś. ... Chyba sam zaraz napiszę ten program według twojej idei i napiszę co poprawiłem. :/ ________________________________________________________ EDIT 3: 9.W "najwęwnętrzniejszej" pętli nie powiększasz wartości " e", dlatego ciągle wypisują Ci się jedynki. :F |
|
Rashmistrz |
» 2014-09-25 18:48:02 Twój program po moich poprawkach (nie do końca sprawny): #include <iostream> void powieksz( int arg1, int & arg2 ) { if( arg1 == 3 ) arg2++; }
int main() { for( int a = 1; a <= 3; ) { for( int b = 1; b <= 3; powieksz( b, a ) ) { for( int c = 1; c <= 3; powieksz( c, b ) ) { for( int d = 1; d <= 3; powieksz( d, c ) ) { for( int e = 1; e <= 3; powieksz( e, d ) ) { std::cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << std::endl; e++; } } } } } return 0; }
|
|
pekfos |
» 2014-09-25 19:59:01 Po co tu pchać jakąkolwiek dodatkową funkcję..? Wystarczy do tego zwykły, poprawnie użyty for. |
|
grzeso |
» 2014-09-25 20:09:33 nie musisz w żaden sposób ograniczać tego jak długo ma się dodawać kolejne a, b,c itp. To ogranicza b < 4 w przykładowej funkcji for( b = 1; b < 4; b++ ) to jest fajnie napisane: a = b = c = 1; for(; a < 4; a++ ) { for(; b < 4; b++ ) { for(; c < 4; c++ )
tylko nie wiem po co a,b,c są wyrzucone z pierwszego miejsca w funkcji for , bo tam jest ich miejsce |
|
Rashmistrz |
» 2014-09-25 21:06:52 @grzesio #include <iostream> int main() { short a, b, c; c = b = a = 1; for(; a < 4; a++ ) { for(; b < 4; b++ ) { for(; c < 4; c++ ) { std::cout << a << ' ' << b << ' ' << c << std::endl; } } } return 0; }
W tym przypadku program wymaga zerowania zmiennych, jak tego nie zrobisz to trzecia pętla w wykona się tylko 3 razy, czyli wypisze: 1 1 1; 1 1 2; 1 1 3; A później instrukcje znajdujące się w 3 pętli się nie wykonają bo nie będzie spełniony warunek c<4. Zmiany zmiennych programu napisanego przez Grzesia: (abc) 000; 001; 002; 003; 004; 014; 024; 034; 044; 144; 244; 344; 444; Koniec. Jak wcześniej mówiłem można wykorzystać specyficzną własność pętli for, czyli zadeklarowanie i zainicjowanie zmiennej w pętli która zostanie utworzona specjalnie dla pętli i skasowana po skończeniu pętli... Jako że zagnieżdżamy pętle to wychodzi z tym ciekawy efekt. |
|
« 1 » 2 |