- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
150 Глава 3
Практическое занятие
Программа CLR, использующая вложенные операторы if
Создайте консольную программу с кодом по умолчанию и модифицируйте функ- цию main () следующим образом:
Как всегда, новые строки кода выделены полужирным.
Описание полученных результатов
Логика этой программы в точности повторяет логику примера ЕхЗ_01 (фактиче- ски все операторы те же самые, за исключением операторов вывода и объявления letter). Я изменил тип этой переменной на wchar_t, поскольку тип Char име- ет несколько дополнительных возможностей, о которых я еще упомяну. Функция Console: :Read () читает одиночный символ с клавиатуры. Поскольку для вывода на- чального приглашения применяется Console: :Write (), символ новой строки не вы- водится, так что вы можете вводить символ в той же строке, что и приглашение.
Среда .NET Framework предлагает свои собственные функции в классе Char для преобразования кодов символов в верхний и нижний регистр. Это функции Char: : ToLower () и Char: : ToUpper (), и вы помещаете преобразуемый символ в качестве аргумента между скобками при вызове этих функций. Например:
Конечно, результат преобразования можно сохранить обратно в исходной пере- менной, как в следующем операторе:
Класс Char также предлагает функции IsUpper () и IsLower (), проверяющие ре- гистр символа. Вы передаете проверяемый символ этим функциям в виде аргумен-
Решения
и
циклы
та, а они возвращают значение bool в качестве результата. Это можно использовать, чтобы закодировать main () несколько иначе.
Применение этих функций заметно упрощает код. После преобразования letter в верхний регистр вы проверяете преобразованное значение на вхождение в диапа- зон от 'А' до 1Z1. Если оно входит в этот диапазон, выдается сообщение, зависящее от выражения условной операции, которое формирует второй аргумент для функции WriteLine (). Условная операция возвращает "заглавную", если letter относится к верхнему регистру, и "прописную", если к нижнему, а результат вставляется в пози- цию выходной строки, отмеченную форматной строкой {0}.
Теперь посмотрите на другой пример CLR, использующий функцию Console: : ReadKey () в цикле и раскрывающий немного подробнее класс ConsoleKeylnf о.
Создайте консольную программу CLR и добавьте следующий код в main ():
Ниже показан результат работы этой программы.
'
Конечно, некоторые комбинации клавиш не представляют никакого отображаемо- го символа, поэтому в этих случаях никакие символы и не выводятся. Программа так- же завершается по нажатию <Ctrl+C>, потому что операционная система распознает эту комбинацию как команду завершения программы.
Описание полученных результатов
Нажатия клавиш проверяются в цикле do-while, и этот цикл продолжается до тех пор, пока не будет нажата клавиша <Esc>. Внутри цикла вызывается функция Console: :ReadKey (), и ее результат помещается в переменную keyPress, имею- щую тип ConsoleKeylnf о. Класс ConsoleKeylnf о имеет три свойства, обратившись к которым, можно получить вспомогательную информацию относительно нажатой клавиши или комбинации клавиш. Свойство Key идентифицирует нажатую клави- шу, свойство Key Char представляет код клавиши в кодировке Unicode, а свойство Modifiers — это битовая комбинация констант ConsoleModifiers, представляющих состояние клавиш Shift, Alt и Ctrl. ConsoleModif iers — перечисление, опреде- ленное в библиотеке System, и константы, определенные в нем, имеют имена Alt, Shift и Control.
Как можно видеть из аргументов функции WriteLine () в последнем операторе вывода, для доступа к свойству объекта необходимо поместить наименование свой- ства следом за именем объекта, отделив его точкой. Здесь точка — это операция до- ступа к члену. Чтобы получить доступ к свойству KeyChar объекта keyPress, вы должны написать keyPress .KeyChar.
Программа работает очень просто. Внутри цикла вызывается функция ReadKey () для чтения нажатия клавиши, и ее результат помещается в переменную keyPress. Далее с помощью функции Write () начальная часть вывода помещается в командную строку. Поскольку в этом случае не выводится символ новой строки, последующий вы- вод продолжается в той же строке. Затем выполняется проверка свойства Modifiers на предмет того, больше ли оно нуля. Если это так, значит, были нажаты модифици- рующие клавиши, и об этом выводится сообщение, в противном случае информация о модифицирующих клавишах пропускается. Возможно, вы помните, что перечисли- мые константы C++/CLI являются объектами, которые нужно явно привести к цело- численном типу, прежде чем использовать их как числовые значения — отсюда при- ведение к int в выражении if.
Интересен вывод Modifiers. Как видно из результирующего вывода программы, когда нажато более одной модифицирующей клавиши, вы получаете информацию о них всех в одном операторе вывода. Это потому, что перечисление Modifiers опреде- лено с атрибутом FlagsAttribute, который указывает на то, что этот перечислимый тип представляет набор отдельных битовых флагов. Благодаря этому переменные перечислимого типа могут состоять из нескольких флагов, объединенных вместе ло- гическим И, а индивидуальные флаги распознаются и выводятся функциями Write () и WriteLine().
Цикл продолжается до тех пор, пока истинно условное выражение keyPress .Key != ConsoleKey: :Escape. Оно возвращает false, когда свойство keyPress.Key принимает значение ConsoleKey: :Escape, что происходит при нажатии клавиши <ESC>.
Цикл for each
Все операторы циклов, о которых я говорил до сих пор, применяются как в языке ISO/ANSI С++, так и в C++/CLI. Но язык C++/CLI предлагает еще один роскошный тип цикла, называемый for each. Он предназначен специально для итерации по объ- ектам, принадлежащим к определенному набору, и поскольку вы пока ничего не зна- ете об этом, я кратко представлю здесь цикл for each, отложив более подробные пояснения на потом.
Создайте
новый проект консольной программы CLR
по имени ЕхЗ_17 и модифи-
цируйте код
следующим образом: