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

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

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

 
 Ответить  Открыть новую тему 
> Удаление повторяющихся строк матрицы, Удаление всей строки. которая повторяется и сжатие матрицы.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской
Реальное имя: Вася

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


Доброго времени суток, уважаемые форумчане.

Задача.
В матрице mxn есть столбец (скажем первый), где элементы повторяются нужно удалить повторяющиеся строки.
Ввод - вывод в файл. Кажется я запутася в циклах.
Вот что у меня получилось.

Если у Вас будет время, пожалуйста, помогите найти ошибку.


Код

Program date_term;
const
   e=5; g=3;

Type
   mas=array[1..e,1..g] of integer;

var
  X,Y:mas;
  k,i,j,n,m:integer;
  f:text; name,name1:string [10];


BEGIN

   writeln ('Write name data file');
   readln(name);
   assign(f,name); reset(f);

for i:=1 to n do
for j:=1 to m do
  read(f,X[i,j]);
  readln(f);
  close(f);

  writeln ('Write 2 name output file');
  readln(name1);
  assign(f,name1); rewrite(f);

writeln ('matr X');
for i:=1 to n do begin
for j:=1 to m do
write (X[i,j]:3);
writeln;

  i:=1;
  while ( i<=n ) do

{Esli o4erednoi element massiva X[i] raven posledyysemy, to}
if X[i,j]=X[i+1,j] then
begin
  {delete element massiva s nomerom i}
      for k:=i+1 to n+1 do
          Y[i,j]:=X[i,j+1]; {Ymensaem razmer massiva}
   n:=n-1
end
  else i:=i+1;

writeln ('Izmenenniy matr Y');
   for i:=1 to n do begin
   for j:=1 to m do
        write(f,Y[i,j]:3);
        writeln(f);
                end;
                end;
                close(f);
END.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


Если строка плохая, то вы в Y копируете весь хвост X, а если строка хорошая, то в Y ничего не пишется, это ошибка.


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


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской
Реальное имя: Вася

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


Подскажите, где она, эта ошибка? Что исправить?

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


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

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

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


Ошибка примерно тут:
{Esli o4erednoi element massiva X[i] raven posledyysemy, to}
if X[i,j]=X[i+1,j] then
begin
{delete element massiva s nomerom i}
for k:=i+1 to n+1 do
Y[i,j]:=X[i,j+1]; {Ymensaem razmer massiva}
n:=n-1
end
else i:=i+1;

Исправить надо этот участок кода на правильный.
Может это пригодится: Многократное удаление символов из строки


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


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской
Реальное имя: Вася

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


Я немного упростил код, но все равно ничего не пойму.
Я постоянно путаюсь в индексах.
Логически все понятно: если 1-й элемент в 1-й строке не равен 2-му в 1-й строке, тогда
запишем его в новую матрицу под тем же номером(а следовательно и всю строку с ним), если нет, то проигнорируем (а следовательно всю эту строку выкинем из матрицы).
Но в итоге ничего не работает.
Помогите пожалуйста.
Вот новый код.


Program date_term;
const
e=5; g=3;

Type
mas=array[1..e,1..g] of integer;

var
X,Y:mas;
k,i,j,n,m:integer;
f:text; name,name1:string [10];


BEGIN

writeln ('Write name data file');
readln(name);
assign(f,name); reset(f);

for i:=1 to n do
for j:=1 to m do
read(f,X[i,j]);
readln(f);
close(f);

writeln ('Write 2 name output file');
readln(name1);
assign(f,name1); rewrite(f);


For i:=1 to n do
if X[i,j]<>X[i+1,j] then
begin
for i:=1 to n do begin
for j:=1 to m do
Y[i,j]:=X[i,j];
end;
end;
writeln (f,'New matrisa Y');
for i:=1 to n do begin
for j:=1 to m do
write(f,Y[i,j]:3);
writeln(f);
end;
close(f);
END.





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


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

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

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


Так ты же в коде ничего не поменял, только n:=n-1 убрал.
Давай как в статье, напиши функцию Good (i) (проверка строки на "хорошесть" - нужно ли её сохранять), функцию копирования одной строки...

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


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

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

 





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