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.
|
#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; }
|
|
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). |
|
latajacaryba |
» 2017-06-07 16:21:49 Tak jedynie rzucając okiem na kod to 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: 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 |
|
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. |
|
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: 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 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. |
|
« 1 » |