osnovyiprogrammirovaniyanac
.pdfВнутри составных операторов могут быть также условные операторы, содержащие простые или составные операторы.
Мы рассмотрели полную форму условного оператора. В языке допускается и краткая форма, которая имеет вид:
if (условие) оператор_1;
Если условие истинно, то выполняется оператор!, иначе (если условие ложно) оператор_1 пропускается. *
В виде блок схемы краткую форму записи оператора if можно представить так:
В С++ существует другая форма записи условного оператора. Это операция «знак вопроса - двоеточие». В общем виде условный оператор выглядит так:
результат = условие ? значение^! : значение_2;
Если условие, стоящее перед знаком вопроса, истинно, то результату присваивается значение_1, стоящее до двоеточия, иначе - значение_2, стоящее после двоеточия. Основное отличие оператора «?:» от оператора if заключается в том, что if не вырабатывает значения, а результат операции «?:» можно присвоить в переменную.
Например, нужно написать программу для нахождения максимального значения из двух чисел. С помощью if мы бы записали так:
int a, b, max;
if (а > b) max = а; else max = b;
ъ
А вот тот же код, но только уже написанный при помощи операции «?:»
int a, b, max;
max = а > b ? а : b;
Если а больше Ь, то переменной max будет присвоено значение а, иначе - значение Ь.
В языке С++ принято следующее правило. Любое выражение с оператором присваивания, заключенное в круглые скобки, имеет значение, равное присваиваемому. Например, выражение (р = 5 + 3) имеет значение 8. После этого можно написать другое
выражение, например: ((р = 5 + 3) < 10), которое в данном случае будет всегда давать истинное значение.
Пример 6.3. Вычислить значение функции у = 1/х при заданном значении аргумента х. Если введенное значение х = 0, то вычисление не производить.
/* Вычисляем у = 1/х */ |
|
|
|
float |
х, у; |
|
|
printf ("Введите значение переменной х: \ п " ) ; |
|||
scanf ("%f", &х); |
|
|
|
if(x |
== 0) printf("Недопустимое |
значение |
переменной х ! \ п " ) ; |
else |
|
|
* |
{ |
|
|
|
У = |
1/х; |
|
|
printf("При х = %.2f, у = %.2f |
\п", х, |
у ) ; |
}
Оператор выбора switch
В условном операторе if мы можем пойти только по двум путям. Но зачастую бывают ситуации, когда мы должны выбирать из большого количества вариантов. Конечно, это можно реализовать с помощью вложенных операций if. Но в С++ предусмотрена специальная конструкция: оператор выбора switch (переключатель), позволяющий пойти по одной из нескольких веток алгоритма. Это особенно часто используется при создании меню, В самом общем виде оператор выглядит так:
switch( выражение )
{
case константа_1 : вариант_1; case константа_2 : вариант_2;
case константа N : вариант N; default : вариант_Ы+1;
break;
break;
break;
}
Здесь используются ключевые слова switch, case, default и break. Конструкция работает следующим образом. Сначала высчитывается выражение в круглых скобках. Полученное значение сравнивают со всеми константами (константными выражениями). Все константы должны быть различными. Если константа равна выражению, то выполняется соответствующий вариант (одна или несколько инструкций). Вариант с ключевым словом default реализуется, если ни один другой не подошел (вариант default может и отсутствовать). Если default отсутствует, а все результаты сравнения отрицательны, то ни один вариант не выполняется. Для прекращения последующих проверок после успешного выбора некоторого варианта используется оператор break, обеспечивающий немедленный выход из переключателя switch.
В операторе switch, как и в if, допускаются вложенные инструкции. „ Пример 6.4. Напишите программу - калькулятор. Необходимо создать меню с четырьмя пунктами. Программа спрашивает 2 числа и, в зависимости от выбранного пункта меню, складывает, вычитает, перемножает, делит между собой эти числа или
просто выходит из программы.
float a, b, |
res=0; |
|
int ch; |
|
|
scanf("%f %f", &a, &b); |
||
printf(" 1. |
Сложить |
\ n " ) ; |
printf(" 2. |
Вычесть |
\ n " ) ; |
printf(" 3. |
Умножить \ n " ) ; |
41
printf(" |
4. |
РазделитьХп |
); |
|
|
|
scanf("%i",Sen); |
|
// |
Выбираем пункт |
меню |
||
switch( |
ch ) |
|
|
// В |
зависимости от |
значения ch выполняем нужную |
//операцию |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
case |
res = a + b |
|
break; |
|
||
case |
res = a - b |
|
break; |
|
||
case |
res = a * b |
|
break; |
|
||
case |
res = a / b |
|
break; |
|
||
|
printf( '"Вы |
ошиблись! ") ; |
|
|||
} |
|
|
|
|
|
|
printf("Ответ |
: %2.2f", |
res); |
|
|
Задачи к главе б.Условные операторы
Оператор if
Задача 6.1. Известно, что оптимальный вес вычисляется по формуле: рост (в сантиметрах) - 100. Напишите программу, которая вычисляет оптимальный вес и выдает рекомендации.
Рекомендуемый вид экрана:
Введите свой рост и вес: 170 68
Вам надо поправиться на 2,00 килограмма.
Задача 6.2. Напишите программу проверки знания даты основания Санкт-Петербурга. Рекомендуемый вид экрана:
В каком |
году |
был |
основан |
Санкт-Петербург? |
» |
Введите |
число |
и |
нажмите |
<Enter> |
|
- > 1 7 0 5 |
|
|
|
|
|
Неверно, |
Санкт-Петербург |
был основан в 1703. |
|
Задача 6.3. Напишите программу проверки знания начала Второй мировой войны. Рекомендуемый вид экрана:
Когда началась Вторая мировая война?
- > 1 9 3 9
Правильно.
Задача 6.4. Напишите программу, вычисляющую стоимость покупки с учетом скидки. Скидка 10 % предоставляется, если сумма покупки больше 1000 рублей.
Рекомендуемый вид экрана:
Введите стоимость покупки:
- > 1 2 0 0
Вам предоставляется скидка 10%. Сумма с учетом скидки 1080,00 руб.
Задача 6.5. С клавиатуры вводятся 3 числа. Напишите программу, которая выводит числа в строку в порядке возрастания.
Рекомендуемый вид экрана:
Введите 3 числа: 8 5 9 5 8 9
Задача 6.6. Напишите программу решения линейного уравнения вида ах + b = 0.
Задача 6.7. Напишите программу решения квадратного уравнения ах2 + Ьх + с = 0.
Задача 6.8. В восточном календаре принят 60-летний цикл, состоящий из 12-летних под циклов, обозначаемых названиями цветов: зеленый, красный, желтый, белый и черный. В каждом под цикле годы носят названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы, собаки и свиньи. С клавиатуры вводится номер года. Необходимо вывести его название, если 1984 год был началом цикла - годом зеленой крысы.
Задача 6.9. С клавиатуры вводятся радиусы двух кругов, координаты центров которых совпадают. Напишите программу, которая выводит их на экран и закрашивает наименьший из них синим цветом, а больший - желтым. Если радиусы совпадают, то программа должна сообщить об этом пользователю и увеличить радиус, введенный первым на 5 пикселей.
Задача 6.10. С клавиатуры вводятся координаты трех горизонтальных линий в произвольном порядке (т.е. линия, координаты которой были введены последними, может
быть между двумя другими). Напишите программу, которая всегда окрашивает самую верхнюю линию в красный цвет, следующую - в зеленый и последнюю - в желтый цвета.
Оператор case
Задача 6.11. Напишите программу, которая запрашивает у пользователя номер текущего месяца и сообщает время года.
Рекомендуемый вид экрана:
Введите номер месяца: 11 Зима.
Задача 6.12. Напишите программу, которая после введенного с клавиатуры числа (от 1 до 999), дописывает слово «рубль» в правильной форме (21 рубль, 332 рубля, 890 рублей).
Задача 6.13. Напишите программу, которая вычисляет дату следующего дня. Рекомендуемый вид экрана:
Введите числами сегодняшнюю дату (число месяц год):31 12 2004 Последний день месяца!
С наступающим новым годом! Завтра 1.1.2005
44
Гпава 7
Циклические конструкции
Иногда для решения задачи нужно выполнить одно и то же действие несколько раз подряд. К примеру, для того чтобы вывести на экран строку «НеПо world!!!» десять раз, можно дать компьютеру столько же команд, используя функцию printf(), а можно дать одну команду «повторить printf() десять раз».
Решение многих задач содержит повторяющиеся действия. В языке С++ предусмотрены операторы повторения, которые называются циклами. Применение циклов в программе позволяет эффективно использовать ресурсы компьютера, сокращает длину программы и время на ее составление.
Для удобства программирования в языке предусмотрены три вида
операторов цикла:
for - оператор цикла с параметром.
while - оператор цикла с предварительным условием (предусловием); do while - оператор цикла с последующим условием (постусловием);
Для всех трех видов операторов цикла характерно следующее:
•повторяющиеся действия записываются всего лишь один раз;
•необходимо предусмотреть выход из цикла или по естественному его окончанию, или с помощью оператора break. Если этого не предусмотреть, то циклические действия будут повторяться бесконечно. В этом случае говорят, что "программа зациклилась".
Оператор цикла for
Когда заранее известно, сколько раз компьютер должен выполнить определенный набор операций, используют оператор цикла с параметром for.
Для представления циклической конструкции в блок-схемах используют блок цикл. Он представляет собой продолговатый шестигранник. По стрелке сверху мы попадаем внутрь цикла. Выполняем первоначальную установку значения переменной, которая будет отсчитывать количество выполненных шагов цикла - счетчика или параметра цикла (i = 0). Далее записываем условие, при невыполнении которого цикл будет прерван (i < 10). Проверяем выполнимость условия, и если оно истинно, идем по стрелочке вниз и выполняем операции в теле цикла. Так называют последовательность команд, выполняемых в одном шаге цикла. Дойдя до конца тела цикла, мы поднимаемся по стрелочке вверх, в заголовок цикла. Изменяем значение параметра (здесь увеличиваем на единицу) и вновь проверяем условие (i < 10). Если условие не выполняется, то выходим из цикла направо.
Блок цикла с параметром. Внутри блока записываются через точку с запятой:
•начальное значение параметра;
•условие выполнения цикла;
•изменение параметра на каждом шаге
цикла.
45
Пример 7 . 1 . Составить блок-схему алгоритма, который печатает на экране 50 звездочек.
Начинается а л г о р и т м с блока "Начало". В нашем примере цикл будет выполняться до тех пор. пока п е р е м е н н а я i н е станет равна 50 (согласно условию i < 50). Начальное значение переменной-счетчика установлено в ноль. Это означает, что будет выполнено 50 шагов (от 0 до 4 9 . включая ноль). В ходе очередного этапа выполнения цикла на экран выводится одна звездочка, после чего компьютер возвращается в заголовок цикла и увеличивает i на единицу. Далее проверяется выполнимость условия (i < 50). И если условие истинно, то начинается новый шаг цикла. Как только условие нарушается, цикл завершается, и мы попадаем на элемент блок-схемы "Конец".
Форма записи оператора for имеет следующий вид:
*
for ъ-zzz ъ. •. ек::е_1; ssqp а«:ение_2 ; выражение 3)
{
:•
for - служебное слово. Далее в круглых скобках идут выражения, разделенные точкой с запятой.
:= : - это инициализация параметра цикла. Иначе говоря, это выражение задает первоначальное значение переменной, по значению которой компьютер определит, следует ли продолжать выполнение цикла.
гыс =.тек::5_2 - это условие выполнения цикла. Если условие истинно, то выполняются операторы циклической части программы. Если условие ложно, то происходит выход из цикла без выполнения операторов циклической части.
5ьгса:ке:-:::5_з - обычно изменяет значение параметра цикла на каждом шаге. Так, программа, описывающая блок-схему из примера 1, будет иметь следующий вид:
int i; for(i=0;i<50;i++)
{
printf{"*");
}
s
Обратите внимание на отсутствие знака « ; » после скобок оператора for. Поставить этот знак там было бы грубой ошибкой. В этом случае переменная i увеличится до 50, но ни одна звездочка не будет выведена на экран.
Пример 7.2. Напишите программу, которая выводит сумму N чисел, введенных пользователем.
|
|
int |
i,N,S=0,a; |
|
|
|
|
|
|
|
|
||||||
/* i- параметр цикла; |
|
|
|
|
|
|
|
|
|||||||||
N- |
количество |
чисел; |
|
|
|
|
|
|
|
|
|||||||
S- |
сумма |
чисел; |
|
|
|
|
|
|
|
|
|
|
|
||||
а- введенное с клавиатуры число. |
|
|
|
|
|
||||||||||||
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
s c a n f & N ) ; |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
for(i=0;i<N;i++) |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scanf("%i",&a); |
//в цикле запрашиваем очередное число и |
тут же |
|||||||||||||||
//складываем |
его |
с |
переменной, |
в |
которой |
хранится |
сумма |
ранее введенных |
|||||||||
//чисел. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
S+=a; |
// |
то же, |
что S=S+a; |
|
|
|
|
|
|
|
|
||||||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("%i", S);//выводим сумму |
на |
экран |
|
|
|
|
|
||||||||||
Проследим, как меняются значения переменных, зная, что количество чисел N=3 и |
|||||||||||||||||
переменная а принимает значения 5,7 и 9. |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
а |
|
|
|
S |
|
|
|
|
|
|
|
0 |
|
|
|
|
5 |
|
|
5 |
(0+5) |
|
||
|
|
|
|
|
1 |
|
|
|
|
7 |
|
|
12 |
(5+7) |
|
||
|
|
|
|
|
2 |
|
|
|
|
9 |
|
|
21 |
(12+9) |
|
||
Пример 7.3. Написать программу, которая вычисляет значения yi = 2х + 1 и уг = х" |
|||||||||||||||||
при х =0, 1, 2, 3, 4. |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
int i,yl,y2; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
for(i=0;i<5;i++) |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
yl=i*i; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y2=2*i + 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
printf ("x= |
|
%i |
yl= %i |
y2=%i\n",i,yl,y2! |
9- |
|
|
|
|||||||||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i(x) |
|
|
|
y i |
|
|
|
У2 |
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
0 |
|
|
1 |
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
1 |
|
|
3 |
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
4 |
|
|
5 |
|
|
|
|
|
|
|
|
|
со |
|
|
|
9 |
|
|
7 |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
4 |
|
|
|
|
16 |
|
|
9 |
|
|
|
|
|
|
|
|
1 2 3 4
Выражение, описывающее шаг цикла, не обязательно должно увеличивать значение параметра цикла. В следующем примере значение параметра цикла убывает.
Пример 7.4. Написать программу, выводящую на экран таблицу квадратов четных чисел от 0 до 10 в убывающем порядке. '»
int i; for(i=10;i>=0;i-=2)
{
printf("%i %i\n",i,i*i);
}
47
Результат выполнения программы:
10 |
100 |
8 |
64 |
6 |
36 |
4 |
16 |
2 |
4 |
0 |
|
Одновременно с изменением значения переменной цикла можно выполнять и другие операции. Например, нам нужны две переменные, одна из которых увеличивается на единицу, а другая уменьшается на двойку. В этом случае операторы записываются в круглых скобках через запятую.
Пример 7.5. Приведенный цикл выполняется 5 раз и не зависит от значений переменной]:
|
|
|
S |
int |
i, |
j; |
|
for |
(i |
= 0, |
j = 1 0 ; i < 5 ; i++, j-= 2) |
{ |
|
|
|
printf("%i |
%i \n", i, j ) ; |
}
Здесь сначала происходит инициализация переменных i и j. Далее проверяется условие выполнения цикла i < 5. Телом цикла является оператор вывода printf. Если тело цикла состоит всего лишь из одного оператора, то фигурные скобки можно не ставить. Каждый раз после вывода значений i и j на экран выполняется третье выражение, представленное двумя операциями: i++ и j = j - 2, разделеными запятой.
Любое из трех выражений в цикле for может отсутствовать, однако точка с запятой должна оставаться всегда. Пример 7.5 можно записать так:
int i=0, j = 10;
for (; i < 5; i++, j-= 2)
{
printf("%i %i \n", i, j ) ;
}
или так:
int i=0, j=.10; for (; i < 5; )
{
printf("%i %i \n", i, j ) ; i++;
j — 2;
}
Независимо от записи, результат выполнения останется неизменным. Переменные i и j во время работы цикла изменяются следующим образом:
s
i |
j |
0 |
10 |
1 |
8 |
2 |
6 |
3 |
4 |
4 |
2 |
|
|
Бесконечный цикл
Так называют циклическую конструкцию, в которой не пред;-л естественного завершения. Эту конструкцию цикла for( ; ; ), удобно применять, если требуется учесть условие, наступление которого не зависит от параметра цикла. К
48
примеру, в программе, запрашивающей пароль и выводящей на него приветствие, невозможно определить заранее, с какой попытки пользователь введет пароль правильно.
В таких программах применяют операторы управления циклом — break и continue.
Ключевое слово break прерывает выполнение цикла, a continue начинает новый шаг, не доходя до конца тела цикла.
Пример 7.6. Напишите программу, запрашивающую пароль пользователя (целое пятизначное число). Если пароль правильный, то выводится приветствие и выполнение программы прерывается. Если пароль неправильный, то выводится сообщение об ошибке и вновь предлагается ввести пароль.
LONG pwd=12 34 5 , pwdl;
for(;;) |
//бесконечный цикл |
{ printf("Введите |
пароль:") |
scanf("%I",&pwdl); |
|
if(pwdl!=pwd) |
// проверка пароля |
{ |
|
printf("Неправильный пароль! Попробуйте ещё раз! \ п " ) ;
continue; |
// |
вернуться в начало |
цикла |
} |
|
|
|
printf("Пароль верен! Здравствуйте! |
\ п " ) ; |
|
|
break; |
//прервать выполнение |
цикла |
}
В этом примере при неправильном пароле компьютер, не доходя до конца тела цикла, переходит в заголовок. Если пароль верен, то условие не выполняется и цикл прерывается.
Если при работе с бесконечным циклом была допущена ошибка, то компьютер в ходе выполнения программы может перестать отвечать на внешние запросы - зациклиться. В таких случаях используют сочетание клавиш Ctrl + Break. Эта команда приостановит выполнение программы и укажет строчку кода, на которой произошла остановка.
Вложенный цикл.
Цикл, который находится в теле другого цикла, называют вложенным. Продемонстрируем такой цикл на примере.
Пример 7.7. Написать программу, которая выводит 3 ряда (по 7 элементов в каждом) случайно подобранных чисел в диапазоне от 0 до 10 и вычисляет сумму элементов каждого ряда.
Рекомендуемый вид экрана:
0 2 8 3 2 7 9 3 | 3 4 3 1 5 7 0 9 3 8 | 3 6 5 8 9 0 2 4 8 7 | 4 3
Для того чтобы использовать в программе случайные числа, необходимо сначала инициализировать генератор случайных чисел при помощи функции randomize(), которая описана в библиотеке stdlib.h. Генерацию случайного числа выполняет функция гапёот(параметр). В качестве параметра указывают число - верхнюю границу диапазона, из которого выбирается значение (нижняя граница - ноль).
# include <stdlib.h>
int |
a,s=0; |
|
|
randomize(); |
// |
генератор случайных чисел |
|
for(int i=0;i<3;i++) |
//в |
этом цикле выводится каждый ряд |
|
{ |
for(int j=0;j<8;j++)//в |
этом цикле выводятся элементы ряда |
|
|
{ |
|
|
|
printf("%2i",a=random(10)); |