Основы языка Java
Задача 2.5.Напишите программу, вводящую три целых числа, и печатающую количество максимальных среди введенных чисел.
Для экономии места приведем только содержательную часть решения этой задачи.
Фрагмент программы (NumMaxVal3v1.java)
int nMax; if (a == b) { if (a == c) nMax = 3; else { if (a > c) nMax = 2; else nMax = 1; } } else { if (a > b) { if (a == c) nMax = 2; else nMax = 1; } else { if (b == c) nMax = 2; else nMax = 1; } } Xterm.println("Количество максимальных чисел = " + nMax);
Приведенная программа является достаточно громоздкой. Гораздо понятнее следующее решение той же задачи.
Фрагмент программы (NumMaxVal3v2.java)
if (a > b) max = a; else max = b; if (c > max) max = c; if (a == max) nMax += 1; if (b == max) nMax += 1; if (c == max) nMax += 1; Xterm.println("Количество максимальных чисел = " + nMax);
Здесь мы сначала определяем максимальное по величине число, а затем просто считаем количество равных этому значению величин. Следующая задача является более простой, но она позволит нам проиллюстрировать работу с логическими операторами.
Задача 2.6. Напишите программу, вводящую три целых числа, и печатающую Yes в том случае, если среди введенных чисел есть одинаковые, и No — иначе.
Текст программы
public class Equal3v1 { public static void main(String[] args) throws Exception { int a = Xterm.inputInt("Введите первое число -> "); int b = Xterm.inputInt("Введите второе число -> "); int c = Xterm.inputInt("Введите третье число -> "); if ( (a == b) || (a == c) || (b == c) ) Xterm.println("Yes"); else Xterm.println("No"); } }
Обратите внимание, что в данной программе использованы операторы условного Или ||, а не логического Или |. Это вполне типично — операторы логического Или | и логического И & на практике не используют — вместо них применяют условные операторы || и &&.
Как это следует из определений, если первый операнд дизъюнкции истинен, то независимо от значения второго операнда результатом будет истина. Аналогично в случае конъюнкции при ложном первом операнде значение второго операнда на результат не влияет — он всегда будет ложным. При выполнении условных операторов || и && исполняющая система Java не производит оценку второго операнда логического выражения, если результат ясен из значения первого операнда. Иногда это просто ускоряет вычисления, а иногда позволяет добиться и большего, как, например, в следующем программном фрагменте.
if (a==0 || b/a > 0) x = y;
При второй операнд оператора || вычисляться не будет и деления на ноль не произойдет, как это было бы в случае использования логического оператора Или |.
Можно изменить проверяемое условие среди чисел есть равные в рассмотренной выше программе на его отрицание среди чисел нет равных и переписать программу, заменяя оператор Или на И.
Фрагмент программы (Equal3v2.java)
if ( (a != b) && (a != c) && (b != c) ) Xterm.println("No"); else Xterm.println("Yes");
При решении рассматриваемой задачи можно обойтись без условных операторов, если вспомнить, что произведение чисел равно нулю тогда и только тогда, когда одно из них нулевое. Это позволяет написать следующую программу.
Фрагмент программы (Equal3v3.java)
if ((a-b)*(b-c)*(c-a) != 0) Xterm.println("No"); else Xterm.println("Yes");
И, наконец, заметим, что программа запишется короче, если заменить в ней оператор if-else на тернарный оператор условия ?:, общая форма записи которого имеет следующий вид:
выражение1 ? выражение2 : выражение3
Если результат вычисления первого выражения истинен, то выполняется выражение2 (второй операнд), а иначе — выражение3 (третий операнд). При использовании этой конструкции два последних ее выражения должны иметь один и тот же тип, в данном случае — строковый.
Фрагмент программы (Equal3v4.java)
Xterm.println( (a-b)*(b-c)*(c-a) != 0 ? "No" : "Yes" );
Задачи для самостоятельного решения
Задача 2.7.Напишите программу, вводящую два целых числа a и b, печатающую их, затем обменивающую значения этих переменных (так, чтобы новое значение a стало равно старому значению b, и наоборот) и вновь их печатающую, которая не использовала бы иных переменных, кроме и .
Задача 2.8.Напишите программу, вводящую три целых числа, и печатающую второе по величине, если оно существует, и No — иначе.
Задача 2.9.Напишите программу, вводящую действительное число, которая рассматривает это число, как координаты точки на прямой, и печатает расстояние от этой точки до отрезка .
Задача 2.10.Напишите программу, вводящую три целых числа, и печатающую с использованием всех возможностей класса Xterm как сами числа, так и их среднее арифметическое.
Задача 2.11.Напишите программу, вводящую действительные коэффициенты , и квадратного уравнения с положительным дискриминантом, находящую оба корня этого уравнения.