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

Problem z zadaniem z kursu o pętli for

Ostatnio zmodyfikowano 2013-02-06 23:17
Autor Wiadomość
Geniusz
Temat założony przez niniejszego użytkownika
Problem z zadaniem z kursu o pętli for
» 2013-02-06 19:27:43
Witam, dopiero zaczynam naukę programowania i rozwiązywałem jedno z zadań z Kursu C++, jednak po napisaniu kodu, działanie programu nie zgadzało się z początkowymi założeniami. Proszę o pomoc czyli o wyjaśnienie, co jest źle w moim kodzie, albo o podsunięcie jakiegoś rozwiązania.

Treść zadania :
Napisz program który wykona wszystkie poniższe kroki w podanej kolejności:
Losuje 10 liczb z przedziału od 10 do 30 włącznie i zapisuje je do tablicy;
Wypisuje 10 wylosowanych liczb od początku do końca;
Wypisuje 10 wylosowanych liczb od końca do początku;
Znajduje najmniejszą oraz największą wylosowaną liczbę.
Wypisuje najmniejszą i największą wylosowaną liczbę.
Program nie może używać pętli innych niż pętla for.
 
Kod napisany przeze mnie :

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

int wylosujLiczby( int itablica[], int ile )
{
    srand( time( NULL ) );
    for( int numer = 0; numer < ile; numer++ )
    {
        itablica[ numer ] =(( rand() % 20 ) + 10 );
    }
   
}
int wypiszTablice( int itablica[], int ile )
{
    for( int ilosc = 0; ilosc < ile; ilosc++ )
    {
        std::cout << itablica[ ilosc ] << std::endl;
    }
}
int wypiszTabliceOdTylu( int itablica[], int ile )
{
    for( int ilosc = 10; ilosc > 0; ilosc-- )
    {
        std::cout << itablica[ ilosc ] << std::endl;
    }
}

int znajdzMinimum( int itablica[], int ile )
{
    int najmniejsza;
    for( int ilosc = 0; ilosc < ile; ilosc++ )
    {
        if( itablica[ ilosc ] < najmniejsza )
             itablica[ ilosc ] = najmniejsza;
       
    }
    return najmniejsza;
}

int znajdzMaksimum( int itablica[], int ile )
{
    int najwieksza;
    for( int ilosc = 0; ilosc < ile; ilosc++ )
    {
        if( itablica[ ilosc ] > najwieksza )
             itablica[ ilosc ] = najwieksza;
       
    }
    return najwieksza;
}


int wypiszMinMax( int iMin, int iMax )
{
    std::cout << "Najwieksza : " << iMax << std::endl;
    std::cout << "Najmniejsza : " << iMin << std::endl;
}


int main()
{
    int tablica[ 10 ];
    wylosujLiczby( tablica, 10 );
    wypiszTablice( tablica, 10 );
    wypiszTabliceOdTylu( tablica, 10 );
    int iMin = znajdzMinimum( tablica, 10 );
    int iMax = znajdzMaksimum( tablica, 10 );
    wypiszMinMax( iMin, iMax );
   
    return 0;
}

# Problem rozwiązany, a rozwiązanie znajduje się niżej
P-75823
ashaneen
» 2013-02-06 22:20:45
Ekspertem nie jestem ale tam gdzie nie zwracasz wartości do funkcji nie, czyli nie ma zadnego return, funkcja 'powinna' posiadac typ void.

losowanie liczb to % zamiast * w (rand()%a)+b;

Patrze dalej może jeszcze coś uda mi się podpowiedzieć, bo rozczytając twój kod sam się uczę,a założyłem podobny temat z podobnym problemem :)


C/C++
int znajdzMaksimum( int itablica[], int ile )
{
    int najwieksza;
    for( int ilosc = 0; ilosc < ile; ilosc++ )
    {
        if( itablica[ ilosc ] > najwieksza ) //  | ilosc > najwieksza| Najwieksza = losowa int u  Ciebie.
             itablica[ ilosc ] = najwieksza;
       
    }
    return najwieksza;
}

Int może być nic większego przy kompilacji sie nie stanie, ale zwróć uwage na build log, bo aż krzyczy z bólu, że mu nie pasuje: ]
P-75868
Geniusz
Temat założony przez niniejszego użytkownika
» 2013-02-06 22:38:37
Dzięki za wskazanie błędu, już poprawiłem z "*" na "%" ale program dalej nie działa tak jak powinien.
Co do void to wydaje mi się, że int też może być.
Proszę o dalsze wypowiedzi :)

Po kompilacji wyskakuje mi :

11
21
22
19
27
16
14
17
20
12
2357228
12
20
17
14
16
27
19
22
21
Najwieksza : 2009222697
Najmniejsza : 2009222697

Process returned 0 (0x0)   execution time : 0.031 s
Press any key to continue.

Rzeczywiście, muszę nad tym jeszcze pomyśleć, bo tak to by wychodziło, że ilość jest większa od zmiennej int
P-75872
Berux
» 2013-02-06 22:48:24
Tak analizuję i w funkcji znajdującej najmniejszą i największą liczbę powinieneś przypisać do zmiennej, którą potem porównujesz z innymi elementami, pierwszy element tablicy. Zaś w pętli for licznik ustawiasz na 1. Czyli:

