Free Pascal-Tablica 1-wymiar-zamienianie sąsiednich wartości


(alabama1) #1

Witam. Czy możecie mi podać sposób, w jaki zamienia się wartości w tablicy jednowymiarowej? Chodzi o to, że jak na przykład mam 5 elementów, to żeby wartość pierwszego elementu przyjęła wartość drugiego elementu, wartość drugiego elementu przyjęła wartość pierwszego, wartość trzeciego przyjęła wartość czwartego elementu i wartość czwartego elementu przyjęła wartość trzeciego elementu.


(Drobok) #2

Trzeba użyć zmiennej tymczasowej. W twoim wypadku wystarczy 1element tablicy zapisać do zmiennej, wszystko przesunąć 1element wstecz, po czym do ostatniego elementu zapisać (lub nie, bo takowej informacji w twoim poście brak) zmienną z indeksu 1.

Np:

tmp:=t[1];

for i:=2 to 5 do

  t[i-1]=t[i];

t[5]:=tmp;

(alabama1) #3

Dzięki, ale czy na pewno dobry kod?

program komorki;

uses crt;

var

A:ARRAY[1..6] of integer;

i,pom:integer;

begin

clrscr;

for i:=1 to 6 do A[i]:=i;

for i:=1 to 6 do write(A[i],',');

readln;

pom:=A[1];

for i:=2 to 6 do

A[i-1]:=A[i];

A[6]:=pom;

write(A[i-1],' ');

readln;

end.

Chcę, żeby pierwsza wartość zamieniła się z drugą, trzecia z czwartą, a piąta z szóstą. Tak nie jest.


(Drobok) #4

Rzeczywiście nie, opacznie zrozumiałem :slight_smile: (myślałem że chcesz przesunąć wszystko o 1 do początku)

i:=1;

repeat

  pom:=A[i];

  A[i]:=A[i+1];

  A[i+1]:=pom;

  i:=i+2;

until i=6

Zwiększasz co 2 (więc nie używasz for), zamieniasz jak w poprzednim zamyśle następny z obecnym.


(alabama1) #5

Ok, a teraz, jak chcę to wyświetlić, to gdzie mam dać write- w pętli, czy poza nią i co ma być napisane-pom czy A_?_


(Pablo_Wawa) #6

Widzę po liczbie zakładanych wątków, że brakuje Ci podstaw algorytmicznych. Sugeruję zapoznanie się z tym tematem - książki lub coś w internecie, np.:

http://www.algorytm.org/

http://open.agh.edu.pl/mod/resource/view.php?id=839


(alabama1) #7

Już doszedłem do ładu- tylko nie until i=6 tylko i=7 :smiley:

program komorki;

uses crt;

var

A:ARRAY[1..6] of integer;

i,pom:integer;

begin

clrscr;

for i:=1 to 6 do A[i]:=i;

for i:=1 to 6 do write(A[i],',');

readln;

i:=1;

repeat

pom:=A[i];

A[i]:=A[i+1];

A[i+1]:=pom;

write(A[i],',');

write(pom,',');

i:=i+2;

until i=7;

readln;

end.

Teraz jest cacy.

Na pewno mi brakuje podstaw, bo straciłem prawie całą drugą klasę liceum- nauczyciel był taki, że max. co 5 lekcji mieliśmy normalną lekcję, a tak, to pozwalał nam robić, co chcemy. Teraz jestem w 3. klasie, zdaję maturę i sobie myślę, że ciężko będzie przyswoić sobie algorytmikę. Bo w Pascalu podstawy i trochę więcej znam.


(Pablo_Wawa) #8

Zamiast

until i=7;

lepiej używać konstrukcji

until i>6;

bo jeśli zmienisz krok iteracji (teraz 2), to znów nie "trafisz" w koniec zakresu, a taka nierówność jest bezpieczna.

Myślę, że nauka (przedmiotów) w szkole to jedno, a zajęcia dodatkowe (w domu) to drugie. Jeśli to jest potrzebne tylko do szkoły, to się nie czepiam, ale jeśli planujesz coś więcej programować, to warto nieco przysiąść nad podstawami.