Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Rozdział 30] Problem z pracą domową.

Ostatnio zmodyfikowano 2014-10-01 16:30
Autor Wiadomość
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:

C/C++
#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 :/
P-117487
Mateus.
» 2014-09-25 05:55:24
Nie potrzebne jest tyle warunków. Wypisuj wszystko w najbardziej zagnieżdżonej pętli.
P-117488
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
P-117524
Rashmistrz
» 2014-09-25 17:27:20
Podpowiedzi i uwagi:
1.Przeczytaj jeszcze raz:
» Kurs C++ » Poziom 2Pętla for lekcja:
"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:
C/C++
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
P-117531
Rashmistrz
» 2014-09-25 18:48:02
Twój program po moich poprawkach (nie do końca sprawny):
C/C++
#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;
}
P-117547
pekfos
» 2014-09-25 19:59:01
Po co tu pchać jakąkolwiek dodatkową funkcję..? Wystarczy do tego zwykły, poprawnie użyty for.
P-117556
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:
C/C++
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
P-117559
Rashmistrz
» 2014-09-25 21:06:52
@grzesio
C/C++
#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.
P-117562
« 1 » 2
  Strona 1 z 2 Następna strona