Катер движется по течению реки из пункта в A в пункт B и обратно с собственной скоростью [latex]v[/latex] км/час. Скорость течения постоянна — [latex]u[/latex] км/час. Расстояние между пунктами составляет [latex]s[/latex] км. Для любых неотрицательных действительных значений расстояния и скоростей вычислите время в пути.
По условию, мы проверяем любые неотрицательные действительные значения, следовательно условие, что [latex]t[/latex] не может быть меньше нуля не выполняется только если скорость течения будет превышать скорость катера (т.е. он не сможет плыть против него). При нарушении этого условия или при получении 0 в знаменателе будем выводить -1.
Время в пути можно найти по формуле: [latex]t=\frac{s}{v}[/latex]
Так как к нашему условие добавляется влияние течения, то скорость по его направлению будет
[latex]v+u[/latex], а против — [latex]v-u[/latex]. Следовательно получаем формулу для нахождения времени, необходимого на преодоление пути от А до В и обратно:
Найти объём тетраэдра три стороны которого образованы векторами [latex]\overrightarrow{a}=(x_{a},y_{a},z_{a})[/latex], [latex]\overrightarrow{b}=(x_{b},y_{b},z_{b})[/latex], [latex]\overrightarrow{c}=(x_{c},y_{c},z_{c})[/latex]
Входные данные
Координаты векторов $a$, $b$, $c$.
Выходные данные
Объём тетраэдра.
Решение
Объем тетраэдра вычисляется по формуле: [latex]V=\frac{1}{6}\left | \vec{a},\vec{b},\vec{c} \right |[/latex], где внутри модуля стоит смешанное произведение векторов.
Метод — это функция или процедура, принадлежащая какому-то классу или объекту, которая определяет поведение программы, содержащимися в ней выражениями. Методы можно встретить в любом примере программы, даже в простом Hello World! используется метод main.
Может иметь выражение внутри (в примере: {trace(«Hello World»).
Рассмотрим данный пример.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classTest{
staticfunctionmain(){
varf=newFraction(3,3);
trace(f.toString());
}
}
classFraction{
publicvardiv:Int;
publicvarden:Int;
publicfunctionnew(x,y){
this.div=x;
this.den=y;
}
publicfunctiontoString():String{
return'Franction: $div/$den';
}
}
В данном примере есть метод toString() и конструктор, кроме main.
Методы могут принимать входные параметры, которые указывают в скобках. Обычно указывают тип параметров, однако иногда этого можно не делать, тогда задача определения типа отходит компилятору, который определяет его при вызове метода.
Тип возвращаемого значения записывается после его объявления через двойные скобки. В нашем случае метод возвращает значение типа String.
У нас все методы классов Franction публичные, что значит, мы можем обращаться к ним из класса Test.
Методы и поля могут переопределены для наследников базового класса. Использование переопределения в классе подразумевает, что у него есть родительский класс. Добавим в наш пример еще один класс — наследник Decimal и переопределим метод базового класса toString().
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
classTest{
staticfunctionmain(){
varf=newFraction(3,3);
trace(f.toString());
vard:Fraction=newDecimal(5,10);
trace(d.toString());
}
}
classFraction{
publicvardiv:Int;
publicvarden:Int;
publicfunctionnew(x,y){
this.div=x;
this.den=y;
}
publicfunctiontoString():String{
return'Franction: $div/$den';
}
}
classDecimalextendsFraction{
publicfunctionnew(x,y){
super(x,y);
}
override publicfunctiontoString(){
vard:Float=div/den;
return'Deimal: $d';
}
}
Переменная d явно определена как Fraction и во время компиляции «узнается» как переменная этого класса, но во время выполнения все равно находится правильный метод toString() в классе Decimal .
Наследник может обратиться к методам родителя, которые он переопределяет с помощью вызова super.methodName(). Это используется, например, в конструкторе наследника.