Proszę o sprawdzenie kodu - zadania na studiach

0

Cześć.

Jestem początkujący, przygodę z programowaniem rozpocząłem niedawno na studiach.
Dostałem do napisania zadanie. W treści chodzi o losowe przypisanie 100 ocen książki, wypisanie tablicy, posortowanie, obliczenie średniej, mediany, która ocena występowała najczęściej, oraz histogram.
Proszę o sprawdzenie mojego kodu i wytłumaczenie, dlaczego zawsze jako najczęstszą ocenę wyświetla 10? Z resztą jakoś sobie poradziłem.
Sprawdzałem już różne źródła, kod przepisany z innych działających programów w moim nie działa, wciąż wyświetla 10.

Mój kod:

#include <iostream>
#include <ctime>
#include <iomanip>

using namespace std;

#define student 100 // dyrektywa definiujaca, liczba studentow oceniajaca ksiazke - 100
const int IleOcen = 11; // liczba ocen do wyboru (przedzial od 0 do 10)

void FunkcjaLosujacaZczasu(){srand(time(0));}
void LosowanieOcen (int*, int);
void PokazTablice (int*, int);
float SredniaOcen (int*, int);
void SortowanieTablicyOcen (int*, int);
float MedianaOcen (int*, int);
void NajczestszaOcena (int*);
int IlePoszczegolnychOcen (int*, int, int);
string Gwiazdka (int);
void HistogramGwiazdek (int*, int, int);

int main ()
{

int tab[student] = {0};
int ocena[IleOcen] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

float SredniaArytmetyczna;
float MedianaZocen;

FunkcjaLosujacaZczasu();

LosowanieOcen(tab, student);

cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl << endl;
cout << "Oceny wystawione przez studentow: " << endl << endl;
PokazTablice(tab, student);
cout << endl << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl << endl;

SortowanieTablicyOcen(tab, student);
cout << "Oceny wystawione przez studentow po posortowaniu od najnizszych do najwyzszych: " << endl << endl;
PokazTablice(tab, student);
cout << endl << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl << endl;

SredniaArytmetyczna = SredniaOcen(tab, student);
cout << "Srednia arytmetyczna wystawionych ocen: " << SredniaArytmetyczna << endl << endl;
cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl << endl;

MedianaZocen = MedianaOcen(tab, student);
cout << "Mediana wystawionych ocen: " << MedianaZocen << endl << endl;
cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl << endl;

NajczestszaOcena (ocena);

cout << endl << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl << endl;
cout << "Histogram wystawionych ocen skladajacy sie z '*':" << endl << endl;
HistogramGwiazdek(tab, student, IleOcen);
cout << endl << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl << endl;

return 0;
}

void LosowanieOcen (int* tab, int liczba)
{
for (int i = 0; i < liczba; i++)
tab[i] = rand()%(11);
}

void PokazTablice (int *tab, int liczba)
{
for (int i = 0; i < liczba; i++)
{
cout << setw(2) << tab[i] << " ";
if ((i+1) % 10 == 0)
{
cout << endl;
}
}
}

void SortowanieTablicyOcen (int *tab, int liczba)
{
for (int i = 0; i < liczba - 1; i++)
for (int j = 0; j < liczba - i - 1; ++j)
if (tab[j] > tab[j + 1])
swap(tab[j], tab[j + 1]);
}

float SredniaOcen (int *tab, int liczba)
{
float suma = 0;
for (int i = 0; i < liczba; i++)
suma += tab[i];
float srednia = suma / liczba;
return srednia;
}

float MedianaOcen (int *tab, int liczba)
{
if (liczba % 2 == 0)
return ((tab[liczba / 2] + ((tab[(liczba / 2) - 1]))) / 2.);
else
return tab [liczba / 2];
}

void NajczestszaOcena(int ocena[])
{
int Najczestsza = 0;
for (int i = 0; i <= 10 ; i++)
{
Najczestsza = max(Najczestsza, ocena[i]);
}
cout << "Najczestsze oceny: ";
for (int i = 0; i <= 10; i++)
{
if (ocena[i] == Najczestsza)
{
cout << i << ' ';
}
}
cout << endl ;
}
int IlePoszczegolnychOcen (int *tab, int ocena, int liczba)
{
int Ile = 0;
for (int i = 0; i < liczba; i++)
if (tab[i] == ocena)
Ile++;
return Ile;
}

