C++ Przesunięcie o 2 w lewo elementów tablicy


(Bartolini234) #1

Cześć, mam pewien problem. Uczę się C++ i mam teraz przesunąć elementy tablicy o 2 w lewo, czyli drugi na zerowe, pierwszy na przedostatnie, trzeci na pierwsze).


(Grzelix) #2

weź ołówek i kartkę i od razu będziesz wiedział jak to zrobić.

 

Pseudokod:

a1 = tab[0];
a2 = tab[1];

for(i=2; i< tab.len; i++){
tab[i-2] = tab[i]
}

tab[tab.len-2] = a1;
tab[tab.len-1] = a2;

w skrócie: zapamiętaj 2 pierwsze wartości, potem w pętli przepisz wartości przesuwając index o 2, zapisz na końcu zapamiętane na początku wartości.


(Bartolini234) #3

Mam coś takiego teraz:

#include iostream
#include cstdlib
#include time.h
 
using namespace std;
 
int main() 
{
	int n=50;
    int Tab[n];
    int losowa_liczba = 0;
 
    srand(time(NULL));
 
    for(int i = 0, j = 0; i50; i++, j++)
	 {
        losowa_liczba = rand() % 41 - 20;
        Tab[i] = losowa_liczba;
 
        cout Tab[i] " ";
        if(j==10)
		 {
            cout endl;
            j=0;
        }
    }
    {
    
        cout"\n\n To jest pierwotna tablica.\n\n";
	} 
int a1=Tab[0];
int a2=Tab[1];
for(int i=2, j=0; i50; i++, j++)
{
	Tab[i-2]=Tab[i];
	Tab[48]=a1;
	Tab[49]=a2;
	cout Tab[i] " ";
	if(j==10)
	{
	cout endl;
	j=0;
	}
}
cout"\n\n To jest tablica po przesunieciu.";
return 0;
	}

Już prawie działa, ale nie do końca. Co jest źle? Zauważyłem, że wartości czasem pojawiają się z “powietrza”.


(Grzelix) #4

Zamiast losować liczby wpisz kolejne, to będziesz wiedział czy algorytm masz poprawny.

 

  1. Nie dopisujesz liczb a1, a2.

  2. W tablicy po przesunięciu wypisujesz starą tablicę.

 

Nie rób wszystkiego naraz. Użyj metod. Zrób mniejszy problem (np 4 elementową tablicę) dla testów,


(Bartolini234) #5

Nie da rady. W zadaniu jest podane, by wylosować :confused:

To rada czy uwaga do kodu? Nie znam się na programowaniu, uczę się bo muszę ale nie potrafię się w tym dobrze zorientować. 


(LoS) #6

Uwaga do kodu.

Rozdziel sobie pętle na losująca i wpisującą wartosći do tablicy , wypisującą tablicę przez zmianą, zmnienijącą o przesuniecię i wypisującą tak żeby były 4 pętle. U Ciebie druga pętla ma za dużo rzeczy w sobie i jest bląd dlatego lepiej na początek sobie je rozdzielić. Jak juz znasz fukcje/metody to wtedy napisz sobie taką funkcję metodoę odpowidzialną za wyświetlanie tablicy(jesli nie rozpsiz sobie wszystko na 4 pętle).

 

Bląd masz w tej pętli:

Tab[i-2]=Tab[i];
    Tab[48]=a1;
    Tab[49]=a2;
    cout<< Tab[i] << " ";

Wyświetlasz tab a zmieniasz tab[i-2] czyli nie wyświetlasz zmian.

Jak rozbijesz na pętle wyświetlającą póżniej całośc tablicy od tab[0] będzie dobrze.

Czyli:

for(int i=2; i<50; i++)
{
    Tab[i-2]=Tab[i];
}
Tab[48]=a1;
Tab[49]=a2;

for(int i = 0, j = 0; i<50; i++, j++)
     {
        cout << Tab[i] << " ";
         if(j==10)
         {
          cout << endl;
           j=0;
         }
     }

(Bartolini234) #7

Dzięki za pomoc Panowie, działa  :-D 

Tab[48]=a1;
   Tab[49]=a2;