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

osnovyiprogrammirovaniyanac

.pdf
Скачиваний:
24
Добавлен:
12.03.2015
Размер:
1.46 Mб
Скачать

Внутри составных операторов могут быть также условные операторы, содержащие простые или составные операторы.

Мы рассмотрели полную форму условного оператора. В языке допускается и краткая форма, которая имеет вид:

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));

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]