Liczby pseudolosowe są dosłownie losowe i nie mieszczą się w ustalonym zakresie

0

Robiłem program w trzech plikach, które zamieściłem poniżej i niestety nie działa. Liczby pseudolosowe wychodza poza zakres, a niektóre są takie same niezależnie ile razy odpale program. Co mogłem zrobić źle? Program pisalem w CodeBlocks o ile ma to jakieś znaczenie.

plik main.cpp

#include <iostream>
#include <cstdlib>
#include "dzien.h"
#include <time.h>

using namespace std;

int suma_opadow = 0, suma_uv = 0, max_temp = 0, min_temp = 0, suma_temp = 0;

int main()
{

srand(time(NULL));

Dzien d[7];

for(int i=0; i<7; i++)
{
    d[i].numer_dnia = i + 1;
    d[i].pogoda();
    if(d[i].pogoda_dnia == 0 || d[i].pogoda_dnia == 1)
    {
        d[i].opady();
        suma_opadow++;
    }
    else
    {
        d[i].swiatlo();
        suma_uv += d[i].wartosc_UV;
    }
    d[i].temp();
    suma_temp += d[i].temperatura;

    if(d[i].temperatura > d[i-1].temperatura)
        max_temp = d[i].temperatura;

    if(d[i].temperatura < d[i-1].temperatura)
        min_temp = d[i].temperatura;
}
for(int i=0; i<7; i++)
{
    cout << "------------" << endl;
    cout << d[i].wartosc_UV << endl;
    cout << d[i].ilosc_opadow << endl;
    cout << d[i].temperatura << endl;
    cout << "------------" << endl;
}
    cout << "Maksymalna odnotowana temperatura to " << max_temp << endl;
    cout << "Minimalna odnotowana temperatura to " << min_temp << endl;
    cout << "Ilosc opadow w tygodniu wynosi " << suma_opadow << endl;
    cout << "Srednia temperatura w tygodniu wynosi " << suma_temp / 7 << endl;
    cout << "Srednia wartosc UV w tygodniu wynosi " << suma_uv / 7 << endl;


    return 0;
}

plik dzien.cpp

#include <iostream>
#include "dzien.h"
#include <cstdlib>

using namespace std;

void Dzien::pogoda()
{
    int pogoda_dnia  = rand()%3;
}

void Dzien::opady()
{
    int ilosc_opadow = rand()%81;
}

void Dzien::swiatlo()
{
    int wartosc_UV = rand()%101;
}

void Dzien::temp()
{
    int temperatura = rand()%51-10;
}

plik dzien.h

#include <iostream>

using namespace std;

class Dzien
{
    public:

    int numer_dnia; // 1 - poniedzialek, 2 - wtorek, ..., 7 - niedziela
    int pogoda_dnia;  // deszcz, grad, slonce(liczba 0 - deszcz, liczba 1 - grad, liczba 2 - slonce)
    int ilosc_opadow;   // wartosc od 0-80
    int wartosc_UV;    // wartosc 0-100
    int temperatura; // wartosc od -10 do +40

    void pogoda(); // losuje pogode
    void opady();   // losuje wartosc opadow w mm
    void swiatlo(); // losuje wartosc UV
    void temp();    // losuje wartosc temperatury w celsjuszach

};
3
void Dzien::pogoda()
{
    int pogoda_dnia  = rand()%3;
}

void Dzien::opady()
{
    int ilosc_opadow = rand()%81;
}

void Dzien::swiatlo()
{
    int wartosc_UV = rand()%101;
}

void Dzien::temp()
{
    int temperatura = rand()%51-10;
}

ale tych wartości nigdzie nie zwracasz ani nie modyfikujesz pól w klasie tylko lokalne zmienne. Wywal int i chyba zatrybi.
Teraz pewnie masz losowe wartości z tego co było w pamięci bo nie inicjujesz zmiennych.

Bardzo dziwne te metody i klasy ale nie będę się czepiać bo widzę że się dopiero uczysz

0
obscurity napisał(a):
void Dzien::pogoda()
{
    int pogoda_dnia  = rand()%3;
}

void Dzien::opady()
{
    int ilosc_opadow = rand()%81;
}

void Dzien::swiatlo()
{
    int wartosc_UV = rand()%101;
}

void Dzien::temp()
{
    int temperatura = rand()%51-10;
}

