C Przesunięcie cykliczne tablicy w prawo

0

Witam serdecznie. Próbuję napisać program który ma za zadanie przesunięcie cykliczne wartości w tablicy w prawo o zadaną wartość k. Może mi ktoś wytłumaczyć jak to się dzieje, że w drugiej pętli for źle mi przepisuje wartości. Jak wyświetlę "i-k" to wyświetla dobrze od 0 do 4, a jak wyświetlę "tab[i-k]" to wyświetla 12312 i te wartości zostają w tej tablicy i wynik końcowy jest źle.

#include <stdio.h>
#include <stdlib.h>

void przesuniecie (int k){
	int tab[]={1,2,3,4,5,6,7,8};
	int pom[k];
	int i,j=0;
	for (i=8-k;i<8;i++){
		pom[j]=tab[i];
		j++;
	}
	for(i=k;i<8;i++){
		printf("%d",i-k);
		tab[i]=tab[i-k];	
	}
	printf("\n");
	for(i=0;i<k;i++)
		tab[i]=pom[i];
	for(i=0;i<8;i++)
		printf("%d",tab[i]);
}

int main(int argc, char *argv[]) {
	int k=3;
	przesuniecie(k);
	return 0;
}
0

W pierwszej piszesz do pom, w drugiej piszesz do tab.

0
  1. Dzieje sie tutaj tak,
 for(i=k;i<8;i++){
                printf("%d",i-k);
                tab[i]=tab[i-k];        
        }

poniewaz po dwukrotnym wykonaniu tej petli masz w tablicy

1, 2, 3, 1, 2, 6, 7, 8

Czyli nadpisujesz sobie 4 i 5, wiesz chyba czym to bedzie skutkowalo dalej.
Powinienes zaczac przesuwanie elementow tablicy od ostatniego elementu, ktory ma zostac przesuniety. W tym wypadku jest to

tab[4]
czyli
5

Tak to powinno wygladac:

1, 2, 3, 4, 5, 6, 7, 5
1, 2, 3, 4, 5, 6, 4, 5
1, 2, 3, 4, 5, 3, 4, 5
1, 2, 3, 4, 2, 3, 4, 5
1, 2, 3, 1, 2, 3, 4, 5

 for(i = 7 - k; i >= 0; i--) 
                tab[i + k] = tab[i];  
  1. Wydaje mi sie ze powinienes rowniez tablice

pom
zamienic na wskaznik i przypisywac mu zaalokowana blok pamieci, wielkosci
k
elementow.
Wystarczy tylko zamienic:

int pom[3];

na:

int* pom = (int*)malloc(sizeof(int) * k);

Dzieki temu w przyszlosci bedziesz mogl liczbe k wczytywac od uzytkownika.

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