Задача. Задача из сборника задач по программированию С.А.Абрамова за 2000 год.
Система из 25 материальных точек в пространстве задана с помощью последовательности действительных чисел [latex]x_{1}, y_{1}, z_{1}, p_{1}, x_{2}, y_{2}, z_{2}, p_{2},\ldots,x_{25}, y_{25}, z_{25}, p_{25}[/latex], где [latex]x_{i}, y_{i}, z_{i}[/latex] — координаты [latex]i[/latex]-ой точки, а [latex]p_{i}[/latex] — ее вес ([latex]i=1,2,\ldots,25[/latex]). Получить координаты центра тяжести системы, а также расстояние от центра тяжести до всех точек системы.
Входные данные:
[latex]x, y, z, p[/latex] — координаты и вес точки.
Выходные данные:
[latex]sum(x,y,z)[/latex] — координаты центра тяжести системы, [latex]l[/latex] — расстояние от центра тяжести до одной из точек.
Тесты:
Входные данные | Выходные данные | |
[latex]x[/latex] [latex]y[/latex] [latex]z[/latex] [latex]p[/latex] | [latex]sum[/latex] [latex](x[/latex] [latex]y[/latex] [latex]z)[/latex] | [latex]l[/latex] |
2 2 1 2 3 1 2 1 |
2.33333 1.66667 1.33333 | 0.57735 1.1547 |
7 10 5 20 1 0 3 1 43 50 6 3 0 9 0 200 4 8 15 66 |
1.84138 9.23448 3.83103 | 5.34452 9.3099 57.9704 4.25705 11.4424 |
Код программы на С++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <iostream> #include <vector> #include <cmath> using namespace std; struct dot { double x; double y; double z; dot() { x=0; y=0; z=0; } dot (double a, double b, double c) { x=a; y=b; z=c; } }; int main() { vector <dot> a; double x, y, z, p; double sump=0; dot sum=dot(); while (cin>>x && cin>>y && cin>>z && cin>>p) { a.push_back(dot(x,y,z)); sum.x+=x*p; sum.y+=y*p; sum.z+=z*p; sump+=p; } sum.x/=sump; sum.y/=sump; sum.z/=sump; cout << sum.x << " " << sum.y << " " << sum.z << endl; for (int i=0; i<a.size(); i++) { double l=sqrt((a[i].x-sum.x)*(a[i].x-sum.x) + (a[i].y-sum.y)*(a[i].y-sum.y) + (a[i].z-sum.z)*(a[i].z-sum.z)); cout << l << endl; } return 0; } |
Код программы на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import java.util.*; import java.lang.*; import java.io.*; class Dot { double x; double y; double z; public Dot() { x = 0; y = 0; z = 0; } Dot (double a, double b, double c) { x=a; y=b; z=c; } } class Ideone{ public static void main (String[] args) throws java.lang.Exception{ Scanner in = new Scanner(System.in); Vector a = new Vector(); double x, y, z, p; double sump=0; Dot sum = new Dot(); while (in.hasNextDouble()){ x = in.nextDouble(); y = in.nextDouble(); z = in.nextDouble(); p = in.nextDouble(); a.add(new Dot(x,y,z)); sum.x += x*p; sum.y += y*p; sum.z += z*p; sump+=p; } sum.x/=sump; sum.y/=sump; sum.z/=sump; System.out.println(sum.x + " " + sum.y + " " + sum.z); Dot dot; for (int i=0; i<a.size(); i++) { dot = (Dot)a.elementAt(i); double l = Math.sqrt((dot.x-sum.x)*(dot.x-sum.x) + (dot.y-sum.y)*(dot.y-sum.y) + (dot.z-sum.z)*(dot.z-sum.z)); System.out.println(l); } } } |
Решение
В цикле «[latex]while[/latex]» читаем числа из входного потока и запоминаем координаты точек в векторе [latex]а[/latex], к переменной [latex]sum[/latex] прибавляем эти координаты, умноженные на [latex]p[/latex].
Потом подсчитываем координаты центра тяжести системы и выводим эти координаты.
В цикле «[latex]for[/latex]» берем из вектора координаты одной из точек системы, считаем расстояние от центра тяжести до одной из точек системы и выводим это расстояние.
Ссылки
Код в ideone.com (C++)
Код в ideone.com (Java)
Условие задачи (с.117)
— Не следует использовать достаточно трудоемкую функцию pow() для простого умножения числа на себя.
— Конечно можно хранить числа в векторе и считать, что каждое третье из них это координата х. Но гораздо лучше создать структуру (или класс) трехмерных координат. Не хотите попробовать?
Согласна: если есть возможность решить задачу лучшим путем, то следует это сделать.
Я попробовала воспользоваться структурой. Пожалуйста, посмотрите такой вариант решения.
Я бы реализовал еще и операции с координатами точек.
Например так: