Пользовательские функции JScript
Обновлен: Ноябрь 2007
Хотя в JScript предлагается множество встроенных функций, можно создавать собственные функции. Определение функции состоит из оператора "function" и блока операторов JScript.
Определение пользовательской функции
Функция checkTriplet, показанная в следующем примере, принимает в качестве аргументов длины сторон треугольника. Она определяет, является ли данный треугольник прямоугольным. Для этого функция проверяет, составляют ли переданные стороны пифагоров треугольник (то есть равен ли квадрат гипотенузы сумме квадратов двух других сторон). При выполнении проверки функция checkTriplet вызывает две другие функции.
Обратите внимание на использование очень маленького числа (epsilon) в качестве эталонной переменной в варианте проверки для чисел с плавающей запятой. Если нельзя с уверенностью гарантировать, что все три проверяемых значения являются целыми числами, то целесообразно не использовать прямую проверку сторон на соответствие пифагорову треугольнику из-за неопределенностей и округлений, возникающих при вычислении чисел с плавающей запятой. Поскольку прямая проверка является более точной, код в данном примере определяет, является ли она допустимой, и в случае положительного ответа использует ее.
При определении этих функций аннотация типа не используется. В целях данного приложения гораздо удобнее, чтобы функция checkTriplet могла принимать как целочисленный тип данных, так и тип с плавающей точкой.
const epsilon = 0.00000000001; // Some very small number to test against.
// Type annotate the function parameters and return type.
function integerCheck(a : int, b : int, c : int) : boolean {
// The test function for integers.
// Return true if a Pythagorean triplet.
return ( ((a*a) + (b*b)) == (c*c) );
} // End of the integer checking function.
function floatCheck(a : double, b : double, c : double) : boolean {
// The test function for floating-point numbers.
// delta should be zero for a Pythagorean triplet.
var delta = Math.abs( ((a*a) + (b*b) - (c*c)) * 100 / (c*c));
// Return true if a Pythagorean triplet (if delta is small enough).
return (delta < epsilon);
} // End of the floating-poing check function.
// Type annotation is not used for parameters here. This allows
// the function to accept both integer and floating-point values
// without coercing either type.
function checkTriplet(a, b, c) : boolean {
// The main triplet checker function.
// First, move the longest side to position c.
var d = 0; // Create a temporary variable for swapping values
if (b > c) { // Swap b and c.
d = c;
c = b;
b = d;
}
if (a > c) { // Swap a and c.
d = c;
c = a;
a = d;
}
// Test all 3 values. Are they integers?
if ((int(a) == a) && (int(b) == b) && (int(c) == c)) { // If so, use the precise check.
return integerCheck(a, b, c);
} else { // If not, get as close as is reasonably possible.
return floatCheck(a, b, c);
}
} // End of the triplet check function.
// Test the function with several triplets and print the results.
// Call with a Pythagorean triplet of integers.
print(checkTriplet(3,4,5));
// Call with a Pythagorean triplet of floating-point numbers.
print(checkTriplet(5.0,Math.sqrt(50.0),5.0));
// Call with three integers that do not form a Pythagorean triplet.
print(checkTriplet(5,5,5));
После выполнения этой программы выводится следующий результат:
true
true
false