IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> как удалить строку из массива?
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Женский
Реальное имя: Натали

Репутация: -  1  +


Дана матрица А порядка н. Удалить строки содержащие нулевые элементы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Удалил.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Женский
Реальное имя: Натали

Репутация: -  1  +


Цитата(-TarasBer- @ 12.01.2011 21:41) *

Удалил.


как удалил??
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ну алгоритм применил.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Женский
Реальное имя: Натали

Репутация: -  1  +


а поделиться? целый день бьюсь над этой задачей..((
я уже поняла, что если матрица не динамическая, то из нее в принципе ничего удалить нельзя. Можно сделать какие-то махинации с переносом строк - на одну выше, или можно пропустить при выводе, но как это сделать правильно? у меня какой-то бред получается( даже стыдно код показывать)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> даже стыдно код показывать

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

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

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

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Женский
Реальное имя: Натали

Репутация: -  1  +


как-то всё сложно)) а попроще нельзя никак?

Сообщение отредактировано: klik1602 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Код

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

Вывести на экран первые j строк матрицы.
    


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Женский
Реальное имя: Натали

Репутация: -  1  +


я по-другому сделала)) наконец-то заработало!!)))

 
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.



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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.

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

Впрочем, раз работает, то препода это устроит.
Когда сдашь задачу преподу, напишу, как бы делал я.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Женский
Реальное имя: Натали

Репутация: -  1  +


спасибо за комментарии, как сдам лабу, отпишусь)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.05.2024 6:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name