Опубликован: 27.09.2006 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный индустриальный университет
Лекция 2:

Основы языка Java

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >

Задача 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;

При a=0 второй операнд оператора || вычисляться не будет и деления на ноль не произойдет, как это было бы в случае использования логического оператора Или |.

Можно изменить проверяемое условие среди чисел есть равные в рассмотренной выше программе на его отрицание среди чисел нет равных и переписать программу, заменяя оператор Или на И.

Фрагмент программы (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, и наоборот) и вновь их печатающую, которая не использовала бы иных переменных, кроме a и b.

Задача 2.8.Напишите программу, вводящую три целых числа, и печатающую второе по величине, если оно существует, и No — иначе.

Задача 2.9.Напишите программу, вводящую действительное число, которая рассматривает это число, как координаты точки на прямой, и печатает расстояние от этой точки до отрезка [0,1].

Задача 2.10.Напишите программу, вводящую три целых числа, и печатающую с использованием всех возможностей класса Xterm как сами числа, так и их среднее арифметическое.

Задача 2.11.Напишите программу, вводящую действительные коэффициенты a, b и c квадратного уравнения a x^2 + b x + c = 0 с положительным дискриминантом, находящую оба корня этого уравнения.

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева