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

Przesunięcie elementów tablicy w lewo i w prawo

Ostatnio zmodyfikowano 2017-11-01 16:27
Autor Wiadomość
koot
Temat założony przez niniejszego użytkownika
Przesunięcie elementów tablicy w lewo i w prawo
» 2017-11-01 00:15:00
Cześć!
Mam do napisania program, który ma przesunąć nieparzyste elementy tablicy na lewą stronę, a parzyste na prawą. Próbowałem czegoś takiego:

int tab [8]={1,2,3,4,5,6,7,8};
for(int i=0;i <=7; i++)
{
if (tab[i]%2==0) swap(tab[i], tab[i+1]);
}

Ale nie działa to poprawnie i w sumie nie wiem, dlaczego. Pewnie jest to banalne do napisania, ale jestem początkujący i mnie to przerasta. Ktoś pomoże?
P-166312
Kinexity
» 2017-11-01 00:40:17
Utwórz nową tablicę i wkładaj elementy nieparzyste od przodu, a parzyste od tyłu.
P-166313
YooSy
» 2017-11-01 00:41:18
P-166314
koot
Temat założony przez niniejszego użytkownika
» 2017-11-01 07:57:23
Nie mogę utworzyć nowej tablicy. Jednym z wymogów zadania jest to, by modyfikować tę już istniejącą.
P-166317
Monika90
» 2017-11-01 09:22:09
C/C++
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    int tab[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    std::partition( std::begin( tab ), std::end( tab ),[]( auto x ) { return x % 2; } );
    for( const auto & x: tab )
         std::cout << x << ' ';
   
}
Albo std::stable_partition jeżeli względna kolejność elementów (nie)parzystych ma być zachowana.
P-166318
koot
Temat założony przez niniejszego użytkownika
» 2017-11-01 11:27:58
@Monika90 W ogóle nie rozumiem tego kodu. Chyba yba jest za skomplikowany dla mnie. Powinienem to zrobić jakimś prostym przesunięciem, tylko nie wiem jak..
P-166319
YooSy
» 2017-11-01 13:01:28
C/C++
void partition( int * first, int * last )
{
    while( * first % 2 && first != last ) ++first; // pomiń wszystko co jest prawidłowo ułożone
   
    if( first == last ) return; // opuść funkcję, gdy jest tylko jeden element
   
    for( int * i = first + 1; i != last + 1; ++i ) {
        if( * i % 2 ) {
            std::swap( * i, * first ); // zamień wartości, gdy znajdziesz nieparzystą
            ++first; // po zamianie wartości należy przesunąć wskaźnik first, tak aby ponownie wskazywał pierwszą parzystą wartość
        }
    }
}

int tab[ 8 ] = { 1, 2, 3, 4, 5, 6, 7, 8 };
partition( tab, tab + 7 ); // przekazujemy adresy pierwszego i ostatniego elementu tablicy

Tak mniej więcej działa std::partition.
std::partition
std::stable_partition
P-166321
koot
Temat założony przez niniejszego użytkownika
» 2017-11-01 14:55:26
@YooSy Działa niemal idealnie :)
P-166325
« 1 » 2
  Strona 1 z 2 Następna strona