Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tablice jednowymiarowe - losowanie liczb z określonego przedziału

Ostatnio zmodyfikowano 2014-06-01 18:13
Autor Wiadomość
marmal
Temat założony przez niniejszego użytkownika
Tablice jednowymiarowe - losowanie liczb z określonego przedziału
» 2014-05-28 11:44:09
Witam,
chciałem napisać program podobny do zadanego w rozdziale 18 kursu C++, który wylosuje 999 liczb z zakresu podanego przez użytkownika, wypisze je, a następnie zsumuje.
Pisałem go, aby użyć funkcji oraz tablicy.

C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

int wylosuj( int start, int stop )
{
    int losowanie;
    losowanie =(( rand() %( stop - start ) + 1 ) + start );
    return losowanie;
}

int main()
{
    srand( time( NULL ) );
    int start, stop;
    int losowanie[ 999 ];
    int licznik = 0;
   
    cout << "OD:" << endl;
    cin >> start;
    cout << "DO:" << endl;
    cin >> stop;
   
    do
    {
        losowanie[ licznik ] = wylosuj( start, stop );
        licznik++;
    }
    while( licznik < 999 );
   
    cout << "Wylosowano:" << endl;
    licznik = 0;
    do
    {
        cout << losowanie[ licznik ] << ",";
        licznik++;
    }
    while( licznik < 999 );
   
    int suma;
    licznik = 0;
   
    do
    {
        suma += losowanie[ licznik ];
        licznik++;
    }
    while( licznik < 999 );
   
    cout << "\nSuma liczb: " << suma << endl;
   
   
   
    return 0;
}

Oto mój kod. Jednak gdy podam przedział np. od 1 do 2 to wylosuje mi same 2. Aa suma jest liczbą nieparzystą, więc gdzieś musi być błąd.
Skoro losuje mi błędnie to myślę, że w funkcji 'wylosuj' podałem niepoprawny przedział, ale nie jestem pewny.
Proszę o pomoc.
P-111005
pekfos
» 2014-05-28 14:18:25
Nie losujesz liczb z przedziału [start; stop]. 2+2*2..
P-111008
Moorfox
» 2014-05-28 17:40:30
C/C++
losowanie =(( rand() %( stop - start ) + 1 ) + start );
start = 1
stop = 2
(rand()% (2-1) + 1)+start = rand()%1 + 1 + start
rand()%1 = 0 nie zaleznie od wartosci rand()
wiec jest to
wylosuj 0 pozniej dodaj do niego 1 i jeszcze wartosc start czyli tez 1 wynik bedzie zawsze 2
WNIOSEK:
mylisz kolejnosc operatorow
POPRAWIONE:
C/C++
losowanie =( rand() %(( stop - start ) + 1 ) + start );

I staraj się programować tak jak robią to inni programiści, żaden dobry programista nie napisze:
C/C++
int losowanie;
losowanie =( rand() %(( stop - start ) + 1 ) + start );
return losowanie;

tylko
C/C++
return rand() %(( stop - start ) + 1 ) + start;
Nie mówiąc już o 3 pętlach i ciągłej zamianie licznik = 0 zamiast użycia for'a
P-111021
marmal
Temat założony przez niniejszego użytkownika
» 2014-05-28 17:46:51
Rzeczywiście.
Dzięki Moorfox za sugestie.
Poprawiłem:
C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

int wylosuj( int start, int stop )
{
    return rand() %(( stop - start ) + 1 ) + start;
}

int main()
{
    srand( time( NULL ) );
    int start, stop;
    int losowanie[ 999 ];
    int suma = 0;
   
    cout << "OD:" << endl;
    cin >> start;
    cout << "DO:" << endl;
    cin >> stop;
   
    for( int i = 0; i < 999; i++ )
    {
        cout << wylosuj( start, stop ) << ",";
        suma += wylosuj( start, stop );
    }
   
    cout << "Suma wylosowanych liczb wynosi: " << suma;
    return 0;
}

