Olej писал(а):
Следующий вариант, естественно, C++.
(Почему естественно? для интересующихся... Потому что C++ - надмножество C, почти всякий код C можно скомпилировать компилятором C++ ... редкие примеры когда нельзя это сделать - специально коллекционируют. Приводимый раньше пример вполне компилируется и в режиме C++)
Следующий вариант, естественно
, Java:
Код: Выделить всё
import java.io.*;
import java.util.StringTokenizer;
import java.lang.Double.*;
class Tric { // класс треугольник
public static final int nodes = 3;
Complex [] pt = new Complex[ nodes ];
public String toString() {
String ret = "";
for( int i = 0; i < nodes; i++ )
ret += "[" + ( new Double( pt[ i ].re ) ).toString() + "," +
( new Double( pt[ i ].im ) ).toString() + "] ";
return ret;
}
public double perimeter() {
double summa = 0.0;
for( int i = 0; i < nodes; i++ )
summa += pt[ i ].minus( pt[ nodes - 1 == i ? 0 : i + 1 ] ).r();
return summa;
}
public double square() {
Complex side1 = pt[ 1 ].minus( pt[ 0 ] ),
side2 = pt[ 2 ].minus( pt[ 0 ] );
return side1.r() * side2.r() *
Math.abs( Math.sin( side1.theta() - side2.theta() ) ) / 2.;
}
}
public class triangle {
public static void main( String[] args ) {
String szStr = "";
Console cons = System.console();
while( true ) {
Tric points = new Tric();
System.out.println( "координаты вершин в формате: X Y" );
Complex parm; // = { };
for( int i = 0; i < Tric.nodes; ) {
szStr = cons.readLine( "%s%d%s", "вершина № ", i + 1, " : " );
if( null == szStr ) { // ^D
System.out.println( "" );
System.exit( 0 );
}
StringTokenizer st = new StringTokenizer( szStr, " \r\n" );
try {
double x = ( new Double( (String)st.nextElement() ) ).doubleValue(),
y = ( new Double( (String)st.nextElement() ) ).doubleValue();
points.pt[ i ] = new Complex( x, y );
}
catch( java.util.NoSuchElementException ex ) {
System.out.println( "ошибка: " + ex.toString() );
continue;
}
catch( java.lang.NumberFormatException ex ) {
System.out.println( "ошибка: " + ex.toString() );
continue;
}
i++;
}
System.out.println( "треугольник: " + points.toString() );
System.out.println( "периметр = " + points.perimeter() );
System.out.println( "площадь = " + points.square() );
System.out.println( "---------------------------------" );
}
}
}
Почему "естественно" тоже понятно: почти тот же синтаксис, что и C/C++, но совершенно другой смысл того, что написано.
В Java нет типа комплексных чисел (как его не было и в C 30 лет до стандарта C99). Для нашего приложения реализацию векторных операций, можно решить следующими способами:
1. Написать (прямо в приложении) свои собственные операции над векторами, нам из них всех нужно: разность (-), модуль (abs, cabs), и фазовый угол (arg, carg).
2. Написать свой собственный класс Complex ... это несложно.
3. Заимствовать где-то в сети рукописный тип Complex (а их там миллион
).
Я воспользовался 3-м способом (и это самый правильный путь), и взял реализацию из математического проекта
3D-XplorMath-J (не знаю относительно математики в самом проекте, но реализация комплексной математики там примитивная).
Переходим к компиляции:
Код: Выделить всё
olej@notebook:~/2014_WORK/ManyLan$ javac triangle.java
Это команда перекомпилирует не только triangle.java, но и класс Complex, находящийся в отдельном файле Complex.java:
Код: Выделить всё
olej@notebook:~/2014_WORK/ManyLan$ ls *.class
Complex.class triangle.class Tric.class
Получили 3 файла... (в мои намерения совершенно не входит рассмотрение пакетов Java, их расположение по каталогам и импортирование ... самое нужное что есть в программировании Java - это предмет подробного рассмотрения, а не беглого сравнения).
Но это, по смыслу,
совершенно другая компиляция, чем в случае C/C++!!!
Выполнение (не хотелось возиться с форматирование числа знаков вещественного вывода
):
Код: Выделить всё
olej@notebook:~/2014_WORK/ManyLan$ java triangle
координаты вершин в формате: X Y
вершина № 1 : -1 0
вершина № 2 : 0 1
вершина № 3 : 1 0
треугольник: [-1.0,0.0] [0.0,1.0] [1.0,0.0]
периметр = 4.82842712474619
площадь = 1.0
---------------------------------
координаты вершин в формате: X Y
вершина № 1 :