Program z funkcjami
Ostatnio zmodyfikowano 2025-06-04 00:29
Syriusz Temat założony przez niniejszego użytkownika |
Program z funkcjami » 2013-02-22 09:57:44 Przerabiam kurs i w jednym z tematow jest program do zrobienia. Napisałem coś takiego : #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
int wylosuj() { return( rand() % 21 ) + 10; }
void wpisanie_do_tablicy( int tablica[] ) { int i; for( i = 0; i < 10; ++i ) tablica[ i ] = wylosuj(); }
void wypisanie_liczb_z_tablicy( int tablica[] ) { int i; for( i = 0; i < 10; ++i ) cout << tablica[ i ] << endl; } void wpisanie_liczb_z_tablicy_odwrocoenj( int tablica[], int tablica2[] ) { for( int j = 0; j < 10; ++j ) { int i = 10; tablica2[ j++ ] = tablica[ i-- ]; } } void wypisanie_liczb_z_tablicy2( int tablica2[] ) { int i; for( i = 0; i < 10; ++i ) cout << tablica2[ i ] << endl; }
int main() { srand( time( NULL ) ); int tablica_wylosowanych[ 10 ]; int tablica_odwrocona[ 10 ]; int i; int j; wpisanie_do_tablicy( tablica_wylosowanych ); wypisanie_liczb_z_tablicy( tablica_wylosowanych ); cout << "Odwrocona tablica" << endl; wpisanie_liczb_z_tablicy_odwrocoenj( tablica_wylosowanych, tablica_odwrocona ); wypisanie_liczb_z_tablicy2( tablica_odwrocona ); return 0; }
Jest to program z zadania konca kursu 2. I nie za bardzo wiem dlaczego jak już wypisze tablice w poprawnej kolejnosci, to kolejna funkcja nie wypisuje jej w odwroconej kolejnosci. Prosze o pomoc, bo nie za bardzo moge tego rozgryzc. Z gory dziekuje za pomoc. Pozdrawiam. |
|
Adam3423 |
» 2013-02-22 12:22:04 void wpisanie_liczb_z_tablicy_odwrocoenj( int tablica[], int tablica2[] ) { for( int j = 0; j < 10; ++j ) { int i = 10; tablica2[ j++ ] = tablica[ i-- ]; } } po pierwsze: tablica2[j++]=tablica[i--]; - wymyśl sobie sposób żeby zapisać to w bardziej zrozumialy sposób bo to nie działa tak jak bys sobie życzył(ale jesteś blisko); po drugie: int i=10; - zauważ, że wartość i przy każdym obiegu będzie taka sama teraz, także w troche innym miejscu pasowaloby to zadeklarować;) powodzenia edit: jeszcze w int main możesz usunąć int i; int j; gdyż nie korzystasz z nich w ogóle;) |
|
Syriusz Temat założony przez niniejszego użytkownika |
» 2013-02-23 19:24:46 Ok, poradziłem sobie. Dziękuje bardzo za pomoc. Pozdrawiam.
|
|
termistor |
» 2025-06-04 00:29:55 Witaj, Syriusz! Dobrze, że poradziłeś sobie z problemem. Dla przypomnienia i dokładnego wyjaśnienia, oto szczegółowe analiza funkcji wpisanie_liczb_z_tablicy_odwrocoenj, która była głównym źródłem problemu w Twoim kodzie:
### Problemy w oryginalnej funkcji ```cpp void wpisanie_liczb_z_tablicy_odwrocoenj(int tablica[], int tablica2[]) { for (int j = 0; j < 10; ++j) { int i = 10; tablica2[j++] = tablica; } } ``` 1. **Błędna inicjalizacja i deklaracja zmiennej `i`:** - `int i = 10;` jest ustawiane w każdej iteracji pętli, co jest niepotrzebne. - Wartość `i = 10` jest poza zakresem tablicy (indeksy 0-9), co prowadzi do przekroczenia zakresu i niezdefiniowanego zachowania.
2. **Podwójne inkrementowanie `j`:** - `j++` w `tablica2[j++]` oraz w warunku pętli `for` powoduje, że `j` rośnie o 2 w każdej iteracji. - Przykładowo: - Iteracja 1: `j = 0` → po `j++` staje się `1`, po pętli staje się `2`. - Iteracja 2: `j = 2` → po `j++` staje się `3`, po pętli `4`. - ... aż do `j = 10`, co kończy pętlę. - W rezultacie kopiowane jest tylko **5 elementów** (0, 2, 4, 6, 8), a nie 10.
3. **Niepoprawne odwrócenie kolejności:** - Aby odwrócić tablicę, należy skopiować elementy z końca pierwszej tablicy do początku drugiej. - Przykład poprawnego podejścia: `tablica2[j] = tablica[9 - j];` (dla j = 0: 9-0 = 9, j = 1: 9-1 = 8, itd.)
### Poprawiona wersja funkcji ```cpp void wpisanie_liczb_z_tablicy_odwroconej(int tablica[], int tablica2[]) { for (int j = 0; j < 10; ++j) { tablica2[j] = tablica[9 - j]; } } ``` - **Zasada działania:** - Dla każdego `j` od 0 do 9: - `tablica2[j]` otrzymuje wartość `tablica[9 - j]`. - Przykład: - `j = 0` → `tablica2[0] = tablica[9]` - `j = 1` → `tablica2[1] = tablica[8]` - ... - `j = 9` → `tablica2[9] = tablica[0]`
- **Dodatkowe zalety:** - Prostota i czytelność kodu. - Brak operacji `j++` wewnątrz pętli. - Unikanie przekroczenia zakresu tablicy.
### Inne sugestie 1. **Usunięcie nieużywanych zmiennych:** W funkcji `main()` zmienne `i` i `j` nie są wykorzystywane. Można je usunąć: ```cpp int main() { srand(time(NULL)); int tablica_wylosowanych[10]; int tablica_odwrocona[10]; wpisanie_do_tablicy(tablica_wylosowanych); wypisanie_liczb_z_tablicy(tablica_wylosowanych); cout << "Odwrocona tablica" << endl; wpisanie_liczb_z_tablicy_odwroconej(tablica_wylosowanych, tablica_odwrocona); wypisanie_liczb_z_tablicy2(tablica_odwrocona); return 0; } ```
2. **Zastosowanie `const` w funkcjach:** Jeśli funkcja nie modyfikuje tablicy, można dodać `const` do jej parametru: ```cpp void wypisanie_liczb_z_tablicy(const int tablica[]); ```
3. **Zmiana nazw funkcji:** Nazwy funkcji mogą być bardziej opisowe. Przykład: - `wpisanie_do_tablicy` → `wypelnijTabliceLosowymiLiczbami` - `wypisanie_liczb_z_tablicy` → `wyswietlTablice`
### Podsumowanie Poprawiona funkcja odwracania tablicy działa poprawnie dzięki: - Zastosowaniu indeksu `9 - j` do odwrócenia kolejności. - Uniknięciu podwójnego inkrementowania `j`. - Eliminacji operacji `i = 10`, które były niepotrzebne i prowadziły do błędów.
Jeśli masz więcej pytań lub potrzebujesz pomocy z innymi tematami, śmiało pytaj. Pozdrawiam! |
|
« 1 » |