Tablice C++, wyznaczanie maksimum oraz ilości liczb powyżej i poniżej średniej

0

Treść zadania: Zaalokuj tablicę 30 elementową liczb typu integer i wypełnij ją liczbami losowymi z przedziału 100-199. W tablicy:

  • znajdź najmniejszą liczbę
  • znajdź największą liczbę
  • średnią wszystkich liczb
    -wyznacz ile liczb mieści się w przedziale poniżej i powyżej średniej.
    Pamiętaj o poprawnej alokacji tablicy i zwolnieniu pamięci po wykonaniu zadania.

I generalnie to udało mi się wypocić, ale jest problem z największą liczbą i wyznaczeniem ilości liczb powyżej i poniżej średniej.
Byłabym bardzo wdzięczna za wskazanie błędu w kodzie :///

Załącznik nie chciał się przesłać niestety więc:

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main() {
	
	srand(time(NULL));
	
	int ilosc = 30;
	int *tab;
	tab=new int[ilosc];
	
	int liczba;
	int max=tab[0];
	int min=tab[0];
	float suma=0;
	float srednia=0;
	int pow=0;
	int pon=0;
	
	
	int i;
	for(i=0; i<ilosc; i++)
	{
		liczba=100+rand()%99;
		tab[i]=liczba;
		cout<<i+1<<". "<<liczba<<endl;
	
	    if(min>tab[i]) min=tab[i];
	    if(max<tab[i]) max=tab[i];
	    
	    suma+=tab[i];
	    srednia=suma/30;
	    
	    if(tab[i]>srednia) pow++;
	    if(tab[i]<srednia) pon++;
	
	}
	
	
	cout<<endl<<"Najmniejsza liczba: "<<min<<endl;
	cout<<"Najwieksza liczba: "<<max<<endl;
	
	cout<<"Srednia liczb: "<<srednia<<endl;
	
	cout<<"Ilosc liczb w przedziale powyzej sredniej: "<<pow<<endl;
	cout<<"Ilosc liczb w przedziale ponizej sredniej: "<<pon<<endl;
	
	
	delete [] tab;
	
	
	return 0;
}

Wiem, że zadanie jest proste, no ale jakoś nie wychodzi.

1
int max=tab[0];
int min=tab[0];

tu podstawiasz dane losowe..... bo pod tab[0] są dane przypadkowe.

jako max daj wartość minimalną przedziału, jako min, daj wartość maksymalną przedziału.

drugi błąd, to wyliczanie średniej i odnosenie sie do niej, masz za każdym razem porównanie nie ze średnią, a ze średnią szczątkową....

2
kaczus napisał(a):
int max=tab[0];
int min=tab[0];

tu podstawiasz dane losowe..... bo pod tab[0] są dane przypadkowe.

jako max daj wartość minimalną przedziału, jako min, daj wartość maksymalną przedziału.

drugi błąd, to wyliczanie średniej i odnosenie sie do niej, masz za każdym razem porównanie nie ze średnią, a ze średnią szczątkową....

To jest racze undefined behavior, bo w tym momencie nie wiadomo jaką wartość ma tab[0]. To są dane o niezdefiniowanym zakresie i nie muszą być z kontrolowanego przez ciebie sposobu losowania (to losowanie odbywa się później). Tam może być cokolwiek co da się reprezentować typem int.

Ten błąd wynika z tego, że chcesz robić wszystko od razu.
Podziel ten kod na części (funkcje) odpowiadające za:

  • stworzenie tablicy z losowymi wartościami
  • wyznaczenie potrzebnych danych statystycznych.

A wszystko się samo naprawi.

0

Chyba nie za bardzo rozumiem ://
W sensie, że zmienna ma wyglądać:
int min=tab[199]
int max=tab[100]?

a co do średniej to już w ogóle nie ogarniam w jaki sposób odnieść się do tej właściwej i jak ją obliczyć, nie widzę błędu

(Sorry ale programowanie zaczynam i mało ogarniam)

0

Zacznij od nowa, Zrób jak radzi @MarekR22. Pisz sobie testy do każdej funkcji.

0

Okej, podzieliłam całość na dwie pętle i dalej te trzy rzeczy nie działają ://
Możliwe, że gdzieś w kodzie jest błąd? Może po prostu źle się do tego zabrałam?

0

Po kompilacji wygląda to tak

0
kq napisał(a):

Pokaż kod, szklana kula nie wychodzi z szafy (boi się koronawirusa), więc sami się nie domyślimy co teraz tam masz.

PS:

Cóż dużo się nie zmieniło ale proszę:


#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{

    srand(time(NULL));

    int ilosc = 30;
    int* tab;
    tab = new int[ilosc];

    int liczba;

    int max = tab[0];
    int min = tab[0];
    float suma = 0;
    float srednia;
    int pow = 0;
    int pon = 0;

    int i;
    for (i = 0; i < ilosc; i++) {
        liczba = 100 + rand() % 99;
        tab[i] = liczba;
        cout << i + 1 << ". " << liczba << endl;
    }

    for (int i = 0; i < ilosc; i++) {

        if (min > tab[i])
            min = tab[i];
        if (max < tab[i])
            max = tab[i];

        suma += tab[i];
        srednia = suma / 30;

        if (tab[i] > srednia)
            pow++;
        if (tab[i] < srednia)
            pon++;
    }

    cout << endl
         << "Najmniejsza liczba: " << min << endl;
    cout << "Najwieksza liczba: " << max << endl;

    cout << "Srednia liczb: " << srednia << endl;

    cout << "Ilosc liczb w przedziale powyzej sredniej: " << pow << endl;
    cout << "Ilosc liczb w przedziale ponizej sredniej: " << pon << endl;

    delete[] tab;

    return 0;
}
0

Tak to powinno iśc, na zachęte Masz dwie funkcje:

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void fillWithRandom(int tab [], int n) {
	srand(time(NULL));
	int liczba;
	for(int i=0; i < n; i++){
		liczba=100+rand()%99;
		tab[i]=liczba;
		cout<<i+1<<". "<<liczba<<endl;
	}
}

float mean(int tab [], int n) {
	// cos z n = 0
	float s = 0;
	for (int i = 0; i < n; ++i)
		s += tab[i];
	return s / n;
}

int main() {
	int ilosc = 4;
	int *tab;
	tab=new int[ilosc];
	fillWithRandom(tab, ilosc);
	std::cout << mean(tab, ilosc);
	
	delete [] tab;

	return 0;
}
2

    int max = tab[0];
    int min = tab[0];
    float suma = 0;
    float srednia;
    int pow = 0;
    int pon = 0;

    int i;
    for (i = 0; i < ilosc; i++) {
        liczba = 100 + rand() % 99;
        tab[i] = liczba;
        cout << i + 1 << ". " << liczba << endl;
    }

@MarekR22 już o tym pisał. Zastanów się nad chronologią:

int tab[2];
int first = tab[0];
tab[0] = 42;
tab[1] = 43;

Jaką wartość ma first? Żadną, masz UB w kodzie, pierw uzupełnij tablicę, a potem pobieraj jej dane.

PS: polecam lekturę moich postów na blogu, linki wyżej.

0

Aish, faktycznie mój błąd.
Jest okej jeśli chodzi o największą liczbę (Dzięki wielkie swoją drogą)

Ale ilość liczb powyżej i poniżej średniej dalej źle się wyświetla ://

1

Popracuj z debuggerem, zobacz jak się zmieniają wartości na żywo. No i przede wszystkim, odpowiedz na jedno ważne pytanie: dlaczego porównujesz do średniej, gdy jeszcze jej nie obliczyłaś?

0

Dobra już wiem gdzie były problemy. Szczerze mówiąc nie spodziewałam się, że chronologia w kodzie ma takie znaczenie (Nauczyciel nigdy o tym nie wspomniał, zmienne po prostu miały być na początku, żeby było czytelniej).
Błąd, jak zwykle, bardzo prosty i logiczny.

Dziękuje wszystkim

0

Czy jest możliwość żebyś @Chandraa podzieliła się już poprawnym kodem?

0

jasne C:

Poprawiony kod wygląda tak:

#include <iostream>
#include <ctime>
#include <cstdlib>


using namespace std;

int main() {
	
	srand(time(NULL));
	
	
	int ilosc = 30;
	int *tab;
	tab=new int[ilosc];
	
	
	float suma=0;
	float srednia;
	int liczba;
	
	
	int i;
	for(i=0; i<ilosc; i++)
	{
		liczba=100+rand()%99;
		tab[i]=liczba;
		cout<<i+1<<". "<<liczba<<endl;
		
	    suma+=tab[i];
	    srednia=suma/30;
	} 
	
	
	int max=tab[0];
	int min=tab[0];
	
	
	int pow=0;
	int pon=0;
	
	
	for(int i=0; i<ilosc; i++)
	{
		
	    if(min>tab[i]) min=tab[i];
	    if(max<tab[i]) max=tab[i];
	    
	    
	    if(tab[i]>srednia) pow++;
	    if(tab[i]<srednia) pon++;
	
	}
	

	
	cout<<endl<<"Najmniejsza liczba: "<<min<<endl;
	cout<<"Najwieksza liczba: "<<max<<endl;
	
	cout<<"Srednia liczb: "<<srednia<<endl;
	
	cout<<"Ilosc liczb w przedziale powyzej sredniej: "<<pow<<endl;
	cout<<"Ilosc liczb w przedziale ponizej sredniej: "<<pon<<endl;
	
	
	delete [] tab;
	
	
	return 0;
}
0
srednia=suma/30;

Zastanów się ile razy powinna być liczona średnia w tym kodzie.

liczba=100+rand()%99;
tab[i]=liczba;

I czy potrzebna ci jest zmienna liczba.

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