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

Kurs - rozdział 22 - kod do sprawdzenia

Ostatnio zmodyfikowano 2017-06-07 16:52
Autor Wiadomość
Tinker
Temat założony przez niniejszego użytkownika
Kurs - rozdział 22 - kod do sprawdzenia
» 2017-06-07 16:10:23
Witam wszystkich. Chwilę mnie tu nie było (nie spamowałem :D). Napisałem rozwiązanie zadania, które działa, ale jestem ciekawy czy coś mogłem napisać lepiej. No i mam dylemat natury merytorycznej: czy instrukcję warunkową
if
 można nazwać rodzajem pętli czy jest to raczej coś innego (dla mnie to pętla wykonująca się raz po spełnieniu warunku)? Pytam, bo w zadaniu autor wskazał na użycie jedynie pętli
for
 do rozwiązania, a bez
if
 nie rozwiązałbym tego.
Kod raczej nie zaskoczy nikogo błyskotliwością, ale interesuje mnie, czy gdzieś nie wkradają mi się "brzydkie" nawyki. Przez chwile próbowałem rozwiązać zadanie (a dokładniej to część z wybieraniem najmniejszej i największej) funkcjami, które zwracają wartości
true
lub
false
, tak jak rozwiązany został problem z rozdziału 21, ale odpuściłem.


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.

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

using namespace std;

void losuj( int tab[], int ile )
{
    for( int i = 0; i < ile; i++ )
    {
        tab[ i ] =( rand() % 21 ) + 10;
       
    }
}

void wypiszOdPoczatku( int tab[], int ile )
{
    for( int i = 0; i < ile; i++ )
    {
        cout << tab[ i ] << endl;
    }
}

void wypiszOdKonca( int tab[], int ile )
{
    cout << endl;
    for( int i = 9; i >= ile; i-- )
    {
        cout << tab[ i ] << endl;
    }
}

void znajdzNajmniejsza( int ile, int tablica[], int najmniejsza )
{
    int indeks = 0;
    for( int i = 0; i < ile - 1; i++ )
    { if( tablica[ indeks ] <= tablica[ i + 1 ] )
             najmniejsza = tablica[ indeks ];
       
        if( tablica[ indeks ] > tablica[ i + 1 ] )
        {
            najmniejsza = tablica[ i + 1 ];
            indeks++;
        }
    }
    cout << endl << najmniejsza;
   
   
}

void znajdzNajwieksza( int ile, int tablica[], int najwieksza )
{
    int indeks = 0;
    for( int i = 0; i < ile - 1; i++ )
    { if( tablica[ indeks ] >= tablica[ i + 1 ] )
             najwieksza = tablica[ indeks ];
       
        if( tablica[ indeks ] < tablica[ i + 1 ] )
        {
            najwieksza = tablica[ i + 1 ];
            indeks++;
        }
    }
    cout << endl << najwieksza;
   
   
}

int main()
{
    srand( time( 0 ) );
    int tablica[ 10 ];
    int najmniejsza;
    int najwieksza;
    losuj( tablica, 10 );
    wypiszOdPoczatku( tablica, 10 );
    wypiszOdKonca( tablica, 0 );
    znajdzNajmniejsza( 10, tablica, najmniejsza );
    znajdzNajwieksza( 10, tablica, najwieksza );
   
   
    return 0;
}
P-162193
hit
» 2017-06-07 16:13:09
if / else
 jest instrukcją warunkową, a nie pętlą.

Co do kodu to mogłeś zadeklarować stały rozmiar tablicy i tak go przekazywać do funkcji, wtedy zwiększenie rozmiaru tablicy nie wpłynęłoby na resztę działania programu i odbywałoby się tylko w jednym miejscu. Co do wypisywania od końca, to też masz na sztywno podane 9, a ja bym tu przekazał i wykorzystał rozmiar tablicy (a nie przekazywał 0).
P-162194
latajacaryba
» 2017-06-07 16:21:49
Tak jedynie rzucając okiem na kod to
C/C++
void wypiszOdKonca( int tab[], int ile )
{
    cout << endl;
    for( int i = 9; i >= ile; i-- )
    {
        cout << tab[ i ] << endl;
    }
}

Jeśli chodziło Ci o wypisanie elementów tablicy od końca, to jest to źle, gdyż przyjmujesz, że tablica ma 10 elementów (0-9). Zrób to tak:
C/C++
void wypiszOdKonca( int tab[], int ile )
{
    cout << endl;
    for( int i = ile; i >= 0; i-- )
    {
        cout << tab[ i ] << endl;
    }
}
EDIT
@up zostałem uprzedzony ;D
P-162196
hit
» 2017-06-07 16:24:55
@latajacaryba
"to jest to źle, gdyż przyjmujesz, że tablica ma 10 elementów (0-9)."

Możesz wyjaśnić co w tym założeniu złego? Chyba, że chodzi Ci o to, że przyjął to jako stała wartość w funkcji, to ok : ) rozumiem.
P-162197
latajacaryba
» 2017-06-07 16:52:38
Chodzi mi o to, że zamiast zrobić funkcję, której przez argument wysyła wielkość tablicy, to zrobił funkcje, która wypisuje elementy tablicy (od 10 do ile). Tak więc, jeśli prześle w argumencie tablice 9 elementową to próba odczytania elementu tab[9] zakończy się błędem krytycznym. Jeśli chce odczytywać od tyłu elementy  od - do to niech zrobi coś takiego:
C/C++
void WypiszOdKonca( char tab[], int od, int _do )
{
    for( int i = od; i <= _do; i-- )
         std::cout << "element " << i << " = " << tab[ i ] << std::endl;
   
}

No a jak chce od końca tablicy (a nie od konkretnego indeksu jak powyższy kod) to pisze
C/C++
void WypiszOdKonca( char tab[], int do, int rozmiar );

moim zdaniem powinno się dążyć do praktyczności kodu. Zamiast 9 można wstawić zmienną z argumentu.
P-162200
« 1 »
  Strona 1 z 1