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

Z jakiego powodu ten program nie losuje mi liczby 16?

Ostatnio zmodyfikowano 2016-11-03 22:20
Autor Wiadomość
MDK
Temat założony przez niniejszego użytkownika
Z jakiego powodu ten program nie losuje mi liczby 16?
» 2016-11-02 19:38:38
Sprawdziłem wielokrotnie. U mnie na komputerze program potrafi wylosować wszystkie pozostałe liczby, oprócz 16. Nie wiem, czy to wina procesora, czy może coś innego jest źle. A jeśli ograniczę zakres losowania w losujLiczbe do 20, to wogóle nie wyświetla wartości ale to zapewne przez to, że nie losuje "16".
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int losujLiczbe()
{
    return(( rand() % 21 ) + 1 );
}

bool sprawdz( int tablica[], int liczbaDoSprawdzenia, int wielkoscTablicy )
{
    int i = 0;
    do
    {
        if( tablica[ i ] == liczbaDoSprawdzenia ) return true;
       
        i++;
    }
    while( i < wielkoscTablicy );
   
    return false;
}

main()
{
    srand( time( 0 ) );
    int tSize = 20;
    int tab[ tSize ];
    int l = 0;
    do
    {
       
        int wylosowanaLiczba = losujLiczbe();
        if( sprawdz( tab, wylosowanaLiczba, tSize ) == false )
        {
            tab[ l ] = wylosowanaLiczba;
            l++;
        };
    }
    while( l < tSize );
   
    l = 0;
    do
    {
        cout << tab[ l ] << endl;
        l++;
    }
    while( l < tSize );
   
    return 0;
}
P-153271
michal11
» 2016-11-02 20:27:43
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

#include <algorithm>

using namespace std;

int losujLiczbe()
{
    return(( rand() % 21 ) + 1 );
}

bool sprawdz( int tablica[], int liczbaDoSprawdzenia, int wielkoscTablicy )
{
    int i = 0;
    do
    {
        if( tablica[ i ] == liczbaDoSprawdzenia ) return true;
       
        i++;
    }
    while( i < wielkoscTablicy );
   
    return false;
}

main()
{
    srand( time( 0 ) );
    int tSize = 21;
    int tab[ tSize ];
    int l = 0;
    do
    {
       
        int wylosowanaLiczba = losujLiczbe();
        if( sprawdz( tab, wylosowanaLiczba, tSize ) == false )
        {
            tab[ l ] = wylosowanaLiczba;
            l++;
        };
    }
    while( l < tSize );
   
    l = 0;
    do
    {
        cout << tab[ l ] <<( l != tSize - 1 ? ", ": "" );
        l++;
    }
    while( l < tSize );
   
    cout << endl;
   
    sort( tab, tab + tSize );
   
    l = 0;
    do
    {
        cout << tab[ l ] <<( l != tSize - 1 ? ", ": "" );
        l++;
    }
    while( l < tSize );
   
   
    return 0;
}

odpal to u siebie i sprawdź czy wszystkie są, ew. wrzuć tutaj screena jeżeli czegoś ( np. 16) będzie brakowało.
P-153277
mateczek
» 2016-11-02 20:33:27
C/C++
if( sprawdz( tab, wylosowanaLiczba, l ) == false ) // tak chyba powinno być ??[/code]


bool sprawdz( int tablica[], int liczbaDoSprawdzenia, int wielkoscTablicy ) //choć wielkość tablicy można by nazwać w stylu "index ostatniego elementu"
{
    int i = 0;
    do
    {
        if( tablica[ i ] == liczbaDoSprawdzenia ) return true;
       
        i++;
    }
    while( i < wielkoscTablicy ); // sorki tu było dobrze bo "l" pokazuje zawsze index o 1 wyżej niż ostatni element zapisany
   
    return false;
}

ewentualnie kod mógłby zostać po staremu ale deklaracja tablicy w ten sposób
C/C++
int tSize = 20;
int tab[ tSize ] { - 1 };
P-153279
carlosmay
» 2016-11-03 18:26:50
constexpr int tSize = 20;
 @mateczek
Warto by zastosować się do konwencji nazewniczych i stałą nazwać wielkimi literami.
P-153315
MDK
Temat założony przez niniejszego użytkownika
» 2016-11-03 18:33:31
Oczywiście, problem można obejść, np. tak jak pisze michal11. I jeśli wprowadzimy zamiast tSize = 20, tSize = 21, to wszystkie liczby się losują. Nie mogę jednak pojąć, skąd się bierze problem przy oryginalnych wartościach. Po prostu jest to problem dość niezwykły, a takie mnie przyciągają :-D
P-153320
mateczek
» 2016-11-03 18:39:14
constexpr int tSize = 20; @mateczek Warto by zastosować się do konwencji nazewniczych i stałą nazwać wielkimi literami.
Jasne lepiej się wówczas czyta. Bo pierwszy rzut oka i już wiadomo o co chodzi.

@MDK
kolego masz niezainicjalizowaną tablicę !!! poniżej zdjęcie jakie losowe wartości przyjmuje twoja tablica po utworzeniu
https://zapodaj.net​/dc0eff85e3541.png.html
dlaczego na ostatnim miejscu jest 16 nie mam pojęcia tak czy siak mogła tam być dowolna losowa liczba. A ponieważ sprawdzasz w programie całą tablicę, a zwłaszcza tą jej część wypełnioną przypadkowymi liczbami, to zwyczajnie masz kuku!!!
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int losujLiczbe()
{
    return(( rand() % 20 ) + 1 );
}

bool sprawdz( int tablica[], int liczbaDoSprawdzenia, int lastElementIndex )
{
    for( int i = 0; i <= lastElementIndex; i++ )
         if( tablica[ i ] == liczbaDoSprawdzenia ) return true;
   
    return false;
}

main()
{
    srand( time( 0 ) );
    constexpr int SIZE_TAB = 20;
    int tab[ SIZE_TAB ];
    int i = 0;
    while( i < SIZE_TAB )
    {
        int wylosowanaLiczba = losujLiczbe();
        if( sprawdz( tab, wylosowanaLiczba, i - 1 ) == false ) {
            tab[ i ] = wylosowanaLiczba;
            i++;
        }
    }
    for( int element: tab ) { //zobacz sobie pętle for z c++11
        cout << element << " ";
    }
    cout << endl;
    return 0;
}
P-153322
MDK
Temat założony przez niniejszego użytkownika
» 2016-11-03 19:11:35
Dzięki mateczek. Udało ci się zapalić tą żarówkę nad moją głową.
P-153323
Monika90
» 2016-11-03 19:12:56
Warto by zastosować się do konwencji nazewniczych i stałą nazwać wielkimi literami.
Taka konwencja jest w Javie a nie w C++. W C++ TAKICH_NAZWY używa się dla makr.
P-153324
« 1 » 2
  Strona 1 z 2 Następna strona