losowanie liczb z przedziału

0

Cześć. Mam do napisania na zajęcia następującą rzecz.

**Napisać funkcję który losuje N liczb całkowitych z przedziału <a, b> i oblicza średnią liczb
nieparzystych z podanego przedziału. Funkcja zwraca obliczoną wartość.
Do funkcji należy przekazać N, a, b.
W funkcji main() wypisać obliczoną średnią **

Utknąłem jednak już na pierwszej części tego zadania. Chciałem zrobić tak, żeby wypisać sobie na ekran losowane liczby, żeby sprawdzić poprawność tego co napisałem, jednak zupełnie mi to nie wychodzi. Nie wiem co i jak zrobić żeby ruszyć z tym zadaniem. Poniżej wrzucam to co wyczarowałem, mam nadzieję że mnie nie zlinczujecie za błędy jakie tam są bo pewnie są to podstawowe rzeczy i bardzo łatwe jednak dopiero zaczynam przygodę z progamowaniem.

#include <iostream>
#include <cstdlib>
using namespace std;

int losowanie (int N, int a, int b)
{
int x,i;

    for (i=1; i<=N; i++)
    {
        x=(rand()%((b-a)+1))+a;
    }
 return x;
}

int main()
{
    int a,b,N,liczba;
    cout << "podaj:a " << endl;
    cin>>a;
    cout << "podaj:b " << endl;
    cin>>b;
    cout << "podaj:N " << endl;
    cin>>N;
    liczba=losowanie(a,b,N);
    cout<<liczba<<endl;
    return 0;
1

Piszesz, że chciałeś wypisać na ekranie te liczby, które losujesz - jednak nic takiego nie robisz.
Losowania dokonujesz w funkcji losowanie, gdzie nie ma żadnego wypisywania na ekran.

Sugerowałbym podejść do tematu powoli - najpierw napisz funkcję int rand_range(int from, int to), która będzie zwracać pseudolosową liczbę z zakresu <from, to>.

0

Czyli ta moja funkcja losowanie nie jest poprawnie zapisana? Tam nie zajdzie losowanie liczb z przedziału?
To wypisanie liczb na ekran miało zajść w mainie i tam miało zostać wypisane

0

Zachodzi tam jakieś losowanie liczb, lecz chcę Ci pokazać, jak podejść do tego sensowniej, czytelniej oraz prościej ;-)

0

Rozumiem, jednak wymagają od nas korzystania jedynie z tego co było przedstawione na wykładach. A tam mieliśmy losowanie liczb w takiej formie jaką ja przedstawiłem.

0

Rozumiesz, że nie każę Ci zmieniać samego algorytmu losowania, tylko proponuję - dla czytelności - wydzielić to do odrębnej funkcji?

Tak czy siak - bazując na tym, co masz, jest tam parę błędów:

  • nie widzę żadnego sumowania,
  • nie widzę żadnego sprawdzania parzystości.

Na czym konkretnie się zatrzymałeś?

0

Twoja funkcja nie działa poprawnie ponieważ zwraca tylko jedną wartość, a ma ich zwróć N. Aby zrobić to w jednej funkcji musisz stworzyć wewnątrz tablice N-elementową i do niej wpisać wszystkie wyniki x, które wyliczasz. Na koniec przypisujesz funkcje do tablicy w metodzie main i wpisujesz wyniki w pętli for. Spróbuj sam ogarnąć to na podstawie tego co Ci napisałem to więcej zapamiętasz i zrozumiesz.

0

Patryk27- zatrzymałem się na samym losowaniu drugiej części jeszcze nie ruszałem. Chciałem teraz zrobić tak że losuje N liczb i w mainie je wypisuje, chciałem to zrobić tylko dla siebie żeby sprawdzic czy liczby dobrze się losują.
Vens- nie miałem jeszcze tablic. Zaczne je dopiero na następnych zajęciach.

0

Bez wykorzystania tablic możesz najwyżej te liczby wypisywać z poziomu funkcji losowanie (dopisz cout << x << endl; do pętli).

0

Okej to w takim razie porzuce ten pomysł z wypisaniem bo w sumie i tak jest to nie potrzebne. Spróbuję dopisać do tej funkcji od razu sprawdzenie przystości mojego x i liczenie średniej.

0

W pętli, którą napisałeś możesz zrobić coś takiego:

  1. Wylosuj liczbę
  2. Sprawdź czy ta liczba jest nieparzysta
  3. Jeśli jest dodaj ją do zmiennej int suma
  4. Zrób zmienna np int licznik i za każdym razem jak znajdziesz nieparzystą liczbę zwiększ licznik o 1
  5. Na koniec zwróć średnią return suma/licznik

W ten sposób funkcja będzie zwracać średnia liczb nieparzystych z podanego przedziału.

0

Właśnie tak zrobiłem jednak gdzieś jest błąd . Wyskakuje informacja że wymagana jest wartość.

#include <iostream>
#include <cstdlib>
using namespace std;

int losowanie (int N, int a, int b)
{
int x,i,z=0,s=0,sr;

    for (i=1; i<=N; i++)
    {
        x=(rand()%((b-a)+1))+a;
        {
            if (x%2=!0)
            z=z+1;
            s=s+x;
        }
    }
 sr=s/z;
 return sr;
}

int main()
{
    int a,b,N,sr;
    cout << "podaj:a " << endl;
    cin>>a;
    cout << "podaj:b " << endl;
    cin>>b;
    cout << "podaj:N " << endl;
    cin>>N;
    cout<<sr<<endl;
    return 0;
}
0

A gdzie wywołujesz funkcję losowanie? I czemu średnia jest liczbą całkowitą a nie double?

0

Fakt zapomniałem, jednak błąd mi wyskakuje w okolicach 13 linii gdzieś koło if.
13|error: lvalue required as left operand of assignment|

0

Rzuca błędem, bo powinno być != a nie =!. Wersja chyba dobrze działająca

#include <iostream>
#include <cstdlib>
using namespace std;

double losowanie (int N, int a, int b)
{
    int x,i,z=0,s = 0;
    srand(time(nullptr));
    for (i=1; i<=N; i++)
    {
        x=(rand()%((b-a)+1))+a;
        {
            cout << x << "\n";
            if (x%2 != 0)
            {
                z=z+1;
                s=s+x;
            }

        }
    }
 double sr = s/z;
 return sr;
}

int main()
{
    int a,b,N;
    cout << "podaj:a " << endl;
    cin>>a;
    cout << "podaj:b " << endl;
    cin>>b;
    cout << "podaj:N " << endl;
    cin>>N;
    double sr = losowanie(N, a, b);
    cout<<sr<<endl;
    return 0;
}

0

Dzięki wielkie wszystkim :) Chyba działa tak jak powinno.

0

z i s powinny być objęte klamrą dobrze rozumie?

0
        {
            if (x%2 != 0)
            z=z+1;
            s=s+x;
        }

Dlaczego tak akurat ułożyłeś te klamry?
Nie chciałeś przypadkiem aby objąć zawartości instrukcji warunkowej klamrą?

0

Tak, poza tym dałem "ziarno" żeby losował różne liczby a nie zawsze te same.

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