Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<malloc.h>
- #include<math.h>
- //Задание: Задано можество материальных точек, среди них найти такую точку, которая ближе всех расположена к центру тяжести этого множества. Пространство трехмерное.
- //Алгоритм решения: сперва по формуле находим центр тяжести в трёхмерном пространстве, затем вычисляя расстояния находим точку, ближайшую к центру тяжести
- float distance(float x1, float y1, float z1, float x2, float y2, float z2)
- {
- return sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1) + (z2 - z1)*(z2 - z1));
- }
- int main()
- {
- int N; //количество точек
- printf("Введите количество точек N:\n");
- scanf("%d", &N);
- float *x = malloc(N * sizeof(float));
- float *y = malloc(N * sizeof(float));
- float *z = malloc(N * sizeof(float));
- float *m = malloc(N * sizeof(float));
- for (int i = 0; i < N; i++) // x, y, z - это координаты точек, m - масса
- {
- scanf("%f %f %f %f", &x[i], &y[i], &z[i], &m[i]);
- }
- float centre_x = 0; // координаты и масса центра:
- float centre_y = 0;
- float centre_z = 0;
- float centre_m = 0;
- //float all_m = 0;
- for (int i = 0; i < N; i++) { // так как центр масс равен сумме масс исходных точек, то:
- centre_m += m[i];
- }
- for (int i = 0; i < N; i++) //теперь покоординатно вычислим центр масс:
- {
- centre_x += x[i] * m[i] / (centre_m);
- centre_y += y[i] * m[i] / (centre_m);
- centre_z += z[i] * m[i] / (centre_m);
- }
- // Осталось найти точку, ближайшую к центру масс, для этого:
- float ax = x[0], ay = y[0], az = z[0];
- float mindistance = distance(ax, ay, az, centre_x, centre_y, centre_z);
- for (int i = 0; i < N; i++)
- if (distance(x[i], y[i], z[i], centre_x, centre_y, centre_z) < mindistance)
- {
- mindistance = distance(x[i], y[i], z[i], centre_x, centre_y, centre_z);
- ax = x[i]; ay = y[i]; az = z[i];
- }
- printf("%f %f %f\n", centre_x, centre_y, centre_z);
- printf("%f %f %f\n", ax, ay, az);
- free(x); free(y); free(z); free(m);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement