Помощь - Поиск - Пользователи - Календарь
Полная версия: как удалить строку из массива?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
klik1602
Дана матрица А порядка н. Удалить строки содержащие нулевые элементы.
-TarasBer-
Удалил.
klik1602
Цитата(-TarasBer- @ 12.01.2011 21:41) *

Удалил.


как удалил??
-TarasBer-
Ну алгоритм применил.
klik1602
а поделиться? целый день бьюсь над этой задачей..((
я уже поняла, что если матрица не динамическая, то из нее в принципе ничего удалить нельзя. Можно сделать какие-то махинации с переносом строк - на одну выше, или можно пропустить при выводе, но как это сделать правильно? у меня какой-то бред получается( даже стыдно код показывать)
TarasBer
> даже стыдно код показывать

А зря. Именно поэтому я и разговариваю загадками. Тут не любят тех, кто ничего не делает и хочет, чтобы делали за него.

> я уже поняла, что если матрица не динамическая, то из нее в принципе ничего удалить нельзя. Можно сделать какие-то махинации с переносом строк - на одну выше, или можно пропустить при выводе

Для статической матрицы действительно ничего, кроме сдвига вверх, придумать невозможно. Осводобившуюся область можно занулить, можно уменьшить значение переменной vertSize (которая отвечает за кол-во выводимых и обрабатываемых строк)
А алгоритм стандартный, надо только представить матрицу как массив рядов (
type
TRow = array [0 .. N-1] of integer;
TMatrix = array [0 .. N-1] of TRow;
), также надо написать функцию, которая определяет наличие нулевого элемента в строке.
Дальше - применить алгоритм из ЧАВО, только в качестве элемента массива надо взять ряд матрицы:
Многократное удаление символов из строки
klik1602
как-то всё сложно)) а попроще нельзя никак?
TarasBer
Код

var
  A: TMatrix;
...
j := 0;
Пройти по рядам матрицы с индексом i.
  Если в ряду i все числа ненулевые, то
    если j<i то копируем ряд i в ряд j (простыи A[j] := A[i])
    увеличить j

Вывести на экран первые j строк матрицы.
    
klik1602
я по-другому сделала)) наконец-то заработало!!)))

 
uses
crt;
type
matr=array[1..10,1..10] of integer;
stroka=string[30];
vekt=array[1..9] of byte;
var
a:matr;
n,m:integer;
flag:boolean;
procedure vvodmatr (var a:matr;namefile:stroka;
var n,m:integer);
var
i,j:integer;
fin:text;
begin
assign(fin,namefile);
reset(fin);
for i:=1 to n do
begin
for j:=1 to m do
read(fin,a[i,j]);
readln(fin);
end;
close(fin);
end;

procedure vivodmatr (namefile:stroka; a:matr; n,m:integer;
var flag:boolean);
var
i,j:integer;
fout:text;

begin
assign(fout,namefile);
if flag then
rewrite(fout)
else
append(fout);
for i:=1 to n do
begin
for j:=1 to m do
write(fout,a[i,j]);
writeln(fout);
end;
close(fout);
end;

procedure delstrok (namefile:stroka; var a:matr; n,m:integer; var flag:boolean);
var
b:vekt;
i,j:integer;
f,p,k:byte;
fout:text;
begin
f:=0;
for i:=1 to n do
begin
k:=0;
for j:=1 to m do
if a[i,j]=0 then
begin
k:=1;
f:=1;
end;
b[i]:=k;
end;
if f=0 then write('V matrice net nol')
else
begin
i:=n;
while(i>=1)and(n>0) do
begin
k:=0;
j:=1;
while(j<=m)and(k=0) do
if a[i,j]=0 then k:=1
else j:=j+1;
if k=1 then
begin
f:=f-1;
if i=n then
begin
n:=n-1;
i:=i-1;
end
else
begin
for k:=i to n-1 do
for p:=1 to m do
a[k,p]:=a[k+1,p];
n:=n-1;
end;
end
else i:=i-1;
end;
end;
assign(fout,namefile);
if flag then
rewrite(fout)
else
append(fout);
for i:=1 to n do
begin
for j:=1 to m do
write(fout,a[i,j]);
writeln(fout);
end;
close(fout);

end;
Begin
clrscr;
write ('vvod poryadok matric');
readln(n);
m:=n;
vvodmatr (a,'L8_in.txt',n,m);
flag:=true;
vivodmatr ('L8_out.txt',a,n,m,flag);
flag:=false;
delstrok ('L8_out.txt',a,n,m,flag);

end.



TarasBer
1.

> for p:=1 to m do
a[k,p]:=a[k+1,p];

Если бы m совпадало с размером матрицы, то можно было бы писать просто a[k] := a[k + 1];
(для не совпадающего - тоже как бы можно, но не надо так делать)
Для динамической матрицы (массив указателей на массивы строк) через a[k] := a[k+1] было бы идеально - копируется не ряд, а только указатель.

2.

Алгоритм ужасен, для каждого удаления элемента выполняет сдвиг всей оставшейся таблицы.
Именно для этого я и написал статью в ЧАВО, чтобы так не делали.
Ужас в том, что эту ошибку делают не только новички. Часто обработчики некоторых форматов, написанные опытными людьми, тоже применяют операцию удаления и сдвига для каждого встреченного комментария.

Впрочем, раз работает, то препода это устроит.
Когда сдашь задачу преподу, напишу, как бы делал я.
klik1602
спасибо за комментарии, как сдам лабу, отпишусь)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.