Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

алгоритмы и програмування / Книги / Шилдт Г. C++ Руководство для начинающих

.pdf
Скачиваний:
5702
Добавлен:
19.04.2015
Размер:
19.93 Mб
Скачать

122 Модуль З. ИНСТРУI<ЦИИ управлени~

case 'А':

cout « "Эта А-ветвь - часть внутренней switch";

break;

case '8': // _.,

break;

саБе '8': // __ .

~npocыМЯтеl<ущеroконтроля--------

1. Какого типа должно быть выражение, управляющее инструкцией sw i tch?

2. Что происходит в случае, если результат вычисления swi tсh-выражения

совпадает с саsе-константой?

3. Что происходит, если саsе-последователъность не завершается инструк­

цией break?*

Спросим у опытного программиста

Вопрос. В какихслучаях кодированu.я мноzонаnравленноzо вemвленu.я лучше исполь­

зовать i f 15 e-i f - Uлестницу", а не инструкцию 5 wi tch2'

Ответ. Используйте i f-еlsе-if-"лестиицу" в том случае, когда условия, управ­

ляющие процессом выбора, нельзя определить ОДЮlм значением. Рассмо­

трим, например, следующую i f 1 5 е-i f -последовательность.

If(x < 10) // _ ..

else Н(у > О) // _ ••

else If (! done) / / '"

эту последовательность нельзя переllрограммировать с помощью инсгрук­

ции swi tch, поскольку все три условия вКJIIOчaIOТ различные перемеюwе

и различные пmы. какая переменнзя управляла бы инсгрукцией switch?

Кроме тoro, if-е1sе-if-"лестницу" придется использовать и в случае, когда

нужно проверять значения с плавающей точкой или другие объекты, 'IИПbI

которых не подходят для ИСП01IЬЭ08aI!ИЯ В swi tсh-вьrpaжении.

1.Выражение. управляющее инструкцией swi1:ch, должно иметь целочисленный или

символьный тип.

2.Если резулътзт вычисления swi tсh-выражения совпадает с саsе-константой, то вы­ полняется последователыlOСТЪ инструКЦИЙ, связанная с ЭТОЙ case-константоЙ.

З. Если са 5 е-последовательность не завершается инструкцией break, то ВЪП101ПlЯется

следующая case-последовательнос1Ъ инструкций.

С++: руководство ДМ! начинающих 123

"'ЩеЙ"'II" '_IIИМ·'.

_,мм t

ГH;i~.~p;- Этот проект создает простую справочную систему, которая под-

---......; сказывает синтаксис управляющих С++-инструкций_ После за-

пуска наша программа отображает меню, содержащее инструкции управления, и

переходит в режим ожидания до тех пор, пока пользователь не сделает свой вы­

бор. Введенное пользователем значение используется в инструкции swi tch для отображения синтаксиса соответствующей инструкции_ В первой версии нашей

простой справочной системы можно получить "справку" только по i f - и s wi t - сh-Инструкциям. Описание синтаксиса других управляющих С++-инструкuий

будет добавлено в последующих проеКтах_

ПослеАовательность Аействий

1.

Создайте файл Help. срр_

2.

Выполнение программы должно начинаться с отображения следующего

 

меню_

 

 

 

 

 

Справка

по

инструкциям:

 

1. if

 

 

 

 

 

2.switch

 

 

 

Выберите

вариант справки:

 

Для реализации этого меню используйте следующую последователыюсть

 

инструкций.

 

 

 

cout

«

"Справка по инс'!'рукциям:\п";

 

cout

«"

 

1.

if\n";

 

cout

«"

 

2.

switch\n";

 

cout

«

"Выберите вариант справки: ";

3.

Затем программа должна принять вариант пользователя.

 

cin »

choice;

 

4.

Получив вариант пользователя, программа применяет инструкцию swi t-

 

ch для отображения синтаксиса выбранной инструкции_

 

switch(choice)

 

 

саsе

'1':

 

 

 

cout

«

"Синтаксис инструкции if:\n\n";

 

 

cout

«

"if(условие) инструкция;\п";

 

 

cout «

"е1sе инструкция;\п";

break;

124 МодульЗ. Инструкцииуправления

саэе '2':

 

 

cout

«

"Синтаксис инструкции switch:\o\o":

cout

«

"switсh(выражение) (\о":

