• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przesunięcie elementów wektora

Object Storage Arubacloud
0 głosów
748 wizyt
pytanie zadane 20 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
edycja 20 marca 2020 przez Hubertius

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ć?  :/

 

komentarz 20 marca 2020 przez mokrowski Mędrzec (155,460 p.)
W <string.h>, masz funkcję memmove(...).

Błędy wypisz z użyciem fprintf(stderr, ....)

Co do shift(...), zrób zwykły switch/case. Pozwoli to ładnie zareagować na błąd kierunku. Niestety ale aby w C uzyskać kontrolę typu enum, trzeba stosować sztuczkę ze strukturą a tu nie możesz zmienić sygnatur funkcji.

1 odpowiedź

0 głosów
odpowiedź 20 marca 2020 przez tangarr Mędrzec (154,860 p.)
Najprostszą metodą jest pętla zamieniająca miejscami odpowiednie elementy tablicy.
Dla przykładu masz tablicę [1, 2, 3, 4, 5, 6] chcesz przesunąć o 2 miejsca.
Musisz wykonać 6-2 zamian miejsc:
- zamieniasz liczby na indeksach 0 i 2: [3, 2, 1, 4, 5, 6]
- zamieniasz liczby na indeksach 1 i 3: [3, 4, 1, 2, 5, 6]
- zamieniasz liczby na indeksach 2 i 4: [3, 4, 5, 2, 1, 6]
- zamieniasz liczby na indeksach 3 i 5: [3, 4, 5, 6, 1, 2]

Podobne pytania

0 głosów
1 odpowiedź 433 wizyt
pytanie zadane 8 czerwca 2020 w C i C++ przez fortuna Początkujący (310 p.)
0 głosów
1 odpowiedź 289 wizyt
pytanie zadane 17 grudnia 2022 w C i C++ przez Stahious Nowicjusz (150 p.)
0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 30 grudnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

92,580 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...