Текст программы экспертного выбора
|
#include <conio.h>
#include <stdio.h>
#include <math.h>
int i,j,e,n,m,p,command;
double
y=0.0,d[30][30],k[30][30],s[30],w[30],l[30],z[30],a[30],b[30],h[30];
FILE* base;
FILE* name;
FILE* wazh;
struct name
{
char pname[50];
} nm[30];
struct krit
{
char pname[50];
} kr[30];
double power(double num, int st) // функция возведения в степень
{
double num1=1;
for (int gggggg=1;gggggg<=st;gggggg++)
num1 *=num;
return num1;
}
void main(void)
{
printf (" \n\n\n\n\n Copyright 1994 by Dan.V.Puzanov & Anton A.Mets \n All rights reserved\n");
printf (" Special thanks Dmitry A.Davidenko\n");
printf ("\n\n\n\n\n Определение лучшего пакета методом смещенного идеала\n\n\n\n\n\n\n\n\n\n");
printf ("Нажмите любую клавишу");
getch();
printf ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nДанные о пакетах вводить из файла? [y/n]: ");
command=getch();
if (command=='y' || command=='Y')
{
name=fopen("name.dat","rb"); // чтение данных о пакетах из
if (name==NULL) return;
fread (&n,sizeof(n),1,name); // файла name.dat
fread (&nm,sizeof(nm),1,name);
fread (&m,sizeof(m),1,name);
fread (&kr,sizeof(kr),1,name);
fread (&a,sizeof(a),1,name);
fread (&b,sizeof(b),1,name);
fclose(name);
}
else
{ // Ввод данных о пакетах вручную
printf ("\nВведите количество пакетов: ");
scanf ("%d",&n);
for (i=1;i<=n;i++)
{
printf ("\nВведите название %d-го пакета: ",i);
scanf ("%s",nm[i].pname);
}
printf ("\nВведите количество критериев оценки: ");
scanf ("%d",&m);
for (j=1;j<=m;j++)
{
printf ("\nВведите название %d-го критерия: ",j);
scanf ("%s",kr[j].pname);
}
for (j=1;j<=m;j++)
{
printf ("\nВведите идеальное значение для критерия ~%s~: ",kr[j].pname);
scanf ("%le",&a[j]);
printf ("\nВведите наихудшее значение для критерия ~%s~: ",kr[j].pname);
scanf ("%le",&b[j]);
};
printf ("\nСохранить введенные данные о пакетах в файле?[y/n] ");
command = getch();
if (command=='y' || command=='Y')
{
name=fopen("name.dat","wb");
if (name==NULL) return;
if(fwrite (&n,sizeof(n),1,name) == 0) return;
fwrite (&nm,sizeof(nm),1,name); // запись данных о
fwrite (&m,sizeof(m),1,name); // пакетах
fwrite (&kr,sizeof(kr),1,name); // в файл name.dat
fwrite (&a,sizeof(a),1,name);
fwrite (&b,sizeof(b),1,name);
fclose(name);
};
}; // конец else
printf("\n Ввод значений критериев из файла ? [y/n]: ");
command=getch();
if (command=='y' || command== 'Y')
{
base=fopen("base.dat","rb");
if (base==NULL) return;
fread (&k,sizeof(k),1,base); // чтение значений критериев
fread (&d,sizeof(d),1,base);
fclose(base); // из файла base.dat
}
else
{
for (i=1;i<=n;i++) // Ввод значениев критериев вручную
for (j=1;j<=m;j++)
{printf ("\n Введите значение критерия ~%s~\n для пакета ~%s~: ",kr[j].pname,nm[i].pname);
scanf ("%le",&k[i][j]);
d[i][j]=(a[j]-k[i][j])/(a[j]b[j]); // Вычисление нормированных критериев
};
printf ("\nСохранить введенные данные о критериях в файле? [y/n]: ");
command = getch();
if (command=='y' || command=='Y')
{
base=fopen("base.dat","wb");
if (base==NULL) return; // запись значений критериев
fwrite (&k,sizeof(k),1,base); // в файл base.dat
fwrite (&d,sizeof(d),1,base);
fclose(base);
};
}; //конец else
printf ("\nВвод значений относительной важности из файла? [y/n]");
command=getch();
if (command=='y' || command== 'Y')
{
wazh=fopen("wazh.dat","rb");
if (wazh==NULL) return;
fread (&w,sizeof(w),1,wazh); // чтение значений
fclose(base); // важности критериев
} / /из файла wazh.dat
else
{
for (j=1;j<=m;j++)
{
printf ("\nВведите значение относительной важности критерия ~%s~: ",kr[j].pname);
scanf ("%le",&w[j]); // Ввод значений относительной важности критериев
};
printf ("\nСохранить значения относительной важности в файле?[y/n]");
command = getch();
if (command=='y' || command=='Y')
{
wazh=fopen("wazh.dat","wb"); // запись значений
if (wazh==NULL) return; // относительной важности
fwrite (&w,sizeof(w),1,wazh); // критериев в файл
fclose(wazh); //wazh.dat
};
}; // end of else
for (j=1;j<=m;j++)
{
s[j]=0.0;
for (i=1;i<=n;i++)
{
if (d[i][j]==0.0) d[i][j]=0.01;
s[j]=s[j]+d[i][j];
}
};
for (j=1;j<=m;j++)
{
h[j]=0.0;
for (i=1;i<=n;i++)
h[j]=h[j]+(d[i][j]/s[j])*log(d[i][j]/s[j]); // Вычисление энтропии
l[j]=w[j]/(h[j]*(-1)); // Вычисление весовых коэффициентов
};
printf ("\nВведите значение параметра важности редковстречающихся свойств: ");
scanf ("%d",&p);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++) // Вычисление метрики
z[i]=z[i]+l[j]*power((1-d[i][j]),p);
if (i==1)
{
y=z[i];
e=i;
}
if (y<z[i]) // Выбор максимальной метрики
{
y=z[i]; // Определение лучшего пакета
e=i;
}
};
printf (" \nВ результате вычислений получено,\nчто ближе всего к идеалу находиться пакет ~%s~",nm[e].pname);
//printf ("\nЕго метрика равна: %le",y);
getch();
};