Здравствуйте! Очень срочно нужна ваша помощь. Дан двумерный массив [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
Понимаешь, в чем дело... Ты не дала достаточно информации, чтобы можно было помочь тебе в решении этой задачи. На данный момент - вопросов больше, чем ответов: Можно ли использовать дополнительную память? Обязана ли исходная матрица остаться неизменной, или она может измениться? Можно ли пользоваться подпрограммами?
Если доп. память использовать можно (или не обязательно сохранять матрицу в том виде, в котором ее получила) - возьми, отсортируй ее любым методом и за один проход посчитаешь количество повторений каждого элемента, никаких вложенных циклов.
А вообще, неплохо было бы знать конечную цель всех этих махинаций с подсчетами, а то очень напоминает сагу об X, Y, Z - задача может решаться совсем не так, как ты это себе представляешь...
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:=1to n dobeginfor j:=1to k dobegin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln;
end;
m:=0;
for i:=1to n dobeginif a[i,k]=1then m:=m+a[i,k];
end;
for i:=1to n doif a[i,k]=1thenbeginfor r:=1to m dofor j:=1to k do
g[r,j]:=a[i,j];
end;
for r:=1to m dobeginfor j:=1to k dobegin
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 .. 1shl max_vars, 1 .. max_vars + 1] of integer;
beginrepeat
readln(k);
if k > max_vars then writeln('неверное значение. Попробуйте еще раз');
until k <= max_vars;
n := 1shl k;
for i := 1to n dobegin
T := i - 1;
for j := k downto1dobegin
a[i, j] := T mod2;
T := T div2;
// Здесь можно устанавливать и значения F для строки №i:
a[i, k + 1] := i mod2; // я просто установил F как признак нечетности строки...
end;
end;
equalOne := 0;
// собственно вывод таблицы истинности:
for i := 1to n dobeginfor j := 1to k do
write(a[i, j]:2);
write(a[i, k+1]:4); // Выводим F
if a[i, k+1] = 1then inc(equalOne);
writeln;
end;
writeln('единичных значений F - ', equalOne, ' шт.');
end.
Где тут нужно сравнение строк друг с другом? Я просил привести задание ПОЛНОСТЬЮ, кстати, а не кусками... Необходимо знать КОНЕЧНУЮ цель, что ты дальше будешь делать с теми строками, в которых F = 1 ???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.