Deivid Temat założony przez niniejszego użytkownika |
[Rozdział 21] Zadanie 1. - Proszę o szczegółową podpowiedź. » 2015-08-27 20:07:57 Witajcie, jestem dość kiepski z programowania i tym oto sposobem od samego rana siedzę nad tym zadaniem. W końcu się poddałem, jeśli wy mi nie pomożecie nie poradzę sobie z nim. Uprzedzę pytania przeglądałem forum ale nie natrafiłem na rozwiązanie moje problemu, bądź co jest bardziej prawdopodobne nie zrozumiałem go. Więc od początku. Stworzyłem sobie funkcję do wypełnienia tablicy: int funkcja_wypelnij_tablice( int tablica[], int wielkosc_tablicy ) { int index = 0; cout << "Wprowadz trzy liczby calkowite: \n"; do { cin.clear(); cin.sync(); cin >> tablica[ index ]; index++; } while( index < wielkosc_tablicy ); }
następnie funkcję do wyświetlenia tablicy (niby zbędne ale dla ułatwienia bym widział gdzie co mam): int funkcja_wyswietl_tablice( int tablica[], int wielkosc_tablicy ) { int index = 0; do { cout << "Liczba " << index + 1 << " to: " << tablica[ index ] << "\n"; index++; } while( index < wielkosc_tablicy ); }
funkcja losujaca: int funkcja_losujaca_2( int stop ) { int losowanie = 0; losowanie =( rand() % stop ) + 0; return losowanie; }
Teraz kolej na int main (+ funkcja sprawdzająca, której nie wiem jak napisać) int main() { srand( time( NULL ) ); int tab_1[ 3 ], index = 0; funkcja_wypelnij_tablice( tab_1, 3 ); funkcja_wyswietl_tablice( tab_1, 3 ); int tab_2[ 2 ], losowanie_pierwsze = 0; losowanie_pierwsze = funkcja_losujaca_2( 3 ); tab_2[ 0 ] = tab_1[ losowanie_pierwsze ]; index = 0; do { cout << tab_2[ index ] << "\n"; index++; } while( index < 2 ); return 0; }
przechodzimy do funkcji sprawdzajacej: bool funkcja_sprawdzenie_losowania( int tablica_1[], int tablica_2[], int wielkosc_tablicy )
{ int index_1 = 0, index_2; do { if( tablica_2[ 0 ] == tablica_1[ index_1 ] ) { return true; } else return false; index_1++; } while( index_1 < wielkosc_tablicy ); }
a to napisałem w int main jako ODNOSNIK: do { int losowanie_drugie = 0; losowanie_drugie = funkcja_losujaca_2( 3 ); if( funkcja_sprawdzenie_losowania( tab_1, tab_2, 3 ) == false ) { tab_2[ 1 ] = tab_1[ losowanie_drugie ]; } index++; } while( index < 1 );
Proszę o rady jak to naprawić. Z góry przepraszam za ilość tekstu ale bardzo zależy mi na tym by ktoś mi to wytłumaczył. Nie chce przechodzić dalej nie opanowując tego rozdziału. Z góry dzięki, Dawid. |
|
carlosmay |
» 2015-08-27 20:33:35 int funkcja_wypelnij_tablice( int tablica[], int wielkosc_tablicy ) nie zwraca wartości (void) int funkcja_wyswietl_tablice( int tablica[], int wielkosc_tablicy ) też nie zwraca wartości (void) Popraw na początek to. Nie chce przechodzić dalej nie opanowując tego rozdziału |
No i dobrze. Bez tych podstaw nie ma szans na dalszą naukę. Powtórz funkcje: jak i kiedy zwracają jakąś wartość i czy zawsze jest to konieczne. Edit: Program ma składać się z funkcji więc nic nie stoi na przeszkodzie, żeby pisać program po kawałku i sprawdzać czy zachowuje się zgodnie z oczekiwaniem. |
|
Deivid Temat założony przez niniejszego użytkownika |
» 2015-08-27 22:37:20 Dzięki za odpowiedź. Czyli z tego co zrozumiałem funkcje wypełnij i wyświetl przyjmują argumenty do funkcji ale nie zwracają wartości a więc zamiast int muszę zastosować void. Co do funki sprawdzającej bool przecież zwraca wartość 0 lub 1. Mógłbym napisać coś więcej o tym ? |
|
carlosmay |
» 2015-08-27 22:56:20 Co do funki sprawdzającej bool przecież zwraca wartość 0 lub 1. Mógłbym napisać coś więcej o tym ? |
Sorki. To chyba zmęczenie. Ta funkcja OK - zwraca wartość, ale nigdy nie wykona inkrementacji. Wyjście z funkcji nastąpi po wykonaniu jednego z returnów. I jeszcze masz zadeklarowaną zmienną index_2 , której nie używasz. |
|
Deivid Temat założony przez niniejszego użytkownika |
» 2015-08-28 09:41:44 OK. Napisałem dzisiaj program od nowa. Mam problem z funkcją sprawdzającą i przypisaniem liczb z tablicy 3 elementowej do tablicy 2 elementowej. Oto kod: (do administracji - wklejam cały kod ponieważ potrzebuję dokładnego wytłumaczenia)
#include<iostream> #include<cstdlib> #include<ctime> using namespace std;
void funkcja_wypelniajaca_tablice_3_elementowa( int tab[] ) { int zmienna_liczba, licznik = 0; cout << "Podaj 3 liczby: \n"; do { cin.clear(); cin.sync(); cin >> zmienna_liczba; tab[ licznik ] = zmienna_liczba; licznik++; } while( licznik < 3 ); }
void funkcja_wyswietlajaca_tablice_3_elementowa( int tab[] ) { int licznik = 0; do { cout << "Liczba " << licznik + 1 << " to: " << tab[ licznik ] << "\n"; licznik++; } while( licznik < 3 ); } int funkcja_losujaca( int ilosc_liczb_losowanych ) { int zmienna_losowana = 0; zmienna_losowana =( rand() % ilosc_liczb_losowanych ) + 0; return zmienna_losowana; }
void funckja_wypelniajaca_tablice_2_elementowa( int tab[] ) { int licznik = 0; do { tab[ licznik ] = 0; licznik++; } while( licznik < 2 ); }
bool funkcja_sprawdzajaca_zawartosc_tablic( int tab_3_el[], int tab_2_el[], int index_losowy ) { int licznik = 0; do { if( tab_2_el[ licznik ] == tab_3_el[ index_losowy ] ) { return false; } licznik++; } while( licznik < 3 ); return true; } int main() { srand( time( NULL ) ); int tablica_3_elementowa[ 3 ]; funkcja_wypelniajaca_tablice_3_elementowa( tablica_3_elementowa ); funkcja_wyswietlajaca_tablice_3_elementowa( tablica_3_elementowa ); int tablica_2_elementowa[ 2 ]; funckja_wypelniajaca_tablice_2_elementowa( tablica_2_elementowa ); int licznik = 0; do { int losowy_index = 0; losowy_index = funkcja_losujaca( 3 ); if( funkcja_sprawdzajaca_zawartosc_tablic( tablica_3_elementowa, tablica_2_elementowa, losowy_index ) ) { tablica_2_elementowa[ licznik ] = tablica_3_elementowa[ losowy_index ]; } licznik++; } while( licznik < 2 ); licznik = 0; do { cout << "Element " << licznik + 1 << " tablicy drugiej to: " << tablica_2_elementowa[ licznik ] << "\n"; licznik++; } while( licznik < 2 ); return 0; }
Proszę o wskazówkę. |
|
carlosmay |
» 2015-08-28 10:39:43 Nie musisz zerować tablicy dwuelem. W pierwszym cyklu zapisujesz efekt losowania do tablicy bo jeszcze nic w niej nie ma. Później operujesz na aktualnym rozmiarze tablicy. Do funkcji sprawdzajacej przekazujesz co wylosowałeś, tab_2_el i aktualny rozmiar (nie cały rozmiar) wtedy nie porównujesz z jeszcze nie zapisanymi elementami tablicy.
Funkcję losująca możesz skrócić do jednej linii. |
|
pekfos |
» 2015-08-28 10:40:25 tablica_2_elementowa[ licznik ] = tablica_3_elementowa[ losowy_index ];
|
Nie używaj tablicy z liczbami użytkownika, bo nic o nich nie wiesz. Jeśli wszystkie liczby są takie same, to nie wylosujesz dwóch różnych. Losuj miejsca w tablicy, a nie liczby, które się tam znajdują. |
|
Deivid Temat założony przez niniejszego użytkownika |
» 2015-08-28 12:27:51 Wydaje mi się że o to tu chodzi, jednak jeszcze coś nie działa. Z waszymi poradami jestem chyba coraz bliżej... a przynajmniej mam taką nadzieję. Oto kod:
#include<iostream> #include<cstdlib> #include<ctime> using namespace std; void wypelnij_tablice( int tab[], int rozmiar_tablicy ) { cout << "Wprowadz 3 liczby: \n"; int licznik = 0; do { cin.clear(); cin.sync(); cin >> tab[ licznik ]; licznik++; } while( licznik < rozmiar_tablicy ); } void wyswietl_tablice( int tab[], int rozmiar_tablicy, int ktora_tablica ) { int licznik = 0; if( ktora_tablica == 1 ) { cout << "Wyswietlasz wpowadzone przez Ciebie liczby: \n"; } if( ktora_tablica == 2 ) { cout << "Wyswietlasz wylosowane liczby: \n"; } do { cout << "Element " << licznik + 1 << " tablicy to: " << tab[ licznik ] << "\n"; licznik++; } while( licznik < rozmiar_tablicy ); } int losowanie_indeksu( int tab[], int ilosc_losowan ) { return tab[( rand() % ilosc_losowan ) ]; } bool sprawdzenie_losowania( int tab[], int wylosowany_indeks, int licznik_losowan ) { if( licznik_losowan <= 0 ) { return false; } int licznik = 0; do { if( tab[ licznik ] == wylosowany_indeks ) { return true; } licznik++; } while( licznik < licznik_losowan ); return false; }
int main() { srand( time( NULL ) ); int tablica_3_el[ 3 ]; int tablica_2_el[ 2 ]; wypelnij_tablice( tablica_3_el, 3 ); wyswietl_tablice( tablica_3_el, 3, 1 ); int wylosowany_indeks = 0, licznik = 0; do { wylosowany_indeks = losowanie_indeksu( tablica_3_el, 3 ); if( sprawdzenie_losowania( tablica_3_el, wylosowany_indeks, licznik ) == false ) { tablica_2_el[ licznik ] = wylosowany_indeks; licznik++; } } while( licznik < 2 ); wyswietl_tablice( tablica_2_el, 2, 1 ); return 0; }
Edit 1: Poprawiłem tą linijkę kodu: if( tab[ licznik ] == wylosowany_indeks ) { return true; } licznik++;
Wcześniej licznik++; byl zaraz po return przed klamerką. |
|
« 1 » 2 3 |