Консультация № 180297
12.10.2010, 23:42
43.38 руб.
0 14 1
Добрый день, эксперты.
Помогите в написании программы на delphi.
Данные заданы в таблице

Найти сходство между объектами Х1 и Х2, Х2 и Х3, Х1 и Х3, Х4 и Х5 используя формулы

n-количество свойств.

Обсуждение

Неизвестный
14.10.2010, 11:40
общий
Плохо видны индексы. Почему-то кажется, что a =[$8721$]xtk*xjk, но тогда a - не скаляр
Напишите тут с использованием кодов, как я сделал
Неизвестный
14.10.2010, 20:05
общий
a=[$8721$]xik*xjk
В индексах ik и jk
Неизвестный
14.10.2010, 20:13
общий
Все равно получается не скаляр, а aij
давно
Академик
320937
2216
16.10.2010, 00:06
общий
Boriss:
Доброе утроСкорей всего, a, b, h, g - это функции. Например, a(1,3), то есть a(вишня, банан)
Неизвестный
16.10.2010, 14:04
общий
Но в показанных Вами формулах - a,b,g,h,n - скаляры! Спросите
давно
Академик
320937
2216
16.10.2010, 14:38
общий
Boriss:
Есть еще один вопрос, а что делать с найденными S1 и S2. Я в распознавании не силен.
Неизвестный
16.10.2010, 15:44
общий
lamed:
Подозреваю, что надо найти те S1 и S2, которые TRUE
Неизвестный
17.10.2010, 00:59
общий
Прошу прощение за невнимательность.
Формулы S1 и S2 не связаны друг с другом. Пользователь может сам выбирать по какой формуле (S1 или S2) сравнивать Х1 и Х2, Х2 и Х3, Х1 и Х3, Х4 и Х5. Т.е. нужно поставить переключать, если выбрана формула S1, то получаем одни значение, если S2 то другие.
давно
Мастер-Эксперт
425
4118
17.10.2010, 06:24
общий
Ну что, кто-нибудь возьмётся за решение задачи? Я продлил срок действия вопроса.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
320937
2216
17.10.2010, 08:08
общий
Kreaman:
Правильно ли я понял, что под сходством понимается просто значение S1 или S2?
Неизвестный
17.10.2010, 10:47
общий
Если пользователь выбрал рассчитывать сходство по формуле S1, то результат должен в таком виде:
Формула сходства S1
Х1 и Х2= ..%
Х2 и Х3= ..%
Х1 и Х3= ..%
Х4 и Х5= ..%
, где .. - число сходства.
Если выбрано S2, то соответственно также.
давно
Академик
320937
2216
17.10.2010, 13:13
общий
sir Henry:
Добрый день! Задание понятно, сделаю.
давно
Академик
320937
2216
19.10.2010, 11:01
общий
Kreaman:
Доброе утро! Выкладываю пока сюда, так как, по-моему в формулу S2 "вкралась" ошибка. Сходство между X1 и X4 составляет 200%, что подтверждается ручным счетом. Проверьте, пожалуйста.

Код:
program p180297;
// В задаче производится только проверка открытия файла-источника
// и создания файла-приемника
// По-хорошему, должна быть также проверка каждого чтения,
// каждой записи и закрытия

{$APPTYPE CONSOLE}

uses
SysUtils;

