#include <conio.h>
#include <stdio.h>
#include <locale>
#include <windows.h>
#include <stdlib.h>
#define DVS_FNAME "dvs.cfg"
struct dvs
{
char man[10]; // manufacturer
int V;
int min_rpm, max_rpm;
int prop_diam, prop_pitch;
int weigth;
dvs *nx;
};
void see(dvs **h)
{
dvs *hh;
hh=*h;
system("cls");
while(hh)
{
puts("Производитель:");
puts(hh->man);
puts("Объём:");
printf("%d",hh->V);
puts("\n");
hh=hh->nx;
}
puts("Для возврата в главное меню нажмите любую клавишу...");
getch();
}
void add(dvs **h, dvs **t, dvs *elem) // добавление элемента в очередь
{
dvs *buff;
if(!(buff=(dvs*)calloc(1,sizeof(dvs))))
return;
memcpy(buff,elem,sizeof(dvs));
if(!*t) *t=*h=buff;
else {(*t)->nx=buff; *t=buff;}
}
void wing_calc()
{
float h, //длина лонжерона
L, //длина корневой нервюры
l, //длина концевой нервюры
S; //площадь крыла
system("cls");
puts("укажите длинну от корневой нервюры до концевой h\n");
scanf("%f",&h);
fflush(stdin);
system("cls");
puts("Укажите длинну корневой нервюры L\n");
scanf("%f",&L);
fflush(stdin);
system("cls");
puts("Укажите длинну концевой нервюры l\n");
scanf("%f",&l);
fflush(stdin);
system("cls");
printf("h=%f\nL=%f\nl=%f\n Данные введены верно?\ny/n",h,L,l);
switch (getch())
{
case 'y':
{
S=h*(L+l);
system("cls");
printf("S=%f\n",S);
puts("Для возврата в главное меню нажмите любую клавишу...");
getch();
break;
}
case 'n':
{
wing_calc();
break;
}
}
}
void find_dvs(dvs **h,dvs **t)
{
char name[10];
int V;
bool FX;
dvs *hh,*prev;
hh=*h;
int asc;
system("cls");
puts("Выберите производителя\n\n");
puts("1)OS MAX\n");
puts("2)ASP\n");
puts("3)GMS\n");
puts("4)Tiger\n");
puts("5)JTH\n");
puts("6)JBA\n");
puts("7)Yamada\n\n");
switch (getch())
{
case '1':
{
strcpy(name,"OS MAX");
break;
}
case '2':
{
strcpy(name,"ASP");
break;
}
case '3':
{
strcpy(name,"GMS");
break;
}
case '4':
{
strcpy(name,"Tiger");
break;
}
case '5':
{
strcpy(name,"JTH");
break;
}
case '6':
{
strcpy(name,"JBA");
break;
}
case '7':
{
strcpy(name,"Yamada");
break;
}
}
system("cls");
puts("Найдены двигатели следующих объёмов:");
while(hh)
{
if(strcmp(hh->man,name)==0)
printf("%d\n",hh->V);
hh=hh->nx;
}
puts("\nУкажите объём:\n");
scanf("%d",&V);
fflush(stdin);
system("cls");
hh=*h;
while(hh)
{
if((strcmp(hh->man,name)==0) && (hh->V==V))
{
puts("Производитель:");
puts(hh->man);
printf("Объём двигателя: %d\n",hh->V);
printf("Обороты холостого хода: %d\n",hh->min_rpm);
printf("Обороты полного хода: %d\n",hh->max_rpm);
printf("Диаметр винта: %d\n",hh->prop_diam);
printf("Щаг винта: %d\n",hh->prop_pitch);
printf("Масса: %d\n",hh->weigth);
break;
}
hh=hh->nx;
}
puts("Delete - удалить данный двигатель");
puts("0 - в главное меню");
prev=*h;
switch(getch())
{
case 'd': // switch для одного элемента? Либо делай больше либо иф(гетч()==244) ...
{
if(hh->man==(*h)->man)
{
*h=hh->nx;
if(!*h) *t=NULL;
}
else
{
while(prev->nx->man!=hh->man && prev)
prev=prev->nx;
prev->nx=hh->nx;
if(!hh->nx) *t=*h;
}
free(hh);
// ВЫЗОВ ФУНКЦИИ ПЕРЕСОЗДАНИЯ ФАЙЛА ИЗ ОЧЕРЕДИ!
}
}
getch();
}
void data_input(dvs *dvg)
{
bool canContinue;
system("cls");
puts("Выберите производителя\n\n");
puts("1)OS MAX\n");
puts("2)ASP\n");
puts("3)GMS\n");
puts("4)Tiger\n");
puts("5)JTH\n");
puts("6)JBA\n");
puts("7)Yamada\n\n");
do
{
canContinue=true;
switch (getch())
{
case '1':
{
strcpy(dvg->man,"OS MAX");
break;
}
case '2':
{
strcpy(dvg->man,"ASP");
break;
}
case '3':
{
strcpy(dvg->man,"GMS");
break;
}
case '4':
{
strcpy(dvg->man,"Tiger");
break;
}
case '5':
{
strcpy(dvg->man,"JTH");
break;
}
case '6':
{
strcpy(dvg->man,"JBA");
break;
}
case '7':
{
strcpy(dvg->man,"Yamada");
break;
}
default: canContinue=false;
}
}while(!canContinue);
system("cls");
puts("Введите объём двигатея:\n\n");
scanf("%d",&dvg->V);
fflush(stdin);
system("cls");
puts("Введите число оборотов холостого хода:\n\n");
scanf("%d",&dvg->min_rpm);
fflush(stdin);
system("cls");
puts("Введите число оборотов полного хода:\n\n");
scanf("%d",&dvg->max_rpm);
fflush(stdin);
system("cls");
puts("Введите диаметр рекомендуемого винта:\n\n");
scanf("%d",&dvg->prop_diam);
system("cls");
fflush(stdin);
puts("Введите шаг рекомендуемого винта:\n\n");
scanf("%d",&dvg->prop_pitch);
system("cls");
fflush(stdin);
puts("Укажите массу двигателя:\n\n");
scanf("%d",&dvg->weigth);
fflush(stdin);
system("cls");
puts("Производитель:");
puts(dvg->man);
//puts("\n");
printf("Объём двигателя: %d\n",dvg->V);
printf("Обороты холостого хода: %d\n",dvg->min_rpm);
printf("Обороты полного хода: %d\n",dvg->max_rpm);
printf("Диаметр винта: %d\n",dvg->prop_diam);
printf("Щаг винта: %d\n",dvg->prop_pitch);
printf("Масса: %d\n",dvg->weigth);
puts("Данные введены верно?\n(y/n)\n\n");
switch (getch())
{
case 'y': return;
case 'n': data_input(dvg);
}
}
void add_dvs(dvs **h, dvs **t)
{
FILE *f;
dvs *current;
system("cls");
current=(dvs*)calloc(1,sizeof(dvs));
data_input(current); // заполнение структуры
add(h,t,current); // добавление в очередь
if(!(f=fopen(DVS_FNAME,"a+b")))
{
printf("Невозможно получить доступ к файлу \"%s\"",DVS_FNAME);
return;
}
fwrite(current,sizeof(dvs),1,f);
fclose(f);
free(current);
}
void dvs_menu(dvs **h, dvs **t)
{
system("cls");
puts("1 - Найти двигатель");
puts("2 - Добавить двигатель");
puts("3 - Отобразить все, что есть в справочнике\n");
puts("0 - назад");
switch (getch())
{
case '1':
{
find_dvs(h,t);
break;
}
case '2':
{
add_dvs(h,t);
break;
}
case '3':
{
see(h);
break;
}
case '0':
{
return;
}
}
}
bool LoadData(dvs **h,dvs **t,char *FName)
{
FILE *f;
dvs *buf;
if(!(buf=(dvs*)calloc(1,sizeof(dvs))))
return false;
if(!(f=fopen(DVS_FNAME,"rb")))
{
free(buf);
return false;
}
do
{
if(!(fread(buf,sizeof(dvs),1,f))) break;
add(h,t,buf);
}while(1);
fclose(f);
}
int main()
{
setlocale(LC_ALL,"rus");
dvs *h, *t;
h=t=NULL;
LoadData(&h,&t,DVS_FNAME);
do
{
system("cls");
puts("1 - Справочник по двигателям");
puts("2 - Вычисление площади крыла\n");
puts("0 - Выход");
switch (getch())
{
case '1':
{
dvs_menu(&h,&t);
break;
}
case '2':
{
wing_calc();
break;
}
case '0': return 0;
}
}while(1);
}