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

rozdzial/lekcja 21, zadanie domowe

Ostatnio zmodyfikowano 2022-04-09 11:46
Autor Wiadomość
jebackoze
Temat założony przez niniejszego użytkownika
rozdzial/lekcja 21, zadanie domowe
» 2022-04-09 01:10:33
hej,
mam nadzieje, ze kod jest sprawny i dziala, ale nurtuje mnie jedna kwestia. na podstawie przykladu nr 1: co jesli wszystkie trzy podane liczby beda takie same? program bedzie dzialal bez konca.
tresc zadania nie wskazuje na zadne zabezpieczenie totez nie wiem jak podejsc do zadania. powinno byc czy jednak to jeszcze nie czas na zniszczenie kursanta?



C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void podajLiczby( int tablica[ ], int ileWpisac )
{
   
cout << "podaj: " << ileWpisac << " liczby." << endl;
   
int i = 0;
   
do
   
{
       
cin >> tablica[ i ];
       
++i;
   
} while( i < ileWpisac );
   
}

int wylosuj( int tablica[ ], int iWielkosc )
{
   
srand( time( NULL ) );
   
int i =(( std::rand() % iWielkosc ) + 0 );
   
return tablica[ i ];
}

bool sprawdzenie( int iLiczba, int tab[ ], int ile )
{
   
if( ile <= 0 )
       
 return false;
   
   
int i = 0;
   
do
   
{
       
if( tab[ i ] == iLiczba )
           
 return true;
       
       
i++;
   
} while( i < ile );
   
   
return false;
}

int main()
{
   
int wylosowana, losy = 0;
   
int iloscT, iloscL; //zmienne na potrzeby szybkiej modyfikacji ilosci liczb wpisanych i losowanych
   
cin >> iloscT; //odpowiednio zadanie nr 1 = 3, zadanie nr 2 = 10
   
cin >> iloscL; //odpowiednio zadanie nr 1 = 2, zadanie nr 2 = 8
   
   
int podaneLiczby[ iloscT ];
   
int wylosowaneLiczby[ iloscL ];
   
podajLiczby( podaneLiczby, iloscT );
   
   
do
   
{
       
wylosowana = wylosuj( podaneLiczby, iloscL );
       
if( sprawdzenie( wylosowana, wylosowaneLiczby, losy ) == false )
       
{
           
wylosowaneLiczby[ losy ] = wylosowana;
           
++losy;
       
}
    }
while( losy < iloscL );
   
   
losy = 0;
   
do
   
{
       
cout << "\nwylosowana liczba to: " << wylosowaneLiczby[ losy ];
       
++losy;
   
} while( losy < iloscL );
   
   
return 0;
}

jesli mialoby byc zabezpieczenie to myslalem o jakiejs funkcji, o dodaniu fragmentow kodow, ale nie moge tego chwycic. ponizej kod dla 1 zadania, gdzie losowalo sie 3 liczby.

wiem, ze te ponizsze kody maja bledy i chyba utknalem

C/C++
bool powtorzen( int index, int tab[ ], int ile ) // argument ile jest pusty
{
   
int i;
   
i = index - 1;
   
do
   
{
       
if( tab[ i ] == tab[ index ] )
           
 return false;
       
       
--i;
   
} while( i >= 0 );
   
   
return true;
}

oraz ponizszy kod, przed losowaniem

C/C++
int index;
index = iloscT;
do
{
   
--index;
   
if( powtorzen( index, podaneLiczby, 2 ) == false )
       
 --iloscL;
   
} while( index >= 0 );

P-179386
pekfos
» 2022-04-09 11:26:37
co jesli wszystkie trzy podane liczby beda takie same? program bedzie dzialal bez konca.
Nie jest wprost powiedziane czym jest tu "powtórzenie". Użytkownik wprowadza 3 zmienne i program ma wybrać dwie z nich bez powtórzeń. Unikalność wartości w tych zmiennych to zupełnie inna sprawa.

C/C++
int wylosuj( int tablica[ ], int iWielkosc )
{
   
srand( time( NULL ) );
   
int i =(( std::rand() % iWielkosc ) + 0 );
   
return tablica[ i ];
}
Resetujesz tu generator losowy przed każdym losowaniem, a time() ma tylko sekundową precyzję. Losowanie bez powtórzeń będzie tu trochę trwało.
P-179387
jebackoze
Temat założony przez niniejszego użytkownika
» 2022-04-09 11:46:48
wiec wszystko jasne, nie ma potrzeby aby wylosowane wartosci byly unikanlne wzgledem siebie.

czyli linie
srand( time( NULL ) );

lepiej przeniesc do int main


EDYCJA: jednak pierwszy kod byl bledny bo mimo, ze losowalem indeks tablicy to pozniej za pomoca funkcji bool zamiast sprawdzac wylosowane indeksy to sprawdzialem wystapienie danej liczby. wszystko dzialalo dopoki wpisywalem rozne liczby, ale jak podalem te same to program sie nie mogl zakonczyc.

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void podajLiczby( int tablica[ ], int ileWpisac )
{
   
cout << "podaj: " << ileWpisac << " liczby." << endl;
   
int i = 0;
   
do
   
{
       
cin >> tablica[ i ];
       
++i;
   
} while( i < ileWpisac );
   
}

int wylosuj( int iWielkosc )
{
   
return( std::rand() % iWielkosc ) + 0;
}

bool sprawdzenie( int iLiczba, int tab[ ], int ile )
{
   
if( ile <= 0 )
       
 return false;
   
   
int i = 0;
   
do
   
{
       
if( tab[ i ] == iLiczba )
           
 return true;
       
       
++i;
   
} while( i < ile );
   
   
return false;
}

int main()
{
   
srand( time( NULL ) );
   
int index, losy = 0;
   
int iloscT, iloscL; //zmienne na potrzeby szybkiej modyfikacji ilosci liczb wpisanych i losowanych
   
cin >> iloscT; //odpowiednio zadanie nr 1 = 3, zadanie nr 2 = 10
   
cin >> iloscL; //odpowiednio zadanie nr 1 = 2, zadanie nr 2 = 8
   
   
int podaneLiczby[ iloscT ];
   
int tablicaIndexow[ iloscL ];
   
podajLiczby( podaneLiczby, iloscT );
   
   
do
   
{
       
index = wylosuj( iloscL );
       
if( sprawdzenie( index, tablicaIndexow, losy ) == false )
       
{
           
tablicaIndexow[ losy ] = index;
           
++losy;
       
}
    }
while( losy < iloscL );
   
   
losy = 0;
   
do
   
{
       
cout << "\nwylosowana liczba to: " << podaneLiczby[ tablicaIndexow[ losy ] ];
       
++losy;
   
} while( losy < iloscL );
   
   
return 0;
}
P-179388
« 1 »
  Strona 1 z 1