string Gwiazdka (int ilosc)
{
string gwiazdki = "";
for (int i = 0; i < ilosc; i++)
gwiazdki += '*';
return gwiazdki;
}

void HistogramGwiazdek (int *tab, int liczba, int IleOcen)
{
int ilosc;
string gwiazdki;
for (int i = 0; i < IleOcen; i++)
{
ilosc = IlePoszczegolnychOcen(tab, i, liczba);
gwiazdki = Gwiazdka(ilosc);
cout << setw(2) << i << ": " << gwiazdki << endl;
}
}
1

Dla mnie jest niekonsekwentne na pograniczu C i C++. Nawet dwie stałe student (niekoniecznie dobrana nazwa skądkolwiek) a IleOcen (tu nazwa jest prawidłowa) są zapisane odmiennie
Tablice int *, ilosc w C++ mnie rażą negatywnie. To nie jest ładne C++.

Funkcja NajczestszaOcena jest jakaś strasznie dziwna, trochę jak kopia szukania maksimum. Nawet trudno sie to czyta.
Nie wiem, czy istnieje algorytm bez jakiejś roboczej struktury danych, najprościej jest taką użyć. w C++ bym użył std::map<int,int> /* liczna analizowana, ilosć wyustapień */

Kolejne, to zdecydowanie drukowanie bym widział POZA funkcją, a funkcja ma zwracać wynik (pewnie wartość, albo indeks najczęstszej)

0

W Twoim kodzie w funkcji NajczestszaOcena, problemem jest to, że nie przekazujesz tablicy ocen tab do funkcji, która pozwoliłaby na obliczenie, która ocena występowała najczęściej. Zamiast tego przekazujesz tablicę ocena, która zawiera wszystkie oceny do wyboru, ale bez informacji, ile razy wystąpiła dana ocena. Dlatego zawsze wyświetla się "najczęściej" występująca ocena, która jest ostatnią wartością w tablicy ocena, czyli w Twoim przypadku 10.

Aby rozwiązać ten problem, musisz przekazać tablicę tab do funkcji NajczestszaOcena i zliczyć, ile razy występuje każda ocena. Możesz to zrobić przy użyciu dodatkowej funkcji IlePoszczegolnychOcen. Następnie znajdź maksymalną wartość wystąpień i wyświetl oceny, które występują tyle razy.

Poniżej znajdziesz poprawiony kod funkcji NajczestszaOcena:

    int oceny[IleOcen] = { 0 }; // zerowanie tablicy ocen
    for (int i = 0; i < student; i++) {
        oceny[tab[i]]++; // zliczanie wystąpień poszczególnych ocen
    }
    int max_ocen = 0;
    for (int i = 0; i < IleOcen; i++) {
        max_ocen = max(max_ocen, oceny[i]); // znajdź maksymalną wartość wystąpień
    }
    cout << "Najczestsze oceny: ";
    for (int i = 0; i < IleOcen; i++) {
        if (oceny[i] == max_ocen) {
            cout << i << " ";
        }
    }
    cout << endl << endl;
}

Musi także zmienić wywołanie funkcji NajczestszaOcena w funkcji main na NajczestszaOcena(tab).

Powinno to rozwiązać problem zawsze wyświetlającej się oceny 10 jako najczęściej występującej.

1

Złe praktyki:

  • using namespace std;
  • makra reprezentujące stałe #define student 100
  • duża funkcja main
  • liczby magiczne
  • użyanie c-array zamiast std::array
  • przekazywanie tablic przez wskaźnik i rozmiar - styl starego C.
  • brak formatowania kodu (może podczas wklejania).
  • kod pisany po polsku

Coś mi się nie zgadza z void HistogramGwiazdek (int *tab, int liczba, int IleOcen) i jego użyciem.

Tu próbowałem ogarnąć twoj bałągan. Jest jeszcze miejsce na poprawki.

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