Pytanie do kodu

0

Witam, mam pewien problem ze swoim kodem. Służy on do wpisania 5 cyfr do tablicy, a potem obliczenia średniej i wypisania większych od średniej. W kodzie jest sprawdzenie danych i teraz jeżeli wpiszę 3 cyfry np. 20.0, 15, 13 oraz literkę zamiast dwóch następnych cyfr to program normalnie obliczy średnią i wypiszę większe od średniej, ale konsola natychmiast się zamyka. Przy podaniu poprawnych danych nie zamyka się od razu tylko czeka na enter czy coś. Kompiluje w VS 15'.

#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;

const int SIZE = 5;

double srednia(double tab[], int n);
void wieksze(double tab[], int n, int gr);

int main(void)
{
	double datki[SIZE];
	int i{};

	while (i<SIZE && cin >> datki[i] )
		i++;

	cout << endl<<"Srednia: "<< srednia(datki, i);
	cout <<endl<< "Wieksze: ";
	wieksze(datki, i, srednia(datki, i));


	cin.get();
	cin.get();

	return 0;
}

double srednia(double tab[], int n)
{
	double suma{};
	for (int i = 0; i < n; i++)
		suma = suma + tab[i];

	return suma / double(n);
}

void wieksze(double tab[], int n, int gr)
{
	for (int i{}; i < n; i++)
		if (tab[i] > gr) cout << tab[i] << "\t";
}
0

while (i<SIZE && cin >> datki[i] )
Tutaj jeśli user wprowadzi coś nie będącego typem double, to cin >> datki[i] się nie uda, ale program poleci dalej. Warunek pętli while przestanie być spełniony i Twój program będzie działał częściowo na niezainicjalizowanej tablicy.

0

Tak działa obsługa wejścia standardowego. Wczytanie literek jako liczby (nie cyfry) nie powodzi się, więc cin >> datki[i] ewaluuje się do false. Literka i znak nowej linii (enter) pozwalają przejść przez dwa gety które masz niżej.

0

@kq: Właśnie chciałbym się dopytać co muszę dodać, żeby nie przeskakiwało przez moje gety, bufor oczyścić czy coś w tym kierunku? Próbowałem już:

std::cin.clear();
std::cin.sync();

P.S. @pingwindyktator To jest specjalnie tak, nie o to pytam :P.

0
double getDouble()
{
   double val;
   while(!(std::cin >> val)) {
        std::cout << "wrong value, again:\n";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max());
    }
    return val;
}

Pisane z palca, ale powinno działać.

0

@kq: W sumie to dodałem te 2 linijki

	std::cin.clear();
	std::cin.ignore(std::numeric_limits<std::streamsize>::max());

Zamiast cin.get(); i działa. Dzięki wielkie :)

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