Mam jeszcze jeden problem z kolejnym zadaniem z kursu. Postanowiłem nie zakładać nowego wątku, gdyż jest ono związane z tablicami jednowymiarowymi.

1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje.

Nie miałem pojęcia jak się za to zabrać, ale wykombinowałem coś takiego, lecz nie działa:
C/C++
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <time.h>
#include <windows.h>

int losuj()
{
    return rand() % 3;
}

bool czyWylosowana( int liczba, int wyb[], int wylos[], int ile )
{
    if( ile == 0 )
         return false;
   
    int i = 0;
    do
    {
        if( wylos[ ile ] == wyb[ liczba ] )
             return true;
       
        i++;
    }
    while( i < ile );
   
}

using namespace std;

int main()
{
    srand( time( NULL ) );
    int wylosowane[ 2 ];
    int wybrane[ 3 ];
   
    for( int i = 0; i < 3; i++ )
    {
        cin >> wybrane[ i ];
    }
    int liczba = 0;
    int ile = 0;
   
    cout << "Wybrane:\n";
    for( int i = 0; i < 3; i++ )
    {
        cout << wybrane[ i ] << endl;
    }
   
    do
    {
        losuj();
        liczba = losuj();
        if( czyWylosowana( liczba, wybrane, wylosowane, ile ) == false )
        {
            wybrane[ liczba ] = wylosowane[ ile ];
            ile++;
        }
    }
    while( ile < 2 );
   
    cout << "Wylosowane: \n";
   
    for( int i = 0; i < 2; i++ )
    {
        cout << wylosowane[ i ] << endl;
    }
}
P-111022
Moorfox
» 2014-05-31 18:55:38
Naucz się formatować trochę kod.
C/C++
losuj();
liczba = losuj();
...

Co do kodu jakie widzę błędy.
Tu jeden sam się domyśl:
C/C++
wybrane[ liczba ] = wylosowane[ ile ];

A tu jeśli żaden warunek nie zajdzie to ?:
C/C++
bool czyWylosowana( int liczba, int wyb[], int wylos[], int ile )
{
    if( ile == 0 )
         return false;
   
    int i = 0;
    do
    {
        if( wylos[ ile ] == wyb[ liczba ] )
             return true;
       
        i++;
    }
    while( i < ile );
   
}
 
A tego całkiem nie moge zrozumieć:
C/C++
int i = 0;
do
{
    if( wylos[ ile ] == wyb[ liczba ] )
         return true;
   
    i++;
}
while( i < ile );

Bardziej sformatowana wersja
C/C++
for( int i = 0; i < ile; i++ )
{
    if( wylos[ ile ] == wyb[ liczba ] ) return true;
   
}
Po co ci to "i" w takim razie chyba, że nie jesteś pewny i musisz sprawdzić ile-razy czy 2 jest równe 2
C/C++
for( int i = 0; i < ile; i++ )
{
    if( wylos[ i ] == wyb[ liczba ] ) return true;
   
}
P-111179
pekfos
» 2014-05-31 20:03:01
Bardziej sformatowana wersja
Zmianę pętli na inną nazywasz formatowaniem kodu..? Nie bądź śmieszny. A przerabiając tutejszy kurs i losowanie bez powtórzeń/tablice, nie zna jeszcze pętli for.
P-111192
Moorfox
» 2014-05-31 20:10:51
Nazwałem to bardziej sformatowaną wersją pętli, bo tak jest. Łatwiej się to czyta czyż nie ? Po za tym nie wiedziałem, że nie zna, nigdy nie przerabiałem tego kursu czystego C++.

EDIT:
zna wystarczy popatrzec na kod wyzej
P-111194
pekfos
» 2014-05-31 21:01:34
Jedyne co się zmieniło w formatowaniu, to brak nowej linii między if a return. IMHO trudniej się czyta bez tego przejścia. Poza tym, nie ma żadnych (widocznych przez pryzmat STC) różnic w formatowaniu kodu. Zmiana struktury językowej jest czymś zupełnie innym. Sprzecznym z definicji.
P-111205
« 1 » 2 3
  Strona 1 z 3 Następna strona