ale tych wartości nigdzie nie zwracasz ani nie modyfikujesz pól w klasie tylko lokalne zmienne. Wywal int i chyba zatrybi.
Teraz pewnie masz losowe wartości z tego co było w pamięci bo nie inicjujesz zmiennych.

Bardzo dziwne te metody i klasy ale nie będę się czepiać bo widzę że się dopiero uczysz

wywalilem int i faktycznie teraz wieksza ilosc liczb sie losuje i sa nawet w dobrym zakresie, ale wciaz mam pojedyncze przypadki liczb pokroju 4215423 oraz dzielenie w mainie tam pod koniec dziwnie sie dzieli jak sobie porownam wartosci z kalkulatora a z konsoli i nie wszytskie dany mi sie poprawnie wyswietlaja jak sobie porownam te z drugiego for w mainie a z tych ostatnich cout
zdjecie z konsoli:
obraz_2023-09-26_195006523.png

2
    if(d[i].pogoda_dnia == 0 || d[i].pogoda_dnia == 1)
    {
        d[i].opady();

opady() wywołujesz tylko 2 na 3 razy. W pozostałych przypadkach będziesz miał losowe wartości.

    if(d[i].temperatura > d[i-1].temperatura)
        max_temp = d[i].temperatura;

    if(d[i].temperatura < d[i-1].temperatura)
        min_temp = d[i].temperatura;

tutaj wychodzisz poza zakres d[i-1] dla i = 0 jest poza tablicą i porównujesz znowu z losowymi danymi. Poza tym powinieneś porównywać temperatura z min_temp i max_temp, bo teraz porównujesz tylko dwa ostatnie elementy, jeśli ostatni będzie wyższy od przedostatniego to go użyjesz jako max_temp a to w większości przypadków nie będzie prawda.
Jak to poprawisz to będziesz miał znowu problem bo min_temp powinno być na początku jak najwyższe.

Dzielenie nie wychodzi ok bo sumujesz suma_uv tylko w przypadku pogoda_dnia = 2

    else
    {
        d[i].swiatlo();
        suma_uv += d[i].wartosc_UV;
    }

Polecam użycie chatGPT, na pewno znalazłoby błędy na tym poziomie a masz ich w tym kodzie całe mnóstwo.

0
obscurity napisał(a):
    if(d[i].pogoda_dnia == 0 || d[i].pogoda_dnia == 1)
    {
        d[i].opady();

opady() wywołujesz tylko 2 na 3 razy. W pozostałych przypadkach będziesz miał losowe wartości.

    if(d[i].temperatura > d[i-1].temperatura)
        max_temp = d[i].temperatura;

    if(d[i].temperatura < d[i-1].temperatura)
        min_temp = d[i].temperatura;

tutaj wychodzisz poza zakres d[i-1] dla i = 0 jest poza tablicą i porównujesz znowu z losowymi danymi. Poza tym powinieneś porównywać temperatura z min_temp i max_temp, bo teraz porównujesz tylko dwa ostatnie elementy, jeśli ostatni będzie wyższy od przedostatniego to go użyjesz jako max_temp a to w większości przypadków nie będzie prawda.
Jak to poprawisz to będziesz miał znowu problem bo min_temp powinno być na początku jak najwyższe.

Dzielenie nie wychodzi ok bo sumujesz suma_uv tylko w przypadku pogoda_dnia = 2

    else
    {
        d[i].swiatlo();
        suma_uv += d[i].wartosc_UV;
    }

Polecam użycie chatGPT, na pewno znalazłoby błędy na tym poziomie a masz ich w tym kodzie całe mnóstwo.

co do opady() to wlasnie ma sie tylko wywolywac gdy jest deszcz lub grad, czyli w przypadka gdzie pogoda_dnia = 0, pogoda_dnia = 1, a suma_uv ma byc losowana i sumowana tylko gdy jest slonce, czyli pogoda_dnia =2, a porownanie temperatur postaram sie naprawic oraz za radą skorzystam z ChatuGPT, dzieki za wyjasnienie problemu

2

W takim razie po prostu ustaw początkowe ilosc_opadow i wartosc_uv na 0.

Zagadka programistów:
Mariuszek dostał 5 jabłek. 3 jabłka zjadł.
Pytanie: Ile jabłek zostało Mariuszkowi?
Myślicie, że 2?
Guzik prawda! Nie wiadomo przecież, ile jabłek miał Mariuszek, zanim dostał 5 jabłek.
Morał: Zawsze zerujcie zmienne!

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