Сортировка структуры - определить ракету с меньшим расстоянием полета - C (СИ)
Формулировка задачи:
задача сама гласит: даны две структуры. структура ракет и структура целей.
требуется чтобы я ввел номер цели и мне вывело ракету с наименьшим расстоянием.
прошлые темы остались без ответа. . . код С
осталось только сортировку. я остановился на том, что у меня ракеты на функцию не передаются или передаются не правельно
тоесть: Sort(s,GG,Sraketa,n,CG,c);
на сортировку
Sort(int s, t1*masr, Sort_c*mas, int Qt, t2*masc,int Qc) (31 строчка кода)
при проверке у меня цели нормально складывает
а ракеты в НОЛЬ. как это исправить?
//lab2.14
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include <dos.h>
#include <math.h>
typedef struct Raketa
{
int No[20];
char X[40];
char Y[40];
} t1;
typedef struct Cel
{
int No[20];
char X[40];
char Y[40];
} t2;
typedef struct sort_c
{
int cs;
int rs;
t1 R;
t2 C;
} Sort_c;
Sort(int s, t1*masr, Sort_c*mas, int Qt, t2*masc,int Qc) ///(номер ракеты, структура ракета, структура координат,
/// размер ракеты, структура целей, размер целей
{
int i;
int temp;
for(i=0;i<Qt;i++)
{
//mas[s-1].cs = sqrt((atoi(masc[s-1].X))*(atoi(masc[s-1].X))+(atoi(masc[s-1].Y))*(atoi(masc[s-1].Y)));
mas[i].rs = sqrt((atoi(masr[i].X))*(atoi(masr[i].X))+(atoi(masr[i].Y))*(atoi(masr[i].Y)));
//mas[i+1].rs = (atoi(masr[i+1].X))*(atoi(masr[i+1].X));
printf("%d^^%d\n",i,mas[i].rs);
printf("%d^^%d\n",i,atoi(masr[1].X));
printf("%d\n",mas[s-1].cs);
if(atoi(masr[i].X)+atoi(masr[i].Y) > atoi(masr[i].X)+atoi(masr[i].Y)) ///mas[c-1] = const
{
temp = mas[i].rs;
mas[i].rs = mas[i+1].rs;
mas[i+1].rs = temp;
}
}
return mas;
}
void inputc(FILE*cf)
{
char ch;
int i=1;
cf=fopen("filec.dat","wb"); // открытие бинарного файла для записи
t2 mas;
printf("\n Ввод\n");
do
{
printf("Номер цели %d:\n",i); //gets(mas.No);
printf("координата по Х:"); gets(mas.X);
printf("координата по У"); gets(mas.Y);
fwrite(&mas,sizeof(mas),1,cf); //функция для записи в файл
printf("\n Закончить? y/n\n");
ch=getch();
i++;
}
while (ch != 'y');
fclose(cf);
}
void inputr(FILE*rf) //новый файл dat ракеты
{
char ch;
int i=1;
rf=fopen("filer.dat","wb"); // открытие бинарного файла для записи
t1 mas;
printf("\n Ввод\n");
do
{
printf("ракета под номером %d\n:",i); //gets(mas.No);
printf("координата по Х: "); gets(mas.X);
printf("коорлината по У: "); gets(mas.Y);
fwrite(&mas,sizeof(mas),1,rf); //функция для записи в файл
printf("\n Закончить? y/n\n");
ch=getch();
i++;
}
while (ch != 'y');
fclose(rf);
}
void appr(FILE *rf) //добавление в файл
{
t1 mas;
char ch;
int i;
rf=fopen("filer.dat","ab"); // открытие бинарного файла для добавления
fseek(rf,0,SEEK_END);
i=ftell(rf)/sizeof(t1);
fseek(rf,0,SEEK_SET);
i=i+1;
printf("\n Ввод\n");
do
{
printf("номер ракеты %d\n:",i); //gets(mas.No);
printf("координата по У:"); gets(mas.X);
printf("координата по Х:"); gets(mas.Y);
fwrite(&mas,sizeof(mas),1,rf);
printf(" Закончить? y\n\n ");
ch=getch();
i++;
}
while (ch != 'y');
printf("\n");
fclose(rf);
}
void appc(FILE *cf) //добавление в файл
{
t2 mas;
char ch;
int i;
cf=fopen("filec.dat","ab");// открытие бинарного файла для добавления
fseek(cf,0,SEEK_END);
i=ftell(cf)/sizeof(t2);
fseek(cf,0,SEEK_SET);
i=i+1;
printf("\n Ввод\n");
do
{
printf("номер цели %d:\n",i); //gets(mas.No);
printf("координата по У:"); gets(mas.X);
printf("координата по Х:"); gets(mas.Y);
fwrite(&mas,sizeof(mas),1,cf);
printf(" Закончить? y\n\n ");
ch=getch();
i++;
}
while (ch != 'y');
printf("\n");
fclose(cf);
}
void printc(FILE *cf, FILE *f1, int*Qtc) //чтение из бин.файла, вывод на экран и запись в текст.файл
{
int i;
t2 m;
(*Qtc)=0;
cf=fopen("filec.dat","rb"); // открытие бинарного файла для чтения
f1=fopen("file4.txt","w");
fread(&m,sizeof(m),1,cf); // чтение из файла одной структуры t1
for (i=0;!feof(cf);i++)
{
(*Qtc)++;
printf("\nЦель под № %d [%s:%s]",i+1, m.X, m.Y);
fprintf(f1,"Цель под № %d [%s:%s]",i+1, m.X, m.Y);
fread(&m,sizeof(m),1,cf);
}
printf("\n");
fclose(cf);
fclose(f1);
}
void printr(FILE *rf, FILE *f, int*Qtr) //только для ракет
{
int i;
t1 m;
(*Qtr)=0;
rf=fopen("filer.dat","rb"); // открытие бинарного файла для чтения
f=fopen("file3.txt","w");
fread(&m,sizeof(m),1,rf); // чтение из файла одной структуры t1
for (i=0;!feof(rf);i++)
{
(*Qtr)++;
printf("\nПусковая установка № %d [%s:%s]", i+1, m.X, m.Y);
fprintf(f,"Пусковая установка № %d [%s:%s]", i+1, m.X, m.Y);
fread(&m,sizeof(m),1,rf);
}
printf("\n");
fclose(rf);
fclose(f);
}
void outstud(t1* GG, int Qts) //вывод на экран
{
int i;
for (i=0;i<Qts;i++) //цикл вывода на экрана
{
printf("\nномер:%d\n",i);
printf("икс:%s\n",GG[i].X);
printf("игрик:%s\n",GG[i].Y);
}
}
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char c,t;
int s;
char n;
int Qts,Qtc,i;
FILE *rf;
FILE *cf;
FILE *f;
FILE *f1;
while (1)
{
puts(" 1 – новый бин.файл");
puts(" 2 – просмотр бин.файла и запись в текст файл");
puts(" 3 – добавление в бин.файл");
puts(" 4 – поиск ближайшей ракеты");
puts(" 5 – !@#$%");
puts(" 8 - выход");
printf("\n");
c=getch();
switch(c)
{
case '1': /// новый файл
{
do
{
// system ("CLS");
puts("1 - ядерная боеголовка");
Sleep(300);
puts("2 - ЦЕЛЬ");
Sleep(300);
puts("9 - в предыдущее меню");
t=getch();
switch(t)
{
case '1': inputr(rf);break;
case '2': inputc(cf);break;
}
}
while (t!='9');
break;
}
case '2': /// просмотр
{
puts("-----ракеты-----");
printr(rf,f,&Qts); //вывод
puts("-----цели-----");
printc(cf,f1,&Qtc);
printf(" Итого: %d\n\n",Qts);
break;
}
case '3': /// добавление
{
do
{
// system ("CLS");
puts("1 - ядерная боеголовка");
Sleep(300);
puts("2 - ЦЕЛЬ");
Sleep(300);
puts("9 - в предыдущее меню");
t=getch();
switch(t)
{
case '1': appr(rf);break;
case '2': appc(cf);break;
}
}
while (t!='9');
break;
}
case '4': /// сама лаба
{
FILE*f=fopen("filer.dat","rb");
FILE*f1=fopen("filec.dat","rb");
//FILE*f2=fopen("filerc.dat","ab");
fseek(f,0,SEEK_END);
n=ftell(f)/sizeof(t1);
fseek(f,0,SEEK_SET);
t1*GG=(t1*)malloc(sizeof(GG)*Qts);
fseek(f1,0,SEEK_END);
c=ftell(f1)/sizeof(t2);
fseek(f1,0,SEEK_SET);
t2*CG=(t2*)malloc(sizeof(CG)*Qtc);
Sort_c* Sraketa = (Sort_c*)malloc(sizeof(Sort_c)*Qts);
fread(Sraketa,sizeof(t1),n,f);
fread(GG,sizeof(t1),n,f);
fread(CG,sizeof(t2),c,f1);
puts("нажмите любую клавишу . . .");
puts("номер цели:");
scanf("%d",&s);
Sort(s,GG,Sraketa,n,CG,c); ///(номер ракеты(), структура ракета, структура координат,
/// размер ракеты, структура целей, размер целей
printf("Для выхода нажмите любую клавишу.....\n");
getch();
break;
}
case '8':return 0;
default : puts(" неверный режим");
}
}
} {
FILE*f=fopen("filer.dat","rb");
FILE*f1=fopen("filec.dat","rb");
//FILE*f2=fopen("filerc.dat","ab");
fseek(f,0,SEEK_END);
n=ftell(f)/sizeof(t1);
fseek(f,0,SEEK_SET);
t1*GG=(t1*)malloc(sizeof(GG)*Qts);
fseek(f1,0,SEEK_END);
c=ftell(f1)/sizeof(t2);
fseek(f1,0,SEEK_SET);
t2*CG=(t2*)malloc(sizeof(CG)*Qtc);
Sort_c* Sraketa = (Sort_c*)malloc(sizeof(Sort_c)*Qts);
fread(Sraketa,sizeof(t1),n,f);
fread(GG,sizeof(t1),n,f);
fread(CG,sizeof(t2),c,f1);
puts("нажмите любую клавишу . . .");
puts("номер цели:");
scanf("%d",&s);
Sort(s,GG,Sraketa,n,CG,c); ///(номер ракеты(), структура ракета, структура координат,
/// размер ракеты, структура целей, размер целей
printf("Для выхода нажмите любую клавишу.....\n");
getch();
break;
}Решение задачи: «Сортировка структуры - определить ракету с меньшим расстоянием полета»
textual
Листинг программы
mas[i].rs = sqrt((atoi(masr[i].X))*(atoi(masr[i].X))+(atoi(masr[i].Y))*(atoi(masr[i].Y)));