Hej!
Mam problem z dokończeniem funkcji w pewnym zadaniu. Oto jego treść:
Napisz funkcję do przesuwania zawartość tablicy liczb całkowitych o zadaną liczbę pozycji w dowolną stronę. Operacja przesunięcie ma uwzględniać zawijanie - element, który "wypadł" z jednej strony tablicy jest wstawiany na puste miejsce na jej końcu. I odwrotnie.
Prototyp funkcji powinien wyglądać następująco:
int shift(int *array, int array_size, int positions_to_shift, enum direction dir);
Parametry:
array - wskaźnik na tablicę typu int, której elementy mają zostać przesunięte,
array_size - liczba elementów w tablicy,
positions_to_shift - liczba pozycji, o którą mają zostać przesunięte elementy tablicy array,
dir - kierunek przesunięcia, może przyjmować jedną z dwóch wartości - ROTATE_RIGHT lub ROTATE_LEFT.
Wartość zwrócona:
1 w przypadku przekazania do funkcji niepoprawnych danych,
0 w przypadku sukcesu.
Napisz program, który pobierze od użytkownika:
tablicę liczb całkowitych (nie więcej niż 150) a wartość 0 będzie oznaczała koniec wprowadzanych przez użytkownika danych,
liczbę pozycji, o którą mają zostać przesunięte elementy w pobranej tablicy oraz
kierunek przesunięcia (1 - w prawo, 2 - w lewo).
Program ma wyświetlić na wyjściu tablicę po przesunięciu jej elementów o wymaganą liczbę pozycji.
W przypadku niepodania żadnej wartości program ma wyświetlić komunikat Not enough data available i niezwłocznie zakończyć działanie z kodem błędu 3.
W przypadku wprowadzenia błędnych danych wyświetlić komunikat Incorrect input i zakończyć działanie z kodem błędu 1.
W przypadku podania danych niezgodnych z treścią zadania program ma wyświetlić komunikat Incorrect input data i zakończyć działanie z kodem błędu 2.
Jeżeli wszystkie operacje się powiodą to program powinien zwrócić wartość 0.
Przykładowa interakcja z programem -- sukces
Podaj wektor: -246 -421 594 320 460 108 0⏎
Podaj przesuniecie: 0⏎
Podaj kierunek przesuniecia: 2⏎
-246 -421 594 320 460 108 ⏎
podaj wektor: 151 73 -906 -630 535 812 0⏎
podaj przesuniecie: 10⏎
podaj kierunek przesuniecia: 1⏎
-906 -630 535 812 151 73 ⏎
Przykładowa interakcja z programem -- błędy danych wejściowych:
podaj wektor: 10 13 33 30 85 32 69 79 46 9 66 10 73 90 97 2 90 1 0⏎
podaj przesuniecie: d⏎
Incorrect input
podaj wektor: 88 2 26 94 4 21 23 96 0⏎
podaj przesuniecie: 2⏎
podaj kierunek przesuniecia: 0⏎
Incorrect input data
Uwaga
Do poruszania się po tablicach używaj zmiennej wskaźnikowej.
Do pobierania oraz wyświetlania elementów tablicy wykorzystaj funkcje read_vector oraz display_vector z zadania 1.8 Sortowanie.
Deklaracje wszystkich funkcji oraz definicję typu wyliczeniowego zamieść w pliku nagłówkowym vector_utils.h, a definicje funkcji w pliku źródłowym vector_utils.c.
No dobra, to teraz mój kod. Oto moje funkcje z pliku "vector_utils.c":
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"
int read_vector(int* tab, int size, int stop_value)
{
if (tab == NULL || (size <= 0 || size > 150))
{
return -1;
}
int i;
for (i = 0; i < size; i++)
{
if(scanf_s("%d", tab + i) != 1)
{
return -2;
}
if (*(tab + i) == stop_value)
{
break;
}
}
return i;
}
void display_vector(const int* tab, int size)
{
if (tab == NULL || (size <= 0 || size > 100))
{
return;
}
int i;
for (i = 0; i < size; i++)
{
printf("%d ", *(tab + i));
}
}
A teraz sam plik "źródłowy":
#include <stdio.h>
#include "vector_utils.h"
int shift(int* array, int array_size, int positions_to_shift, enum direction dir);
int main()
{
enum kierunek {ROTATE_RIGHT=1,ROTATE_LEFT=2};
printf("Podaj wektor: ");
int table[150];
int stop = 0;
int size = 150;
int* pointer_on_table = table;
int wynik = read_vector(pointer_on_table, size, stop);
if(wynik == -2 || wynik==-1)
{
printf("Incorrect input");
return 1;
}
pointer_on_table = table;
if (*pointer_on_table == stop)
{
printf("Not enough data available");
return 3;
}
size = wynik;
int how_many_shifts;
printf("Podaj o ile komorek dokonujesz przesuniecia: ");
if(scanf_s("%d",&how_many_shifts)!= 1)
{
printf("Incorrect input");
return 1;
}
enum kierunek move;
printf("Podaj kierunek przesuniecie: ");
if (scanf_s("%d", &move) != 1)
{
printf("Incorrect input");
return 1;
}
if (move < 1 || move>2)
{
printf("Incorrect input data");
return 2;
}
shift(pointer_on_table, size, how_many_shifts, move);
const int* stable_pointer = table;
display_vector(stable_pointer, size);
return 0;
}
int shift(int* array, int array_size, int positions_to_shift, enum direction dir)
{
if (array == NULL || (array_size <= 0))
{
return 1;
}
int ile_do_konca = 0;
int i=0;
int* adres_wspomagajcy;
adres_wspomagajcy = array;
if (dir == 1)
{
/*for (i = 0; i <= array_size; i++)
{
if ((i + positions_to_shift) > array_size)
{
}
else
{
int zamiana_podstawowa = *(array+i);
*(array+i) = *(array + i + positions_to_shift);
*(array + i + positions_to_shift) = zamiana_podstawowa;
}
}*/
}
return 0;
}
No i teraz problem. Nie do końca wiem jak rozpisać instrukcje dla dir==1 i dir==2. Podpowiecie mi jak to mogę rozwiązać? :/