https://pastein.ru/t/sZ
скопируйте уникальную ссылку для отправки
Загрузка данных
#include <Ballistic.h>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define _USE_MATH_DEFINES
int add_motions(void** arr, int N)
{
int key;
while (true)
{
if (N < MAX)//проверяем есть ли свободные места в массиве
printf("%d cвободных траекторий\n", MAX - N);
else
break;
printf("Выберите вид траектории для добавления:\n");
printf("\t1->Параллельно\n\t2->Под углом к оси X\n\t3->Закончить ввод.\nN->");
scanf_s("%*c");//чистим от возможного мусора буфер
scanf_s("%d", &key);
void* t = NULL;//создаем указатель на добавляемый обьект
switch (key)
{
case 1:
t = create_motion(Parallel);
break;
case 2:
t = create_motion(ByAngle);
break;
case 3:
return N; //выход из функции
default:
printf("Некоррректный ввод!");
}
if (t != NULL)
{
arr[N] = t;
N++;
}
}
return N;
}
void* create_motion(Kind type)
{
float x0, y0, alpha, speed;
void* t = (void*)malloc(sizeof(Trajectory));//указатель на создаваемую структуру
if (t == NULL) return NULL;
printf("Начальная координата x0 (м)->");
scanf_s("%f", &x0);
printf("Начальная координата y0 (м)->");
scanf_s("%f", &y0);
printf("Начальная скорость (м/с)->");
scanf_s("%f", &speed);
switch (type)
{
case Parallel:
((Trajectory*)t)->kind = Parallel;
((Trajectory*)t)->x0 = x0;
((Trajectory*)t)->y0 = y0;
((Trajectory*)t)->speed = speed;
break;
case ByAngle:
printf("Угол alpha к оси X в градусах (0..180)->");
scanf_s("%f", &alpha);
if (alpha >= 180 && alpha <= 0) return NULL;
((Trajectory*)t)->kind = ByAngle;
((Trajectory*)t)->x0 = x0;
((Trajectory*)t)->y0 = y0;
((Trajectory*)t)->speed = speed;
((Trajectory*)t)->alpha = alpha;
default:
break;
}
return t;
}
void print_list(void** arr, int N)
{
if (N == 0)
{
printf("Ошибка! Список пуст.\n");
return;
}
float x0, y0, alpha, speed;
printf("№ %9s %7s %7s %10s %11s\n", "type", "x0,м", "y0,м", "speed,м/с","angle, град");
for (size_t i = 0; i < N; i++)
{
void* t = arr[i];
Kind type = *((Kind*)t);
switch (type)
{
case Parallel:
x0 = ((Trajectory*)t)->x0;
y0 = ((Trajectory*)t)->y0;
speed = ((Trajectory*)t)->speed;
printf("%d %9s %7.2f %7.2f %10.2f\n", i + 1, "Parallel", x0, y0, speed);
break;
case ByAngle:
x0 = ((Trajectory*)t)->x0;
y0 = ((Trajectory*)t)->y0;
speed = ((Trajectory*)t)->speed;
alpha = ((Trajectory*)t)->alpha;
printf("%d %9s %7.2f %7.2f %10.2f %11.2\n", i + 1, "ByAngle", x0, y0, speed, alpha);
break;
default:
break;
}
}
system("pause");
return;
}
void calc_motion(void** arr, int N)
{
if (N == 0)
{
printf("Ошибка! Список пуст.\n");
return;
}
float x0, y0, x_end, y_end, alpha, speed, time, S;
printf("№ %9s %6s %6s %6s ", "type", "x0,м", "y0,м", "t,cек");
printf("%9s %6s %6s\n", "distance", "x(t),м", "y(t),м");
for (size_t i = 0; i < N; i++)
{
void* t = arr[i];
Kind type = *((Kind*)t);
switch (type)
{
case Parallel:
x0 = ((Trajectory*)t)->x0;
y0 = ((Trajectory*)t)->y0;
speed = ((Trajectory*)t)->speed;
time = sqrt(2.0 * y0 / G);
S = speed * time;//дальность полета
//координаты точки приземления на поверхность
x_end = x0 + S;
y_end = 0;
printf("%d %9s %6.2f %6.2f ", i + 1, "Parallel", x0, y0);
printf("%6.2f %9.2f %6.2f %6.2f \n", time, S, x_end, y_end);
break;
case ByAngle:
x0 = ((Trajectory*)t)->x0;
y0 = ((Trajectory*)t)->y0;
speed = ((Trajectory*)t)->speed;
alpha = ((Trajectory*)t)->alpha;
alpha = alpha * PI / 180.0;//переводим в радианы
float sina;
sina = sin(alpha);
time = (speed * sina + sqrt(pow(speed, 2) * pow(sina, 2) + 2 * G * y0)) / G;
S = speed * cos(alpha) * time;
x_end = x0 + S;
y_end = 0;
printf("%d %9s %6.2f %6.2f ", i + 1, "ByAngle", x0, y0);
printf("%6.2f %9.2f %6.2f %6.2f \n", time, S, x_end, y_end);
break;
default:
break;
}
}
system("pause");
return;
}