Przesuwanie wartości w tablicy.

0

Cześć, chcę napisać program, który przesuwa wartości w tablicy jednowymiarowej o zadaną liczbę pozycji w prawo w sposób cykliczny.

To znaczy, że jeżeli mam tablicę [1,2,3,4,5] i dokonam przesunięcia o p=2 to w wyniku powinienem dostać [4,5,1,2,3] - to znaczy element o indeksie n-1 wchodzi na pozycję o indeksie 0.

Konkretnie napisałem już program, który przesuwa mi elementy tablicy w prawo natomiast robi to tylko o 1 cykl, a ja chciałbym, aby to robił o wybraną przeze mnie ilość cykli. Jakieś wskazówki ?

void przesun(int tab[], int n, int p)
{
    int i,temp;
     for (i = 0; i < n ; i++)
        {
            temp=tab[n-1];
            tab[n-1]=tab[i];
            tab[i]=temp;
        }
}

int main()
{
    int TAB[5]={1,2,3,4,5};
    int i;
    for ( i = 0 ; i < 5; i++)
    {
        printf("%d\n",TAB[i]);
    }
    puts("\n");
    przesun(&TAB,5,1);
    for ( i = 0 ; i < 5; i++)
    {
        printf("%d\n",TAB[i]);
    }
    return 0;
}
0

Konkretnie napisałem już program, który przesuwa mi elementy tablicy w prawo natomiast robi to tylko o 1 cykl, a ja chciałbym, aby to robił o wybraną przeze mnie ilość cykli

Czyli rozumiem, że o N wykonań funkcji przesun. Najprościej więc jej wywołanie zapiąć w jakiejś pętli albo napisanie pętli wewnątrz funkcji:

#include <stdio.h>

void reorganize(int * array, unsigned cycles, size_t length) {
    for (unsigned c = 0; c < cycles; ++c) {
        for (size_t i = 0; i < length; ++i) {
            int temp = 0;
            temp = array[length - 1];
            array[length - 1] = array[i];
            array[i] = temp;
        }
    }
}

int main(void) {
    int array[] = { 1, 2, 3, 4, 5 };
    size_t length = sizeof(array) / sizeof(array[0]);
    reorganize(array, 2, length);

    for (size_t i = 0; i < length; ++i) {
        printf("%d ", array[i]);
    }
    return 0;
}

https://ideone.com/9A5GHk

PS: Pisałem to z palca w ideone więc z góry sorry za jakieś warningi dotyczące niezgodności typów w pętlach, niemniej jednak na oko chyba jest w porządku :)

1

Wersja z jedną pętlą w C:

#include <stdio.h>

void reorganize(int * array, unsigned cycles, size_t length) {
    int val;
    int lastIdx = length - 1;
    int moveSize = (length - 1) * sizeof(int);
    for (unsigned c = 0; c < cycles; ++c) {
    	val = array[lastIdx];
    	memmove(array + 1, array, moveSize);
    	array[0] = val;
    }
}
 
int main(void) {
    int array[] = { 1, 2, 3, 4, 5 };
    size_t length = sizeof(array) / sizeof(array[0]);
    reorganize(array, 2, length);
 
    for (size_t i = 0; i < length; ++i) {
        printf("%d ", array[i]);
    }
    return 0;
}

https://ideone.com/Y24gF6

3

kod o złożoności o(n):
https://ideone.com/khMprb

Copy with pride :).

0

Dzięki za różne pomysły na rozwiązanie tego, właśnie tego mi brakowało :) Bo ogólnie takie najprostsze rozwiązanie, które przyszło mi do głowy, tak na chłopski rozum to

void przesun(int tab[], int n, int p)
{
    int i,temp,j;
    for ( j = 0 ; j < p ; j ++)
    {
        for (i = 0; i < n ; i++)
        {
            temp=tab[n-1];
            tab[n-1]=tab[i];
            tab[i]=temp;
        }
    }
}

Chyba jest oki :D Dzięki.

0

To nie jest najprostsze, bo ktoś kto będzie używał ten funkcji ni hu hu nie będzie wiedział co to jest n albo p. Najlepiej nazywać zmienne po imieniu, a nie tak jak na studiach :)

No i kurcze... jakoś odrzucają mnie takie niezainicjalizowane zmienne: int i,temp,j; Teraz nawet w C# jak piszę to piszę np: int number = 0; Tak mi zostało z C właśnie.

0

A co do inicjalizacji zmiennych - czy kultura zapisu nakazuje im nadawać, chociażby 0 ?

Moim zdaniem jest to zalecane i to nawet nie przez kulturę zapisu tylko z uwagi na to, że w takim obiekcie najczęściej są zwyczajnie śmieci i łatwo później machnąć się używając niezainicjalizowanego obiektu. Dotyczy to zwłaszcza wskaźników nie ustawionych na NULL. C to nie język zarządzany jak np. C# gdzie obiekty są domyślnie inicjalizowane i w zasadzie nie ma tego problemu.

1

W sumie jeśli ma być to cykliczne, to ja bym nic nie przesuwał, tylko odpowiednio ustawiał wskaźnik i odpowiednio to ustawienie interpretował.

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