Лабораторная работа №5
Название работы
Обработка данных типа char и boolean. Условные выражения. Троичная условная операция (тернарный оператор) в Java.
Цель работы
Освоить работу с типами boolean и char, научиться применять методы класса Character для анализа символов, научиться составлять сложные условные выражения, изучить синтаксис и научиться применять троичную условную операцию Java.
Постановка задачи
- Ознакомиться с принципами хранения и обработки символов и логических значений в Java, а также с принципами построения логических выражений.
- Выполнить заданные операции над данными типа
charв окне кода. - Выполнить заданные операции над данными типа
booleanв окне кода. - Разработать и отладить программу, демонстрирующую использование типов
charиboolean, условных выражений, а также троичной условной операции (тернарного оператора).
Краткие теоретические сведения
Тип char
Тип char представляет коды символов Unicode. Код символа – это номер соответствующего символа в таблице Unicode. Код является 16-битовым целым значением (без знака). Дополнительные сведения о символах Unicode можно получить, обратившись к Интернет-ресурсам:
Число символов, которые можно закодировать с помощью 16 битов равно 216=65536 (диапазон значений кода символа ─ от 0 до 65535).
Преимущество Java: набор символов Unicode определяет полный набор интернациональных символов, который может представлять все символы, находящиеся во всех человеческих языках. Язык Java cсоздан для разработки апплетов «всемирного использования»! Недостаток: Использование Unicode несколько неэффективно для языков, подобных английскому, немецкому, французскому, чьи символы могут легко помещаться в 8 битах. (плата за «глобальную мобильность»).
Стандартный набор символов, известный как ASCII (включает буквы английского алфавита, цифры, символы пунктуации, специальные символы) располагается в интервале значений кодов от 0 до 127 (как обычно), а расширенный восьмиразрядный набор символов ISO-Latin-1 ─ в диапазоне от 0 до 255.
Фрагмент кодовой таблицы, содержащий кириллические символы приведен на рисунке 1.

Рисунок 1 - Фрагмент таблицы Unicode с кириллическими символами (www.unicode.org)
Тип char в Java по существу является подмножеством типа int, поэтому для типа char определены целочисленные операции, например, для данных типа char допустимо действие код ± целое. В программе программист действует с символами, а компилятор преобразует эти действия в работу с кодами. Следует обратить внимание, что при вычисления выражения, в котором используются целочисленные операции над символами, их коды преобразуются в значения типа int. Соответственно тип значения такого выражения – int. Если это значение присваивается переменной типа char, нужно использовать явное преобразование типа, например:
char ch = (char)('A'+'B');
Операции сравнения символов на самом деле сравнивают их коды.
В программе можно использовать переменные и литералы типа char.
Литерал типа char – это символ, заключенный в одиночные кавычки: 'z', '7', '+', '&', 'ю', 'Я' и т.д.
Символ можно задать также его кодом (целым числом в десятичной системе счисления), например:
char ch = 88;
Некоторые «символы» не имеют графического изображения. Такие символы кодируются особо, например, '\n' – новая строка, '\r' – возврат каретки, '\t' – табуляция. Некоторые символы имеют специальный смысл – одиночные и двойные кавычки, слэш. Литералы этих символов записываются при помощи символа \ : одиночная кавычка – '\'', двойная кавычка '\"', слэш – '\\'. Можно задать восьмеричный или шестнадцатеричный код символа: '\aaa' (не более трех восьмеричных цифр а) или '\uxxxx' (ровно четыре шестнадцатеричных цифры х). Такой способ задания называется escape-последовательностью. Основные escape-последовательности приведены на рисунке 2.

Рисунок 2 - Основные escape-последовательности
В практике программирования символы принято делить на категории: буквы, цифры, управляющие символы, пробельные символы и другие.
Различают также большие и маленькие буквы. Проверка того, что символ принадлежит определенной категории, предусмотрена в классе-оболочке Character. Так, Character.isDigit(x) возвращает true, если x – цифровой символ. Метод isLetter(x) проверяет, буква ли x. Имеются методы isLetterOrDigit(x) (х – буква или цифра?), isLowerCase(x) (x – маленькая буква?), isUpperCase(x) (x – большая буква?), isSpaceChar(x) (x – пробел?).
Метод Character.toUpperCase(x) возвращает большую букву, соответствующую букве − значению х (проверьте в панели кода: Character.toUpperCase('ж')). Метод Character.toLowerCase(x) сопоставляет маленькую букву, соответствующую букве − значению х.
Тип boolean
Булевский тип в Java – это простой тип boolean и класс-оболочка Boolean. Литералы типа boolean – это false и true («ложь» и «истина»). К булевскому типу применимы операции сравнения (== и !=) и операции булевой логики (рисунок 3)

