Pętla nie wykonuje się poprawnie.

0

Witam, mam do zrobienia prosty program w którym podaje liczbę zestawów 3 liczb, a potem wyszukuje w tych trzech liczbach min i max. I tak tyle razy, ile jest zestawów. Nie mam problemu z min i max, ale nie mam pojęcia czemu prosta pętla nie wykonuje się tak, jakbym chciał. Gdy podaje np. 5 zestawów, to raz się wykonuje 3 razy, raz 2. Może ktoś spojrzeć i podpowiedzieć co jest nie tak? Na początku programowania działała normalnie, coś się potem musiało sknocić.

# include <iostream>
# include <cstdio>
# include <conio.h>
using namespace std;

int main()
{
    int liczbaZestawow;
    cout << "Podaj liczbe zestawow.";
    cin >> liczbaZestawow;
    for (int i = 0; i < liczbaZestawow; i++ )
    {
        int tablicaLiczb[2];
        int a, b, c;
        int k = 0;
        int j = 0;
        cout << "Podaj 3 liczby. ";
        cin >> a;
        cin >> b; 
        cin >> c;
        int max;
        int min;
        tablicaLiczb[0] = a;
        tablicaLiczb[1] = b;
        tablicaLiczb[2] = c;
        max = tablicaLiczb[0];  //tymczasowy maks
        min = tablicaLiczb[0];  // tymczasowy min
        for (k; k < 3; k++) // licze maksimum
        {
            if (tablicaLiczb[k+1] > max)
            {
                max = tablicaLiczb[k+1];
            }
        }
        for (j; j < 3; j++) //licze minimum
        {
            if (tablicaLiczb[j+1] < min)
            {
                min = tablicaLiczb[j+1];
            }
        }
        cout << min << " " << max << '\n';  // wypisuje max i min
    }
    getchar();
}
1

Tablice są indeksowane od zera.
Oraz int tablicaLiczb[2]; oznacza tablice dwuelementową.

0

Tak wiem, ale w zależności od liczb jakie wpisze, zmienia się liczba pętli która się wykona... Np. jak podam tylko liczby "1 2 3", chce zestawów 5, to wyszuka mi min i max tylko 3 razy i się kończy. A jak podam jakieś różne inne, to cztery razy lub dwa. Czemu? Albo jak podam, że chce 2 zestawy, to każe mi wpisać 3 zestawy.

P.S. Sama pętla działa normalnie, to w reszcie programu jest coś, co mi to miesza...

0

tablicaLiczb[2] = c;
pod adresem tablicaLiczb+2 jest prawdopodobnie zmienna liczbaZestawow
tym samym nadpisujesz ja liczba 3 przy wczytywaniu liczb do tablica liczb

tutaj
tablicaLiczb[k+1]
nawet dobierasz się do zmiennej tablicaLiczb[3] co już jest w ogóle straszne

0

No tak, racja... chwila, poprawie i zobaczę czy działa.

Poprawiłem te sprawdzanie tablicyLiczb[3] (w pętlach do szukania min i max dałem i<2, j<2) ale nie poprawiło to problemu.

pod adresem tablicaLiczb+2 jest prawdopodobnie zmienna liczbaZestawow
tym samym nadpisujesz ja liczba 3 przy wczytywaniu liczb do tablica liczb

Nie rozumiem za bardzo, w sensie jak to możliwe?

2
Apprentice napisał(a):

Poprawiłem te sprawdzanie tablicyLiczb[3] (w pętlach do szukania min i max dałem i<2, j<2).

Nie poprawiłeś tylko dalej zepsułeś. Od początku:

int tab[2];

tworzy tablicę 2-elementową o indeksach 0 i 1. Czyli istnieją 2 elementy: tab[0] i tab[1], odwołanie się do elementu tab[2] jest ciężką zbrodnią i program może wyczyniać różne cuda.
Czyli w Twoim przypadku trzeba:

int tablicaLiczb[3];

Dalej:

for (k; k < 3; k++)    // licze maksimum
{
    if (tablicaLiczb[k+1] > max)
    {
        max = tablicaLiczb[k+1];
    }
}

Nawet jeśli deklarujesz tablicę poprawnie, to nadal jest źle tutaj (wcześniej było podwójnie źle). Jakie wartości przyjmuje k? Na logikę 0, 1, 2. To jakie wartości przyjmuje k+1? I czym jest tablicaLiczb[3] dla tablicy 3-elementowej? Ciężką zbrodnią.

1

Nie rozumiem za bardzo, w sensie jak to możliwe?
Stos może być na przykład tak ułożony
http://screenshooter.net/100253651/eolcowv
numery na obrazku odpowiadają indeksom tablicy tablicaLiczb[2]

0

O rany, racja... przypomniałem sobie, że to wtedy, jak zmieniałem to z 3 na 2, to się pętla zepsuła. Koniec tematu, wszystko działa dziękuje za pomoc :).

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