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;
}