cout

«"

 

саэе константа:\о":

cout

«"

последовательность инструкций\о":

cout

«"

break:\o";

cout

«"

// ~ .. \o";

cout

«

"}\о":

break:

defau1t:

cout « "Такого варианта нет.\о";

5. Приведем полный лис'РИНГ программы Не1р. срр.

/*

Проект 3.1.

Простая справочная система.

*/

#ioc1ude <iostream> usiog оатезрасе std:

iot maio () char choice:

cout « "Справка по инструкциям:\о":

cout «" 1. if\o": cout «" 2. switch\n":

cout « "Выберите вариант справки: ":

cin » choice:

cout « "\n":

switch(choice)

саэе '1':

cout « "Синтаксис ИНСТРУКЦИИ if:\n\n": cout « "if (условие) ин(:трукция: \0": cout « "е1зе инструкция;\п";

break; case '2': cout « cout « cout « cout « cout « cout « cout « break; default: cout «

С++: руководство ДЛЯ начинающих 125

"Синтаксис инструкции switch:\n\n";

"switсh(выражение) (\n";

"case KOHcTaHTa:\n";

"последовательность инструкций\n";

"break; \n" ;

"// ... \n";

"}\n";

"Такого варианта HeT.\n";

return О;

Вот один ИЗ возможных вариантов вьmолнения этой программы.

Справка по инструкциям:

1. if

2. switch

Выберите вариант справки: 1

Синтаксис инструкции if:

if(условие) инструкция;

else инструкция;

ВАЖНОI

'18' 'ИК. fg;r;

в модуле 2 мы уже использовали простую форму цикла for. Здесь же мы рас­

смотрим его более детально, и вы узнаете, насколько мощным и гибким средством

программирования он является. Начнем с традиционных форм его использования. Итак, общий формат записи цикла for для многократного выполнения одной

инструкции имеет следующий вид.

fоr(инициализация; выражение; инкремент) инструкция;

Если цикл for предназначен для многократного выполнения не одной ин­

струкции, а программноro блока, то его общий формат выглядит так.

126 МОДУЛЬ З. ИНСТРУКЦИИ управлениS1

fоr(инициализация; выражение; инкремент)

