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%
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%
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.