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