{

последовательность инструкций

Элемент инициализация обычно представляет собой инструкцию присваивания, которая устанавливает ynpa6Л1UOlJJUЮ nepeмeн1l1JЮ ЦUЮUl равной начальному значе­ нию. эта переменная действует в качестве счетчика, который управляет ра(ютой

цикла Элемент выражение представляет собой условное выражение, в кО'Тором

тестируется значение управляющей переменной цикла. Результат этого тecrирова­ ния определяет, выполнится цикл for еще ра;} или нет. Элемент инкремент - это

выражение, которое определяет, как изменяется значение управляющей переменной

цикла после каждой итерации. Обраnпе ВНИМiUfие на то, что все эти элементы цикла for должны отделяться точкой с запятой. Цикл for будет выполняться до тех пор,

пока вычисление элемента выражение дает истинный результат. как только это

условное выражение станет ложным, цикл завершится, а выполнение программы

продолжится с ииструкции, следующей за циклом for.

В следующей программе цикл for используется для вывода значений ква­ дратного корня, извлеченных из чисел от 1 до 99. В этом примере управляющая

перемеtlНая цикла называется пит.

//ВЫВОД значений квадратного корня из чисел от 1 до 99.

#inc1ude <iostream> #inc1ude <cmath> using namespace std;

int main ()

{

int пит;

double sq_root;

for(num=l;

пит <

100;

пит++) (

sq_root = sqrt«double) пит);

cout «

пит «

" " «

s~root « '\п';

return О;

в этой программе использована стандартная С++-функция sqrt (). как разъяснялось в модуле 2, эта функция возвращает значение квадратного корня

sqrt ()

С++: РУКОВОДСТВО М9. начинающих 127

из CBoero аргумента. Аргумент должен иметь тип double, и именно поэтому при вызове функции параметр пит приводится к типу double. Сама функ­ ция также возвращает значение типа double. Обратите внимание на то, что в

программу включен заголовок <стаth>, поскольку этот заголовочный файл обе­

спечивает подцержку функции sqrt ().

Управляющая переменнЗS\ цикла for может изменяться как с положитель­

ны,' так и с отрицательным приращением, причем величина этого приращения

также можетбытьлюбой. Например, следующаяпрограммавыводит числа вдиа­

пазоне от 50 до -50 с декрементом, равным 10.

// Использование в цикле for отрицательного приращеНИR.

#include <iostrearn> using narnespace std;

int main()

int i;

for(i=50; i >= -50; i

i-10) cout « i « I 1 .

return О;

При выполнении программа генерирует такие результаты.

50 40 за 20 10 О -10 -20 -зо -40 -50

Важно понимать, что условное выражение всегда тестируется в начале выпол­ нения цикла for. Это значит, что если первая же проверка условия даст значение ЛОЖЬ, код тела ЦИJUIа не выполнится ни разу. Вот пример:

for(count=10; count < 5; count++)

cout « count; // Эта инструкция не выполнится.

Этот цикл Iiикогда не выполнится, поскольку уже при входе в Hero значение его

управляющей переменной count больше пяти. Это делает условное выражение

(count < 5) ложным с самого начала. Поэтому даже одна итерация этоro цикла

не будет выполнена.

Вариации на тему цикла for

Цикл for - одна из наиболее гибких инструкций в С#, поскольку она по­

зволяет получить широкий диапазон вариантов ее применения. Например, для

г­

:s:

:r

Ф

.;;:

'"о

Q.

128 Модуль З. ИНСТРУКЦИИ управления

управления циклом for можно использовать несколько переменных. Рассмо­ трим следующий фрагмент кода.

for(x=O, y=lO; х <= у; ++х, --у) // Сразу несколько

/ / упрааna:IЦИХ nepeкellJWX.

cout « х « ' , « у « '\п';

Здесь запятыми отделяются две инструкции инициализации и два инкремеНТНbJХ

выражения. Это делается для того, чтобы компилятор "понимал", что существует

две инструкции инициализации и две инструкции инкремента (декремента). В

С++ запятая представляет собой оператор, I<ОТОрЫЙ, по сути, означает "сделай

это и то". Другие применения оператора "запятая" мы рассмотрим ниже в этой книге, но чаще всего он используется в цикле for. В разделах инициалИЗ311ИИ и

инкремента цикла for можно использовать любое количество инструкции, но

обычно их число не превышает двух.

Спросим у опытного программиста

Вопрос. Поддерживает ли С++, помимо !щrt(). другие мате..mтuческие функции?

Ответ. Даl Помимо функции sqrt (), С++ поддерживает широкий набор мате­

матических функций, например sin () , cos (), tan (). 10g (), cei1 ()

и floor ( ). Если вас интересует программирование в области матема1'И­

КИ, вам стоит ознакомиться с составом С++-библиотеки математических функций. Это сделать нетрудно, поскольку все С++-компиляторы их под­

держивают, а их описание можно найти в документации, прилагаемой к

вашему компилятору. Помните, что все математичеСЮlе функции требуют

включения в программу заголовка <ста th>.

Условным выражением, которое управляет циклом f оr, может быть любое допу­

стимое С++-выражение. При этом оно не06язательно должно включать управляю­

щую переменную ЦИЮIа. В следующем примере цикл будет выполняться до тех пор, пока функция rand () не сгенерирует значение, которое превышает число 20 000.

/*

Выполнение цикла продолжается здесь до тех пор, пока

случайное число не превысит 20000.

*/

tinclude <iostream> tinclude <cstdlib> using namespace std;

 

 

 

 

С++: PYI<OBOACTBO ДЛ91 начинающих 129

са

int main ()

 

 

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

10:

 

 

 

 

 

 

:s:

int

i;

 

 

 

 

 

:1:

 

 

 

 

 

Ф

 

 

 

 

 

 

 

<

int

r;

 

 

 

 

 

R

 

 

 

 

 

 

 

5-

 

 

 

 

 

 

 

:s:

r =

rand () ;

 

 

 

 

~

 

 

 

 

~

 

 

 

 

 

 

 

>-

for(i=O;

r <=

20000;

i++)

//

В этом уcnо.вом awp...вии

еu-

.:1:

 

 

 

 

 

/ /

 

:S:

 

 

 

 

 

уа:рaJШ-nцe- переllеlUl&Jl ЦИIUI&

 

 

 

 

 

 

// не ИCDоnъsуетс•.

 

r = rand () ;

 

 

 

 

 

cout

«

"Число

равно

" «

r

«

 

"Оно сгенерировано при попытке " « i « " ." ,.

return О;

ВОТ ОДИН из возможных результатов выполнения этой программы.

Число равно 26500. Оно сгенерировано при попытке з.

При каждом проходе ЦИlUIа с помощью функции rand () генерируется новое случайное число. Когда оно превысит число 20 000, условие продолжения ЦИlUIа

станет ложным, и ЦИIUI прекратится.

Отсутствие элементов в определении цикла

в С++ разрешается опустить любой элемент заголовка цикла (инициализа­

ция, условное выражение, инкремент) или даже все сразу. Например, мы хотим

написать ЦИIUI, который должен выполняться до тех пор, пока с lUIавиатуры не

будет введено число 123. Вот как выглядит такая программа.

.

// Цикл for без инкремента в заголовке.

#include <iostream> using паmеsрасе std;

int main ()

130

МОДУЛЬ З. ИНСТРУJ<ЦИИ управлени~

int

Х;

 

 

 

for(x=O;

х != 123;

{ / / ~ Зl.zpахе_ JUUCPeKeR~a He~.

cout

«

"Введите число: ";

ci'n

»

Х;

 

return О;

Здесь в заголовке цикла for отсутствует выражение инкремента. Это означает, что при каждом повторении цикла выполняется только оДJЮ действие: значение переменной х сравнивается с числом 123. Но если ввести с клавиатуры число 123,

условное выражение, проверяемое в цикле, станет ложным, и цикл завершится.

Поскольку выражение инкремента в заголовке цикла for отсутствует, управля­ ющая переменная цикла не модифицируется.

Приведем еще один вариант никла for, в заголовке которого, как показано в следующем фрагменте кода, отсутствует раздел инициализации.

х = О;

/ /

+-

Переиенная: х инициanизируе~CJI вне ЦИlCJlа.

for ( ; х<10;

 

cout

«

х

« I 1,.

++Х;

 

 

 

Здесь пустует раздел инициализации, а управляющая переменная 1< инициализи­ руется до входа о цикл. К размещению выражения инициализации за пределами

цикла, как правило, прибегают только в том случае, когда начальное значение генерируется сложным процессом, который неудобно поместить в определение цикла. Обратите внимание также на то, что в :пом примере элемент инкремента

цикла for расположен не в заголовке, а в теле цикла.

Бесконечный цикл for

Оставив пустым условное выражение цикла for, можно создать бесконечuый

цикл (цикл, К01'ОрЫЙ никогда не заканчивается). Способ создания такого цикла

показан на примере следующей конструкции цикла for.

for(;;)

/ / ...

С++: руководство ДЛЯ начинающих 131

Этот ЦИКЛ будет работать без конца. Несмотря на существование некоторых за­

дач программирования (например, KOMaMHbIX процессоров операционных си­

стем), которые требуют наличия бесконечного цикла, большинство "бесконеч­

ных циклов" - это просто циклы со специальными требованиями к завершению.

Ближе к концу этого модуля будет показано, как завершить ЦИКЛ тaкoro типа.

(Подсказка: с помощью инструкции break.)

Циклы без тела

в С++ тело цикла for может быть пустым, поскольку в С++ синтаксически допустима пустая инструкция. "Бестелесные" циклы не только возможны, но за­ частую и полезны. Например, в с.ледующеЙ программе один из таких циклов ис­ пользуется для суммирования чисел от 1 до 10.

//Пример использования цикла for с пустым телом.

#include <iostream> #include <cstdlib> using namespace std;

int main ()

int i;

int зит О;

//Суммируем числа от 1 до 10.

for(i=l; i <= 10; sum += i++)

;

// ~ "БеСlJ.lеnесRЫЙ" ЦИ1CJI.

cout «

"Сумма чисел равна "

«

sum;

return

О;

 

 

Результат выполнения этой программы выглядит так.

Сумма чисел равна 55

Обратите внимание на то, что процесс суммирования полностью реализуется в заголовке J:lНСТРУКЦИИ f Оr, и поэтому в теле цикла нет никакой неоБХОДИМОСnt.

Обратите также в}lИмание на следующее выражение инкрементирования.

зит += i++

Соседние файлы в папке Книги