Рисунок 3 - Операции булевой логики
Значения булевского типа получаются как результат арифметического сравнения значений других типов и/или как результат операций И (AND − &), ИЛИ (OR − |), Исключающее ИЛИ (XOR − ^), НЕ (NOT − !). Рисунок 4 демонстрирует правила выполнения этих операций (аналогичны действиям этих операций на битах целых чисел).

Рисунок 4 - Правила выполнения операций булевой логики
Сокращенные логические операции (&& и ||).
Как видно из рисунока 4, односимвольная операция ИЛИ приводит к true-результату, когда операнд А – true, независимо от того, каков B. Точно также операция И приводит к false-результату, когда А – false, независимо от того, каков В.
Если использовать двузначные формы (&& и ||) вместо однозначных (& и |), Java вообще не будет выполнять оценку правого операнда, если значение выражения полностью определяется значением левого операнда.
Использование сокращенной формы стало стандартной практикой в булевской логике, оставляя версии с одиночным символом исключительно для поразрядных операций целыми типами (хотя есть и исключения из этого правила).
Типовое применение булевского типа и операций с ним – хранение результатов проверки сложных условий. Например, (x > 2.0) & (x < 5.0) будет иметь значение true, если действительное x удовлетворяет неравенству 2.0 < x < 5.0 Выражение !(x > 2.0) истинно для тех же x, что и выражение (x ≤ 2.0).
Результаты булевских операций с константами и булевской переменной x:
!true→false!false→truex | true→true,x | false→xx & false→falsex & true→x
Троичная условная операция.
В Java определена троичная (с тремя операндами) условная операция, также называемая тернарным оператором (?:). Ее синтаксис:
expression1 ? expression2 : expression3
expression1 – выражение, имеющее значение типа boolean.
Если оно true, то вычисляется expression2, иначе (если expression1 − false), вычисляется expression3. Результатом условной операции является значение вычисляемого выражения. Требуется, чтобы expression2 и expression3 возвращали значение одного и того же типа, который не может быть void).
Пример демонстрирует предотвращение деления на нуль благодаря применению тернарного оператора:
ratio = denominator == 0 ? 0 : numerator / denominator;
ratio присваивается 0, если делитель denominator равен нулю, и результат деления в противном случае.
Порядок выполнения работы
Работа в BlueJ в окне кода с типом char
- Объявите
char-переменную и присвойте ей значение литерала – маленькой латинской буквы, например,'z'. Проверьте значение переменной, нажав Enters. - Измените значение переменной, уменьшив или увеличив его на небольшое целое число (здесь нужно использовать явное преобразование типа в
charдля выражения в правой части оператора присваивания – объясните почему). Проверьте значение переменной и сформулируйте свой вывод. - Наберите последовательно в окне кода:
Проанализируйте значения, возвращенные операциями сравнения, и сделайте соответствующие выводы.
'Q'<'F' 'F'<'Q' 'A'>'9' 'X'==88 'Y'=='X'+1 - Проверьте работу методов
toUpperCase()иtoLowerCase(). Для этого введите в панель кода следующие операторы:После ввода каждого оператора проверяйте значение соответствующей переменной. Проанализируйте результаты. Сделайте выводы.char a1= Character.toUpperCase ('v'); char a2= Character.toUpperCase ('V'); char a3= Character.toLowerCase ('Q'); char a4= Character.toLowerCase ('q'); - Проверьте работу методов
isLetter(),isDigit(),isLetterOrDigit()(аргументом методов является символ). Для этого введите в панели кода следующие операторы:После ввода каждого оператора проверяйте значение переменнойboolean b1=Character.isLetter('A'); b1=Character.isLetter('9'); b1=Character.isDigit('A'); b1=Character.isDigit('9'); b1= Character. isLetterOrDigit ('9'); b1= Character. isLetterOrDigit ('A'); b1= Character. isLetterOrDigit ('&');b1. Проанализируйте результаты. Сделайте выводы. - Определите десятичные и шестнадцатеричные коды маленьких и больших букв русского алфавита, набрав
например:
System.out.println((int)буква); // или System.out.printf("%x",(int)буква); // и System.out.println(Integer.toHexString((int)буква));Сделайте выводы.System.out.println((int)'Б'); System.out.printf("%x\n", (int)'Б'); System.out.println(Integer.toHexString((int)'Б')); System.out.println((int)'б'); System.out.printf("%x\n", (int)'б'); System.out.println(Integer.toHexString((int)'б'));
Работа в BlueJ в окне кода с типом boolean
- В панели кода введите:
Сделайте выводы.
boolean a=false; boolean q=true; a==q a!=q a<q a>q - В панели кода определите числовую переменную
xи булевскую переменнуюb. Вычислите значениеb = (x>2.0)&(x<5.0)приx=2.1. Повторите вычисление приx=5.3. Вычислитеb = (x>2.0)|(x<5.0)при тех же значенияхx. Приведите в отчете результаты и сделанные выводы. - Введите булевские переменные
c,d,e,f. Вычислитеeпо формуле:для всех возможных значенийe = ! ( c & d | true) | (! c | ! d)cиd. - Вычислите
f = (!(c|d)==(!c&!d))для всех возможных значенийcиd. - Составьте булевское выражение, которое истинно для значений
x, находящихся внутри отмеченных интервалов (рисунок 5). Значения границ интервалов выберите самостоятельно. Проверьте в окне кода значение выражения для значенийх, находящихся внутри интервалов и за пределами интервалов.
Рисунок 5 - Интервалы на оси X, в которых выражение должно быть истинно - Составьте булевское выражение, истинное для точек с координатами
(x,y), лежащих внутри прямоугольника (рисунок 6). Расположение прямоугольника на плоскости XOY выберите самостоятельно. Проверьте в окне кода значение выражения для точек, находящихся внутри прямоугольника и за его пределами.
Рисунок 6 - Область истинности выражения
Разработка программы для выполнения операций с данными типа char и boolean
- Разработайте программу согласно варианту задания.
- Проведите отладку программы и испытание на достаточном количестве тестовых примеров.
Напомним, что под тестом (тестовым примером) понимается набор входных данных и соответствующий ему набор выходных данных программы. Программист должен разработать для своей программы набор тестов, проверяющий все возможные случаи (ветви) реализации программы.
Варианты заданий
В качестве индивидуального задания на лабораторную работу предлагается разработать программу, вычисляющую значение символьной переменной a в зависимости от значений символьных переменных с и d. В программе для присвоения значения переменной a предлагается использовать тернарный оператор (троичную условную операцию). В окне терминала должны быть выведены значения переменных a, с и d в виде символов и в виде кодов символов для каждого тестового примера. Варианты заданий приведены ниже в таблице.
Вариант задания V необходимо вычислить по формуле
V = N % 14 != 0 ? N % 14 : 14,
где N – номер студента в списке группы.
| № п/п | Правило для вычисления значения переменной a |
|---|---|
| 1 | a=c+d, если с – цифра, d – буква, или с – знак '&'; a=c+2, в противном случае. |
| 2 | a=c–d, если с – буква, d – буква, с>d; a=047016 , в противном случае. |
| 3 | a=c, если с='A' или с='F' или с='a' или с='f', d – цифра; a=d, в противном случае. |
| 4 | a=c+10, если c – знак '#' или '@', d – не буква; a='G', в противном случае. |
| 5 | a= Character.toUpperCase(d), если с='Y' или '!', d – буква или цифра; a=c, в противном случае. |
| 6 | a= Character.toUpperCase(с), если с='y' или 'n', d – не знак '%';a=d, в противном случае. |
| 7 | a=c+20, если с='R' или 'r', d – не цифра и не буква; a=d; |
| 8 | a= Character.toLowerCase(c), если с – буква, d – цифра или буква или знак '*'; a=d++, в противном случае. |
| 9 | a= Character.toLowerCase(d), если с – цифра или знак '$', d – буква; a=c; |
| 10 | a=d––; если с = '@', или с – буква, или d – не цифра; a=c––, в противном случае. |
| 11 | a='Y', если с – буква или цифра, d – не буква и не цифра и не знак '#'; a='N', в противном случае. |
| 12 | a= Character.toUpperCase(с), если с – буква, но с не является буквами 'A' или 'a', d ='%'; a=d, в противном случае. |
| 13 | a=c+d, если c – буква, но не 'R', d – цифра, но не '9'; a='7', в противном случае. |
| 14 | a='5', если с='9' или с='0', d – не буква и не '#'; a=c++, в противном случае. |
Контрольные вопросы
- Для чего используется тип
char. Сколько битов занимает значение типаchar? - Что такое Unicode? Как представляется символ в
Java? Сколько символов можно представить соответствующим образом? - Как можно задать символьный литерал в программе? Назовите 3 способа.
- Как вывести код символа?
- Какие операции определены для типа
char? Приведите в качестве примера участок кода, требующий явного преобразования типаcharвintиintвchar. - По какому принципу выполняется сравнение символов? Чему равны значения выражений
'A'<'D','C'>'F','9'<'A'. Какого они типа? - С какими методами, реализующими функции над символами и определенными в классе-оболочке
Character, вы познакомились в ходе выполнения данной лабораторной работы? Значения каких типов они возвращают? - Для чего используется тип
boolean? Какой класс оболочка ему соответствует в Java? - Какие значения может принимать тип
boolean? - Чему равны значения выражений
2>5,3<10? - Какие операции определены для данных логического типа (
boolean)? - Назовите правила выполнения операций булевой логики.
- В чем состоит особенность выполнения сокращенных операций
&&и||? - Что из себя представляет условное выражение?
- Приведите пример сложного условного выражения. Чему равно его значение?
- Объясните синтаксис троичной условной операции (тернарного оператора). Приведите пример.
- Перечислите возможности текстового процессора Microsoft Word, которые вы использовали при выполнении отчета по лабораторной работе.