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

Zadanie 22

Ostatnio zmodyfikowano 2015-03-24 22:05
Autor Wiadomość
Czdum
Temat założony przez niniejszego użytkownika
Zadanie 22
» 2015-03-13 15:20:13
Witam serdecznie, robiąc ostatni podpunkt zadania domowego z tego rozdziału wystąpiły u mnie dwa problemy. Otóż nie działa mi funkcja znajdmax i nie jestem w stanie znaleźć gdzie jest błąd w tym przypadku.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
bool czybylawylosowana( int wpisanaliczba, int tablicazapisu[], int numerwtablicy )
{
    if( numerwtablicy <= 0 )
         return false;
   
    for( int i = 0; i <= numerwtablicy; i++ )
    if( wpisanaliczba == tablicazapisu[ i ] )
         return true;
   
    return false;
}
void losowanie( int wylosowaneliczby[], int ile )
{
    int i = 0, liczba;
    do
    {
        liczba =(( rand() % 20 ) + 10 );
        if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false )
        {
            wylosowaneliczby[ i ] = liczba;
            i++;
        }
    } while( i < ile );
   
}
void wypisanieTablicy( int tablicadowypisania[], int jakduza )
{
    for( int i = 0; i < jakduza; i++ )
         cout << "W tablicy pod numerem " << i + 1 << " znajduje sie " << tablicadowypisania[ i ] << endl;
   
}
void wypisanieTablicyOdTylu( int tablicadowypisania[], int jakduza )
{
    for( jakduza; jakduza > 0; jakduza-- )
         cout << "W tablicy pod numerem " << jakduza << " znajduje sie " << tablicadowypisania[ jakduza - 1 ] << endl;
   
}
void znajdzminimum( int tablica[], int numerowTablicy )
{
    int a;
    for( int i = 0; i < numerowTablicy; i++ )
    {
        for( int b = 0; b < numerowTablicy; b++ )
        {
           
            if( tablica[ b ] > tablica[ b + 1 ] )
            {
                a = tablica[ b ];
                tablica[ b ] = tablica[ b + 1 ];
                tablica[ b + 1 ] = a;
            }
        }
    }
    cout << "Najmniejsza liczba to " << tablica[ 0 ] << endl;
    cout << "Najwieksza liczba to " << tablica[ 9 ] << endl;
}
void znajdzmax( int tablica[], int numerwpisu )
{
    int a;
    for( int b = 0; b < numerwpisu; b++ )
    {
        for( int i = 0; i < numerwpisu; i++ )
        {
            if( tablica[ i ] < tablica[ i + 1 ] )
            {
                a = tablica[ i ];
                tablica[ i ] = tablica[ i + 1 ];
                tablica[ i + 1 ] = a;
            }
        }
    }
    cout << "najmniejsza liczba to " << tablica[ 9 ] << endl;
    cout << "najwieksza liczba to " << tablica[ 0 ] << endl;
}
int main()
{
    srand( time( NULL ) );
    int tablica[ 10 ];
    losowanie( tablica, 10 );
    wypisanieTablicy( tablica, 10 );
    wypisanieTablicyOdTylu( tablica, 10 );
    znajdzminimum( tablica, 10 );
    znajdzmax( tablica, 10 );
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
Drugim co mi nie wychodzi jest zastąpienie polecenia
do...while
 w funkcji losowanie na pętle
for
. Próbowałem to zrobić w następujący sposób
C/C++
for( i = 0; i < ile; i++ )
{
    liczba =(( rand() % 20 ) + 10 );
    if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false )
         wylosowaneliczby[ i ] = liczba;
   
}
, ale niestety w tym przypadku w pewnym momencie losuje mi jakąś liczbę z kosmosu. Z góry dzięki.
P-128253
pekfos
» 2015-03-13 16:07:52
C/C++
for( int i = 0; i < numerwpisu; i++ )
{
    if( tablica[ i ] < tablica[ i + 1 ] )
Wychodzisz poza tablicę.

C/C++
for( i = 0; i < ile; i++ )
{
    liczba =(( rand() % 20 ) + 10 );
    if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false )
         wylosowaneliczby[ i ] = liczba;
   
}
Jak liczba została już wylosowana, zostawiasz pole tablicy niezainicjalizowane.
P-128259
Czdum
Temat założony przez niniejszego użytkownika
» 2015-03-13 17:08:26
poradziłem sobie z tym wychodzeniem poza tablicę w następujący sposób:
C/C++
void znajdzmax( int tablica[], int numerwpisu )
{
    int a;
    for( int b = 0; b < numerwpisu; b++ )
    {
        for( int i = 0; i < numerwpisu; i++ )
        {
            if( i == 0 )
            {
                if( tablica[ i ] < tablica[ i + 1 ] )
                {
                    a = tablica[ i ];
                    tablica[ i ] = tablica[ i + 1 ];
                    tablica[ i + 1 ] = a;
                }
            }
            else
            {
                if( tablica[ i - 1 ] < tablica[ i ] )
                {
                    a = tablica[ i - 1 ];
                    tablica[ i - 1 ] = tablica[ i ];
                    tablica[ i ] = a;
                }
            }
        }
    }
    cout << "najmniejsza liczba to " << tablica[ 9 ] << endl;
    cout << "najwieksza liczba to " << tablica[ 0 ] << endl;
}

Ale mogę prosić o rozszerzenie trochę wypowiedzi z tym brakiem inicjalizacji?
P-128262
maly
» 2015-03-13 17:26:36
Chodzi oto że jeśli liczba była wylosowna to zamiast spróbować ponownie losować lecisz dalej nie wypełniając tablicy.
P-128263
pekfos
» 2015-03-13 17:42:18
poradziłem sobie z tym wychodzeniem poza tablicę w następujący sposób:
W efekcie masz dwa razy tyle kodu, gdzie przypadek dla zera i ogólny (dla 1) robią dokładnie to samo. Wystarczyło zmienić parametry pętli..
P-128266
Czdum
Temat założony przez niniejszego użytkownika
» 2015-03-13 17:49:58
@pekfos w jaki sposób parametry pętli?
P-128267
pekfos
» 2015-03-13 17:51:31
Zaczynaj od 1, zamiast od zera? Dla zera i tak robisz to samo. Druga opcja to kończyć jeden element wcześniej i pierwszy kod będzie poprawny.
P-128268
Czdum
Temat założony przez niniejszego użytkownika
» 2015-03-13 18:38:49
okej, serdeczne dzięki pekfos, teraz ogarnąłem jak przesortować to krócej.

Teraz takie pytanie, czy da się w ogóle zamienić
C/C++
void losowanie( int wylosowaneliczby[], int ile )
{
    int i = 0, liczba;
    do
    {
        liczba =(( rand() % 21 ) + 10 );
        if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false )
        {
            wylosowaneliczby[ i ] = liczba;
            i++;
        }
    } while( i < ile );
   
}
 tak żeby zamiast
do..while
 była pętla
for
? Bo pętli "for" wg tego co przeczytałem powinno się używać wtedy kiedy wiemy dokładnie ile razy ma zostać wykonana pętla, a tu tego nie wiemy (dobrze myślę?)
P-128272
« 1 » 2
  Strona 1 z 2 Następna strona