Free Pascal Zamienianie wartości- tablica 1-wymiarowa


(alabama1) #1

Cześć. W jaki sposób zamienić wartości tablicy w sposób:pierwsza z ostatnią, druga z przedostatnią, itd?


(Drobok) #2

Robisz for r div 2. Zamieniasz element i-ty z elementem r-i+1 (gdzie r to rozmiar tablicy), musisz dodawać 1 bo elementy są numerowane od 1, jak byś tego nie zrobił to byś zamieniał pierwszy z przedostatnim itd.


(alabama1) #3

Zaraz, zaraz. Jak to ma wyglądać?

for r dif 2? for r:=1 to 8 do r dif 2? czy jak? Bo dalszą część twojego posta rozumiem.


(Drobok) #4

for i:=1 to r div 2 do

(od 1 do połowy / ew mniejszej połowy z tablicy rób). Div to dzielenie bez reszty, nie pamiętam jak to było w pascalu, ale znak dzielenia może również zadziałać :slight_smile:


(alabama1) #5
program komorki;

uses crt;

var

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

i:integer;

begin

clrscr;

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

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

readln;

for i:=1 to (8 dif 2) do A[i[:=A[8-i+1];

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

readln;

end.

Wyskakuje błąd przy 8 dif 2. Chyba program tego nie kuma, gdy są nawiasy, to błąd brzmi, że po 8 powinien być nawias zamknięty. Jak nie ma nawiasów, to jest błąd, że po 8 powinno być do. Dla znaku dzielenia identycznie.


(Drobok) #6

DIV !, gdzie ja napisałem dif ;s

A co do znaku dzielenia, to pisz bez spacji.


(B.Andy) #7

Nie mówiąc też o:

A[i[:=

I ostatni write jest poza pętlą.


(Pablo_Wawa) #8

A ja z uporem maniaka będę forsował swoje podejście:

poczatek:=1;

koniec:=n;

while poczatek
begin

    pom:=A[poczatek];

    A[poczatek]:=A[koniec];

    A[koniec]:=pom;

    poczatek:=poczatek+1;

    koniec:=koniec-1;

end;

Podobnie jak w wątku http://forum.dobreprogramy.pl/free-pascal-wpisanie-liczb-tablicy-t518901.html zastosowałem tutaj ten sam mechanizm (a kod zrobił się krótszy). :slight_smile:


(alabama1) #9

Nie wiem, czy ja was nie rozumiem, czy wy mnie. Pablo_Wawa- zastosowałem się do twojego pomysłu:

program komorki;

uses crt;

var

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

i,poczatek,koniec,pom:integer;

begin

clrscr;

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

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

readln;

poczatek:=1;

koniec:=8;

while poczatek
begin

        pom:=A[poczatek];

        A[poczatek]:=A[koniec];

        A[koniec]:=pom;

        write(A[poczatek],',',A[koniec],',');

        poczatek:=poczatek+1;

        koniec:=koniec-1;

end;

I wyświetla mi się tak:

1,2,3,4,5,6,7,8

8,1,7,2,6,3,5,4

A chodzi mi o takie coś:

1,2,3,4,5,6,7,8

8,7,6,5,4,3,2,1- pierwsza z ostatnią, druga z przedostatnią, itd.


(Drobok) #10

Ehh, wyświetlasz w złej kolejności. Kto ci powiedział by dać tam writeln ?

Wyświetlając zamieniane elementy, zawsze będziesz wyświetlał ostatni, pierwszy, przedostatni, drugi itd

Wyświetlaj poza pętlą zamieniającą i będzie ok.


(alabama1) #11

Zaraz to zrobię, tylko dla porządku- w moim kodzie nie widzę żadnego writeln.


(Drobok) #12

Ach, przyzwyczajenie. Chodzi o write.


(alabama1) #13

■■■■■■■, zaraz mi głowa pęknie. Jak dać write poza pętlą? Przecież tak, to tylko mi się raz wyświetli. Dać to do nowej pętli? I co ma być w tym write?


(Rolek0) #14

@alabama1 Rozumiesz w ogóle kod, który piszesz?


(alabama1) #15

Myślę, że rozumiem. Najpierw przyporządkowuję wartościom ich indeksy, a potem to tak przez mgłę, bo niedawno poznałem zmienną tymczasową. Najpierw przyporządkowuję elementowi i element ostatni, zwiększam indeks początkowy o 1 w górę, końcowy o 1 w dół. Teraz jak to wypisać? Gdybym wszystko wiedział co i jak, to by problemu nie było.

Coś zmieniłem w kodzie, ale dalej źle pokazuje:

1,2,3,4,5,6,7,8

8,7,6,5,1,2,3,4

Do połowy tablicy działa dobrze, wtedy się kończy, bo poczatek zrównał się z koniec.

program komorki;

uses crt;

var

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

i,poczatek,koniec,pom:integer;

begin

clrscr;

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

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

readln;

poczatek:=1;

koniec:=8;

while poczatek
begin

        pom:=A[poczatek];

        A[poczatek]:=A[koniec];

        A[koniec]:=pom;

        poczatek:=poczatek+1;

        koniec:=koniec-1;

end;

poczatek:=1;

koniec:=8;

while poczatek
begin

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

poczatek:=poczatek+1;

koniec:=koniec-1;

end;

poczatek:=1;

koniec:=8;

while poczatek
begin

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

poczatek:=poczatek+1;

koniec:=koniec-1;

end;

readln;

end.

Ktoś mi doradzi? Ok, jakoś już to zrozumiałem, ale będę musiał teraz dobrze to przestudiować, by do końca zrozumieć.

program komorki;

uses crt;

var

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

i,poczatek,koniec,pom:integer;

begin

clrscr;

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

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

readln;

poczatek:=1;

koniec:=8;

while poczatek
begin

        pom:=A[poczatek];

        A[poczatek]:=A[koniec];

        A[koniec]:=pom;

        poczatek:=poczatek+1;

        koniec:=koniec-1;

end;

poczatek:=1;

koniec:=8;

while poczatek
begin

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

poczatek:=poczatek+1;

end;

readln;

end.

(Pablo_Wawa) #16

A czemu tak to komplikujesz? Używaj normalnego kodu wyświetlającego zawartość tablicy, poniżej całość kodu:

program komorki;

uses crt;

var

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

i,poczatek,koniec,pom:integer;

begin

clrscr;


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

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

readln;


poczatek:=1;

koniec:=8;

while poczatek
begin

        pom:=A[poczatek];

        A[poczatek]:=A[koniec];

        A[koniec]:=pom;

        poczatek:=poczatek+1;

        koniec:=koniec-1;

end;


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

readln;

end.

(Rolek0) #17

A ja mam poważne wątpliwości.

Po początkowym wypełnieniu tablicy, wypisujesz jej zawartość.

Odwaracasz kolejność wartości w tablicy i… nie wiesz jak wypisać jej zawartość???

Proponuję wziąć kartkę i ołówek i ręcznie wykonywać program zapisując kolejne wartości zmiennych.


(alabama1) #18

Dzięki. Nie byłem pewny, czy dla elementu i w końcu jest przyporządkowywana wartość początkowa, czy końcowa.