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;
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)
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?
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.
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.
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ś
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.
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?