C/C++
int znajdzMaksimum( int itablica[], int ile )
{
    int najwieksza = itablica[ 0 ]; //tutaj przypisujesz pierwszy element
    for( int ilosc = 1; ilosc < ile; ilosc++ ) // zamiast 0 - 1
    {
        if( itablica[ ilosc ] > najwieksza )
             itablica[ ilosc ] = najwieksza;
       
    }
    return najwieksza;
}

I w funkcji znajdzMinimum analogicznie do powyższego.
P-75873
Geniusz
Temat założony przez niniejszego użytkownika
» 2013-02-06 22:57:34
Pozmieniałem według twojej rady, ale wtedy pokazuje mi, że najmniejsza i największa są takie same.

C/C++
...

int znajdzMinimum( int itablica[], int ile )
{
    int najmniejsza = itablica[ 0 ];
    for( int ilosc = 1; ilosc < ile; ilosc++ )
    {
        if( itablica[ ilosc ] < najmniejsza )
             itablica[ ilosc ] = najmniejsza;
       
    }
    return najmniejsza;
}


int znajdzMaksimum( int itablica[], int ile )
{
    int najwieksza = itablica[ 0 ];
    for( int ilosc = 1; ilosc < ile; ilosc++ )
    {
        if( itablica[ ilosc ] > najwieksza )
             itablica[ ilosc ] = najwieksza;
       
    }
    return najwieksza;
}

...


29
27
14
17
19
18
16
15
12
28
2357228
28
12
15
16
18
19
17
14
27
Najwieksza : 29
Najmniejsza : 29

Process returned 0 (0x0)   execution time : 0.063 s
Press any key to continue.

To wygląda tak jakby po prostu wypisywało pierwszą liczbę, a reszty już nie sprawdza ;/
P-75875
ashaneen
» 2013-02-06 23:04:05
ta pętla jest bezsensu od Tomczyka, poprostu wypisuję pierwszą tablicę.

Próbuje również z tym się uporać, jestem kawałek dalej niż Ty, odwiedź mój temat to napewno coś dla siebie znajdziesz.
P-75877
Berux
» 2013-02-06 23:06:57
Zastanów się nad tym:
itablica[ ilosc ] = najmniejsza;

i
itablica[ ilosc ] = najwieksza;

Elementowi tablicy przypisujesz wartość zmiennej najwieksza/najmniejsza. Nie powinno być czasem na odwrót?
Spróbuj jeszcze zamienić:
itablica[ numer ] =(( rand() % 20 ) + 10 );
na to:
itablica[ numer ] =( rand() % 20 ) + 10;
Nie wiem czy to zadziała, ale sprawdź.

/edit:
@ashaneen
Teraz już poprawiłem na kod w poście, w którym teraz oto piszę. :)
P-75878
Geniusz
Temat założony przez niniejszego użytkownika
» 2013-02-06 23:17:01
Jutro jeszcze nad tym pomyślę, bo już wyłączyłem komputer i pisze z komórki. Dzięki za pomoc, może coś z tego wyjdzie :)

# Sprawdziłem i wszystko działa jak należy, bardzo dziękuje za pomoc.

Poprawiony kod :

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>



int wylosujLiczby( int itablica[], int ile )
{
    srand( time( NULL ) );
    for( int numer = 0; numer < ile; numer++ )
         itablica[ numer ] =( rand() % 20 ) + 10;
   
}



int wypiszTablice( int itablica[], int ile )
{
    std::cout << "Wylosowane liczby : " << std::endl;
    for( int ilosc = 0; ilosc < ile; ilosc++ )
         std::cout << itablica[ ilosc ] << std::endl;
   
}


int wypiszTabliceOdTylu( int itablica[], int ile )
{
    std::cout << std::endl << "Wylosowane liczby od tylu : " << std::endl;
    for( int ilosc = 9; ilosc > - 1; ilosc-- )
         std::cout << itablica[ ilosc ] << std::endl;
   
}



int znajdzMinimum( int itablica[], int ile )
{
    int najmniejsza = itablica[ 0 ];
    for( int ilosc = 1; ilosc < ile; ilosc++ )
    {
        if( itablica[ ilosc ] < najmniejsza )
             najmniejsza = itablica[ ilosc ];
       
    }
    return najmniejsza;
}


int znajdzMaksimum( int itablica[], int ile )
{
    int najwieksza = itablica[ 0 ];
    for( int ilosc = 1; ilosc < ile; ilosc++ )
    {
        if( itablica[ ilosc ] > najwieksza )
             najwieksza = itablica[ ilosc ];
       
    }
    return najwieksza;
}


int wypiszMinMax( int iMin, int iMax )
{
    std::cout << "Najwieksza : " << iMax << std::endl;
    std::cout << "Najmniejsza : " << iMin << std::endl;
}



int main()
{
    int tablica[ 10 ];
    wylosujLiczby( tablica, 10 );
    wypiszTablice( tablica, 10 );
    wypiszTabliceOdTylu( tablica, 10 );
    int iMin = znajdzMinimum( tablica, 10 );
    int iMax = znajdzMaksimum( tablica, 10 );
    wypiszMinMax( iMin, iMax );
    return 0;
}

Program działa teraz tak :


Wylosowane liczby :
17
21
10
19
17
26
23
15
29
25

Wylosowane liczby od tylu :
25
29
15
23
26
17
19
10
21
17
Najwieksza : 29
Najmniejsza : 10

Process returned 0 (0x0)   execution time : 0.031 s
Press any key to continue.

P-75880
« 1 »
  Strona 1 z 1