Olej писал(а):
Следующий вариант, естественно, C++.
Следующий вариант, естественно
, Java:
Следующий вариант - Python:
Ещё вариант ... может кому-то показаться сильно неожиданным
- JavaScript.
Почему JavaScript?
- JavaScript считается языком для встраивания, большинство знают его как встраиваемый компонент в HTML, но всё гораздо шире: JavaScript отличный скриптовый инструмент для встраивания в большие сложные проекты, отличный пример - все VoIP SoftSwitch: Asterisk, FreeSWITCH, YATE.
- но для JavaScript есть и консольный интерпретатор - SpiderMonkey, отличный способ поупражняться
- JavaScript не объектный язык, но в нём есть "не чистая" объектность через прототипы объектов - очень оригинально, для сравнения
- в консольном JavaScript - минимальный API, всего пару десятков функций ... + методы существующих объектов-классов, но этого достаточно для построения развитых приложений, это достигается за счёт практически полного
отказа от типизации (на память приходит LISP и FORTH).
- чисто
интерпретирующий язык
- интересно для сравнения с Java, для начинающих - чтобы с первого поверхностного взгляда увидеть, что у JavaScript с Java нет
ничего общего ... кроме одного слова
Код: Выделить всё
#!/usr/bin/js -U
function Complex( re, im ) { // конструктор
this.x = re; this.y = im;
}
// определение методов экземпляра в объекте-прототипе конструктора ...
Complex.prototype.abs = function() {
return Math.sqrt( this.x * this.x + this.y * this.y );
}
Complex.prototype.arg = function() {
return Math.atan2( this.y, this.x );
}
Complex.prototype.sub = function( that ) {
return new Complex( this.x - that.x, this.y - that.y );
}
Complex.prototype.toString = function() {
return " [" + this.x.toFixed( 2 ) + "," + this.y.toFixed( 2 ) + "]";
}
// определение методов класса (static, friend)
Complex.sub = function( a, b ) {
return new Complex( a.x - b.x, a.y - b.y );
}
var nodes = 3;
var perimeter = function( triang ) { // функциональные литералы
var summa = 0.0;
for( i = 0; i < triang.length; i++ )
summa += Complex.sub( triang[ i ],
triang[ i == 0 ? triang.length - 1 : i - 1 ] ).abs();
return summa;
},
square = function( triang ) {
var side1 = triang[ 1 ].sub( triang[ 0 ] );
side2 = triang[ 2 ].sub( triang[ 0 ] );
return side1.abs() * side2.abs() *
Math.abs( Math.sin( side1.arg() - side2.arg() ) ) / 2.;
};
while( true ) {
print( "координаты вершин в формате: X Y" );
var i = 0;
var points = new Array( nodes );
while( i < nodes ) {
putstr( "вершина №" + ( i + 1 ) + " : " );
var s = readline()
if( s === null ) { // ^D
print( "завершение" );
quit();
}
var ws = s.split( ' ' );
if( ws.length !== 2 ||
isNaN( x = parseFloat( ws[ 0 ] ) ) ||
isNaN( y = parseFloat( ws[ 1 ] ) ) ) {
print( "ошибка" );
continue;
}
points[ i++ ] = new Complex( x, y );
delete x; delete y;
}
s = "треугольник:";
for( i in points ) s += points[ i ];
print( s );
print( "периметр = " + perimeter( points ).toFixed( 2 ) );
print( "площадь = " + square( points ).toFixed( 2 ) );
print( "---------------------------------" );
}
(там даже есть обработка ошибок ввода
)
Выполнение:
Код: Выделить всё
olej@notebook:~/2014_WORK/ManyLan$ js -U triangle.js
координаты вершин в формате: X Y
вершина №1 : -1 0
вершина №2 : 0 1
вершина №3 : 1 0
треугольник: [-1.00,0.00] [0.00,1.00] [1.00,0.00]
периметр = 4.83
площадь = 1.00
---------------------------------
координаты вершин в формате: X Y
вершина №1 : завершение
Практиковаться в JavaScript - очень интересно ... истинное удовольствие.
Сложность в том, что по консольному JavaScript и SpiderMonkey практически нет описаний, руководств...
Но, в какой-то степени достаточно (язык то маленький) 2-х источников:
1. описания
JS API на сайте Mozilla (которой и принадлежит SpiderMonkey).
2. книга вот такая, даже есть в переводе на русский язык:
Дэвид Флэнаган, JavaScript. Подробное руководство, 6-е издание
1080 страниц ... я был научным редактором издания этой книги, поэтому её помню.
Это из отзывов о книге на сайте издательства:
26 декабря 2013
Это единственная книга по JavaScript, которую можно назвать учебником по языку. Все другие книги, притендующие на звание "учебник" - хлам.