Poprawianie zadania - losowanie liczb, dynamiczna rezerwacja

0

Cześć,
miałam do zrobienia zadanie z C++, wydawało mi się w porządku, ale jednak coś tam nie działa poprawnie - dostałam komentarz zwrotny, ale nie do końca rozumiem o co w nim chodzi. Wiem, że mogę wrócić z pytaniem do prowadzącego, ale wydaje mi się, że to jest dość jasno napisane, tylko ja jestem niekumata i wolę zapytać na forum.
Treść komentarza:
"

  1. w losowaniu brak jedynki

  2. źle liczone max - nie działa dla dla innych zakresów np <-10, -5>

  3. cout << "Najwieksza liczba w tablicy X to: " << znajdywanieNajwiekszejLiczby(X, &ileRazyMaksLiczba)
    << " i pojawila sie " << ileRazyMaksLiczba << " raz/razy." << endl;

to nie działa << ileRazyMaksLiczba trzeba następnym cout (przykarzywane przez parametr i nie uaktualiniło się

  1. int W[liczbyWiekszeOdSredniej]; - to nie jest dynamiczna rezerwacja !"

1- nie rozumiem tego losowania - u mnie się pokazują jedynki...
2- nie wiem jak naprawić, żeby działało dla takich zakresów - jak tak patrzę, to wydaje się ok i nie wiem co poprawić (a faktycznie nie działa)
3- tego nie rozumiem
4- jak inaczej zrobić dynamiczną rezerwację? wydawało mi się, że o to jest to i teraz już nie wiem :/

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

#define N 10
using namespace std;

int losowanieLiczbyDoTablicy(int, int);

void wypelnijTabliceLosowo(int []);

void wyswietlanieTablicy(int []);

void wypelnianieTablicyQ(int X[], int Y[], int Z[], int Q[]);

int znajdywanieNajwiekszejLiczby(int a[], int *);

int obliczanieSredniej(int a[], float &);

void wyswietlanieTablicyW(int [], int);


int main() {

    srand((unsigned int) time(NULL));

    int ileRazyMaksLiczba = 0;
    float srednia;

    int X[N];
    int Y[N];
    int Z[N];
    int Q[N];
    losowanieLiczbyDoTablicy(0, 5);
    wypelnijTabliceLosowo(X);
    wypelnijTabliceLosowo(Y);
    wypelnijTabliceLosowo(Z);
    wypelnianieTablicyQ(X, Y, Z, Q);

    cout << "Zawartosc tablicy X: " << endl;
    wyswietlanieTablicy(X);
    cout << "Zawartosc tablicy Y: " << endl;
    wyswietlanieTablicy(Y);
    cout << "Zawartosc tablicy Z: " << endl;
    wyswietlanieTablicy(Z);
    cout << "Zawartosc tablicy Q: " << endl;
    wyswietlanieTablicy(Q);

    cout << "Najwieksza liczba w tablicy X to: " << znajdywanieNajwiekszejLiczby(X, &ileRazyMaksLiczba)
         << " i pojawila sie " << ileRazyMaksLiczba << " raz/razy." << endl;
    cout << "Najwieksza liczba w tablicy Y to: " << znajdywanieNajwiekszejLiczby(Y, &ileRazyMaksLiczba)
         << " i pojawila sie " << ileRazyMaksLiczba << " raz/razy." << endl;

    int liczbyWiekszeOdSredniej = obliczanieSredniej(X, srednia);
    cout << "Srednia liczb w tablicy X wynosi: " << srednia << ", a liczb wiekszych od sredniej jest "
         << liczbyWiekszeOdSredniej << "." << endl;


    int W[liczbyWiekszeOdSredniej];
    int poczatek = 0;
    for (int i = 0; i < N; i++) {
        if (X[i] > srednia) {
            W[poczatek++] = X[i];
        }
    }
    cout << "Zawartosc tablicy W: " << endl;
    wyswietlanieTablicyW(W, liczbyWiekszeOdSredniej);

    return 0;
}


int losowanieLiczbyDoTablicy(int p, int k) {
    int i = (rand() % (k - p) + p);
    return i;
}

void wypelnijTabliceLosowo(int a[]) {
    for (int i = 0; i < N; i++) {
        a[i] = losowanieLiczbyDoTablicy(0, 5);
    }
}

void wyswietlanieTablicy(int a[]) {

    for (int i = 0; i < N; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}

void wypelnianieTablicyQ(int X[], int Y[], int Z[], int Q[]) {
    for (int i = 0; i < N; i++) {

        if (X[i] >= Y[i] && X[i] >= Z[i]) {
            Q[i] = X[i];
        }

        if (Y[i] >= X[i] && Y[i] >= Z[i]) {
            Q[i] = Y[i];
        }

        if (Z[i] >= X[i] && Z[i] >= Y[i]) {
            Q[i] = Z[i];
        }
    }
}

int znajdywanieNajwiekszejLiczby(int a[], int *ileRazyMaksLiczba) {

    int najwiekszaLiczba = 0;
    *ileRazyMaksLiczba = 0;
    for (int i = 0; i < N; i++) {
        if (najwiekszaLiczba <= a[i]) {
            najwiekszaLiczba = a[i];
        }
    }
    for (int j = 0; j < N; j++) {
        if (a[j] == najwiekszaLiczba) {
            *ileRazyMaksLiczba += 1;
        }
    }
    return najwiekszaLiczba;
}

int obliczanieSredniej(int a[], float &srednia) {
    int prawdziwaSrednia = 0;
    for (int i = 0; i < N; i++) {
        srednia += a[i];
    }
    srednia = srednia / N;
    for (int j = 0; j < N; j++) {
        if (a[j] > srednia) {
            prawdziwaSrednia += 1;
        }
    }
    return prawdziwaSrednia;
}

void wyswietlanieTablicyW(int a[], int liczbyWiekszeOdSredniej) {

    for (int i = 0; i < liczbyWiekszeOdSredniej; i++) {
        cout << a[i] << " ";
    }
}
4

jak inaczej zrobić dynamiczną rezerwację? wydawało mi się, że o to jest to i teraz już nie wiem

int *W = new int[liczbyWiekszeOdSredniej];
....
delete []W; 

albo używając kontenera vector<int> z STL.

vector<int> W(liczbyWiekszeOdSredniej);

W funkcji znajdywanieNajwiekszejLiczby ustawiasz zmienną najwiekszaLiczba na zero. Co będzie kiedy cała tablica będzie zawierała liczby mniejsze od zera? Czy wynik będzie poprawny?

0
TomaszLiMoon napisał(a):

jak inaczej zrobić dynamiczną rezerwację? wydawało mi się, że o to jest to i teraz już nie wiem

int *W = new int[liczbyWiekszeOdSredniej];
....
delete []W; 

albo używając kontenera vector<int> z STL.

vector<int> W(liczbyWiekszeOdSredniej);

W funkcji znajdywanieNajwiekszejLiczby ustawiasz zmienną najwiekszaLiczba na zero. Co będzie kiedy cała tablica będzie zawierała liczby mniejsze od zera? Czy wynik będzie poprawny?

właśnie kazali mi bez vector, także wielkie dzięki za drugi sposób : )

no właśnie dałeś mi do myślenia i pod najwiekszaLiczba podstawiłam indeks 0 z tablicy, potem w pętli porównywałam do niego i.. chyba działa :D

a masz może jakiś pomysł o co chodzi z losowaniem jedynki? u mnie się totalnie losują...

0

Jedynki się losują, ale całe losowanie możesz uprościć/umieścić w jednej funkcji.

void wypelnijTabliceLosowo( int a[] , int min = 0 , int max = 5 )
 {
    for( int i = 0 ;  i<N ; ++i ) a[i] = rand()%max + min;    
}
0

Jeśli ma być C++ to jeszcze może być: std::unique_ptr<int[]> w(new int[100]);

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