ОСНОВНЫЕ
СВЕДЕНИЯ
РОССИЙСКИЙ
КОМПЬЮТЕРНЫЙ
БЕСТСЕЛЛЕР
Москва
2023
УДК 004.43
ББК 32.973.26-018.1
В19
В19
Васильев, Алексей.
Программирование на C# для начинающих. Основные сведения /
Алексей Васильев. — Москва : Эксмо, 2023. — 592 с. — (Российский
компьютерный бестселлер).
ISBN 978-5-04-092519-3
В этой книге Алексей Васильев, доктор физико-математических наук
и автор популярных российских самоучителей по программированию,
приглашает читателей ознакомиться с основами языка C#. Прочитав ее,
вы узнаете историю языка, его структуру, ознакомитесь с типами данных
и переменными, операторами, циклами и множеством другой полезной
информации, необходимой для работы с этим языком.
УДК 004.43
ББК 32.973.26-018.1
Вв ед ен и е
ЯЗЫК С# И Т ЕХН ОЛОГИ Я
.NET FRAMEWORK
Русская речь не сложнее других. Вон Марга
дон - дикий человек - и то выучил.
из к/ф «Формула лю бви»
Язык С# уже многие годы неизменно входит в список языков програм
мирования, самых востребованных среди разработчиков программного
обеспечения. Язык является базовым для технологии .Net Framework,
разработанной и поддерживаемой корпорацией Microsoft. Именно язы
ку С# посвящена книга, которую читатель держит в руках.
И стория создания я з ы ка С#
История , леденящая кровь. Под маской овцы
скрывался лев.
из к/ф «Покровские ворота»
Язык С# создан инженерами компании Microsoft в 1998-2001 годах.
Руководил группой разработчиков Андерс Хейлсберг, который до того
трудился в фирме Borland над созданием компилятора для языка Pascal
и участвовал в создании интегрированной среды разработки Delphi.
Язык С# появился после языков программирования С++ и Java. Бога
тый опыт их использования бьш во многом учтен разработчиками С#.
G)
Н А ЗАМ ЕТ КУ
Си нтаксис языка С# похож н а синтаксис языков С++ и Java. Но сход
ство внешнее. У языка С# своя ун и кал ьная кон це п ция . В месте с тем
м ногие управля ющие инструкци и в языке С# будут знакомы тем , кто
п рограм м и рует в С++ и Java .
7
Вв едение
Вообще же из трех язы ков п рогра м м и рования С++ , Java и С# исто
рически первым поя вился язы к С++ . Затем на сцену вы шел язык
Java. И уже после этого появился язы к п рограм м и рования С# .
Для понимания места и роли языка С# на современном рынке про
граммных технологий разумно начать с языка программирования С, ко
торый в свое время стал мощным стимулом для развития программных
технологий как таковых. Именно из языка С обычно выводят генеало
гию языка С#. Мы тоже будем придерживаться классического подхода.
Язык программирования С появился в 1 972 году, его разработал Де
нис Ритчи. Язык С постепенно набирал популярность и в итоге стал
одним из самых востребованных языков программирования. Этому
способствовал ряд обстоятельств. В первую очередь, конечно, сыграл
роль лаконичный и простой синтаксис языка. Да и общая концепция
языка С оказалась исключительно удачной и живучей. Поэтому ког
да встал вопрос о разработке нового языка, который бы поддерживал
парадигму объектно ориентированного программирования (ООП),
то выбор естественным образом пал на язык С: язык программирова
ния С++, появившийся в 1 983 году, представлял собой расширенную
версию языка С, адаптированную для написания программ с привлече
нием классов, объектов и сопутствующих им технологий. В свою оче
редь, при создании языка программирования Java отправной точкой
стал язык С++. Идеология языкаjаvа отличается от идеологии языка
С++, но при всем этом базовые управляющие инструкции и операторы
в обоих языках схожи.
G)
Н А ЗАМ ЕТ КУ
Язы к п рограм м и рования Java официально появился в 1 995 году
и стал популярн ы м благодаря ун иверсал ьности п рограм м , нап и
санных на этом языке . Технология , испол ьзуемая в Java, позволяет
п исать переноси м ы е п рограм м н ы е коды , что искл юч ител ьно важно
при разработке п р ил ожени й для испол ьзован ия в lпternet.
Нет ничего удивительного, что при создании языка программирова
ния С# традиция была сохранена: синтаксис языка С# во многих мо
ментах будет знаком тем, кто уже программирует на С++ и Java. Хотя
такое сходство - внешнее. Языки очень разные, поэтому расслабляться
не стоит. Да и базовые синтаксические конструкции в языке С# имеют
свои особенности. Все это мы обсудим в книге.
8
Я зык С# и технология .Net Framework
Особен ности я з ы ка С#
Обо мне придумано столько небылиц, что
я устаю их опровергать.
из к/ф �Формула лю бви»
Язык программирования С#
-
простой, красивый, эффективный и гибкий.
С помощью программ на языке С# решают самые разные задачи. На С#
можно создавать как небольшие консольные программы, так и програм
мы с графическим интерфейсом. Код, написанный на языке С#, лаконичен
и понятен (хотя здесь, конечно, многое зависит от программиста). В этом
отношении язык программирования С# практически не имеет конкурентов.
G)
Н А ЗАМ ЕТ КУ
Язык С# создавался после появления языков С++ и Java. В С# были
учтен ы и по возможности устранены «недостатки » и «недоработки » ,
которые есть в С++ и Java. Иногда язык С # упоминается как усовер
шенствованная версия языков С++ и Java, хотя концепции у них со
вершенно разн ые, так что утверждение довол ьно поверхностно .
Кроме собственно преимуществ языка С # , немаловажно и то, что язык
поддерживается компанией Microsoft. Поэтому он идеально подходит,
чтобы писать программы для выполнения под управлением операцион
ной системы Windows.
�
ПОДРОБН ОСТИ
Операционной системой Windows и технологией . Net Framework ком
п а н и и Microsoft область применения языка С # не огран ичи вается .
Существуют ал ьтернати вные п роекты (такие, например, как М опо ) ,
позволя ющие выпол нять п рограм м ы , написанные н а языке С#, под
управлением операционных систем , отличных от Windows. Вместе
с тем мы в кн и ге будем исходить из того , что испол ьзуются « родн ые»
средства разработки и операционная система Windows.
Как отмечалось выше, язык С# является неотъемлемой частью тех
нологии (или платформы) .Net Framework. Основу платформы .Net
Framework составляет среда исполнения CLR (сокращение от Common
Language Runtime) и библиотека классов, которая используется при
программировании на языке С#.
9
Вв едение
G)
Н А ЗАМ ЕТ КУ
Платформа .Net Framework позволяет испол ьзовать и иные языки
программирования, а не только С# - нап ример, С++ или Visual Basic .
Возможности платформы .Net Framework позволяют объединять
«В одно целое» п рограммные коды , написанные на разных языках
программирования. Это очень мощная технологи я , но для нас инте
рес представляет написание програм мных кодов на языке С#. Имен
но особенности и возможности языка С# м ы будем обсуждать в кн иге .
При компилировании программного кода, написанного н а языке С # , соз
дается промежуточный код. Это промежуточный код реализован на языке
M SIL (сокращение от Microsoft Intermediate Language ). Промежуточный
код выполняется под управлением системы CLR. Система CLR запускает
JIТ-компилятор (сокращение от Just In Time ), который, собственно, и пе
реводит промежуточный код в исполняемые инструкции.
�
ПОДРОБН ОСТИ
Файл с программным кодом на языке С# сохраняется с расширени
ем cs. После компиляции п рограм мы создается файл с расширени
ем е х е . Но выполнить этот файл можно тол ько на комп ьютере, где
установлена система .Net Framework. Такой код называется управля
емым ( поскол ьку он выполняется под управлением системы CLR) .
.
.
Описанная нетривиальная схема компилирования программ с привле
чением промежуточного кода служит важной цели. Дело в том, что тех
нология .Net Framework ориентирована на совместное использование
программных кодов, написанных на разных языках программирования.
Базируется эта технология на том, что программные коды с разных язы
ков программирования «переводятся� (в процессе компиляции) в про
межуточный код на общем универсальном языке. Проще говоря, коды
на разных языках программирования приводятся «К общему знаменате
лю�, которым является промежуточный язык M SIL.
�
ПОДРОБН ОСТИ
П рограм м ы , написанные на Java, тоже компилируются в промежуточ
ный байт- код. Байт- код выполняется под управлением ви ртуальной
машины Java. Но по сравнени ю с языком С# имеется принци пиал ьное
отличие. Байт- код, в который переводится при компиляции Jаvа- про
грам ма, имеет при вязку к одному языку программирования - языку
10
Я зык С# и технология .Net Framework
Java. И в Java схема с промежуточным кодом нужна для обеспечения
универсальности программ , поскольку промежуточный байт- код не за
висит от типа операционной системы (и поэтому переносим ) . Особен
ность операционной системы учитывается той виртуальной машиной
Java, которая установлена на компьютере и выполняет промежуточный
байт- код. Промежуточный код, который испол ьзуется в технологии
.Net Framework, не привязан к конкретному языку программирования.
Например, что при компиляции программы на языке С# , что при ком
пиляции программы на языке Visual Basic получаются наборы инструк
ций на одном и том же промежуточном языке MSIL. И нужно это, еще
раз подчеркнем , для обеспечения совместимости разных программ
ных кодов, реализованных на разных языках.
Весь этот процесс для нас важен исключительно с познавательной точки
зрения. Более принципиальными являются вопросы, касающиеся осо
бенностей собственно языка С#.
Первое, что стоит отметить: язык С# полностью объектно ориентиро
ванный. Это означает, что даже самая маленькая программа на языке С#
должна содержать описание хотя бы одного класса.
G)
Н А ЗАМ ЕТ КУ
Здесь есть методологическая проблема. Состоит она в том , что не
подготовленному ч итател ю сложно восприни мать концепцию ООП
сразу, без п редварител ьной подготовки . М ы найдем выход в том ,
чтобы испол ьзовать определенный шаблон п р и написании п ро
грам м . Затем , по мере знакомства с языком С# , м ногие моменты
станут просты м и и п онятн ы м и .
Как отмечалось выше, базовые синтаксические конструкции языка С #
напоминают (или просто совпадают) соответствующие конструкции
в языках С++ и/или Jаvа. Но, кроме них, язык С# содержит множество
интересных и полезных особенностей, с которыми мы познакомимся
в книге.
�
ПОДРОБН ОСТИ
Знакомым с языками п рограммирован ия С++ и/или Java будет
полезно узнать, что в языке С# , как и в языке С++ , испол ьзуются
п ространства имен , указатели , существует переопределение опе
раторов. Также в С# , как и в Java, имеются и нтерфейсы , объекты
реал изуются через ссыл ки , испол ьзуется система автоматической
11
Вв едение
«уборки мусора » . А еще в С# испол ьзуются делегаты , кон цепция
которых идеологически бл изка к концепции указателей на фун кци и
в С++ . М ассивы в С# бол ьше напоми нают массивы Java , но вооб
ще в С# они достаточ н о специфич н ы е . И ндексаторы в С# позво
л я ют и ндексировать объекты - подобн ы й механ изм , основа н н ы й
на переоп редел е н и и оператора « квадратн ые скобки » , есть в С++ .
Свойства, которые испол ьзуются в С#, представл я ют собой нечто
среднее между полем и методом , хотя , конеч н о , бол ьше напомина
ют п ол е с особы м режи мом доступа .
Есть в языке С# и �классические� механизмы, характерные для боль
шинства языков, поддерживающих парадигму ООП. Мы познакомим
ся с тем, как на основе классов и объектов в языке С# реализуется ин
капсуляция, узнаем, что такое наследование и как в С# используется
полиморфизм. Будет много других тем и вопросов, которые мы изучим.
Например, мы узнаем (во второй части книги), как в С# создаются при
ложения с графическим интерфейсом, и познакомимся с основными
подходами, используемыми при создании многопоточных приложений.
Но обо всем этом - по порядку, тема за темой.
П рограммное обеспе ч ение
Показывай свою гравицану. Если фирменная
вещь - возьмем !
из к/ф -«Кин-дза-дза»
Для работы с языком программирования С# на компьютере должна
быть установлена платформа .Net Framework. Компилятор языка С#
входит в стандартный набор этой платформы. Поэтому, если на компью
тере установлена платформа .Net Framework, этого достаточно для нача
ла программирования в С#. Обычно дополнительно еще устанавливают
среду разработки, благодаря которой процесс программирования на С#
становится простым и приятным.
Если мы хотим написать программу (на языке С#), сначала нам нужно
набрать соответствующий программный код. Теоретически сделать это
можно в обычном текстовом редакторе. В таком случае набираем в тек
стовом редакторе код программы и сохраняем файл с расширением . c s
(расширение для файлов с программами, написанными н а языке С#).
12
Я зык С# и технология .Net Framework
После того как код программы набран и файл с программой сохранен,
ее следует откомпилировать. Для этого используют программу-компи
лятор c s c . ехе, которая устанавливается, как отмечено выше, при уста
новке платформы .Net Framework.
�
ПОДРОБН ОСТИ
Ал горитм действи й тако й : в командной строке указывается назва
ние п рограм м ы - ком пилятора csc.ехе , а затем через п робел ука
зы вается название файла с п рограммой на языке С# . Допусти м ,
м ы записал и код п рограм м ы в файл MyProgram. cs. Тогда для ком
пиляции программы в командной строке испол ьзуем инструкци ю
csc. ехе MyProgram. cs или csc MyProgram. cs ( расш ирение ехе
файла можно не указы вать ) . Есл и ком п ил я ция проходит нормально,
то в резул ьтате получаем файл с расш ирением . ехе , а название
файла совпадает с названием исходного файла с п рограммой ( в на
шем случае это MyProgram. ехе ) . Полученный в резул ьтате ком п ил я
ци и ехе-файл запускают на выполнение.
Файл csc.exe п о умолчан и ю находится в каталоге C : \ Window s \
Microsoft. NET\ Framework внутри папки с номером верси и - на
пример, vЗ. 5 или v4. О. Также для ком п ил и рован ия п рограммы
из командной строки п ридется , скорее всего , выпол н ить некоторые
допол н ител ьные настройки - например, в переменных среды за
дать путь для поиска ком п илятора csc. ехе .
Хотя такая консольная компиляция вполне рабочая, прибегают к ней
редко. Причина в том, что не очень удобно набирать код в текстовом
редакторе, затем компилировать программу через командную строку
и запускать вручную исполнительный файл. Намного проще восполь
зоваться специальной программой интегрированной средой разработ
ки (ID E от Integrated Development Environment ). Среда разработки со
держит в себе все наиболее важные «ингредиенты» , необходимые для
«приготовления» такого «блюда», как программа на языке С#. При ра
боте со средой разработки пользователь получает в одном комплекте ре
дактор кодов, средства отладки, компилятор и ряд других эффективных
утилит, значительно облегчающих работу с программными кодами. Мы
тоже прибегнем к помощи среды разработки. Нам понадобится прило
жение Microsoft Visual Studio.
-
Загрузить установочные файлы можно с сайта компании Microsoft
. m i c r o s o f t . сот (на сайте следует найти страницу загрузок).
www
13
Вв еде н ие
После установки среды разработки мы получаем все, что нужно для
успешной разработки приложений на языке С#.
�
ПОДРОБН ОСТИ
Приложение Microsoft Visual Studio я вляется ком мерчески м . Одна
ко у него есть неком мерческая «уп рощенная» версия Visual Studio
Express , которая впол н е подойдет для изучения языка п рогра м м и
рования С#.
G)
Н А ЗАМ ЕТ КУ
Кроме языка программ ирован ия С# среда разработки Visual Studio
позволяет создавать п рограм м ы на языках Visual Basic и С++ . Часть
настроек, вл ияющих на фун кциональность среды разработки , оп ре
деляется в процессе установки .
Как выглядит окно приложения Visual Studio Express (версия 2 0 1 5), по
казано на рис. В. 1 .
og<
Namt
�
1
;Х
. 1c:J�1 I
МodiftIO
19.01.2017
Optn solution
• 9 х
Loc.1tion
IJ,\Wmpla\Мyl'App\МyFApp.lln
1 ( №w soluьon )
EnorJ
loo&тo11l�n91 !«toм....9ts!
t..м
Ptopcmts
•
9 х
Descr1ptюn
Tooh
so
Рис. 8.2. Окно среды разработки SharpDevelop
Загрузить все необходимые файлы для установки среды разработки
SharpDevelop можно на сайте проекта www. i c s h a rp c o de . n e t .
Еще один проект, заслуживающий внимания, называется Mono
(сайт поддержки проекта www. mo n o - p r o j e c t . c om). Проект раз
вивается в основном благодаря поддержке компании Xamarin (сайт
www. xama r i n . c om). В рамках этого проекта была создана среда
15
Вв еде н ие
разработки MonoDevelop (сайт www. mo n o deve l op . сот ) , предназна
ченная, кроме прочего, для создания приложений на языке С#. На дан
ный момент разработчикам для установки предлагается среда разработ
ки Xamarin Studio, которая позиционируется как продолжение проекта
MonoDevelop. Окно среды разработки Xamarin Studio показано на рис. В.3.
X.m1nn Stud10 Communrty
FИ
Edit
Vw:w
Dtl
lt -
Seмch
Pro,ect
Ot-fм.itt.
Buitd
Run
V�sion Controe
Toots
Window
Htfp
Creating а
Fluld
Android UI
11ps for
Smooth and
As developers, we mnt to buld
moЬlt Jpps that are not on}'f
beautiul 1nd fearure.«h, but alsa
hlgh-oerformonce. We often tl>�
Юout WJYS we an optmzt our
network а15 and background
oPtr.llЬOn.s
#DocumentDB loves
Acqualnt
1- Down�d SoluЬon
Xamarln: Planet Scale
МоЫlе Арр ln Ave
steps
Тh.1$ IS J specQI OUest post from tht
DcкumentOB tеащ wrtten Ьу Кd
G;мytyuk. К111 works •t мo:rosol't on
the OOt•"""• N
w�
н.tр
� Anкh.
-
х
•
Discover what's new in Express 2015 for V
futUtn�bprи. lSfOfV!
Lwn•�
Sн�in...... -.1he.NПfr•IN'WOl'll.
Eapo1 ... ll\-tul 1 rlfWJn°I� �>IUdlo fцм S.М.:t1
�...iop
Rt:•dy to Cktud·powef your �е?
Connect to Azure
�t·•
@
r..,
1tк.......
а
P...ctf'lll PtO]«Ь-6Solwoм
ш
,...,....
Рис. 1 . 1 . Создание нового проекта в окне среды разработки Microsoft Visual
Studio Express
27
Глава 1
G)
Н А ЗАМ ЕТ КУ
Для создания нового п роекта можно воспол ьзоваться п и ктограм
мой на панел и инструментов или нажать комбинацию клавиш
++ .
В результате появляется окно создания нового проекта, показанное
на рис. 1 .2 .
Для изменения порядка вычисления выражений можно использовать
круглые скобки.
G)
Н А ЗАМ ЕТ КУ
Помимо своего прямого назначения - изменения порядка выч исле
ния п одвы ражений - круглые скобки облегчают чтение п рограм м
ного кода . Так что и х нередко испол ьзуют и в «декоративных» целях,
когда прямой необходимости в этом нет.
П римеры п рограмм
Я тебя полюбил - я тебя научу.
из к/ф «Кин-дза-дза»
Далее мы рассмотрим несколько очень простых иллюстраций к тому, как
базовые операторы языка С# могут использоваться на практике. Снача
ла мы создадим программу, предназначенную для проверки введенного
пользователем числа на предмет четности/нечетности.
G)
Н А ЗАМ ЕТ КУ
Ч исло назы вается четн ы м , есл и оно дел ится на 2 - то есть есл и
при делении на 2 в остатке получаем О . Есл и ч исло на 2 не дел ится ,
то оно назы вается нечетн ы м .
Программа выполняется просто: появляется диалоговое окно с полем
ввода, в которое пользователю предлагается ввести целое число. Далее
появляется еще одно диалоговое окно с сообщением о том, что пользова
тель ввел четное или нечетное число. Код программы представлен в лис
тинге 2 . 1 .
106
Базовые типы и операто ры
[1i!] л истинг 2. 1 . Проверка числа на четность/нечетность
u s ing Sys tem;
u s ing Sys tem . Windows . Forms ;
u s ing Micros oft . VisualBas i c ;
c l a s s OddEvenDemo {
s tatic vo id Main ( ) {
1 1 Целочисленные переменные :
int numЬer, reminde r ;
1 1 Считывание целого числа :
numbe r=Int 3 2 . Parse (
Interaction . I nputBox (
1 1 Текст в окне :
"Введите целое число : " ,
1 1 Название окна :
" Проверка " )
);
1 1 Вычисляется остаток о т деления на 2 :
reminder=numЬer% 2 ;
s t ring txt= " Bы ввели " ;
1 1 Использован тернарный оператор :
txt+= ( reminder==O ? " чeтнoe " : " нeчeтнoe " ) + " число ! " ;
Me s s ageBox . Show ( txt ) ;
В программе используются две целочисленные переменные numb e r
и reminde r - соответственно, для запоминания введенного пользова
телем числа и остатка от деления этого числа на 2 . Для считывания чис
ла использован статический метод I nputBox ( ) класса I nt e r a c t i o n
(для использования этого класса в заголовке программы взята инструк
ция u s i n g Mi c r o s o ft . Vi s u a l B a s i c ) . Аргументами методу пере
дается два текстовых значения: текст, отображаемый над полем ввода,
и название (заголовок) для окна. Метод I np u t B o x ( ) значением воз
вращает введенное пользователем значение, но значение возвращается
107
Глава 2
в текстовом формате. Для преобразования текстового представления
числа в целое число используем статический метод P a r s e ( ) из струк
туры I n t 3 2 (структура доступна после подключения пространства имен
S y s t e m командой u s i n g S y s t em). В частности, инструкция вызова
метода I nputBox ( ) передана аргументом методу P a r s e ( ) . Результат
преобразования присваивается значением переменной n umbe r.
Командой remi n de r=numb e r % 2 в переменную reminde r записывает
ся остаток от деления значения переменной numb e r на 2 . Переменная
reminde r в принципе может принимать всего два значения: О при чет
ном значении переменной numb e r и 1 при нечетном значении перемен
ной numb e r .
Текстовая переменная t x t объявляется с начальным значением " В ы
вв ели " . Нам эта переменная нужна для того, чтобы записать в нее текст,
который затем будет отображаться во втором диалоговом окне. Следу
ющей командой t x t + = ( r e m i nde r== O ? " ч e т н o e " : " н е ч е т н о е " ) +
" число ! " к текущему значению этой переменной дописывается недо
стающая часть. Здесь в подвыражении в правой части мы использовали
тернарный оператор. Речь об инструкции remi n de r = = O ? " ч e т н o e " :
" нече т н о е " . Значение этого выражения определяется так: если зна
чение переменной r em i n de r равно О, то значение выражения равно
" че т ное " . В противном случае (если значение переменной reminde r
отлично от О ) значение выражения равно " н ече т н о е " . Таким обра
зом, в текстовое значение переменной t x t включается слово " че т н о е "
или " н ече т н о е " в зависимости от значения переменной r em i n d e r .
После того как значение переменной t x t сформировано, командой
Me s s ageBox . S how ( txt ) отображается диалоговое окно с соответству
ющим сообщением (для использования класса Me s s ageBox используем
инструкцию u s i n g S ys tem . Wi ndows . F o rms в заголовке программы).
При запуске программы на выполнение появляется окно с текстовым
полем. На рис. 2 . 1 показано такое окно с числом 1 2 3 в поле ввода.
Прооер"
Вее.аопе uелое число:
123
Рис.
1 08
2. 1 . В поле введено нечетное ч исло
Базовые типы и операто ры
После щелчка по кнопке ОК появляется новое окно с сообщением о том,
что число нечетное. Окно показано на рис. 2.2.
В ы ааищ нечетное число!
ок
Рис .
2 . 2 . Окно с соо б щением о том , что б ыло введено нечетное ч и сло
На рис. 2.3 показано начальное диалоговое окно с числом 1 24 в поле ввода.
Прооероtа
1 24
Рис .
2.3. В поле введено четное ч исло
Если так, то вторым появится окно с сообщением о том, что пользова
тель ввел четное число. Окно показано на рис. 2 .4.
Вы ваvш четное Ч\IСЛО!
ок
Рис. 2 . 4 . Окно с соо б щением о том ,
что б ыло введено четное ч исло
При этом стоит также заметить, что если пользователь в поле ввода
в первом окне введет не число или вместо кнопки ОК щелкнет кноп
ку Отмена (или закроет окно с помощью системной пиктограммы),
то в программе произойдет ошибка. В принципе, подобные ситуации
легко обрабатываются. Но пока что нас этот вопрос занимать не будет.
В следующей программе для числа, введенного пользователем, опреде
ляется количество сотен (в десятичном представлении числа это третья
цифра справа). В листинге 2.2 представлен код программы.
109
Глава 2
[1i!] л истинг 2.2 . Количество сотен в числе
us ing Sys tem;
us ing Sys tem . Windows . Forms ;
us ing Micros oft . Vi sualBas i c ;
c l a s s Hundreds Demo {
s tatic vo id Main ( ) {
/ / Целочисленные переменные :
int numЬe r , hundreds ;
/ / Считывание целого числа :
numbe r=Int 3 2 . Parse (
Interaction . I nputBox (
/ / Надпись над полем ввода :
" Введите целое число : " ,
/ / Заголовок окна :
" Количество сотен " )
);
/ / Количество сотен в числе ( для целочисленных
/ / операндов деление выполняется нацело ) :
hundreds=numbe r/ 1 0 0 % 1 0 ;
/ / Текстовая переменная :
s t ring txt= " B этом числе "+hundreds+" сотен ! " ;
/ / Отображение окна с сообщением
// ( аргументы метода - сообщение и заголовок окна ) :
Me s s ageBox . Show ( tx t , " Coтни" ) ;
Эта программа напоминает предыдущую - как минимум в части счи
тывания целочисленного значения. Число, введенное пользователем,
записывается в переменную numb e r . Затем выполняется команда
hundr e d s =numЬe r / 1 0 0 % 1 0 , благодаря чему в переменную hundreds
записывается количество сотен в числе. Вычисления выполняются так:
значение переменной numb e r делится на 1 0 0 . Здесь нужно учесть, что
110
Базовые типы и операто ры
для целочисленных операндов выполняется целочисленное деление.
Поэтому деление числа на 1 О О означает фактически отбрасывание двух
последних цифр в представлении числа. Как следствие, третья справа
цифра в значении переменной numb e r �перемещается� на последнюю
позицию (первую справа).
G)
Н А ЗАМ ЕТ КУ
Значение переменной numЬer не меняется . Речь идет о значении вы
ражения numЬe r / 1 О О по сравнению со значением переменной numЬer .
Далее вычисляется остаток от деления на 1 О значения выражения
n umbe r / 1 0 0 (выражение numbe r / 1 0 0 % 1 0 ). Результат записывается
в переменную hundr e d s .
В программе объявляется текстовая переменная t x t с о значением
"В э т ом числе " +hundreds+ " сотен ! " , в котором использована пере
менная hundreds. Переменную txt используем в команде Me s s ageBox .
Show ( txt , " Со тни " ) для отображения окна с сообщением (первый аргу
мент определяет текст сообщения, а второй задает заголовок окна).
На рис. 2.5 показано окно с полем, содержащим введенное пользовате
лем число.
Ко11ичкт110 соте:н
Рис .
2. 5 . В поле введено целое ч исло для оп ределения кол ичества сотен в ч исле
После щелчка по кнопке ОК появляется окно с сообщением, показанное
на рис. 2.6.
Сотни
В ]ТОМ чиСJ'lе S сотен!
ок
Рис .
2 . 6 . Окно с соо б щением о кол ичестве сотен в ч исле
111
Глава 2
В данном случае мы ввели число 2 5 3 8 и программа вычисляет кор
ректное значение 5 для количества сотен в числе.
Р ез ю ме
Только быстро. А т о одна секунда здесь - это
полгода там !
из к/ф -«Кин-дза-дза»
• При объявлении переменной указывается ее тип и название. Не
сколько переменных одного типа может быть объявлено одновре
менно. При объявлении переменной можно указать ее значение.
Константы объявляются с ключевым словом c o n s t .
• В языке С# существует несколько базовых типов. Целочислен
ные типы данных b y t e , s b yt e , s h o r t , u s ho r t , i n t , u i n t , l o n g
и u l ong. Отличаются эти типы размером выделяемой памяти и воз
можностью/невозможностью использовать отрицательные чис
ла. Действительные числа реализуются с помощью типов f l o a t
и douЬ l e . Для финансовых расчетов используется тип de c ima l .
Символьные значения реализуются через тип char. Логические зна
чения реализуются как значения типа b o o l .
• Целочисленные литералы п о умолчанию реализуются как i n t
значения, действительные числовые литералы реализуются как
dоuЫ е -значения, символьные литералы реализуются как с h а r
значения, текст реализуется в виде объектов класса s t r ing.
• Если в выражении используются значения разных (но совмести
мых) типов, то применяется автоматическое преобразование типов.
Можно также выполнять явное приведение типов.
• Для выполнения основных операций применяются специальные
операции. В С# есть четыре группы операторов: арифметические
( «сложение» +, «вычитание» - , «умножение» * , «деление» / , «оста
ток от деления» % , «инкремент» + + , «декремент» - - ), логические
( «логические и» & и & &, «логические или» 1 и 1 1 , «логическое исклю
чающее или» л , «логическое отрицание» ! ), операторы сравнения
( «меньше» =, «равно» ==, «не равно» ! = ), а также побитовые операторы ( «по
битовое и» & , «побитовое или» 1 , «побитовое исключающее или» л ,
1 12
Базовые типы и операто ры
«побитовая инверсию> - , «сдвиг влево» < < , «сдвиг вправо» >>). В С#
есть один тернарный оператор ? : , представляющий собой упрощен
ную форму условного оператора. Для арифметических и побито
вых операторов есть сокращенные формы операции присваивания
( * =, / = , %=, +=, - = , =, & =, л = и 1 =). Оператор присваивания =
в языке С# возвращает значение.
Задания для самостоятел ьной работы
Хочешь поговорить - плати еще чатл.
из к/ф -«Кин-дза-дза»
1 . Напишите программу, которая проверяет, делится ли введенное поль
зователем число на 3.
2. Напишите программу, которая проверяет, удовлетворяет ли введенное
пользователем число следующим критериям: при делении на 5 в остатке
получается 2, а при делении на 7 в остатке получается 1 .
3 . Напишите программу, которая проверяет, удовлетворяет ли введен
ное пользователем число следующим критериям: число делится на 4,
и при этом оно не меньше 1 0 .
4 . Напишите программу, которая проверяет, попадает л и введенное
пользователем число в диапазон от 5 до 1 О включительно.
5. Напишите программу, которая проверяет, сколько тысяч во введен
ном пользователем числе (определяется четвертая цифра справа в деся
тичном представлении числа).
6. Напишите программу, которая проверяет вторую справа цифру в вось
меричном представлении числа,введенного пользователем. Число вво
дится в десятичном (обычном) представлении.
7. Напишите программу, которая вычисляет третий бит справа в двоич
ном представлении числа, введенного пользователем. Число вводится
в десятичном (обычном) представлении. В программе используйте опе
ратор побитового сдвига.
8. Напишите программу, в которой для введенного пользователем числа
в бинарном представлении третий бит устанавливается равным единице.
1 13
Глава 2
9. Напишите программу, в которой для введенного пользователем чис
ла в бинарном представлении четвертый бит устанавливается равным
нулю.
1 0 . Напишите программу, в которой для введенного пользователем чис
ла в бинарном представлении значение второго бита меняется на проти
воположное (исходное нулевое значение бита меняется на единичное,
а исходное единичное значение бита меняется на нулевое).
Гл ава 3
У П РАВЛ SI Ю ЩИ Е И НСТ РУК ЦИ И
З начит, такое предложение : сейчас мы на
жимаем на контакты и перемещаемся к вам.
Но если эта машинка не сработает, тогда уж вы
с нами переместитесь, куд а мы вас переме
стим !
из к/ф -«Кин-дза-дза»
В этой главе мы рассмотрим вопросы, связанные с использованием
управляющих инструкций. Более конкретно, мы сосредоточим внима
ние на следующих конструкциях языка С#:
• познакомимся с условным оператором i f ;
• научимся использовать оператор выбора s w i t ch ;
• узнаем, как используется оператор цикла wh i l e ;
• выясним, в чем особенности оператора цикла d o - wh i l e ;
• убедимся в гибкости и эффективности оператора цикла f o r ;
• познакомимся с инструкцией безусловного перехода g o t o ;
• составим некоторое представление о системе обработки исключе
ний.
Теперь рассмотрим более детально означенные выше темы.
1 15
Глава 3
Условны й оператор if
Или ты сейчас же отдаешь нам эту К Ц , или
меньше чем за семь коробков мы тебя на З ем
лю не положим !
из к/ф «:Кu н-дза-дза'>
Условный оператор позволяет выполнять разные блоки команд в зави
симости от истинности или ложности некоторого условия (выражение
со значением логического типа). Работает это так: сначала вычисляется
значение некоторого логического выражения (условие). Если значение
выражения равно t ru e (условие истинно), выполняется определенный
блок команд. Если значение выражения равно f a l s e (условие ложно),
выполняется другой блок команд.
Условие
t r ue
,
1
>" " - -
, , ... - - - - �.
f a l se
... ,
...
, - - "
" .\
,
" ' ,
'
1
1
\
1
'
1
""
\
" ... "
,
'
'
1
1
-\
Команды
,-- \
, - - ..,
'
,
'·
Команды
,�.
.
'
'
1
1
�-
1
,
'
-
i f - бл о к
'
,_ .... '
1
,
'
'
1
- - '
'
' ,
-' - ,
... _ _ _ ...
, , ,, ... " _ " ,
,'
,
,
'
1
1
�"-
'
е l s е - бл о к
\
,
,
.
- -
\
'
,
'
1
' - -:
'
, _
...\ ,
... ... _ _ ... ...
,
,'
,, ... _ _ _ "
Рис. 3. 1 . П р и н ци п ы выпол н е н и я условного оператора
Описывается условный оператор достаточно просто: указывается клю
чевое слово i f, после которого в круглых скобках следует условие,
проверяемое при выполнении условного оператора. Блок команд, вы
полняемых при истинном условии, указывается в фигурных скобках
сразу после ключевого слова i f с условием ( i f-блок). Команды, пред
назначенные для выполнения в случае ложного условия, указываются
116
Управля ющие инструкции
в фигурных скобках после ключевого слова e l s e ( е l s е -блок). Шаблон
описания условного оператора приведен ниже (жирным шрифтом выде
лены ключевые элементы шаблона):
if (условие ) {
1 1 Команды - если условие истинно
else {
1 1 Команды - если условие ложно
Принципы выполнения условного оператора также проиллюстрирова
ны в схеме на рис. 3. 1 .
Условие
f a l se
t r ue
1
1
,
,
" - - - ...:. .
, - - ... ,, ... - - ... ...
1
\
•-,
'
К оманды
,'' \
1
1
\
1
\
1
1
1
1
'
� ... _
:
\
" ... _ ::
'
'
i f - блок
1
" ... ..,. _ _
" ...\ ... " ... _ _ ... ... r. '·',
...
,
'
'
'._ , - '
/
_ _ _ ,
Рис. 3.2. Выполнение условного оператора в упрощенной форме
Если блок состоит всего из одной команды, то фигурные скобки для вы
деления блока можно не использовать.
У условного оператора есть упрощенная форма, в которой отсутству
ет е l s е -блок. Если так, то оператор выполняется следующим обра
зом: проверяется условие, и, если оно истинно, выполняются команды
в i f-блоке. Если условие ложно, то ничего не происходит - выполня
ется команда, следующая после условного оператора. Шаблон описания
1 17
Глава З
условного оператора в упрощенной форме такой (жирным шрифтом вы
делены ключевые элементы шаблона):
if (условие ) {
/ / Команды - если условие истинно
Как выполняется условный оператор в упрощенной форме, иллюстри
рует схема на рис. 3.2.
Небольшой пример, иллюстрирующий работу условного оператора,
представлен в листинге 3. 1 .
� Листин г 3. 1 . Использовани е условно го оператора
us ing Sys tem . Windows . Forms ;
us ing Micros oft . Vi sualBas i c ;
c l a s s Usingi fDemo {
s tatic vo id Main ( ) {
/ / Переменная для определения типа пиктограммы :
Me s s ageBoxi con icon ;
/ / Переменные для определения текста сообщения ,
/ / заголовка окна и имени поль зователя :
s t ring msg , t i t l e , name ;
/ / Считывание имени пользователя :
name=Interaction . InputBox (
/ / Текст над полем ввода :
" Как Вас зовут ? " ,
/ / Название окна :
" Знакомимся " ) ;
/ / Проверка введенного поль зователем текста :
i f ( name== " " ) { / / Если текст не введен
/ / Пиктограмма ошибки :
icon=Me s s ageBoxi con . Error;
/ / Текст сообщения :
msg= " Очень жаль , что мы не познакомилис ь ! " ;
118
Управля ю щие инструкции
1 1 Заголовок окна :
titlе=" Знакомство не состоялось " ;
e l s e { / / Если текст введен
11 Информационная пиктограмма :
icon=Me s s ageBoxi con . I nformation ;
1 1 Текст сообщения :
msg= " Очень приятно , " +name+ " ! " ;
1 1 Заголовок окна :
titlе=" Знакомство состоялось " ;
1 1 Отображение сообщения ( аргументы - текст
/ / сообщения , заголовок, кнопки и пиктограмма ) :
Me s s ageBox . Show (msg, title , Mes sageBoxButton s . OK , icon) ;
Программа простая: отображается окно с полем ввода, и пользователю
предлагается ввести туда имя. Затем появляется новое диалоговое окно
с сообщением, которое содержит введенное пользователем имя. Но это,
если имя пользователь ввел. Однако пользователь в первом окне может на
жать кнопку отмены или закрыть окно с помощью системной пиктограммы
с крестом. Вот такая ситуация и обрабатывается с помощью условного опе
ратора. А именно, мы воспользуемся тем, что если пользователь закрывает
окно с полем ввода без ввода текста, то соответствующий метод возвращает
пустую текстовую строку. Чтобы легче было понять, как организован про
граммный код, рассмотрим результат выполнения программы. Сначала, как
указывалось, появляется окно с полем ввода, представленное на рис. 3.3.
Зкакомимс.я
IAnoo l O ) {
1 1 Отображение сообщения :
Console . WriteLine ( " Oгo, как много букв ! " ) ;
1 1 Если в строке не больше десяти символов :
else {
1 1 Отображение сообщения :
Console . WriteLine ( " Oгo, как мало букв ! " ) ;
1 1 Е сли введена пустая строка :
else {
Console . WriteLine ( "Жaль , что не ввели текст ! " ) ;
Алгоритм выполнения программы простой: пользователю предлагается
ввести текстовое значение, и это значение считывается и записывается
в текстовую переменную. Затем в дело вступают вложенные условные
операторы. Во внешнем операторе проверяется, не пустая ли введенная
пользователем текстовая строка. И если строка не пустая, то во внутрен
нем условном операторе проверяется, не превышает ли длина строки
значение 1 О . В зависимости от истинности или ложности этих условий
в консольное окно выводятся разные сообщения.
126
Управля ющие инструкции
Для записи текстового значения, введенного пользователем, использу
ется переменная t x t . Значение считывается командой txt=Co n s o l e .
Re adL i n e ( ) . Во внешнем условном операторе проверяется условие
t x t ! = " " . Если условие ложно, то выполняется команда C o n s o l e .
W r i t e L i n e ( " Жал ь , ч т о не в в ели т е к с т ! " ) в е l s е -блоке внеш
него условного оператора. Если же условие t x t ! = " " во внешнем ус
ловном операторе истинное, то в i f-блоке сначала выполняется коман
да C on s o l e . Wr i t e L i n e ( " Спа сибо , ч т о в в ели т е к с т ! " ) , после
чего на сцену выходит внутренний условный оператор. В этом опера
торе проверяется условие txt . Length> l O . Здесь мы воспользовались
свойством L e n gth, которое возвращает количество символов в тексто
вой строке. Следовательно, условие txt . Length> l O истинно в случае,
если текстовая строка, на которую ссылается переменная t x t , содер
жит больше 1 0 символов. Если так, то выполняется команда Co n s o l e .
W r i t e L i n e ( " O г o , как мн о г о букв ! " ) в i f-блоке внутреннего ус
ловного оператора. Если условие t x t . L e n g t h > 1 О ложно, то выпол
няется команда C o n s o l e . Wr i t e L i n e ( " О г о , как мало букв ! " )
в е l s е -блоке внутреннего условного оператора.
Таким образом, возможны три принципиально разных случая:
•
пользователь не ввел текст ;
•
пользователь ввел текст, состоящий больше чем из 1 О символов ;
•
пользователь ввел текст, состоящий не больше чем из 1 О символов.
Результат выполнения программы может быть таким (здесь и далее
жирным шрифтом выделено значение, которое вводит пользователь).
[1i!J Резул ьтат выполнения программы (из листинга 3.3 )
Введите текст : Изучаем С#
Спасибо , что ввели текст !
Ого, как мало букв !
Это пример ситуации, когда введенный пользователем текст содержит
не больше 1 О символов. Если пользователь вводит текст, состоящий
из более чем 10 символов, то результат может быть следующим.
[1i!J Резул ьтат выполнения программы (из листинга 3.3 )
Введите текст : Продоmкаем изучать С#
127
Глава 3
Спасибо , что ввели текст !
Ого, как много букв !
Наконец, если пользователь не вводит текст, то результат выполнения
программы такой.
� Резул ьтат выпол нения программы (из листинга 3.3 )
Введите текст :
Жаль , что не ввели текст !
Еще один пример, рассматриваемый далее, иллюстрирует схему с вло
женными условными операторами, когда каждый следующий вну
тренний условный оператор формирует е l s е -блок внешнего условно
го оператора. Программа, представленная в листинге 3.4, выполняется
по простой схеме: пользователь вводит целое число (предположительно,
от 1 до 4), а программа выводит текстовое название этого числа.
� Листинг 3. 4 . Определение ч исл а
us ing Sys tem;
c l a s s Anothe rNe stedi fDemo {
s tatic vo id Main ( ) {
1 1 Переменная для запоминания введенного числа :
int numЬe r ;
1 1 Отображение сообщения :
Console . Write ( " Bвeдитe целое число : " ) ;
1 1 Считывание числа :
numbe r= Int 3 2 . Parse ( Console . Read1ine ( ) ) ;
1 1 Е сли введена единица :
i f ( numЬer==l ) Console . WriteLine ( "Eдиницa " ) ;
1 1 Е сли введена двойка :
e l s e i f ( numbe r==2 ) Console . WriteLine ( " Двoйкa " ) ;
1 1 Е сли введена тройка :
e l s e i f ( numbe r==З ) Console . WriteLine ( " Tpoйкa " ) ;
1 1 Е сли введена четверка :
128
Управля ющие инструкции
e l s e i f ( numbe r==4 ) Console . WriteLine ( "Чeтвepкa " ) ;
1 1 Все прочие случаи :
e l s e Console . WriteLine ( " Heизвecтнoe число " ) ;
Программа «узнает� числа от 1 до 4 включительно. В начале выполне
ния программы командой C on s o l e . W r i te ( " Введите целое чис
л о : " ) отображается приглашение ввести целое число. Число считы
вается командой n umb e r = I n t 3 2 . P a r s e ( C o n s o l e . Re a dL i n e ( ) )
и записывается в переменную n umЬe r. Затем задействуется блок из вло
женных условных операторов, в каждом из которых проверяется введен
ное значение. При наличии совпадения в консольном окне появляется
сообщение соответствующего содержания (название введенного числа).
Если пользователь ввел число, не попадающее в диапазон значений от 1
до 4 , то выполняется команда C o n s o l e . W r i t e L i n e ( " Неиз в е с т н о е
число " ) . Ниже показано, как может выглядеть результат выполнения
программы, если пользователь вводит «знакомое� для программы чис
ло (здесь и далее жирным шрифтом выделено введенное пользователем
значение).
[1i!J Резул ьтат выполнения программы (из листинга 3. 4)
Введите целое число : 2
Двойка
Если программе не удается идентифицировать число, то результат та
кой.
[1i!J Резул ьтат выполнения программы (из л истинга 3. 4)
Введите целое число : 5
Неизвестное число
Как мы увидим далее, вложенные условные операторы - далеко
не единственный способ организовать проверку нескольких условий
в программе.
129
Глава 3
Оператор выбора switch
Нет-нет, шуба подождет. Я считаю, что глав
ное - посмотреть на мир.
из к/ф «Бриллиан товая рука»
Оператор выбора swi tch позволяет выполнить проверку значения не
которого выражения. В языке С# выражение, которое проверяется с по
мощью оператора выбора swi t ch, может возвращать значение целочис
ленного, символьного или текстового типа. Описывается оператор выбора
следующим образом. Сначала указывается ключевое слово swi t ch, после
которого в круглых скобках следует проверяемое выражение. Тело операто
ра выбора заключается в фигурные скобки. Там описываются с а s е-блоки.
Каждый такой блок начинается с ключевого слова c a s e . После него указы
вается контрольное значение (заканчивается двоеточием). Каждый с а s е
блок содержит набор команд, заканчивающийся инструкцией break. Кон
трольные значения в с а s е-блоках сравниваются со значением выражения
в switсh-инструкции. Если совпадение найдено, то выполняются коман
ды в соответствующем с а s е-блоке. На случай, если совпадения нет, в опе
раторе выбора s w i t ch может быть предусмотрен блок de fau l t . Общий
шаблон описания оператора выбора swi tch с тремя с а s е-блоками пред
ставлен ниже (жирным шрифтом выделены ключевые элементы шаблона):
switсh(выражение){
case значение
1:
1 1 Команды
break ;
case значение 2 :
1 1 Команды
break ;
case значение 3 :
1 1 Команды
break ;
default :
11 Команды
break ;
130
Управля ю щие инструкции
Блок de fau l t не является обязательным - его можно не указывать со
всем. На рис. 3.6 показана схема, иллюстрирующая способ выполнения
оператора выбора s w i t c h .
'
1
1
'
,
..,, , -
, , ... " - - - - - - - (:::
, , , ...
' · · -
(
---
не
'
,
...
... _
,
,,
...
'
'
\" " ,
'
о б я з а тел ь ный
_
...
... ," "
' " ... ... " блок
' ... ...
...
,
)--
:
'
/
'
_к
_о
_м
_а.вды
_
_
_
_
_
О
break
)
_ _
" ...
... _ _ _ _
_ , ,' "" - - - '
�
Рис. 3. 6. В ы полнение оператора вы б ора
131
Глава 3
Таким образом, при выполнении оператора выбора сначала вычисляется
значение выражения в s w i t сh-инструкции. Полученное значение по
следовательно сравнивается с контрольными значениями в с а s е -бло
ках. При первом же совпадении выполняются команды в соответству
ющем с а s е -блоке - вплоть до инструкции b r e a k. Если совпадение
не найдено и в операторе выбора есть de fau l t -блoк, то выполняются
команды в этом блоке. Если совпадение не найдено и de f a u l t-блока
в операторе выбора нет, то ничего не происходит.
�
ПОДРОБН ОСТИ
И усл о в н ы й операто р , и оператор выбора, и рассматриваемые
далее операторы цикл а - все переч исленные управл я ющие и н
струкци и есть не тол ько в языке С# , но и , скажем , в языках С++
и Java . Даже бол ьше - там они п рактически такие же , как в язы
ке С# . И в плане си нтаксиса, и в плане п р и н ципов выпол нения .
Но вот оператор выбора в С# немного особ ы й . Во-первых, кро
ме цел оч исленных и сим вол ьных вы раже н и й в операторе выбора
мо гут испол ьзоваться и текстовые вы ражения . Такого нет в языке
С++ (там п роверяемое в ы ражение может быть целоч исл е н н ы м или
символ ь н ы м ) . Во - вторых, в С# в операторе выбора, есл и с а s е
блок непусто й , он должен заканчи ваться Ь r е а k - и нструкцие й . В от
л и ч и е от С#, в языках С++ и Java с а s е -блок может заканчи ваться
инструкцией b r e a k , но это не обязател ьно. Вообще , инструкция
b r e a k испол ьзуется для завершения работы оп ераторов цикл а или
оператора выбора. Само по себе завершение ко манд в с а s е - бл оке
оператора выбора работу это го оператора не завершает. Други
м и сл овам и , есл и в каком -то с а s е - бл оке команды выпол н ил и с ь ,
т о это к автоматическому завершению в ы п о л н е н и я всего операто
ра выбора не п р и водит. Чтобы заверш ить оператор выбора, нужна
инструкция b r e a k . Ч исто гипотетически , есл и бы с а s е - бл ок не за
кан ч и вался инструкцией b r e a k , то п осл е завершения выполнения
команд в это м бл оке должно было бы начаться выпол нение команд
в следующем с а s е - блоке (даже есл и нет сов падения с контрол ь
ным значением в этом блоке ) . В языках С++ и Java все так и п роис
ходит. Что касается языка С # , то здесь п р и про верке знач ения в ы
ражения и срав нении е г о с контрол ь н ы м и знач е н и я м и с а s е - бл оки
могут переби раться не в том по рядке , как они указан ы в операторе
выбора. П оэтому в ы пол н е н и е кода необходимо огранич ить л и ш ь
блоком , для которого выявлено сов падение контрол ьного значе
н и я со значением п роверяемого вы ражения . Как бы там н и был о ,
но в языке С# непустые с а s е - блоки и блок de fau l t заканчива
ются инструкцией b r e a k . Как и зачем испол ьзуются пустые с а s е
блоки - обсудим немного позже .
132
Управля ющие инструкции
Несложно заметить, что в некотором смысле оператор выбора напоми
нает блок из вложенных условных операторов, хотя полной аналогии
здесь, конечно, нет. Небольшой пример, в котором использован опера
тор выбора, представлен в листинге 3.5. Фактически это альтернативный
способ реализации программы с вложенными условными операторами,
в которой по введенному пользователем числу определяется название
этого числа (см. листинг 3.4). Но на этот раз вместо условных операто
ров использован оператор выбора s w i t ch.
� Листинг 3. 5 . З накомство с оператором выбора
u s ing Sys tem;
u s ing Sys tem . Windows . Forms ;
u s ing Micros oft . VisualBas i c ;
c l a s s SwitchDemo {
s tatic vo id Main ( ) {
/ / Переменная для запоминания введенного числа :
int numЬer;
/ / Переменная для записи названия числа :
s t ring name ;
/ / Считывание числа :
numbe r=I nt 3 2 . Parse (
Interaction . I nputBox (
/ / Текст над полем ввода :
"Введите число : " ,
/ / Заголовок окна :
"Число " )
);
/ / Использование оператора выбора для определения
/ / названия введенного числа :
switch ( numЬe r ) {
case 1 :
/ / Если ввели число 1
nаmе=" Единица " ;
/ / Название числа
break;
/ / Завершение блока
case 2 :
/ / Если ввели число 2
133
Глава 3
nаmе=" Двойка " ;
/ / Название числа
break;
/ / Завершение блока
case 3 :
/ / Если ввели число 3
nаmе=" Тройка " ;
/ / Название числа
break;
/ / Завершение блока
case 4 :
/ / Если ввели число 4
nаmе= "Четверка " ;
/ / Название числа
break;
/ / Завершение блока
de fault :
/ / Ввели другое число
/ / Текст сообщения :
nаmе= " Неизвестное число " ;
break;
/ / Завершение блока
} / / Завершение оператора выбора
/ / Отображение сообщения :
Me s s ageBox . Show ( name , "Чиcлo " ) ;
Предыдущая версия программы была консольной. Эта версия для вво
да числа и вывода сообщения использует диалоговые окна. Но это от
личие �косметическое» . Идеологически важное отличие состоит в том,
что здесь мы используем оператор выбора s w i t c h . Целочисленная
переменная numb e r предназначена для записи числа, которое вво
дит пользователь. Текстовая переменная n ame нужна для того, чтобы
сформировать и запомнить текстовое значение - название введенного
пользователем числа. Для считывания числа используем статический
метод I np u t B o x ( ) класса I n t e r a c t i o n . Для преобразования тек
стового представления числа в целое число используем статический
метод P a r s e ( ) из структуры I n t 3 2 . Результат записывается в пере
менную numb e r .
Для проверки значения переменной numb e r использован оператор
выбора. Проверяемым выражением в нем является эта переменная.
В с а s е -блоках указаны контрольные значения - целые числа от 1 до 4
включительно (всего четыре с а s е -блока). При наличии совпадения
значения переменной numb e r и контрольного значения в с а s е -блоке
134
Управля ю щие инструкции
получает значение переменная name (значение переменной - название
введенного числа). На случай, если совпадения не будет, предусмотрен
de f a u l t-блок. В этом блоке значением переменной name присваивает
ся текст, сообщающий о невозможности идентифицировать число.
Таким образом, было или не было совпадение, переменная n ame по
лучит значение. Это значение используется в команде Me s s a g e B o x .
Show ( name , " Число " ) , которой отображается диалоговое окно с сооб
щением (название числа или сообщение о том, что число неизвестно).
На рис. 3.7 показано окно с полем ввода, в которое введено число 2 .
Число
Рис. 3. 7. В поле введено ч исло 2
После подтверждения ввода появляется новое диалоговое окно, пока
занное на рис. 3.8.
Число
�
Двойк1
ок
Рис. 3.8. Окно с соо б щением после ввода числа 2
На рис. 3.9 показано окно с полем ввода, в котором пользователь указал
число 5 .
ЧиU10
Рис. 3. 9 . В поле введено ч исло 5
135
Глава 3
После щелчка по кнопке ОК появляется окно с сообщением о том, что
число неизвестно. Окно показано на рис. 3. 1 0.
Чием
�
Нrю�sктн о е ч�tсло
ок
Рис. 3. 1 О. Окно с соо б щением после ввода ч исла 5
Стоит заметить, что если пользователь вместо ввода числа в окне с по
лем щелкнет, например, кнопку Отмена, то возникнет ошибка. Жела
ющие могут подумать, как следует модифицировать программный код,
чтобы подобная ситуация обрабатывалась корректно.
G)
Н А ЗАМ ЕТ КУ
В программе испол ьзовано нескол ько пространств имен . П ростран
ство имен Sys tem . Windows . Forms необходи мо подкл ючить для ис
пол ьзования статического метода Show ( ) из класса Me s s ageBox .
Метод отображает диалоговое окно с сообщением ( в данном слу
чае назван ие введенного пользователем ч исла) . Пространство имен
Mi c ro s o ft . V i s u a l Ba s i c нужно для испол ьзования статического
метода I nputBox ( ) из класса Interaction . Метод отображает окно
с полем ввода . Напом н и м , что в данном случае мы п рибегаем к по
мощи средств разработки языка Visual Basic. Наконец, пространство
имен Sys tem нам понадобилось, поскол ьку мы используем стати
ческий метод Parse ( ) из структуры I n t 3 2 . Вообще-то м ы еще ис
пол ьзуем и текстовый тип S t r i n g. Это класс из п ространства имен
Sys tem. Но в программе ссылка на текстовый тип выпол нена через
идентификатор s t ring, явля ющийся псевдонимом для инструкции
Sys tem . S t r i n g. Так что s t r ing можно было бы испол ьзовать и без
подкл ючения пространства имен Sys tem.
Как отмечалось ранее, с а s е -блоки в операторе выбора могут быть пу
стыми. Так поступают в случае, если необходимо, чтобы для несколь
ких контрольных значений выполнялись одни и те же команды. Если
так, то вместо дублирования команд в соответствующих с а s е -блоках
(что неудобно и не очень рационально) используют несколько идущих
один за другим пустых блоков. Причем в таких пустых с а s е -блоках нет
136
Управля ющие инструкции
даже Ь r е а k-инструкций. Пример подобного подхода проиллюстриро
ван в следующей программе, представленной в листинге 3.6.
� Листинг 3.6. Оператор выбора с пустыми са sе -блоками
u s ing Sys tem;
u s ing Sys tem . Windows . Forms ;
u s ing Micros oft . VisualBas i c ;
c l a s s Anothe rSwitchDemo {
s tatic vo id Main ( ) {
/ / Переменная для запоминания введенного числа :
int numЬer;
/ / Переменная для текста сообщения :
s t ring txt= " " ;
/ / Началь ное значение переменной
/ / Считывание числа :
numbe r=I nt 3 2 . Parse (
Interaction . I nputBox (
/ / Текст над полем ввода :
"Введите целое число от
1
до 9 : " ,
/ / Заголовок окна :
"Число " )
);
/ / Проверка значения переменной numbe r :
switch ( numЬe r ) {
case
1:
case 9 :
/ / Оператор выбора
/ / Е сли значение
1
/ / Е сли значение 9
/ / Текст сообщения :
txt=" Bы ввели нечетное , \n но не простое число . " ;
break; / / Завершение блока
case 2 :
/ / Е сли значение 2
case 3 :
/ / Е сли значение 3
case 5 :
/ / Е сли значение 5
case 7 :
/ / Е сли значение 7
137
Глава З
/ / Текст сообщения :
txt=" Bы ввели простое число . " ;
break; / / Завершение блока
case 4 :
/ / Е сли значение 4
case 8 :
/ / Е сли значение 8
/ / Текст сообщения :
txt=" Bы ввели число - степень двойки . " ;
break; / / Завершение блока
case 6 :
/ / Е сли значение 6
/ / Текст сообщения :
txt=" Bы ввели 6 - совершенное число . " ;
break; / / Завершение блока
/ / Отображение диалогового окна с сообщением :
Me s s ageBox . Show ( tx t , "Чиcлo " ) ;
Данная программа в некотором смысле напоминает предыдущую. Сна
чала пользователю предлагается ввести целое число (в диапазоне от 1
до 9 ) . Результат записывается в переменную numb e r . После этого с по
мощью оператора выбора проверяется значение этой переменной. Мы
�классифицируем» числа по следующим категориям:
• Простые числа - числа, которые не имеют других делителей, кроме
единицы и себя самого. В диапазоне чисел от 1 до 9 простыми явля
ются числа 2 , 3, 5 и 7 .
• Числа, которые являются степенью двойки - в диапазоне от 1 до 9
2
3
в эту категорию попадают числа 4 (2
4) и 8 (2
8).
=
=
• Число 6 является совершенным - сумма его делителей (числа 1, 2
и 3 ) равна самому этому числу. Следующее совершенное число - это
2 8 (его делители 1 , 2 , 4 , 7 и 1 4 в сумме дают 2 8 ), но оно не попадает
в интервал от 1 до 9 .
• Нечетные числа, которые при этом н е являются простыми - в ука
занном диапазоне это числа 1 и 9 .
138
Управля ю щие инструкции
Введенное пользователем число с помощью оператора выбора «припи
сывается� к одной из перечисленных групп. И в этом операторе выбора
мы используем пустые с а s е-блоки. Например, есть в операторе выбо
ра такая конструкция (комментарии для удобства удалены):
case 2 :
case 3 :
case 5 :
case 7 :
txt= "Bы ввели простое число . " ;
break;
Как это работает? Допустим, пользователь ввел значение 2. При срав
нении этого значения с контрольными значениями в с а s е -блоке со
впадение имеет место для блока c a s e 2 . Поэтому будут выполнены
все команды от места, где идентифицировано совпадение, до первой ин
струкции b r e a k. В результате выполняется команда t x t = " Bы в в ели
про с т о е число . " . Теперь предположим, что пользователь ввел значе
ние 5 . Совпадение проверяемого (переменная numb e r ) и контрольно
го значения имеет место в блоке c a s e 5. Он пустой. Но это все равно
с а s е-блок. Поэтому выполняются команды от места совпадения до пер
вой инструкции b r e a k. Итог такой - выполняется команда t x t = " Bы
в в ели про с т о е число . " . То же получаем, когда пользователь вводит
значение 3 и 7 . Прочие блоки в операторе выбора работают по такому же
принципу.
Внешне все выглядит следующим образом. При запуске программы
на выполнение появляется окно с полем ввода, в которое следует ввести
число от 1 до 9. Окно показано на рис. 3. 1 1 .
Число
Рис. З. 1 1
.
Окно с полем для ввода ч исла в диапазоне от 1 до 9
Если пользователь вводит числа 1 или 9 , то следующим появляется
окно, представленное на рис. 3. 1 2 .
139
Глава 3
ЧНо
Вы е в е1 ш нечflНое..
но не: npocтot чиС/lо.
ок
Рис. 3. 1 2 . Окно появляется , есл и пол ьзовател ь вводит ч исло 1 или 9
G)
Н А ЗАМ ЕТ КУ
В операторе выбора в одном из с а s е -блоков (для значений 1 и 9 )
при оп ределении текстового значения переменной txt в текстовом
л итерале испол ьзована инструкция \ n . Напом н и м , что это инструк
ция перехода к новой строке . П ри отображен и и соответствующего
текста в том месте , где размещена инструкция \ n , выполняется пе
реход к новой строке. Резул ьтат можно видеть на рис . 3 . 1 2 , где текст
в диалоговом окне отображается в две строки .
В случае, если пользователь вводит число 2 , 3 , 5 или 7 , появится окно,
представленное на рис. 3. 1 3 .
Число
Вы
в аt..n и простое число.
ок
Рис. 3. 1 3. Окно появляется , есл и пол ьзовател ь
вводит ч исло 2, 3, 5 или 7
Если пользователь вводит число 6 , появляется окно, показанное
на рис. 3. 1 4 .
Число
Вы
авvш
6
·
совершенное число.
ок
Рис. 3. 1 4 . Окно появляется ,
есл и пользовател ь вводит ч исло 6
140
Управля ющие инструкции
Наконец, если пользователь вводит число 4 или 8, то появляется окно,
показанное на рис. 3 . 1 5 .
Число
ок
Рис. 3. 1 5 . Окно появляется ,
есл и пол ьзовател ь вводит ч и сла 4 или 8
Хочется обратить внимание на несколько обстоятельств. Во-первых,
в операторе выбора мы не использовали de f a u l t - блок. Как упоми
налось ранее, этот блок не является обязательным, чем мы, собствен
но, и воспользовались. Но поскольку теперь в s w i t с h-операторе
de f а и 1 t-блока нет, то теоретически может получиться, что в операторе
переменной txt значение не будет присвоено - например, если пользо
ватель введет число, которое не попадает в диапазон значений от 1 до 9 .
И это проблема, поскольку переменная t x t используется в команде
Me s s ageBox . S h o w ( t x t , " Число " ) после оператора выбора. Такие си
туации компилятором отслеживаются, и выдается ошибка еще на этапе
компиляции. Чтобы ее избежать, при объявлении переменной txt мы ей
сразу присвоили пустое текстовое значение. В таком случае, даже если
пользователь введет значение вне рекомендуемого диапазона и в опера
торе выбора значение переменной t x t присвоено не будет, переменная
останется со своим старым значением. Возможно, это не самый лучший
способ решения проблемы, но, во всяком случае, при компиляции не бу
дет ошибки.
Также стоит заметить, что, если пользователь в поле ввода введет не чис
ло, отменит ввод (щелкнув кнопку Отмена) или закроет окно щелчком
по системной пиктограмме, возникнет ошибка. Чтобы ее избежать, мож
но воспользоваться системой перехвата и обработки исключений. Как
это делается, кратко будет показано в одном из разделов в конце главы.
Обработке исключений также посвящена одна из глав во второй части
книги.
141
Глава З
Оператор ц и кла wh i l e
З амечательная идея ! Ч то ж она мне самому
в голову не пришла ?
из к/ф �Ирония судьбы,
WlU
С легким паром»
Оператор цикла позволяет многократно выполнять определенный набор
команд. В языке С# существует несколько операторов цикла, и со всеми
ними мы познакомимся. Но начнем с оператора цикла whi l e. У него до
статочно простой синтаксис. Описание оператора начинается с ключевого
слова whi l e. В круглых скобках после ключевого слова whi l e указьшает
ся некоторое условие (выражение со значением логического типа). Затем
в фигурных скобках указьшается блок из команд, формирующих тело опе
ратора цикла. Общий синтаксис оператора цикла wh i l e, таким образом,
следующий (жирным шрифтом выделены ключевые элементы шаблона):
while (ycлoвиe ) {
1 1 Команды
Выполняется оператор цикла wh i l e так. Сначала проверяется условие
(в круглых скобках после ключевого слова w hi 1 е ). Если условие истинно
(значение t rue ), то выполняются команды в теле оператора цикла. После
этого снова проверяется условие. Если оно истинно, то снова выполняют
ся команды в теле оператора цикла, после чего опять проверяется условие,
и так далее. Оператор цикла выполняется до тех пор, пока при проверке
условия оно не окажется ложным (значение fa l s e). Если при проверке
условия оно оказывается ложным, команды в теле оператора цикла не вы
полняются, работа оператора цикла завершается и управление передается
следующей инструкции после оператора цикла. Схема выполнения опе
ратора цикла wh i l e проиллюстрирована на рис. 3. 1 6.
Стоит заметить, что команды в теле оператора выполняются блоком то есть условие в очередной раз проверяется только после того, как вы
полнены все команды в теле оператора цикла. Условие, указанное в круг
лых скобках после ключевого слова wh i l e , должно быть таким, чтобы
при выполнении команд в теле оператора цикла оно в принципе могло
измениться. Проще говоря, чтобы в операторе цикла начали выполнять
ся команды, условие в самом начале должно быть равно t ru e . А чтобы
оператор цикла в какой-то момент завершил выполнение, условие долж
но стать равным f a l s e . Иначе получим бесконечный цикл.
142
Управля ющие инструкции
,/ ' ' '
,. - -1
'
1
,
\
... - -
t r ue
'
- - -
•
В языке С# существуют специальные управляющие инструкции, по
зволяющие создавать в программе точки ветвления и блоки повто
ряемых команд.
•
166
Условный оператор i f позволяет выполнять разные блоки команд
в зависимости от истинности или ложности некоторого условия.
Управля ющие инструкции
Проверяемое условие указывается в круглых скобках после ключе
вого слова i f. Команды, выполняемые при истинном условии, ука
зываются в блоке после i f-инструкции. Команды, выполняемые при
ложном условии, указываются в е l s е -блоке. Существует упрощен
ная форма условного оператора без е l s е -блока.
• Оператор выбора s w i t c h позволяет выполнять разные блоки ко
манд в зависимости от значения некоторого выражения. Проверя
емое выражение (целочисленное, символьное или текстовое) ука
зывается в круглых скобках после ключевого слова s w i t ch. Затем
указываются с а s е -блоки с контрольными значениями. Выполняют
ся команды в с а s е -блоке, в котором контрольное значение совпа
дает со значением проверяемого выражения. В случае, если значе
ние выражения не совпадает ни с одним из контрольных значений
в с а s е -блоках, выполняются команды в de f a u l t-блоке. Этот блок
не является обязательным. Каждый с а s е -блок и de f a u l t-блок за
канчивается инструкцией b r e a k. В случае необходимости можно
использовать пустые с а s е -блоки.
• Оператор цикла wh i l e позволяет многократно выполнять блок
определенных команд. После ключевого слова wh i l e в круглых
скобках указывается условие, при истинности которого выполняют
ся команды в теле оператора цикла. Каждый раз после выполнения
этих команд проверяется условие, и, если оно истинно, команды вы
полняются снова.
• Оператор цикла do-wh i l e похож на оператор цикла wh i l e , но в опе
раторе do - wh i l e сначала выполняются команды, а затем проверяет
ся условие. Команды указываются после ключевого слова do. После
блока команд следует ключевое слово wh i l e и, в круглых скобках,
условие. Оператор цикла выполняется до тех пор, пока при очеред
ной проверке условия оно не оказывается ложным.
• Описание оператора цикла f o r начинается с ключевого слова f o r .
В круглых скобках указывается три блока инструкций. Блоки разде
ляются между собой точкой с запятой. Если блок содержит несколь
ко инструкций, то они разделяются запятыми. Команды, формиру
ющие тело оператора цикла, указываются в круглых скобках после
f о r -инструкции. Выполнение оператора цикла начинается с вы
полнения команд в первом блоке. После этого проверяется условие
во втором блоке. Если оно ложно, оператор цикла завершает работу.
Если условие истинно, то выполняются команды в теле оператора
167
Глава З
цикла и в третьем блоке. Затем снова проверяется условие. Если ус
ловие ложно, работа оператора цикла завершается. Если условие
истинно, выполняются команды в теле оператора и в третьем блоке
и снова проверяется условие. И так далее, пока при проверке усло
вия оно не окажется ложным.
• Инструкция безусловного перехода g o t o позволяет перейти к вы
полнению программного кода в том месте, которое выделено меткой.
Используя инструкцию g o t o и условный оператор, можно органи
зовать циклическое выполнение программного кода (симулировать
работу оператора цикла). Общая рекомендация состоит в том, чтобы
избегать использования инструкции g o t o .
• Система обработки исключений позволяет предусмотреть специаль
ный код, выполняемый при возникновении ошибки. С этой целью
используется конструкция t ry- c at ch. Программный код, при вы
полнении которого может возникнуть ошибка, помещается в t r у
блок. Программный код, предназначенный для выполнения в случае
возникновения ошибки, помещается в с а t с h-блок. Если при выпол
нении кода в t rу-блоке ошибка не возникает, то с а t сh-блок игно
рируется. Если при выполнении кода в t rу-блоке возникает ошибка,
то выполнение команд в блоке t r y прекращается и начинают выпол
няться команды в блоке c a t c h .
Задания для самостоятел ьной работы
Владимир Николаевич, у тебя дома жена,
сып-двоечник, з а кооперативпую квартиру
не заплачено. А ты тут мозги пудришь. Плохо
кончится, родной.
из к:/ф -«Кин-дза-дза»
1 . Напишите программу, в которой пользователь вводит число, а про
грамма проверяет, делится ли это число на 3 и на 7 . Результаты проверки
отображаются в сообщении в диалоговом окне. Используйте обработку
исключений.
2. Напишите программу, в которой пользователь последовательно вво
дит два целых числа. Программа определяет, какое из чисел больше или
они равны, и выводит сообщение в диалоговом окне. Используйте обра
ботку исключений.
1 68
Управля ющие инструкции
3 . Напишите программу, в которой вычисляется сумма чисел, которые
вводит пользователь. Программа выводит запрос на ввод числа, считы
вает введенное пользователем число, прибавляет его к сумме и снова
выводит запрос на ввод числа. Процесс продолжается до тех пор, пока
пользователь не введет нулевое значение. Используйте обработку ис
ключений.
4. Напишите программу, в которой пользователь вводит целое число
в диапазоне от 1 до 7 , а программа определяет по этому числу день не
дели. Если введенное пользователем число выходит за допустимый диа
пазон, выводится сообщение о том, что введено некорректное значение.
Используйте оператор выбора s w i t ch. Предложите механизм обработ
ки ошибки, связанной с вводом нечислового значения.
5. Напишите программу, в которой пользователю предлагается ввести
название дня недели. По введенному названию программа определяет
порядковый номер дня в неделе. Если пользователь вводит неправиль
ное название дня, программа выводит сообщение о том, что такого дня
нет. Предложите версию программы на основе вложенных условных
операторов и на основе оператора выбора s w i t ch.
6. Напишите программу, в которой вычисляется сумма нечетных чисел.
Для проверки результата воспользуйтесь тем, что 2 + 4 + 6 + ". + 2п =
п(п + 1 ). Предложите версии программы, использующие разные опера
торы цикла.
7. Напишите программу для вычисления суммы квадратов натуральных
чисел. Для проверки результата воспользуйтесь тем, что 1 2 + 2 2 + 3 2 + " .
2 n(n + 1 ) (2n + 1)
+п =
П редложите версии программы, использующие разные
6
операторы цикла.
•
8. Напишите программу, которая выводит последовательность чисел
Фибоначчи. Первые два числа в этой последовательности равны 1 , а ка
ждое следующее число равно сумме двух предыдущих (получается по
следовательность 1 , 1 , 2 , 3, 5 , 8 , 1 3 , 2 1 , 3 4 , 5 5 , 8 9 и так далее). Количе
ство чисел в последовательности вводится пользователем. Предложите
версии программы, использующие разные операторы цикла.
9. Напишите программу, в которой пользователем вводится два целых
числа. Программа выводит все целые числа - начиная с наименьшего
(из двух введенных чисел) и заканчивая наибольшим (из двух введен
ных чисел). Предложите разные версии программы (с использованием
169
Глава З
разных операторов цикла), а также механизм обработки исключений
для этой программы.
1 0 . Напишите программу, в которой вычисляется сумма чисел, удовлет
воряющих таким критериям: при делении числа на 5 в остатке получа
ется 2 , или при делении на 3 в остатке получается 1 . Количество чисел
в сумме вводится пользователем. Программа отображает числа, которые
суммируются, и значение суммы. Используйте обработку исключений.
Предложите версии программы, использующие разные операторы цикла.
Гл ава 4
МАССИВЫ
- Пойдем простым логическим ходом.
- Пойдем вместе .
из к/ф �Ирония судьбы,
WlU
С легким паром»
В этой главе мы обсудим исключительно важную конструкцию - речь
пойдет о массивах. Среди тем, которые мы рассмотрим, будут такие:
• одномерные массивы - способы их объявления и использования ;
• особенности работы с двумерными массивами ;
• способы инициализации массивов ;
• выполнение основных операций с массивами - в частности, речь бу
дет идти о копировании и присваивании массивов ;
• создание �рваных» массивов - то есть массивов со строками разной
длины ;
• особенности массива из объектных ссылок.
Также мы познакомимся со способами обработки аргументов командной
строки. Еще в главе есть различные примеры использования массивов.
Начнем же с азов - с создания одномерных массивов.
Одномерные масси вы
Первый раз таких единоличников вижу.
из к/ф �девчата»
Массив - это набор элементов одного типа, которые объединены об
щим именем. Переменные, входящие в массив, называются элемента
ми массива. Поскольку одно и то же имя (имя массива) 4П рименяет
ся» сразу к нескольким переменным, то эти переменные нужно как-то
171
Глава 4
идентифицировать. Идентификация выполняется с помощью индекса
или индексов. Индекс - это целое число. Количество индексов, необ
ходимых для однозначной идентификации переменной в массиве, опре
деляет размерность массива. Под размером массива обычно подразуме
вают общее количество элементов в массиве. Под размером массива для
данной размерности имеют в виду количество значений, которые мо
жет принимать индекс, соответствующий данной размерности. Самые
простые - одномерные массивы, в которых для идентификации элемен
та в массиве нужно указать всего один индекс. Знакомство с массива
ми начнем именно с одномерных массивов. То есть далее в этом разделе
речь идет об одномерных массивах.
Мы уже выяснили, что массив - это набор переменных. Возникает есте
ственный вопрос: как получить доступ к этому набору? Ответ состоит
в том, что доступ к массиву получают с помощью специальной пере
менной, которая называется переменноймассива. Как и обычную пере
менную, переменную массива перед использованием следует объявить.
При объявлении переменной массива указывают идентификатор типа
элементов массива, после него указываются пустые квадратные скобки
и имя переменной массива. То есть шаблон объявления переменной мас
сива такой:
тип [ ] переменная
Например, если мы хотим объявить переменную массива с названи
ем nums и предполагается, что массив будет состоять из целочислен
ных значений типа i n t , то переменная массива объявляется командой
i n t [ ] num s . Если бы мы объявляли переменную массива с названием
s ymЬs и массив предполагался состоящим из символьных значений, то ко
манда объявления такой переменной выглядела бы как char [ ] s ymЬ s .
Н о создание (объявление) переменной массива н е означает создания
массива. Другими словами, даже если мы объявили переменную масси
ва, сам массив от этого не появляется. Его еще нет. Массив нужно со
здать.
Для создания массива используется оператор n e w . После оператора
new указывается идентификатор типа, соответствующий типу элемен
тов создаваемого массива, а в квадратных скобках после идентифика
тора типа указывается размер массива. Шаблон для команды создания
массива имеет такой вид:
new тип [ размер ]
172
Масс ивы
Например, если мы хотим создать одномерный целочисленный мас
сив из 1 2 элементов, то команда создания такого массива выглядит как
new in t [ 1 2 ] . Чтобы создать массив из 1 О элементов символьного типа,
используем команду new char [ 1 О ] . Остается открытым вопрос о том,
как переменная массива связана с собственно массивом. Ответ очень про
стой: переменная массива ссылается на массив. Можно сказать и иначе:
значением переменной массива может быть адрес массива в памяти.
G)
Н А ЗАМ ЕТ КУ
Что понимать под «адресом масси ва» и как этот адрес испол ьзуется ,
более детал ьно обсуждается в главе ( во второй части книги ) , посвя
щенной работе с указателя м и . Пока же нам достаточно самых общих
представлений о том , что такое «адрес масси ва» .
Также нужно учесть, что команда создания массива не только создает
массив, но еще и имеет результат. Это адрес созданного массива. А адрес
массива, как мы уже знаем, может быть значением переменной массива.
Главное, чтобы тип переменной массива соответствовал типу элементов
в массиве. Если обобщить все вышеизложенное, то общая схема созда
ния массива реализуется следующими командами:
тип [ ] переменная ;
переменная=nеw тип [ размер ] ;
То есть задача по созданию массива состоит из двух этапов:
•
•
объявление переменной массива ;
создание массива и присваивание ссылки на массив переменной мас
сива.
Эти два этапа можно объединить и воспользоваться такой командой:
тип [ ] переменная=nеw тип [ размер ] ;
Схема реализации одномерного массива проиллюстрирована на рис. 4. 1 .
Например, командой i n t [ ] nums=new i n t [ 1 2 ] создается целочис
ленный массив из 1 2 элементов, объявляется переменная массива nums
и ссылка на созданный массив записывается в эту переменную. Ко
мандой char [ ] s ymb s =new char [ 1 О ] создается массив из 1 О сим
вольных элементов, объявляется переменная массива s ymb s и ссылка
на массив записывается в переменную.
173
Глава 4
/
, ...
/
.... - "
,-
"
- ,1 - ,
Пер емен н а я: масс и в а '.
, , .... - - " .>, поэтому нельзя однозначно предугадать, когда именно объекты
будут удалены. Можно быть уверенным лишь в том, что это произойдет.
Стати ч еские ч лены кл асса
Приедут тут всякие : без профессии , без подушек" .
из к/ф « д евчата>.>
Поля и методы могут быть статическими. Особенность статических по
лей и методов в том, что они могут использоваться без создания объектов.
G)
Н А ЗАМ ЕТ КУ
Со статически м и методами м ы уже встречал ись ранее и обсужда
ли их. Но там реч ь шла о статических методах, описанных в том же
классе , что и главный метод п рограм м ы . Соответственно, мы ис
пол ьзовал и статические методы в том же классе , в котором они
были оп исан ы . Но в общем случае статический метод может быть
оп исан в одном классе , а использован в другом .
Статические члены класса описываются с ключевым словом s t a t i c .
Для обращения к статическому члену класса (полю или методу) указы
вается имя класса, после которого через точку указывают имя поля или
имя метода (с аргументами или без). Таким образом, если при обращении
314
З нако мство с классами и о бъекта м и
к обычным полям и методам нам нужно указать объект, то при обращении
к статическим полям и методам вместо объекта указывается класс. Если
статическое поле или метод используются в том же классе, где они описа
ны, то имя класса при обращении к полю или методу можно не указывать.
(D
Н А ЗАМ ЕТ КУ
Статические поля играют рол ь глобал ьных переменных. Они «не при
вязан ы » к какому-то кон кретному объекту и существуют «сами
по себе » . Единственное огран ичение - статические поля нужно
описы вать в классе и при обращении указы вать имя этого класса .
Аналогично, статические методы в языке С# и грают п римерно ту же
рол ь, что и фун кци и в языке С++ . Статический метод - это , по сути ,
блок команд, которые не подразумевают испол ьзован ия объекта ,
и поэтому для выполнения этих команд ( вызова метода) объект как
таково не нужен .
�
ПОДРОБН ОСТИ
При обращении к статическому пол ю или при вызове статическо
го метода вместо имени класса можно указать и имя объекта это
го класса , п ричем объект может быть любым ( главное, чтобы того
класса , в котором оп исан статический член ) . Во всех случаях реч ь
идет о статических членах. Но обращаться к статическому члену че
рез объект все же нежелател ьно, поскол ьку в этом случае создается
иллюзия , что соответствующее поле или метод я вляются обыч н ы м и
(не статически м и ) , а это не так.
При работе со статическими методами существует очевидное ограниче
ние: статический метод может обращаться только к статическим полям
и методам в классе. Объяснение простое: поскольку статический метод
существует без привязки к объекту, то нет смысла обращаться к полям
и методам объекта (поскольку объекта как такового нет).
В листинге 6.6 представлена программа. В ней используется класс со ста
тическим полем и методом.
� Листинг 6 . 6 . Знакомство со статическими полями и методами
u s ing Sys tem;
11 Класс со статическим полем и методом :
c l a s s MyClas s {
1 1 Статическое поле :
315
Глава б
puЫ ic static int code=l O O ;
1 1 Статический метод :
puЫ ic static void show ( ) {
Console . WriteLine ( " Cтaтичecкoe поле : " +code ) ;
1 1 Класс с главным методом :
c l a s s StaticDemo {
1 1 Главный метод :
static vo id Main ( ) {
1 1 Вызов статического метода :
MyClas s . show ( ) ;
1 1 Обращение к статическому полю :
MyClas s . code=2 0 0 ;
1 1 Вызов статического метода :
MyClas s . show ( ) ;
Ниже представлен результат выполнения программы.
� Результат выполнения программы ( из листинга 6 . 6)
Статическое поле : 1 0 0
Статическое поле : 2 0 0
В программе описьmается класс MyC l a s s , у которого есть открытое статиче
ское целочисленное поле code с начальным значением 1 О О , а также статиче
ский метод show ( ) (без аргументов и не возвращающий результат). Метод
при вызове отображает в консольном окне значение статического поля code.
В главном методе программы командой MyC l a s s . s h o w ( ) вызы
вается статический метод s h o w ( ) класса MyC l a s s . В результате
в консоли отображается текущее значение статического поля c o d e .
Мы это значение можем изменить - например, с помощью команды
MyC l a s s . c o de = 2 0 0 , после чего значение статического поля стано
вится равным 2 0 0 . Проверить это легко - достаточно вызвать метод
316
З нако мство с классами и о бъекта м и
s h ow ( ) (команда MyC l a s s . s how ( ) ) . В данном случае примечателен
факт, что мы не создали ни одного объекта класса MyC l a s s , но это не ме
шает нам использовать статические члены этого класса.
Еще один, на этот раз �математический� пример с использованием ста
тических полей и методов представлен в листинге 6.7. В программе опи
сан класс МуМа th, в котором есть статические методы для вычисления
значений синуса и экспоненты. В классе также имеется константное ста
тическое поле, значение которого определяет иррациональное число л.
G)
Н А ЗАМ ЕТ КУ
Что касается статических полей , то нередко они испол ьзуются как
статические константы : для такого поля указы вается идентифика
тор типа (и есл и нужно - спецификатор уровня доступа ) , но вместо
кл ючевого слова s t a t i c указы вается идентификатор c o n s t . При
ч и на в том , что константн ые поля по умолчанию реал изуются как
статические. Значение константного поля указы вается при объя в
лении и впоследстви и не может быть изменено.
�
ПОДРОБН ОСТИ
Дл я вычисления экспоненты испол ьзуется следующее вы ражение:
"п
х2
х3
х"
�
ехр (х) ::::: 1 + х + 2Т
+ 31 ." + nг = Lk=O k! . В п рограмме описывается
статический метод для выч исления сум м ы Lk=O qk q0 + q , + + qn ,
где при заданно �значен и и аргумента х слагаем ые в сум ме вычис
=
···
ля ются как qk = k!· Сум ма вычисляется с помощью оператора цик
ла, в котором после п рибавления к сум ме очередного слагаемого
рассч иты вается слагаемое для следующей итераци и . При этом
мы исходим из того , что есл и выч ислена добавка qk для текущей
итераци и , то добавка qk+i для следующей итера ци и выч исляется
как
qk+ 1
qk
х
qk+ i = qk x k+ l
=
(легко п роверить, что есл и
qk
),
k..!.__
+1
=
�
�
k! и qk = (k+ l)! ' то
Аналоги ч н ы м образом выч исляется си нус : испол ьзуется формула
(-1 )"х>п+1 - " п (-1 )kx>k+1
xl
xs
х'
s 1 n (x) - х - 31 + 51 - 71 + ". + (2n + l ) ! - Lk=O ( 2k + l ) ! . П одход испол ьзу •
ем тот же , что и при вычислении экспоненты - то есть выч исляет-
Глава б
Для определения значения параметра п ( верхняя граница в сум мах,
через которые вычисляется си нус и экспонента) в програм ме (в со
ответствующем классе) объя влено статическое целоч исленное поле.
А значение тт=З , 1 4 1 592 определяется через статическую константу.
Проанализируем представленный ниже программный код.
[1i!J Л истинг 6. 7. И спользование статических полей и методов
us ing Sys tem;
/ / Класс со статическими методами и полями :
c l a s s MyMath {
/ / Константное поле ( число " пи" ) :
puЫ ic const douЫe Рi=З . 1 4 1 5 92 ;
/ / Закрытое статическое поле ( граница суммы) :
private static int N=l O O ;
/ / Статический метод для вычисления экспоненты :
puЫ ic static douЫe exp ( douЫe х ) {
/ / Сумма и добавка к сумме :
douЫe s=O , q= l ;
/ / Вычисление суммы :
for ( int k=O ; k=text . Length истинно в том случае,
если индекс меньше нуля или больше максимально допустимого ин
декса в тексте (определяется длиной текста). В этом случае выполня
ется инструкция r e t u rn, которая завершает работу аксессора, и с тек
стовым полем объекта, соответственно, ничего не происходит. Если же
этого не происходит, то индекс попадает в допустимый диапазон значе
ний и начинается процесс вычисления нового текстового значения для
поля t e x t . Для этого объявляется локальная текстовая переменная t
с пустой текстовой строкой в качестве начального значения. Затем запу
скается оператор цикла, в котором к текстовой строке последовательно
дописываются начальные символы из поля t e x t , но только до символа
с индексом k (этот символ не копируется). Далее командой t + =va l u e
к текстовой строке дописывается тот символ, который присваивает
ся значением выражению с проиндексированным объектом. То есть
490
С в ойст ва и индекс аторы
получается, что вместо символа с индексом k из текстового поля t e x t
в текстовую строку дописывается тот символ, что указан в операции
присваивания (определяется значением параметра val ue ). Затем сно
ва запускается оператор цикла, с помощью которого к текстовой строке
из переменной t дописываются все оставшиеся символы из текстово
го поля t e x t . По завершении этого оператора цикла командой t e x t = t
текстовое поле получает новое значение. Новое значение поля t e x t от
личается от предыдущего значения одним символом.
В главном методе программы командой MyS t r i n g t x t = " Myx a " соз
дается объект t x t класса MyS t r i n g (здесь использована операция
неявного приведения типов). Также главный метод содержит приме
ры использования индексатора с индексом, значение которого выхо
дит за допустимый диапазон (команды t x t [ - 1 ] = ' ы ' и t x t [ 4 ] = ' ъ ' ).
Есть также команды ( t x t [ O ] = ' C ' , t x t [ l ] = ' л ' , t x t [ 2 ] = ' o '
и txt [ 3 ] = ' н ' ), в которых значение индекса корректно. Для проверки
значения текстового поля объекта t x t используется переопределение
метода T o S t r i n g ( ) (метод вызывается, когда объект t x t передается
аргументом методу W r i t e L i n e ( ) ).
В следующем примере описывается класс с индексатором, индекс кото
рого не является целым числом. Соответствующая программа представ
лена в листинге 9. 1 1 .
� Л истинг 9 . 1 1 . И ндексатор с нечисловым индексом
u s ing Sys tem;
11 Класс с индексатором :
c l a s s MyClas s {
1 1 Целочисленное поле :
puЫ ic int code ;
1 1 Конструктор с одним аргументом :
puЫ ic MyCla s s ( int n ) {
code=n ;
1 1 Целочисленный индексатор с индексом , который является
11 объектом класса MyCla s s :
puЫ ic int this [ MyC l a s s obj ] {
1 1 Метод вызывается при считывании значения
491
Гл ава 9
1 1 выражения с проиндексированным объектом :
get {
1 1 Резуль тат :
return code - obj . code ;
1 1 Метод вызывается при присваивании значения
11 выражению с проиндексированным объектом :
set {
1 1 Присваивается значение полю :
code=obj . code+value ;
1 1 Класс с главным методом :
c l a s s Non intindexDemo {
1 1 Главный метод :
static vo id Main ( ) {
1 1 Создание объекта :
MyC l a s s A=new MyC l a s s ( l O O ) ;
1 1 Проверка значения поля объекта :
Console . WriteLine ( " Oбъeкт А : { 0 } " , A . code ) ;
1 1 Создание объекта :
MyC l a s s B=new MyC l a s s ( 1 5 0 ) ;
1 1 Проверка значения поля объекта :
Console . WriteLine ( " Oбъeкт В : { 0 } " , B . code ) ;
1 1 Использование индексатора :
int num=A [ B ] ;
Console . WriteLine ( " Bыpaжeниe А [ В ] = { О } " , num) ;
Console . WriteLine ( " Bыpaжeниe В [А ] = { О } " , В [А ] ) ;
А [ В ] =2 0 0 ;
1 1 Проверка значения поля объекта :
Console . WriteLine ( " Oбъeкт А : { 0 } " , A . code ) ;
492
С в ойст ва и индекс аторы
Результат выполнения программы такой.
[1i!J Результат выполнения программы (из листинга 9 . 1 1 )
Объект А : 1 0 0
Объект В : 1 5 0
Выражение А [ В ] = - 5 0
Выражение В [ А] = 5 0
Объект А : 3 5 0
Здесь мы описываем класс MyC l a s s , у которого есть открытое целочис
ленное поле c o de , конструктор с одним аргументом и индексатор. Тип
индексатора определяется ключевым словом i n t , а вот индекс в индекса
торе описан как MyC l a s s obj . Аксессоры индексатора описаны так, что
результатом выражения вида А [ В ] , в котором А и В являются объектами
класса MyC l a s s, является разность значений поля c o de объекта А и объ
екта В. Например, если поле c o de объекта А равно 1 О О , а поле c o de объ
екта В равно 1 5 О , то результатом выражения А [ В ] будет 5 О (разность
значений 1 О О и 1 5 О ). Значение выражения В [ А ] при этом равно 5 О (раз
ность значений 1 5 О и 1 О О ). Если выражению вида А [ В ] присваивается
целочисленное значение, то поле c o de объекта А получит новое значение,
которое равно сумме значения поля c o de объекта В и значения, присваи
ваемого выражению А [ В ] . Так, при значении поля c o de объекта В равном
1 5 О в результате выполнения команды А [ В ] =2 О О поле c o de объекта А
получит значение 3 5 О (сумма значений 1 5 О и 2 О О ).
-
Двумерные и ндексаторы
Дело государственной важности. Возможна
погоня.
из к/ф «Бриллиантовая рука»
Двумерный индексатор описывается, в принципе, так же, как и одномер
ный индексатор. Отличие лишь в том, что теперь в индексаторе опи
сывается два индекса (могут быть разного типа). Для каждого индекса
указывается тип, описания индексов в квадратных скобках разделяют
ся запятыми. При индексировании объектов также указывается два ин
декса. В листинге 9. 1 2 представлена программа, дающая представление
о том, как описывается и используется двумерный индексатор.
493
Гл ава 9
[1i!J Л истинг 9 . 1 2 . Знакомство с двумерными индексаторами
us ing Sys tem;
/ / Класс с двумерным индексатором :
c l a s s MyClas s {
/ / Закрытое поле , являющееся ссылкой н а двумерный
/ / символьный массив :
private char [ , ] s ymЬ s ;
/ / Конструктор с двумя аргументами :
puЫ ic MyC la s s ( int а , int Ь ) {
/ / Создание двумерного массива :
s ymbs=new char [ a , Ь ] ;
/ / Заполнение двумерного массива .
/ / Перебор строк массива :
for ( int i=O ; i