Помощь - Поиск - Пользователи - Календарь
Полная версия: сравнение строк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
troublesome
Здравствуйте!
Очень срочно нужна ваша помощь. Дан двумерный массив [1..m,1..n]. Нужно сравнить строки так: 1 со всеми, 2 со всеми и т.д. и для каждого написать число не совпадений. У меня все идеи не удались. Получается ОЧЕНЬ громоздко. Если будут хоть какие-то идеи, буду благодарна.
volvo
Цитата
У меня все идеи не удались. Получается ОЧЕНЬ громоздко.
Я не вижу, КАК именно у тебя получается. Где твое решение? Что именно для тебя - "громоздко"?
troublesome
моя идея была в том, что бы тупо каждый раз запускать цикл for и проверять все по отдельности a[i,j]=a[i+1,j] и т.д. Но это же глупость!!! я начинающий и мне кажется, что я просто чего-то не знаю, что могло бы мне помочь при решении этой проблемы. поэтому и написала, что нужна идея,а не код. Помогите, если знаете, как делать.
volvo
Понимаешь, в чем дело... Ты не дала достаточно информации, чтобы можно было помочь тебе в решении этой задачи. На данный момент - вопросов больше, чем ответов: Можно ли использовать дополнительную память? Обязана ли исходная матрица остаться неизменной, или она может измениться? Можно ли пользоваться подпрограммами?

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

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

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


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

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


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
Цитата
тут вот что происходит
Тут происходит совсем не то, что ты написала (либо опять что-то недоговаривается). То, что описано постом выше - делается так:
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 ???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.