Программа


#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); /* Закрытие файла */
}

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию