Текст программы экспертного выбора

#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();

};