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

Przesuwanie indeksu tablicy

VPS Starter Arubacloud
0 głosów
1,274 wizyt
pytanie zadane 12 października 2015 w C i C++ przez Armando Obywatel (1,870 p.)

Cześć! Mój program ma za zadanie przesuwać indeksy tablicy o 5 w prawo po wygenerowaniu wcześniej liczb (pseudo)losowych. Gdy wykonam ową funkcję do przesunięcia to liczby zmieniają się i zaczynają powtarzać. Gdzie tkwi błąd ? Z góry dziękuję :)

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

void generuj_liczby(int b[],int k)
{
	int i;
	system("CLS");
	srand(time(NULL));
	for (i=0;i<k;i++)
	{
		b[i]=rand()%601-300;
		cout<<b[i]<<endl;
	}
	return;
}

void wyswietl_liczby(int b[],int k)
{
	int i;
	system("CLS");
	cout<<"Oto liczby zapisane w tablicy:\n\n";
	for (i=0;i<k;i++)
	{
		cout<<b[i]<<" ";
	}
	return;
}

void przesun5p(int b[],int k)
{
	int i,pom[5];
	for(i=0;i<5;i++)
        pom[i]=b[k-5+i];
	for (i=k-6;i>-1;i--)
        b[i+5]=b[i];
    for(i=0;i<5;i++)
        pom[i]=b[i];
	return;
}

int il_uj(int b[], int k)
{
	int i,ilu;
	ilu=0;
	for(i=0;i<k;++i)
	{
		if(b[i]<0) ilu++;
	}
	return ilu;
}



int main()
{
	char w;
	int a[5000];
	int n,uj;
	float Sr;
	cout<<"\nWybierz ilosc liczb : ";
		cin>>n;
	do
	{
		system("CLS");
		cout<<"Wybierz co chcesz zrobic:";
		cout<<"\n1. Generowanie liczb - 1";
		cout<<"\n2. Wyswietlenie liczb z tablicy - 2";
		cout<<"\n3. Przesuniecie o 5 w prawo - 3";
		cout<<"\n4. Ilosc liczb ujemnych - 4";
		cout<<"\n5. Koniec - 5\n";
		cin>>w;
		switch (w)
		{
			case '1' : generuj_liczby(a,n); break;
			case '2' : wyswietl_liczby(a,n); break;
			case '3' : przesun5p(a,n); break;
			case '4' : uj=il_uj(a,n);
			cout<<"Ilosc liczb ujemnych w tablicy: "<<uj;break;
		}
		cout<<"\n";
		system("PAUSE");
	} while (w!='5');
	return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 12 października 2015 przez niezalogowany
wybrane 12 października 2015 przez Armando
 
Najlepsza
Po co ci 3 pętle for w funkcji do przesuwania?
komentarz 12 października 2015 przez Armando Obywatel (1,870 p.)
Według mojego nauczyciela informatyki tak powinien wyglądać zapis, sam jestem dopiero na etapie zrozumienia tej funkcji i również mnie to ciekawi. Jeśli można to jak powinien wyglądać krótszy zapis ?
komentarz 12 października 2015 przez Armando Obywatel (1,870 p.)

Znalazłem problem! Polegał on na tym, że ostatnia instrukcja w funkcji powinna być odwrotnie zapisana, a mianowicie tak: 

void przesun5p(int b[],int k)
{
    int i,pom[5];
    for(i=0;i<5;i++)
        pom[i]=b[k-5+i];
    for (i=k-6;i>-1;i--)
        b[i+5]=b[i];
    for(i=0;i<5;i++)
        b[i]=pom[i];
    return;
}

 

komentarz 12 października 2015 przez niezalogowany

Dzięki, że się przypomniałeś, byłem na zajęciach i zapomniałem.

Całość przypomina nieco przesuwanie bitów, więc wystarczy pętla w której zrobimy n - k kroków, gdzie n - rozmiar tablicy, k - ilość miejsc o jaką mamy przesunąć elementy

#include <iostream>
#include <algorithm>

using namespace std;


void bitwiseR(int t[], int size, int bitwise)
{
	// wyliczamy ile kroków potrzeba na przesunięcie całej tablicy
	int n = size - bitwise;

	for (int i = 0; i < n; i++)
	{
		int next = (i + bitwise) % size; // <- niezbyt wydajne (modulo), ale wciąż lepiej niż 3 pętle
		swap(t[i], t[next]); // <- zamiana obiektów
	}
}

int main()
{
	const int size = 6;
	int t[size] = { 1, 2, 3, 4, 5, 6 };

	bitwiseR(t, size, 5);
	for (int i = 0; i < size; i++)
		cout << t[i] << " ";

	cout << "\n";
	cin.get();
}

 

komentarz 13 października 2015 przez niezalogowany
Zapomniałem wspomnieć, że ta implementacja jest jedynie do przesuwania obiektów w prawo, jeżeli będziesz chciał przesunąć obiekty w lewo to musisz napisać podobną, ale nieco inną implementację

Podobne pytania

+1 głos
1 odpowiedź 533 wizyt
0 głosów
1 odpowiedź 870 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez NyguseK Użytkownik (650 p.)
+1 głos
1 odpowiedź 380 wizyt
pytanie zadane 24 września 2016 w C i C++ przez Prime_Bull Obywatel (1,820 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...