Программа
#include <stdio.h>
#include <math.h>
const int n=4; //* Начальное количество жуков */
const float Vicinity=0.5; /* Расстояние слияния жуков */
struct Zuck{float X,Y; /* Жук: координаты, флаг существования */
int Flag;};
struct Zuck Zucki[4]; /* Жуки */
int GetQuantity(struct Zuck Zucki[]) /* Функция подсчета количества жуков */
{
int Meter=0; /* Счетчик жуков */
int i; /* Счетчик цикла */
for(i=0;i<n;i++) /* Цикл просмотра массива жуков */
if (Zucki[i].Flag) Meter=Meter+1; /* Если жук существует, то подсчет жуков */
return Meter; /* Возврат значения */
}
float GetDistance(struct Zuck Zuck1, struct Zuck Zuck2)
{ /* Функция определения расстояния между жуками */
return sqrt(pow(Zuck1.X-Zuck2.X,2)+pow(Zuck1.Y-Zuck2.Y,2));
}
void GetV(float *Vx, float *Vy,float V,struct Zuck Zucki[],int i)
{ /* Функция определния скорости жука */
int Num; /* Номер ближайшего жука */
float Distance; /* Расстояние до Num жука */
int FlagDistance; /* Флаг определенности Distance */
float DistanceNew; /* Расстояние до следующего жука */
int j; /* Счетчик */
FlagDistance=0; /* Сброс флага */
for(j=1;j<n;j++) /* Цикл просмотра массива жуков */
{
if (Zucki[(i+j)%n].Flag) /* Если текущий жук существует, то */
if (FlagDistance)
{ /* Если определена дистанция до одного из предыдущих жуков, то */
/* расчет дистанции и сравнение с предыдущим значением: */
DistanceNew=GetDistance(Zucki[i],Zucki[(i+j)%n]);
if (DistanceNew<Distance || DistanceNew==Distance && ((i+j)%n)<Num)
{ /* Если новое значение дистанции меньше предыдущего или
дистанции равны и номер текущего жука меньше предыдущего, то */
Num=(i+j)%n; /* переопределение номера ближайшего жука */
Distance=DistanceNew; /* переопределение дистанции */
}
}
else /* Если текущий жук является первым найденым, то */
{
Num=(i+j)%n; /* определение номера ближайшего жука */
Distance=GetDistance(Zucki[i],Zucki[Num]); /* Определение расстояния */
FlagDistance=1; /* Подъем флага */
}
}
if (Distance!=0) /* Если расстояние не нулевое, то расчет проекций: */
{
*Vx=V*(Zucki[Num].X-Zucki[i].X)/Distance;
*Vy=V*(Zucki[Num].Y-Zucki[i].Y)/Distance;
}
}
void Overlapping(struct Zuck Zucki[],float Vicinity) /* Функция слияния жуков */
{
int i,j; /* Счетчики циклов */
for (i=n-1;i>0;i--) /* Цикл перебора жуков для возможного слияния */
for (j=i-1;j>=0;j--) /* Цикл перебора возможно близких жуков */
if (Zucki[i].Flag&&Zucki[j].Flag) /* Если оба жука существуют */
if (GetDistance(Zucki[i],Zucki[j])<Vicinity)
/* то, если расстояние между ними меньше окрестности слияния */
Zucki[i].Flag=0; /* то сброс флага существования */
}
void SetCoord(struct Zuck Zucki[],int Num,float Vx,float Vy,float dt,float Vicinity)
{ /* Функция пересчета координат и слияния жуков */
/* Пересчет координат: */
Zucki[Num].X=Zucki[Num].X+Vx*dt;
Zucki[Num].Y=Zucki[Num].Y+Vy*dt;
Overlapping(Zucki,Vicinity); /* Слияние */
}
void main()
{
int i,j; /* Счетчики */
float V; /* Скорость */
float Vx,Vy; /* Проекции скоростей */
float dt; /* Временной интервал */
float t=0; /* Время */
FILE *f; /* Файловая переменная */
/* Ввод скорости и временного интервала: */
printf("Введите скорость "); scanf("%f",&V);
printf("Введите временной интервал "); scanf("%f",&dt);
for (i=1;i<=n;i++) /* Цикл ввода координат жуков */
{
printf("Введите координаты %d-го жука ",i); /* Вывод приглашения */
scanf("%f %f",&Zucki[i-1].X,&Zucki[i-1].Y); /* Ввод координат */
Zucki[i-1].Flag=1; /* Подъем флага */
}
f=fopen("zucki.dat","w"); /* Открытие файла под запись */
fprintf(f," t ▌ X1 Y1 Vx1 Vy1▐▌ X2 Y2 Vx2 Vy2▐▌ X3 Y3 Vx3 Vy3▐▌ X4 Y4 Vx4 Vy4▐\n");
/* Вывод заголовка */
for (;GetQuantity(Zucki)>1;) /* Цикл работы пока жуков больше 1-го */
{
fprintf(f,"%3.1f ",t=t+dt); /* Вывод момента времени */
for (i=0;i<=n-1;i++) /* Цикл просмотра массива жуков */
if (Zucki[i].Flag) /* Если жук существует, то */
{
GetV(&Vx,&Vy,V,Zucki,i); /* Определение скорости жука */
fprintf(f,"▌%3.1f %3.1f %4.1f %4.1f▐",Zucki[i].X,Zucki[i].Y,Vx,Vy);
/* Вывод координат и скорости в файл */
SetCoord(Zucki,i,Vx,Vy,dt,Vicinity); /* Пересчет координат жука */
}
else fprintf(f,"▌-----------------▐");
/* вывод прочерка для несуществующего жука */
fprintf(f,"\n");/* Вывод конца строки */
}
fclose(f); /* Закрытие файла */
}
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию