Опубликован: 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 >
Анастасия Халудорова
Анастасия Халудорова
подавляющее большиство фукций на пространстве последовательостей?
екатерина яковлева
екатерина яковлева
как получить сертификат,что для этого нужно?
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Антон Никитин
Антон Никитин
Россия, Хабаровск