Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Odwrócenie kolejności elementów tablicy.

bobik89 22 Mar 2010 16:58 10947 7
  • #1 22 Mar 2010 16:58
    bobik89
    Poziom 8  

    Witam

    mam napisać program który po wprowadzeniu dziesięciu elementów tablicy wyświetli tę tablicę "od tyłu".
    mam już go napisanego, ale jest mały problem. W tej odwróconej tablicy, przed tymi wszystkimi elementami,jak widzicie, wyskakuje mi "0" czemu?

    oto kod:

    Code:

    #include <cstdlib>
    #include <stdio.h>


    using namespace std;

    int main(int argc, char *argv[])
    {   
        int tab[9];
        int *wskaznik;
        wskaznik=tab;
     
     printf("Wprowadz elementy tablicy 10-cio elementowej: \n\n");
     for(int i=0; i<=9; i++)
     {
     printf("Podaj %d element tablicy: ", i);
     scanf("%d", &wskaznik[i]);
     }
     
     
     printf("\nNastepujaca tablica wyswietla  elementy wprowadzonej tablicy: \n");
     for(int i=0; i<=9; i++,wskaznik++)
     {     
     printf("%d", *wskaznik);
     printf("\n");
     }

    *wskaznik=0;
     printf("\nWprowadzone elementy w odwrotnej kolejnosci: \n");
     for (int i=10; i>=0; i--)
     {
     printf("%d", *wskaznik--);
     printf("\n");
     }

        system("PAUSE");
        return EXIT_SUCCESS;
    }


    Poprawiłem tytuł. - arnoldziq

    0 7
  • #2 22 Mar 2010 17:28
    arnoldziq
    Moderator Programowanie

    Bo wpisujesz 10 (od 0 do 9) a odczytujesz 11 (od 10 do 0).

    0
  • #4 22 Mar 2010 18:59
    bobik89
    Poziom 8  

    nie rozumiem... w ostatniej pętli próbowałem zmieniać tę 9 na 8 albo 10 i nic nie pomaga, jest jeszcze gorzej. A program mamy napisać "wyłącznie na wskaźnikach"

    1
  • #5 22 Mar 2010 19:00
    akaz_
    Poziom 13  

    Tak jak napisał arnoldziq.

    Ogólnie, do wykonania zadania nie potrzebujesz wcale wskaźników.
    Co prawda całość będzie działała szybciej (szybciej będą obliczane miejsca w pamięci danych elementów tablicy), ale jak widzisz zajmuje to też więcej kodu,
    a i pogubić się jest bardzo łatwo.

    Alternatywnie więc możesz zrobić coś takiego:

    Code:

    for (int i=9; 0<=i; i--)
       cout << tablica[i];



    EDIT:
    nie zdążyłem przeczytać postu, że musi być na wskaźnikach.
    Problem nie leży w pętli, a tym co jest przed pętlą, mianowicie: *wskaznik = 0;

    0
  • #6 22 Mar 2010 22:39
    bobik89
    Poziom 8  

    jak wywale tą linijke *wskaznik=0; to wywala mi jakąś liczbe z kosmosu

    0
  • Pomocny post
    #7 22 Mar 2010 22:44
    Dżyszla
    Poziom 42  

    Wróćmy może do teorii...
    for(exp_1;cond;exp_2)

    Kolejnością wykonywania jest:
    exp_1
    cond
    exp_2
    cond
    ...

    Tak więc przed wystąpieniem warunku zakazującego wykonania pętli (czy bardziej właściwie: przed niespełnieniem warunku wykonania pętli) następuje przesunięcie wskaźnika poza tablicę (10 element). Tak więc, aby powrócić na właściwy w kolejnej pętli należy albo zainicjować go położeniem ostatniego elementu tablicy, albo po prostu "cofnąć" o tą jedną pozycję. Możesz to wykonać albo przed pętlą, albo w kodzie inicjującym pętlę, albo dokonując w pętli predekrementacji.

    Ponadto ważny błąd! Tablica jest 9-elementowa (elementy o indeksach od 0 do 8 ), a Ty zapisujesz 10 elementów! Co gorsza odczytujesz już aż 11!

    0
  • #8 23 Mar 2010 00:08
    bobik89
    Poziom 8  

    ok, już działa. Dzięki wielkie!

    0