Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

150 Глава 3

Практическое занятие

Программа CLR, использующая вложенные операторы if

Создайте консольную программу с кодом по умолчанию и модифицируйте функ- цию main () следующим образом:

Как всегда, новые строки кода выделены полужирным.

Описание полученных результатов

Логика этой программы в точности повторяет логику примера ЕхЗ_01 (фактиче- ски все операторы те же самые, за исключением операторов вывода и объявления letter). Я изменил тип этой переменной на wchar_t, поскольку тип Char име- ет несколько дополнительных возможностей, о которых я еще упомяну. Функция Console: :Read () читает одиночный символ с клавиатуры. Поскольку для вывода на- чального приглашения применяется Console: :Write (), символ новой строки не вы- водится, так что вы можете вводить символ в той же строке, что и приглашение.

Среда .NET Framework предлагает свои собственные функции в классе Char для преобразования кодов символов в верхний и нижний регистр. Это функции Char: : ToLower () и Char: : ToUpper (), и вы помещаете преобразуемый символ в качестве аргумента между скобками при вызове этих функций. Например:

Конечно, результат преобразования можно сохранить обратно в исходной пере- менной, как в следующем операторе:

Класс Char также предлагает функции IsUpper () и IsLower (), проверяющие ре- гистр символа. Вы передаете проверяемый символ этим функциям в виде аргумен-

Решения и циклы 151

та, а они возвращают значение 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 и модифи- цируйте код следующим образом:

ы уже немного знаете об объектах String, которые представляют набор симво- лов, поэтому можете применить цикл for each для итерации по символам строки. Давайте рассмотрим соответствующий пример.