const
MaxParam = 10; // Максимальное число параметров
MaxElement = 100; // Максимальное число строк
n = 7; // Число строк (временно, для отладки)
type
TBool = 0..1;
TVector = array[1..MaxParam] of TBool;
TElement = record
name : string[20];
v : TVector;
end;
TMatrix = array[1..MaxElement] of TElement;
TParamNames = array[1..MaxParam] of string[20];
TFunc = function(xi, xj: TVector; n: integer): real;
// ---------- Functions ----------
Function a(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum :=0;
For k:= 1 to n do
sum := sum+xi[k]*xj[k];
a:=sum;
End;

Function b(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum:=0;
For k:= 1 to n do
sum := sum+(1-xi[k])*(1-xj[k]);
b:=sum;
End;

Function h(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum :=0;
For k:= 1 to n do
sum := sum+(1-xi[k])*xj[k];
h:=sum;
End;

Function g(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum :=0;
For k:= 1 to n do
sum := sum+xi[k]*(1-xj[k]);
g:=sum;
End;

Function s1(xi, xj: TVector; n: integer): real;
Begin
S1:= a(xi,xj,n)/(n-b(xi,xj,n));
End;

Function s2(xi, xj: TVector; n: integer): real;
Begin
S2:= a(xi,xj,n)/(g(xi,xj,n)+h(xi,xj,n));
End;

procedure CalcWrite(m: TMatrix; s: TFunc; params: integer; elems: integer; var f:text);
var
i, j: integer;
begin
for i:= 1 to elems-1 do
for j:= i+1 to elems do
writeln(f, 'X',i,' и X',j,'=',s(m[i].v,m[j].v,params)*100:5:2, '%');
end;

// --------------------
var
i, j: integer;
p: integer;
CalcType: integer;
str: string;
m: TMatrix;
InFile, OutFile: text;
InFileName, OutFileName: string[30];
params, elems: integer;
pNames: TParamNames;

// ---------- main ----------
begin
// Запрашиваем имена файла-источника и файла-приемника
write('Входной файл ');
readln(InFileName);

write('Выходной файл ');
readln(OutFileName);

{$I-}
AssignFile(InFile, InFileName);
reset(InFile);
{$I+}
if (IOResult <> 0) or (InFileName = '') then
begin
writeln('Файл данных не найден! Задача завершается');
readln;
halt;
end;

{$I-}
AssignFile(OutFile, OutFileName);
rewrite(OutFile);
{$I+}
if (IOResult <> 0) or (OutFileName = '') then
begin
writeln('Не могу создать выходной файл! Задача завершается');
readln;
halt;
end;

readln(InFile, str);

// Прочитали число и список параметров
params := 1;
p:= pos(';', str);
while (p>0) do
begin
pNames[params]:=copy(str,1,p-1);
delete(str,1,p);
inc(params,1);
p:= pos(';', str);
end;
pNames[params] := str;

// Прочитали число и список объектов

elems := 0;
while not eof(InFile) do
begin
inc(elems);
readln(InFile, str);
p:= pos(';', str);
m[elems].name := copy(str,1,p-1);
delete(str,1,p);

for i:= 1 to params-1 do
begin
p:= pos(';', str);
m[elems].v[i]:=StrToInt(copy(str,1,p-1));
delete(str,1,p);
end;
m[elems].v[params]:=StrToInt(str);
end;

close(InFile);

// Отпечатали список параметров
write(OutFile, 'Объект':10);
for i:= 1 to params do
write(OutFile, pNames[i]:15);
writeln(OutFile);

// Отпечатали список объектов
for i:= 1 to elems do
begin
write(OutFile, m[i].name:10);
for j:= 1 to params do
write(OutFile, m[i].v[j]:10, ' ':5);
writeln(OutFile);
end;

writeln(OutFile, 'Параметров=', params, ',объектов=', elems);

// Запрашиваем тип расчета и выполняем расчет
// Сохраняем результаты в файл-приемник
write('Выберите тип расчета (1 или 2)');
readln(CalcType);
if not (CalcType in [1..2]) then
begin
writeln('Вы выбрали неверный тип. Будет выполнен расчет по умолчанию (тип 1)');
CalcType:= 1;
end;
writeln(OutFile, 'Формула сходства S',CalcType);
case calctype of
1: CalcWrite(m, s1, params, elems, OutFile);
2: CalcWrite(m, s2, params, elems, OutFile);
else
writeln(OutFile, 'ошибка');
end;
Close(OutFile);
Writeln('Удачи!');
Readln;
end.


Входной файл
Код:
Желтый?;Красный?;Есть семечка?;Есть косточка?
Вишня;0;1;0;1
Яблоко;1;1;1;0
Банан;1;0;0;0
Слива;1;1;0;1
Груша;1;0;1;0


Примеры выходного файла
Код:
    Объект        Желтый?       Красный?  Есть семечка? Есть косточка?
Вишня 0 1 0 1
Яблоко 1 1 1 0
Банан 1 0 0 0
Слива 1 1 0 1
Груша 1 0 1 0
Параметров=4,объектов=5
Формула сходства S1
X1 и X2=25.00%
X1 и X3= 0.00%
X1 и X4=66.67%
X1 и X5= 0.00%
X2 и X3=33.33%
X2 и X4=50.00%
X2 и X5=66.67%
X3 и X4=33.33%
X3 и X5=50.00%
X4 и X5=25.00%


Код:
    Объект        Желтый?       Красный?  Есть семечка? Есть косточка?
Вишня 0 1 0 1
Яблоко 1 1 1 0
Банан 1 0 0 0
Слива 1 1 0 1
Груша 1 0 1 0
Параметров=4,объектов=5
Формула сходства S2
X1 и X2=33.33%
X1 и X3= 0.00%
X1 и X4=200.00%
X1 и X5= 0.00%
X2 и X3=50.00%
X2 и X4=100.00%
X2 и X5=200.00%
X3 и X4=50.00%
X3 и X5=100.00%
X4 и X5=33.33%


давно
Академик
320937
2216
20.10.2010, 12:31
общий
это ответ
Здравствуйте, Kreaman!
Доброе утро! Проверено Delphi 7.

Код:
program p180297;
// В задаче производится только проверка открытия файла-источника
// и создания файла-приемника
// По-хорошему, должна быть также проверка каждого чтения,
// каждой записи и закрытия

{$APPTYPE CONSOLE}

uses
SysUtils;

const
MaxParam = 10; // Максимальное число параметров
MaxElement = 100; // Максимальное число строк
n = 7; // Число строк (временно, для отладки)
type
TBool = 0..1;
TVector = array[1..MaxParam] of TBool;
TElement = record
name : string[20];
v : TVector;
end;
TMatrix = array[1..MaxElement] of TElement;
TParamNames = array[1..MaxParam] of string[20];
TFunc = function(xi, xj: TVector; n: integer): real;
// ---------- Functions ----------
Function a(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum :=0;
For k:= 1 to n do
sum := sum+xi[k]*xj[k];
a:=sum;
End;

Function b(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum:=0;
For k:= 1 to n do
sum := sum+(1-xi[k])*(1-xj[k]);
b:=sum;
End;

Function h(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum :=0;
For k:= 1 to n do
sum := sum+(1-xi[k])*xj[k];
h:=sum;
End;

Function g(xi, xj: TVector; n: integer): integer;
Var
k: integer;
Sum: integer;
Begin
sum :=0;
For k:= 1 to n do
sum := sum+xi[k]*(1-xj[k]);
g:=sum;
End;

Function s1(xi, xj: TVector; n: integer): real;
Begin
S1:= a(xi,xj,n)/(n-b(xi,xj,n));
End;

Function s2(xi, xj: TVector; n: integer): real;
Begin
S2:= a(xi,xj,n)/(g(xi,xj,n)+h(xi,xj,n));
End;

procedure CalcWrite(m: TMatrix; s: TFunc; params: integer; elems: integer; var f:text);
var
i, j: integer;
begin
for i:= 1 to elems-1 do
for j:= i+1 to elems do
writeln(f, 'X',i,' и X',j,'=',s(m[i].v,m[j].v,params)*100:5:2, '%');
end;

// --------------------
var
i, j: integer;
p: integer;
CalcType: integer;
str: string;
m: TMatrix;
InFile, OutFile: text;
InFileName, OutFileName: string[30];
params, elems: integer;
pNames: TParamNames;

// ---------- main ----------
begin
// Запрашиваем имена файла-источника и файла-приемника
write('Входной файл ');
readln(InFileName);

write('Выходной файл ');
readln(OutFileName);

{$I-}
AssignFile(InFile, InFileName);
reset(InFile);
{$I+}
if (IOResult <> 0) or (InFileName = '') then
begin
writeln('Файл данных не найден! Задача завершается');
readln;
halt;
end;

{$I-}
AssignFile(OutFile, OutFileName);
rewrite(OutFile);
{$I+}
if (IOResult <> 0) or (OutFileName = '') then
begin
writeln('Не могу создать выходной файл! Задача завершается');
readln;
halt;
end;

readln(InFile, str);

// Прочитали число и список параметров
params := 1;
p:= pos(';', str);
while (p>0) do
begin
pNames[params]:=copy(str,1,p-1);
delete(str,1,p);
inc(params,1);
p:= pos(';', str);
end;
pNames[params] := str;

// Прочитали число и список объектов

elems := 0;
while not eof(InFile) do
begin
inc(elems);
readln(InFile, str);
p:= pos(';', str);
m[elems].name := copy(str,1,p-1);
delete(str,1,p);

for i:= 1 to params-1 do
begin
p:= pos(';', str);
m[elems].v[i]:=StrToInt(copy(str,1,p-1));
delete(str,1,p);
end;
m[elems].v[params]:=StrToInt(str);
end;

close(InFile);

// Отпечатали список параметров
write(OutFile, 'Объект':10);
for i:= 1 to params do
write(OutFile, pNames[i]:15);
writeln(OutFile);

// Отпечатали список объектов
for i:= 1 to elems do
begin
write(OutFile, m[i].name:10);
for j:= 1 to params do
write(OutFile, m[i].v[j]:10, ' ':5);
writeln(OutFile);
end;

writeln(OutFile, 'Параметров=', params, ',объектов=', elems);

// Запрашиваем тип расчета и выполняем расчет
// Сохраняем результаты в файл-приемник
write('Выберите тип расчета (1 или 2)');
readln(CalcType);
if not (CalcType in [1..2]) then
begin
writeln('Вы выбрали неверный тип. Будет выполнен расчет по умолчанию (тип 1)');
CalcType:= 1;
end;
writeln(OutFile, 'Формула сходства S',CalcType);
case calctype of
1: CalcWrite(m, s1, params, elems, OutFile);
2: CalcWrite(m, s2, params, elems, OutFile);
else
writeln(OutFile, 'ошибка');
end;
Close(OutFile);
Writeln('Удачи!');
Readln;
end.


Входной файл
Код:
Желтый?;Красный?;Есть семечка?;Есть косточка?
Вишня;0;1;0;1
Яблоко;1;1;1;0
Банан;1;0;0;0
Слива;1;1;0;1
Груша;1;0;1;0


Примеры выходного файла
Код:
    Объект        Желтый?       Красный?  Есть семечка? Есть косточка?
Вишня 0 1 0 1
Яблоко 1 1 1 0
Банан 1 0 0 0
Слива 1 1 0 1
Груша 1 0 1 0
Параметров=4,объектов=5
Формула сходства S1
X1 и X2=25.00%
X1 и X3= 0.00%
X1 и X4=66.67%
X1 и X5= 0.00%
X2 и X3=33.33%
X2 и X4=50.00%
X2 и X5=66.67%
X3 и X4=33.33%
X3 и X5=50.00%
X4 и X5=25.00%


Код:
    Объект        Желтый?       Красный?  Есть семечка? Есть косточка?
Вишня 0 1 0 1
Яблоко 1 1 1 0
Банан 1 0 0 0
Слива 1 1 0 1
Груша 1 0 1 0
Параметров=4,объектов=5
Формула сходства S2
X1 и X2=33.33%
X1 и X3= 0.00%
X1 и X4=200.00%
X1 и X5= 0.00%
X2 и X3=50.00%
X2 и X4=100.00%
X2 и X5=200.00%
X3 и X4=50.00%
X3 и X5=100.00%
X4 и X5=33.33%


Примечание. По-моему, формула S2 содержит ошибку. Сходство между X1 и X4 составляет 200%, что подтверждается ручным счетом. Если требуются уточнения, задавайте вопросы в мини-форум.
Форма ответа