Запускаем на выполнение эту программу.
Когда она запустится, надо щелкнуть мышкой в консоль и ввести значение A, как показано на рис. 2.2.
Рис. 2.2. Ввод значения А
Затем нужно ввести значение B, затем значение C.
После ввода C программа подсчитает корни и выведет их в консоль. После окончания работы программы Eclipse будет иметь вид:
Рис. 2.3. Вывод корней квадратного уравнения
Трассировка в Eclipse
Очень часто в процессе отладки программы помогает трассировка. Сейчас мы посмотрим, как трассировка выполняется в Eclipse.
Чтобы перейти в режим трассировки, нужно сначала поставить точку прерывания в тексте программы. В нашем примере поставим точку прерывания на 40 строку – строку, где производится конвертация ранее введенной строки s1 в переменную a.
Для установки точки прерывания нужно щелкнуть левой кнопкой мыши левее номера строки и выбрать из контекстного меню пункт Toggle Breakpoint, как это показано на рис. 2.4 ниже:
Рис. 2.4. Точка прерывания
После установки точки прерывания нужно запустить программу на выполнение в режиме Debug:
Рис. 2.5. Запуск программы в режиме Debug
При первом запуске в режиме Debug Вы можете получить подобное сообщение:
Рис. 2.6. Разрешаем доступ Eclipse в брандмауэре
Выберите «Разрешить доступ».
После ввода строк со значениями для a, b, c Eclipse выдаст Вам запрос на изменение перспективы. Ответьте ему Yes. Также желательно поставить галочку на Remember my decision, чтобы Eclipse делал такое же изменение каждый раз – см. рис. 2.7 ниже:
Рис. 2.7. Запрос на изменение перспективы
После переключения в перспективу Debug вы увидите такой вид Eclipse:
Рис. 2.8. Перспектива Debug в Eclipse
Теперь, чтобы трассировать (выполнять по шагам программу), нужно нажимать на клавиатуре F6 (Step Over – на рис. 2.9 помечено цифрой 1).
При пошаговом выполнении в Variables можно видеть текущее состояние переменных (цифра 2 на рис. 2.9), а в редакторе кода видеть, какая строка будет выполняться следующей (цифра 3 на рис. 2.9).
Рис. 2.9. Трассировка программы
Пройдя по шагам всю программу и дойдя до последнего вывода в коде, Вы получите такой вид Eclipse:
Рис. 2.10. Завершение трассировки
После окончания трассировки нужно перейти в Java перспективу. Для этого можно зайти в меню и выбрать Window/Open Perspective/Java, как это показано на рис. 2.11.
Рис. 2.11. Переход в Java перспективу
Снова наши поздравления – Вы выполнили трассировку Вашей программы в Eclipse!
Теперь, после первичного знакомства с Java и с Eclipse, мы перейдем к изучению управляющих конструкций Java. Вас ждут 3 работы – A, B и C, выполняя которые Вы освоитесь в Eclipse, а Java для Вас станет хорошим знакомым, с которым можно решать любые задачи. Вы готовы перейти к следующему этапу? Тогда – поехали!!!
Первая работа A – в ней Вы напишите программу на Java, в которой будут развилки, и в которой Вы попробуете все ранее рассмотренные инструменты Eclipse.
РАЗВИЛКИ
Развилки полные и усеченные
Практически в каждом алгоритме есть несколько путей его выполнения. Тот или иной путь выбирается в процессе выполнения алгоритма в зависимости от условий. Например, если мы обратимся к кулинарии и рассмотрим рецепт приготовления блинчиков, то при приготовлении блинчиков один вариант рецепта используется, если есть кефир, другой – если нет кефира, но есть, например, сметана.
В программировании такие ситуации описываются при помощи развилки.
Типичная развилка выглядит в Java так:
if (условное_выражение) {
Действие_1
} else {
Действие_2
}
В блок-схеме она выглядит так:
Рис. 3.1. Структура развилки
Пример – вычисление максимума из двух чисел – val1 и val2:
if (val1 > val2) {
max_val = val1;
} else {
max_val = val2;
}
В блок-схеме это выглядит так:
Рис. 3.2. Блок-схема вычисления максимума из двух чисел
Развилка, в которой есть и ветка if, и ветка else, называется полной.
Развилка, в которой есть только ветка if, а ветки else нет, называется усеченной развилкой. Код усеченной развилки в Java выглядит так:
if (условное_выражение) {
Действие_1
}
Блок - схема для усеченной развилки выглядит так:
Рис. 3.3. Структура усеченной развилки
Обратите внимание, что в блок-схеме ЕСТЬ ветка МИНУС, но на ней НЕТ ДЕЙСТВИЙ. При этом в тексте программы else нет совсем. Это важный момент!
Пример – вычисление минимума из трех чисел
Ниже представлена программа, которая находит и выводит минимальное из трех чисел. В реализации используются усеченные развилки.
public class Test1 {
public static void main(String[] args) {
int val1 = 9;
int val2 = 10;
int val3 = 6;
int min_val = val1; // берем за минимальный число val1
if (val2 < min_val) { // если второе меньше
min_val = val2; // то теперь минимальное val2
}
if (val3 < min_val) { // если третье меньше
min_val = val3; // то теперь минимальное val3
}
System.out.println("min_val = " + min_val);
}
}
Блок-схема для программы целиком выглядит так:
Рис. 3.4. Блок-схема программы поиска минимума из трех чисел
Вложенные развилки
Одна развилка разбивает программу на 2 пути выполнения. Часто путей выполнения программы больше, чем два. Чтобы выбрать один из них, требуется либо набор идущих друг за другом усеченных развилок, как в предыдущем примере, либо вложенные развилки.
Типичная вложенная развилка выглядит так:
if (условное_выражение1) {
Действие_1
} else {
if (условное_выражение2) {
Действие_2
} else {
Действие_3
}
}
В сокращенной записи используется последовательность else if в одной строке:
if (условное_выражение1) {
Действие_1
} else if (условное_выражение2) {
Действие_2
} else {
Действие_3
}
Блок-схема для вложенной развилки выглядит так:
Рис. 3.4. Структура вложенной развилки
Пример с вложенными развилками
Ниже представлена программа вычисления размера штрафа за превышение скорости, реализованная с использованием вложенных развилок:
public class Test2 {
public static void main(String[] args) {
int v_max = 40; // задано ограничение скорости
int v = 121; // задана скорость нарушителя
if ( v <= v_max) {
System.out.println("Все по правилам!");
} else if (v <= v_max + 20) {
System.out.println("не штрафуется");
} else if (v <= v_max + 40) {
System.out.println("500");
} else if (v <= v_max + 60) {
System.out.println("1000-1500");
} else if (v <= v_max + 80) {
System.out.println("2000-2500");
} else {
System.out.println("5000");
}
}
}
Блок-схема для этой программы выглядит так:
Рис. 3.5. Блок-схема программы вычисления размера штрафа (вложенные развилки)
Пример с усеченными развилками
Ниже представлена программа вычисление размера штрафа за превышение скорости, реализованная с использованием усеченных развилок:
public class Test2_1 {
public static void main(String[] args) {
int v_max = 40;
int v = 130;
if ( v <= v_max) {
System.out.println("Все по правилам!");
}
if ((v > v_max) && (v <= v_max + 20)) {
System.out.println("не штрафуется");
}
if ((v > v_max + 20) && (v <= v_max + 40)) {
System.out.println("500");
}
if ((v > v_max + 40) && (v <= v_max + 60)) {
System.out.println("1000-1500");
}
if ((v > v_max + 60) && (v <= v_max + 80)) {
System.out.println("2000-2500");
}
if (v > v_max + 80) {
System.out.println("5000");
}
}
}
Блок-схема для варианта с усеченной развилкой:
Рис. 3.6. Блок-схема программы вычисления размера штрафа (усеченные развилки)
Логические операции в Java
В примере с усеченными развилками используется операция «&&». Что это такое?
Это одна из логических операций. Вот список всех логических операций, которые могут использоваться для формирования условия развилки:
Таблица 3.1
Логические операторы
Оператор | Описание |
& | Логическое AND (И) |
&& | Сокращенное AND |
| | Логическое OR (ИЛИ) |
|| | Сокращенное OR |
^ | Логическое XOR (исключающее OR (ИЛИ)) |
! | Логическое унарное NOT (НЕ) |
Из таблицы видно, что && – это операция «сокращенное AND».
Таблица 1.4
Таблица истинности логических операторов
A | В | A OR B | || | A AND B & && | A XOR B ^ | NOT A ! |
false | false | false | false | false | true |
true | false | true | false | true | false |
false | true | true | false | true | true |
true | true | true | true | false | false |
В нашей задаче нам нужен именно AND, так как он позволяет задать условие, при котором должны соблюдаться два ограничения ОДНОВРЕМЕННО. Например, максимально разрешенная скорость составляет v=40 км/ч, а водитель едет со скоростью 79 км/ч, тогда сработает условие, которое предписывает ему штраф в 500 рублей:
if ((v > v_max + 20) && (v <= v_max + 40)) {
System.out.println("500");
}
Условие сработает, потому что обе части и (v > v_max + 20) и
(v <= v_max + 40) истинны.
Если же скорость водителя будет, например, v = 150 км/ч, то условие (v > v_max + 20) будет истинно, но условие (v <= v_max + 40) ложно, и все условие в целом будет ложно.
Обработка исключений
В современных языках программирования есть механизм обработки исключений.
В простейшем варианте использования он выглядит так:
try {
Строка_кода1_которая_может_выбросить_исключение;
Строка_кода2_которая_может_выбросить_исключение;
Строка_кодаN_которая_может_выбросить_исключение;
} catch (ИМЯ_КЛАССА_ИСКЛЮЧЕНИЯ Объект) {
Сюда_попадает_управление_когда_исключение_выброшено;
} catch (ИМЯ_КЛАССА_ИСКЛЮЧЕНИЯ2 Объект2) { Сюда_попадает_управление_когда_исключение2_выброшено;
}
Этого варианта конструкции try catch Вам будет достаточно для выполнения всех заданий из этих методических указаний.
Пример обработки исключений при чтении числа из консоли
Ниже приведен пример ввода целого числа t с консоли и вывода его снова в консоль – с обработкой всех возникающих исключений.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test3 {
public static void main(String[] args) {
int t;
try {
// !!! Здесь может быть выброшено исключение
// ввода-вывода
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
//Читаем из консоли строку
// !!! Здесь может быть выброшено исключение
// ввода-вывода
String s = br.readLine();
//конвертируем строку в число t
// !!! Здесь может быть выброшено исключение
// неправильного формата числа
t = Integer.parseInt(s);
//Ловим исключения ввода-вывода
} catch (IOException e) {
//Выводим сообщение об исключении в консоль
System.out.println("IOException: "
+ e.getMessage());
// завершаем работу программы
return;
//Ловим исключения неправильного формата числа
} catch (NumberFormatException e) {
//Выводим сообщение об исключении в консоль
System.out.println("NumberFormatException: "
+ e.getMessage());
// завершаем работу программы
return;
}
// Если исключений не было – дойдем до этого кода
// и выведем введенное значение t
System.out.println("t=" + t);
}
}
Пример решения задачи A
Ниже приведено решение для 0 варианта задачи A.
Вариант A.0
Для введенного числа t (температура на улице в конце января) вывести прилагательное, характеризующее температуру качественно.
Если t>–5, то вывести «Тепло».
Если –5>= t > –20, то вывести «Нормально».
Если –20>= t, то вывести «Холодно».
Текст программы:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class A_0 {
public static void main(String[] args) {
int t;
System.out.print("Введите t: ");
try {
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
//Читаем из консоли
String s = br.readLine();
//конвертируем строку в число
t = Integer.parseInt(s);
//Ловим исключения ввода-вывода
} catch (IOException e) {
//Выводим сообщение об исключении в консоль
System.out.println("IOException: "
+ e.getMessage());
// завершаем работу программы
return;
//Ловим исключения неправильного формата числа
} catch (NumberFormatException e) {
//Выводим сообщение об исключении в консоль
System.out.println("NumberFormatException: "
+ e.getMessage());
// завершаем работу программы
return;
}
// собственно вывод «Тепло», «Нормально» и «Холодно»
if (t >–5) {
System.out.println("Тепло!");
} else if (t > –20) {
System.out.println("Нормально!");
} else {
System.out.println("Холодно!");
}
}
}
Блок-схема программы:
Рис. 3.7. Блок-схема программы A.0
Дата: 2019-02-25, просмотров: 345.