Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ сравнение строк

Автор: troublesome 10.03.2010 15:25

Здравствуйте!
Очень срочно нужна ваша помощь. Дан двумерный массив [1..m,1..n]. Нужно сравнить строки так: 1 со всеми, 2 со всеми и т.д. и для каждого написать число не совпадений. У меня все идеи не удались. Получается ОЧЕНЬ громоздко. Если будут хоть какие-то идеи, буду благодарна.

Автор: volvo 10.03.2010 16:39

Цитата
У меня все идеи не удались. Получается ОЧЕНЬ громоздко.
Я не вижу, КАК именно у тебя получается. Где твое решение? Что именно для тебя - "громоздко"?

Автор: troublesome 10.03.2010 17:01

моя идея была в том, что бы тупо каждый раз запускать цикл for и проверять все по отдельности a[i,j]=a[i+1,j] и т.д. Но это же глупость!!! я начинающий и мне кажется, что я просто чего-то не знаю, что могло бы мне помочь при решении этой проблемы. поэтому и написала, что нужна идея,а не код. Помогите, если знаете, как делать.

Автор: volvo 10.03.2010 17:55

Понимаешь, в чем дело... Ты не дала достаточно информации, чтобы можно было помочь тебе в решении этой задачи. На данный момент - вопросов больше, чем ответов: Можно ли использовать дополнительную память? Обязана ли исходная матрица остаться неизменной, или она может измениться? Можно ли пользоваться подпрограммами?

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

А вообще, неплохо было бы знать конечную цель всех этих махинаций с подсчетами, а то очень напоминает http://gunsmoker.blogspot.com/2008/10/x-y-z.html - задача может решаться совсем не так, как ты это себе представляешь...

Автор: troublesome 10.03.2010 18:11

Можно ли использовать дополнительную память?(если необходимо, то можно)
Обязана ли исходная матрица остаться неизменной, или она может измениться?(изменяться она не должна. если отличий 2-х строк только 1, то в новую матрицу записывается 1 строка-копия тех, которые сравнивали, но на месте отличия пишется любой другой знак)т.е было 23456 и 23457==>23450. в итоге получается новая матрица с нулями на тех местах, где 1 отличий.
Можно ли пользоваться подпрограммами?(да)

еще ужаснее это то, что с новой матрицей происходит тоже самое. и это все до тех пор, пока не останется матрица со строками, которые имеют больше чем 1 отличий.


Добавлено через 11 мин.
а нужна мне старая матрица для того, что бы:
старая матрица
0001
0010
0011
1001
1010
1011
новая
2021
2012(на месте двоек отличия) их 2 потому что сравнивали строки несколько раз.
и получается
101101
011011(матрица покрытия)1-если строка новой матрицы входит в строку старой. 0-наоборот.

вот для этого мне и надо понять, как сравнивать строки.

Автор: troublesome 12.03.2010 3:12

Всем еще раз привет.



readln(k);
n:=round(exp(ln(2)*k));
k:=k+1;
for i:=1 to n do
begin
for j:=1 to k do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln;
end;
m:=0;
for i:=1 to n do begin
if a[i,k]=1 then m:=m+a[i,k];
end;
for i:=1 to n do
if a[i,k]=1 then
begin
for r:=1 to m do
for j:=1 to k do
g[r,j]:=a[i,j];
end;

for r:=1 to m do
begin
for j:=1 to k do
begin
write('g[',r,',',j,']=',g[r,j]);
end;
writeln;
end;
end.



тут вот что происходит. пользователь вводит кл-во переменных, программа создает матрицу(таблицу истинности+еще один столбик для значения F).
....... F
000 1
001 0
010 0 и т.д.
Далее программа отыскивает к-во строк, у которых F=1. за счет этого появляется информ. о к-ве строк в новой матрице, которая будет состоять только из тех строк, в которых F=1.
Проблема в том, что у меня выводится матрица, в которой все строки состоят из последней строки 1-й матрицы(где F=1). Пробовала найти ошибку в Pascal ABC, но тщетно.

Автор: volvo 13.03.2010 22:09

Цитата
тут вот что происходит
Тут происходит совсем не то, что ты написала (либо опять что-то недоговаривается). То, что описано постом выше - делается так:
const
max_vars = 5;

var
k, n, i, j: integer;
T, equalOne: integer;

a: array[1 .. 1 shl max_vars, 1 .. max_vars + 1] of integer;

begin
repeat
readln(k);
if k > max_vars then writeln('неверное значение. Попробуйте еще раз');
until k <= max_vars;

n := 1 shl k;
for i := 1 to n do
begin
T := i - 1;
for j := k downto 1 do
begin
a[i, j] := T mod 2;
T := T div 2;

// Здесь можно устанавливать и значения F для строки №i:
a[i, k + 1] := i mod 2; // я просто установил F как признак нечетности строки...
end;
end;

equalOne := 0;
// собственно вывод таблицы истинности:
for i := 1 to n do
begin
for j := 1 to k do
write(a[i, j]:2);
write(a[i, k+1]:4); // Выводим F
if a[i, k+1] = 1 then inc(equalOne);
writeln;
end;

writeln('единичных значений F - ', equalOne, ' шт.');
end.
В результате имеем:
Прикрепленное изображение

Где тут нужно сравнение строк друг с другом? Я просил привести задание ПОЛНОСТЬЮ, кстати, а не кусками... Необходимо знать КОНЕЧНУЮ цель, что ты дальше будешь делать с теми строками, в которых F = 1 ???