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

Program z funkcjami

Ostatnio zmodyfikowano 2025-06-04 00:29
Autor Wiadomość
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 :
C/C++
#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 );
   
    //Wypisywanie liczb od pocz¹tku do koñca
    wypisanie_liczb_z_tablicy( tablica_wylosowanych );
    //Wypisanie liczb od konca do poczatku
    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.
P-76699
Adam3423
» 2013-02-22 12:22:04
C/C++
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;)
P-76706
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.

P-76834
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!
P-182473
« 1 »
  Strona 1 z 1