Operator swap - niejasność.

0

Cześć!
Mam następujące zadanko: Napisz funkcję, która otrzymuje dodatnią liczbę całkowitą n oraz wskaźnik na n-elementową tablicę o elementach typu int i odwraca kolejność elementów tablicy. W pokazanym poniżej programie posłużyłem się funkcją swap, jednak nie do końca spełnia moja one oczekiwania (zapewne dlatego, że nie wiem jak jej używać...). Czy bylibyście tak mili i powiedzieli mi co jest nie tak/ zaproponowali inne rozwiązanie, jeżeli to wydaje Wam się skrajnie błędne?

#include <iostream>
#include <algorithm>


using namespace std;

void odwroc(int n,int *tab)
{   cout<<"Przed odwroceniem: "<<endl;
    for(int i=0; i<n; i++)
    {
        cout<<*(tab+i)<<" ";
    }
    cout<<endl<<endl;
    cout<<"Po odwroceniu: "<<endl;

      for(int i=0; i<n; i++, n--)
    {
         swap(*(tab+i), *(tab+n));
    }

};

int main()
{   int tab[100];
    int wartosc;
    int n=0;

        cout<<"W celu zakonczenia wpisywania elementow do tablicy wpisz dowolna litere."<<endl;
        do
        {   cout<<"Podaj element: "<<endl;      cin>>wartosc;
            tab[n]=wartosc;
        if(cin.good())
            n++;
        else
            break;
        }while(1);
        cout<<endl<<endl;


    odwroc(n, tab);

    return 0;
}
0

Tutaj trochę inny sposób, także nieskuteczny. W obu przypadkach brakuje cout wyświetlającego liczby po odwróceniu, jednak to bez znaczenia bo i tak pokazuje je złe. Usunąłem w celu zminimalizowania kodu, który daje Wam do analizy.

#include <iostream>

using namespace std;

void odwroc(int n,int *tab)
{   cout<<"Przed odwroceniem: "<<endl;
    for(int i=0; i<n; i++)
    {
        cout<<*(tab+i)<<" ";
    }
    cout<<endl<<endl;
    cout<<"Po odwroceniu: "<<endl;

      for(int i=0; i<n; i++, n--)
    {
         pomocnicza=*(tab+n);
         *(tab+n)=*(tab+i);
         *(tab+i)=pomocnicza;
    }

};

int main()
{   int tab[100];
    int wartosc;
    int n=0;

        cout<<"W celu zakonczenia wpisywania elementow do tablicy wpisz dowolna litere."<<endl;
        do
        {   cout<<"Podaj element: "<<endl;      cin>>wartosc;
            tab[n]=wartosc;
        if(cin.good())
            n++;
        else
            break;
        }while(1);
        cout<<endl<<endl;


    odwroc(n, tab);

    return 0;
}
0

ktokolwiek?:)

3

std::reverse

0
```c for(int i=0; i<n; i++,="i++," n--)="n--)" ```="```" daleko="daleko" lecisz="lecisz" bo="bo" jak="jak" dolecisz="dolecisz" już="już" do="do" **n/2**="**n/2**" to="to" tablica="tablica" jest="jest" odwrócona,="odwrócona," a="a" jeszcze="jeszcze" drugie="drugie" pół="pół" czyli="czyli" odwracasz="odwracasz" tablice="tablice" drugi="drugi" raz="" za="Za" ty="Ty"> tablica jest taka sama jak na początku
0

satirev, trochę jaśniej? ;)
stryku, nie do końca jest tak jak mówisz, bo n zmniejsza się w trakcie wykonywania pętli, więc i oraz n spotkają się w połowie elementów, a same elementy zostaną odwrócone tylko raz

1

nie do końca spełnia moja one oczekiwania
Możesz wyjaśnić co to oznacza? Program się wywala czy co? Bo to

*(tab+n);

powinno program wywalić przy pierwszej iteracji bo chcesz wziąć jeden element za tablicą

2
  1. zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. nie nadużywaj postinkrementacji: http://4programmers.net/Forum/1101404
bladyzor napisał(a):

... funkcję, która otrzymuje dodatnią liczbę całkowitą n oraz wskaźnik na n-elementową tablicę o elementach typu int i odwraca kolejność elementów tablicy.
To po kiego ta twoja funkcja smaruje po ekranie?

void odwroc(size_t n,int *tab)
  {
   int *p=tab,*k=p+n;
   while(p<--k) swap(*(p++),*k);
  }
3

stryku: to jest wskaźnik, tam określasz n-te "okienko" od początku tablicy ;) np. *tab ma swój adres w pamięci zajmujący powiedzmy 4 bity, natomiast *(tab+2) będzie przesunięty o 8 bitów dalej
_13th_Dragon: społeczność 4 programmers jak zwykle miła. Jak w formatowaniu kodu ma mi pomóc link do Twojego wpisu, gdzie porównujesz złe formatowanie do noszenia spodni na wysokości kostek? To, że programujesz trochę dłużej ode mnie nie znaczy, że możesz patrzeć na innych z góry i mówić w ich stronę jak dickhead. Nie wniosłeś zupełnie nic do tego tematu.

Całej reszcie dziękuję za pomoc, tutaj może nie optymalny, lecz działający już kod:

#include <iostream>

using namespace std;

void odwroc(int n,int *tab)
{   int pomocnicza;
    int rowna_n=n;
    cout<<"Przed odwroceniem: "<<endl;
    for(int i=0; i<n; i++)
    {
        cout<<*(tab+i)<<" ";
    }
    cout<<endl<<endl;
    cout<<"Po odwroceniu: "<<endl;

      for(int i=0; i<n; i++, n--)
    {
         pomocnicza=*(tab+n-1);
         *(tab+n-1)=*(tab+i);
         *(tab+i)=pomocnicza;
    }
    for(int i=0; i<rowna_n; i++)
    {
        cout<<*(tab+i)<<" ";
    }

};

int main()
{   int tab[100];
    int wartosc;
    int n=0;

        cout<<"W celu zakonczenia wpisywania elementow do tablicy wpisz dowolna litere."<<endl;
        do
        {   cout<<"Podaj element: "<<endl;      cin>>wartosc;
            tab[n]=wartosc;
        if(cin.good())
            n++;
        else
            break;
        }while(1);
        cout<<endl<<endl;


    odwroc(n, tab);

    return 0;
}
0

Nie wiem co ma do tych "okienek" rozmiar adresu, ale ogólnie masz rację. Więc wiesz, że

*(tab+n)

jest równoznaczne z tab[n]

. Jeżeli n to rozmiar tablicy to wylatasz poza nią.
0

Dokładnie, dlatego w nowym kodzie już poprawione ;)

0

.

1 użytkowników online, w tym zalogowanych: 0, gości: 1