• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pisze program gdzie wpisując do tablicy kolejne wartości pokazuje mi jej statystyki: suma, średnia i wartość najwyższa.

0 głosów
62 wizyt
pytanie zadane 15 grudnia 2021 w C i C++ przez Steked Nowicjusz (120 p.)
#include <iostream>

using namespace std;

int main()
{
	float divide = 1, sum = 0;
	int counter = 1;
	setlocale(LC_CTYPE, "Polish");
	
	for(int i = 0; ; i++)
	{ 
		int tab[i];
		
		cout<<"Wpisz dane: ";
		cin>>tab[i];
		sum+=tab[i];
		
		cout<<"Suma wynosi: ";
		cout<<sum<<"\n";
		
		cout<<"Średnia wynosi: ";
		cout<<(sum/divide)<<"\n\n";
		divide++;
		for(int k = 0; k < counter; k++)
		{
		if (tab[0] < tab[k])
			tab[0] = tab[k];
		}
		counter++;
		cout<<tab[0]<<"\n\n";
	}
	return 0;
}

Cześć.

Jestem dość nowy w C++. Problem polega na tym, że zawsze za piątym razem gdy wpisuję wartość, zmienna wyznaczająca wartość największą tablicy zwraca wartość 34 i potem się psuje. Nie mam pojęcia co zrobiłem źle, naprowadzi mnie ktoś, albo chociaż wskaże poprawną drogę?

1 odpowiedź

0 głosów
odpowiedź 15 grudnia 2021 przez Pawel1995 Gaduła (3,160 p.)
edycja 15 grudnia 2021 przez Pawel1995

1. Brak warunku w pętli for

2. int tab[i]; przed pętla bo za każdym razem tworzysz ja na nowo. [całą tablice zamiast chcianej zmiennej]

3. tab[0] = tab[k]; nie ma sensu nadpisywanie jednej i tej samej zmiennej

 

Skasowałem setlocale(LC_CTYPE, "Polish"); oraz zmieniłem punkt 1. na  int* tab = new int[i];

U mnie działa poprawnie:

 

#include <iostream>

using namespace std;

int main()
{
    float divide = 1, sum = 0;
    int counter = 1;

    for (int i = 0; ; i++)
    {
        int* tab = new int[i];

        cout << "Wpisz dane: ";
        cin >> tab[i];
        sum += tab[i];

        cout << "Suma wynosi: ";
        cout << sum << "\n";

        cout << "Średnia wynosi: ";
        cout << (sum / divide) << "\n\n";
        divide++;
        for (int k = 0; k < counter; k++)
        {
            if (tab[0] < tab[k])
                tab[0] = tab[k];
        }
        counter++;
        cout << tab[0] << "\n\n";
    }
    return 0;
}

 

komentarz 15 grudnia 2021 przez j23 Mędrzec (172,840 p.)
edycja 15 grudnia 2021 przez j23

A gdzie podziało się delete[]? Indeksujesz poza zakresem. No i sens użycia tablicy w tym zadaniu jest żaden.

int* tab = new int[i]; nie realokuje tablicy, a jedynie nadpisuje wskaźnik na starą wskaźnikiem na nową (co oczywiście powoduje wyciek). Ergo - zmiana tak samo błędna jak u OP, tylko zgodna ze standardem C++ ;)

1
komentarz 15 grudnia 2021 przez Oscar Pasjonat (24,050 p.)
Po co szukać max za każdym razem w całej tablicy. Podobnie jak suma, maksymalna wartość może być liczona na bieżąco, jeśli nowo wczytana liczba jest większa do aktualnego max to uaktualniamy max i już.

Tak w ogóle nie znamy dokłądnej treści zadania/założeń programu, więc można założyć że tablica jest wystarczająca. Za mało danych by stwierdzić jaka implementacja jest najlepsza.

Podobne pytania

0 głosów
1 odpowiedź 88 wizyt
0 głosów
2 odpowiedzi 341 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 81 wizyt

87,901 zapytań

136,488 odpowiedzi

304,300 komentarzy

58,284 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...