Pascal, usuwanie wiersza i kolumny macierzy


(Wolin91) #1

Witam, mam do zrobienia zadanie z programowania w Pascalu. Polecenie brzmi następująco: Dana jest macierz liczb rzeczywistych wymiaru n oraz naturalne liczby i,j, (1<=i, j<=n). Z macierzy usunąć i-ty wiersz i j-tą kolumnę. Jak na razie stworzyłem kod do momentu generowania tablicy i mam problem z konkretnym algorytmem usuwania wiersza i kolumny. Chodzi o to aby dany wiersz/kolumnę przesunąć na miejsce poprzedniego/niej.

 

Kod:

program projekt;

const nm=50;

type tab1:array[1..nm, 1..nm] of real;

var n:integer;
      a:tab1;

procedure gentab(n:integer; var x:tab1;)

var i,j:integer;

begin
randomize;
for i:=1 to n do
begin
writeln;
for j:=1 to n do
begin
x[i,j]:=random;
write(x[i,j]:6:2);
end;
end;
end;

Z góry dziękuję za pomoc!


(Drobok) #2

usuwany = obecny

dopuki obecny < ostatni, jeśli następny istnieje to przesuń następny na miejsce obecnego


(pocolog) #3

Faktycznie usunąć możesz jedynie stosując tablicę dynamiczną. W tablicy statycznej możesz ew. wyzerować wartości ostatniego ‘wiersza’ po wcześniejszym przekopiowaniu kolejnych wpisów na poprzednie miejsce.

for licznik:=nr_do_usuniecia to lenght(tablica)-1 do tablica(licznik):=tablica(licznik+1)

(Wolin91) #4

czyli lepiej zrobić tablicę dynamiczną tj.

program projekt1;

uses CRT;

var
tab1 : array of real;
n, i : Integer;
begin

Randomize;


SetLength(Tablica, n);


for i := 0 to n-1 do
begin
Tablica[i] := Random(100);
Write(Tablica[i],' ');
end;

Nie robiłem zadań na przykładach tablic dynamicznych z definiowaniem setlength więc sory, że tak pytam. Jakaś podpowiedź co dalej?


(pocolog) #5

Podałem ci kod jak przesunąć wszystkie wpisy o jedno miejsce w dół poczynając od pozycji do usunięcia. Po zastosowaniu tego kodu pozostaną ci na końcu tablicy dwa identyczne wpisy. Wystarczy teraz skrócić tablice o ostatni wpis czyli

setlength(tablica, length(tablica)-1)

i masz tablice z usuniętym dowolnym wpisem

 

W twoim kodzie deklarujesz tablice

SetLength(Tablica, n);

bez podania wartości dla “n”, czyli definiujesz tablice o zerowej długości.


(Drobok) #6

W wypadku gdy zmienisz tablicę nadmiarową na dynamiczną musisz usunąć ostatni element tablicy (oczywiście stosujac podany wyżej algorytm)

przykład masz tutaj http://www.freepascal.org/docs-html/ref/refsu18.html

Mając 2wymiary podajesz argumenty SetLength(arr, nX, nY);


(Wolin91) #7

Proszę o zerknięcie i ewentualne naprostowanie co należy zmienić.

program projekt2;

type tablica = array of array of real;

var A:tablica;
    i,j,w,k:integer;
    

begin

randomize;

setlength (A, 10, 10);

for i:=0 to 9 do

begin

writeln;

for j:=0 to 9 do

begin

A[i,j]:=random;

write(A[i,j]:6:2);

end;
end;
end;

begin

writeln ('ktory wiersz chcesz usunac?');

readln (w);

writeln ('ktora kolumne chcesz usunac?');

readln (k);

begin

for i:=w to lenght(A)-1 do A(i):=A(i+1)

for j:=k to lenght(A)-1 do A(i):=A(j+1)

end;

begin

setlength(A, length(A)-1);

write(A[i,j]:6:2);

readln;

end;
end;
end.

(pocolog) #8

Używaj znacznika <code> bo ciężko się to czyta. Zbyt często niepotrzebnie zamykasz części kodu w bloki begin end. Na końcu przy skracaniu tablicy musisz podać 3 wartości czyli nazwę tablicy, długość pierwszego oraz drugiego wymiaru - u ciebie jest podany tylko jeden wymiar i program nie będzie wiedział o który ci chodzi.

Co chciałeś zrobić tym poleceniem “write(A[i,j]:6:2);” bo domyślam się że wyświetlić całą skróconą tablicę, w takim wypadku musisz zastosować kolejną pętlę for która przeleci całą tablicę od początku do końca wyświetlając kolejno jej elementy.

 

Tak lepiej widać co tam stworzyłeś :wink:

program projekt2;
type tablica = array of real;
var A:tablica;
  i,j,w,k:integer;
begin
  randomize;
  setlength (A, 10, 10);
  for i:=0 to 9 do
  begin
    writeln;
    for j:=0 to 9 do
    begin
      A[i,j]:=random;
      write(A[i,j]:6:2);
    end;
  end;
end;
begin
  writeln ('ktory wiersz chcesz usunac?');
  readln (w);
  writeln ('ktora kolumne chcesz usunac?');
  readln (k);
begin
  for i:=w to lenght(A)-1 do A(i):=A(i+1)
    for j:=k to lenght(A)-1 do A(i):=A(j+1)
end;
begin
  setlength(A, length(A)-1);
  write(A[i,j]:6:2);
  readln;
end.

(Wolin91) #9

W linijce    for i:=w to length(A)-1 do A(i):=A(i+1)   wywala błąd 'illegal expression oraz   project1.lpr(23,31) Fatal: Syntax error, “;” expected but “(” found. Jakieś pomysły?


(pocolog) #10

Uzupełnij znaki “;” na końcach poleceń