Главная страница

СИ. Программирование на языке CC Часть Структурное программирование


Скачать 1.65 Mb.
НазваниеПрограммирование на языке CC Часть Структурное программирование
Дата11.02.2022
Размер1.65 Mb.
Формат файлаpdf
Имя файлаAlgLangCpp.pdf
ТипУчебное пособие
#359040
страница5 из 11
1   2   3   4   5   6   7   8   9   10   11
if
(
x
& 0
xDF
){ ... Аналогично, если требуется проверить, неравен ли й бит переменной нулю ! (
x
| 0
x04
)){ ... Максимальное из двух чисел.
В листинге
2.5
приведён пример программы, которая запрашивает ввод с клавиатуры двух вещественных чисел и выводит на экран максимальное из них. На рис.
2.4
показана схема алгоритма.
Рис. 2.4. Алгоритм нахождения максимального из двух чисел
Листинг 2.5: Максимальное из двух чисел (вариант 1)
1
# i n c l u d e

2
# i n c l u d e


— 59 —
3 4
i n t
main
(){
5
double
a
,
b
,
max
;
6
printf
("a␣=␣");
7
scanf
("%lg", &
a
);
8
printf
("b␣=␣");
9
scanf
("%lg", &
b
);
10
i f
(
a
>
b
)
11
max
=
a
;
12
e l s В листинге
2.6
показано, как изменится предыдущая программа, если вместо функций и использовать потоки ввода-вывода cin и
cout
Листинг 2.6: Максимальное из двух чисел (вариант 2)
1
# i n c l u d e

2
using namespace
std
;
3 4
i n t
main
(){
5
double
a
,
b
,
max
;
6
cout
<< "a␣=␣";
7
cin
>>
a
;
8
cout
<< "b␣=␣";
9
cin
>>
b
;
10
i f
(
a
>
b
)
11
max
=
a
;
12
e l s e

— 60 —
13
max
=
b
;
14
cout
<< "max␣=␣" Оператор Оператор множественного выбора switch используется для перебора большого числа вариантов:
switch
(
выражение
) {
case
константное_выражение1
: [
список_операторов1
]
case
константное_выражение2
: [
список_операторов2
]
case
константное_выражениеN
: [
список_операторовN
]
[
d e f a u l t
:
список_операторов
]
}
Здесь и далее в квадратных скобках указываются фрагменты программы, которые можно опустить. В данном случае после любого константного выражения допускается не указывать список операторов (те. некоторый список операторов может соответствовать нескольким вариантам значения константного выражения блок default также необязателен.
Пример 2.7. Ввести с клавиатуры значение i
; если ввели, то присвоить = 5; если ввели 2, то присвоить 𝑥 = 10; во всех остальных случаях присвоить = 0:
i n t
i
,
x
;
cin
>>
i
;
switch
(
i
) {
case
1:
x
= 5;
break
;
case
2:
x
= 10;
break
;
d e f a u l t
:
x
= Не забывайте break после каждого варианта

— 61 Пример 2.8. Если с клавиатуры ввели символ, то вывести слово
«
сумма
»; если ввели, то вывести слово разность во всех остальных случаях ничего не делать) {
case
’+’:
cout
<< "сумма "разность";
}
Рис. 2.5. Схема алгоритма для примера
2.8.
Если опустить оператор break
, то будут выведены оба слова подряд (даже без пробела между ними. На рис.
2.5
показано обозначение оператора множественного выбора на схемах алгоритмов.
Условная операция.
В языке C/C++ имеется тернарная (имеющая три операнда) условная операция:
условие
?
выражение1
:
выражение2
Если выражение, заданное в качестве условия, неравно нулю (те. имеет значение true
), то результат операции — первое выражение, в противном случае — второе. Например, чтобы найти максимальное из двух чисел (
a
>
b
)?
a
:
b
;

— 62 Пример 2.9. Области на плоскости. По координатам точки на плоскости необходимо определить, к какой из областей принадлежит точка
(рис.
2.6
). Для этого необходимо сначала записать уравнения для границ областей.
Рис. 2.6. Области на плоскости
Уравнение прямой на плоскости = 𝑎𝑥 + 𝑏, где параметр 𝑎 равен тангенсу угла наклона прямой (
𝑎 = 0 для горизонтальных прямых, а параметр — это ордината точки пересечения прямой с осью Уравнение вертикальной прямой = 𝑥
0
, где абсцисса точки пересечения прямой с осью
𝑥.
Если известны координаты двух точек, и, 𝑦
2
, через которые проходит прямая, то параметры и 𝑏 легко находятся решением системы двух линейных уравнений 𝑎 · 𝑥
1
+ 𝑏 ;
𝑦
2
= 𝑎 · 𝑥
2
+ 𝑏 Выражая из второго уравнения и подставляя результат в первое, получим =
𝑦
1
− 𝑦
2
𝑥
1
− 𝑥
2
;
𝑏 = 𝑦
2
− 𝑎 · Множество точек, лежащих ниже прямой, задаётся неравенством < 𝑎𝑥 + выше прямой — неравенством > 𝑎𝑥 + Уравнение окружности радиуса, центр которой имеет координаты, 𝑦
0
), выглядит следующим образом − 𝑥
0
)
2
+ (𝑦 − 𝑦
0
)
2
= Множество точек,
лежащих внутри окружности − 𝑥
0
)
2
+ (𝑦 − 𝑦
0
)
2
< снаружи − 𝑥
0
)
2
+ (𝑦 − 𝑦
0
)
2
> 𝑟
2

— 63 Рассмотрим для примера задание из варианта 12. Уравнение наклонной прямой, проходящей через точки с координатами, 0.5) и (0.5, 0) (верхняя граница области 3):
𝑦 = −𝑥 + 0,5, а уравнение прямой, проходящей через точки, −0.5) и (0.5, 0) (нижняя граница области 3): 𝑦 = 𝑥 − Поэтому множество точек, лежащих внутри области 3 задаётся системой неравенств > 0 ;
𝑦 < −𝑥 + 0.5 ;
𝑦 > 𝑥 − 0.5 Множество точек, лежащих внутри окружности единичного радиуса
(часть области 2), задаётся неравенством+ 𝑦
2 6 1. Для оставшейся части области 2 выполняются неравенства 6 𝑥 6 1 ;
−1 6 𝑦 6 1 Точки, координаты которых не удовлетворяют неравенствам, записанным для областей 2 или 3, очевидно, лежат в области Схема алгоритма решения задачи показана на рис. Образец программы приведён в листинге, а на рис.
2.8
демонстрируется реализация условных вычислений в Листинг 2.7: Определение номера области по координатам точки include


2
i n t
main
(){
3
f l o a t
x
,
y
;
4
i n t
region
;
5
printf
("\n␣x␣=␣");
scanf
("%f", &
x
);
6
printf
("␣y␣=␣");
scanf
("%f", &
y
);
7
i f
( (
x
> 0) && (
y
< - x
+0.5) && (
y
>
x
-0.5) )
8
region
= 3;
9
e l s e
10
i f
(
x
*
x
+
y
*
y
<= 1)
11
region
= 2;

— 64 Рис. 2.7. Алгоритм определения номера области
Рис. 2.8. Условный оператор в MathCAD
12
e l s e
13
i f
( (
x
<= 0) && (
x
>= -1) && (
y
<= 1) && (
y
>= -1) )
14
region
= 2;
15
e l s e
16
region
= 1;
17
printf
("\nRegion␣=␣%i\n",
region
);
18
return
0;
19
}

— 65 —
2.5. Операторы цикла
В языке C/C++ имеется три вида оператора цикла с предусловием, с постусловием и цикл с параметром.
Цикл с предусловием.
Если указанное условное выражение истинно, то выполняется тело цикла и управление передаётся снова на проверку условия.
Как только условие окажется ложным, выполнение цикла завершится:
while
(
условие
) {
... ;
... На схемах алгоритмов цикл с предусловием обозначается, как показано на риса, б.
Пример 2.10. Вывести числа от 5 доте- Цикл с постусловием.
Сначала выполняется тело цикла, затем проверяется условие. Если оно истинно, то процесс повторяется. ;
... ;
}
while
(
условие
);
Два варианта обозначения цикла с постусловием показано на рис.
2.9
в, г.
Пример 2.11. Вывести числа от 5 до 1:
i n t
i
= 5;
do
{
cout
<<
i
<< ",␣";

— 66 Рис. 2.9. Обозначения циклов на схемах алгоритмов а, б) цикл с предусловием;
в, г) цикл с постусловием де) цикл с параметром i
--;
// те. i = i - 1;
}
while
(
i
> Сумма цифр числа.

В листинге
2.8
приведена программа, которая вычисляет сумму цифр заданного числа. Для нахождения цифр в десятичной записи числа используются последовательные деления на 10: остаток даёт очередную цифру, а результат запоминается для следующего деления. Так продолжается до тех пор, пока результат деления не станет нулевым. Алгоритм. Вводим целое число x
2. Инициализируем переменную для накопления суммы = 0

— 67 —
3. Находим остаток отделения на накапливаем сумму sum = sum + остаток. Находим результат целочисленного деления x = x / 10 5. Если неравно возвращаемся к п. Выводим значение На рис.
2.10
показан результат работы программы.
Рис. 2.10. Результат работы программы из листинга
2.8
Листинг 2.8: Вычисление суммы цифр числа i n c l u d e

2
using namespace
std
;
3
i n t
main
(){
4
i n t
x
;
5
cout
<< "x␣=␣";
6
cin
>>
x
;
7
i n t
sum
= 0;
8
do
{
9
sum
+=
x
% 10;
// тете" Цикл с параметром.

Сначала выполняется инициализация, затем, как ив цикле с предусловием, осуществляется проверка истинности условного выражения. Если оно истинно, то выполняется тело цикла, после чего выполняется модификация параметра(ов) цикла и управление снова передаётся на проверку условия o r

(
инициализация
;
условие
;
модификация
) {
... ;
... На старых схемах алгоритмов цикл с параметром иногда обозначают, как показано на рис.
2.9
д (задано начальное значение параметра, конечное значение и шаг изменения s
). Новое обозначение по ГОСТ 19.701-90 приведено на рисе. Если тело цикла состоит из одного оператора, то фигурные скобки можно опустить.
Пример 2.12. Вывести числа от 5 до 1:
i n t
i
;
f o r
(
i
=5;
i
>0;
i
--) {
cout
<<
i
<< "Пример 2.13. В блоках оператора for можно записывать несколько операторов через запятую. Кроме того, в языке C++ (в отличие от можно объявить параметры) цикла внутри оператора for
:
f o r
(
i n t
i
=0,
j
=5;
i
< Будет напечатано 0, 5, 1, 4, 2, 3, Здесь блоки инициализации и модификации состоят из двух операторов.
Пример 2.14. Чтобы в каждой итерации цикла вывод на экран начинался с новой строки, надо в блоке модификации перейти на новую строку,
например:
f o r
(
i n t
i
=10,
k
=5;
i
>0;
i
--,
k
++,
cout
<<
endl
)
cout
<<
i
<< "," <<
k
;

— 69 Сумма чётных чисел в заданном диапазоне.

В листинге
2.9
приведена программа, которая вычисляет сумму всех чётных чисел в заданном диапазоне. На рис.
2.11
показан результат работы программы.
Рис. 2.11. Экран программы из листинга
2.9
Листинг 2.9: Сумма чётных чисел в заданном диапазоне i n c l u d e

2
# i n c l u d e

3
using namespace
std
;
4
i n t
main
(){
5
i n t
a
,
b
;
6
long i n t
sum
;
7
bool
flag
;
8
SetConsoleOutputCP
(1251);
9
cout
<< "Сумма␣чётных␣чисел␣в␣заданном␣диапазоне\n";
10
do
{
// Цикл, пока не будет введён правильный диапазон "Начало␣диапазона␣=␣";
cin
>>
a
;
12
cout
<< "Конец␣диапазона␣=␣";
cin
>>
b
;
13
flag
=
a
>
b
;
// true, если диапазон задан неверно f

(
flag
)
15
cout
<< "Конечное␣значение␣не␣должно␣быть␣"
16
"меньше␣начального!\n";
17
}
while
(
flag
);
18 19
sum
= 0;
// Инициализация переменной, в которой накапливаем сумму

— 70 —
20
f o r
(
i n t
i
=
a
;
i
<=
b
;
i
++)
// Перебираем все числа в диапазоне f

(
i
% 2 == 0)
// Если остаток отделения на 2 равен 0 22
sum
+=
i
;
// Накапливаем сумму "Сумма␣чётных␣чисел␣в␣диапазона␣от␣"
24
<<
a
<< "до" <<
b
<< "равна" Вложенные циклы.
В листинге
2.10
приведена программа, выводящая на экран все трёхзначные числа, сумма цифр которых равна заданному числу.
На рис.
2.12
показан результате работы.
Рис. 2.12. Экран программы из листинга
2.10
Листинг 2.10: Трёхзначные числа с заданной суммой цифр i n c l u d e

2
using namespace
std
;
3
i n t
main
(){
4
i n t
n
;
5
cout
<< "n␣=␣";
6
cin
>>
n
;
7
f o r
(
i n t
i
=1;
i
<10;
i
++)
8
f o r
(
i n t
j
=1;
j
<10;
j
++)
9
f o r
(
i n t
k
=1;
k
<10;
k
++)
10
i f
(
i
+
j
+
k
==
n
)

— 71 —
11
cout
<<
i
<<
j
<<
k
<<
endl
;
12 Оператор передачи управления.

Имеется (ноне рекомендуется для использования, т. к. нарушает принципы структурного программирования) оператор, который позволяет перейти в указанное место программы:
goto
метка
;
метка
:
опратор
;
Имя метки должно удовлетворять обычным требованиям к идентификаторам.
Оператор Оператор прервать) используется внутри операторов цикла или switch для обеспечения перехода в точку программы,
находящуюся непосредственно за оператором, внутри которого находится Пример 2.15. Рассмотрим следующий фрагмент i n t

n
= 8;
i n t
a
[
n
] = {5, 1, 2, 14, 25, 6, 0, 9};
i n t
i
,
j
=-1,
k
;
cout
<< "Введите␣число:␣";
cin
>>
k
;
f o r
(
i
= 0;
i
<
n
;
i
++){
i f
(
a
[
i
] ==
k
){
// нужное значение j
=
i
;
// номер найденного элемента cout
<<
k
<< "на" <<
j
<< "месте выйти из цикла

— 72 —
i f
(
j
< 0)
// элемент не найден cout
<<
k
<< "␣не␣найден\n";
Здесь в цикле for производится поиск элемента в массиве. Как только найден элемент с заданным значением, поиск прекращается.
Оператор Оператор перехода к следующей итерации цикла продолжить) пропускает все операторы, оставшиеся до конца тела цикла, и передаёт управление на начало следующей итерации.
Пример 2.16. Рассмотрим, что будет выведено в результате выполнения следующего фрагмента программы o r
(
i n t
i
=0,
j
=3;
i
<
j
;
j
--) {
cout
<<
i
++;
i f
(
i
<
j
)
continue
;
cout
<< ’.’ Таблица 2.4. Трассировка цикла из примера
2.16.
Итерация i
j for(...,icout i
if(icout
1 0
3
true
0 1
true
2 1
2
true
1 2
false
.2 Распишем по шагам процесс выполнения данного цикла Выполняется блок инициализации оператора for: i = 0; j = 3.
— Проверяется условие i < j цикла for. Результат true, поэтому выполняется тело цикла На экран выводится значение i — число 0, затем i увеличивается на 1
(постинкремент), те. теперь i = 1.
— Проверяется условие i < j в операторе if, получается true (т. к. 1 <
3), поэтому выполняется оператор continue, символ точка не выводится, управление передаётся на блок модификации оператора for.

— 73 —
— Значение переменной j уменьшается на 1 и становится равным 2. Проверяется условие i < j в операторе for, получается true (т. к. 1 < поэтому снова выполняется тело цикла На экран выводится значение i — число 1, затем i увеличивается i нате. теперь i = 2.
— Проверяется условие i < j в операторе if, получается false (т. к не меньше 2), поэтому оператор continue не выполняется. Выводится символ точка и значение j — число 2. управление передаётся на блок модификации оператора for.
— Значение переменной j уменьшается на 1 и становится равным 1. Проверяется условие i < j в операторе for, получается false (т. к. 3 не меньше 1), поэтому выполнение цикла завершается.
Трассировка цикла показана в табл. Таким образом, в результате выполнения данного фрагмента будет выведена строка
01.2
Правила хорошего стиля программирования. Не использовать goto
2. Соблюдать отступы. Не смешивать стили форматирования операторных скобок { и }.
4. Не смешивать методы ввода-вывода C и C++.
5. Писать содержательные комментарии.
Табулирование функции.
В листинге
2.11
приведена программа, которая выводит на экран таблицу значений заданной функции (рис. Позже
(см. с) мы переделаем эту программу для использования с несколькими различными функциями.
Листинг 2.11: Табулирование функции i n c l u d e

2
# i n c l u d e

3
# i n c l u d e

4
i n t
main
(){

— 74 —
5
double
a
,
b
,
y
,
x
,
d
;
6
long
i
,
n
;
7
SetConsoleOutputCP
(1251);
8
printf
("\n␣=====␣Табулирование␣функции␣=====\n");
9
printf
("Начало␣=␣");
scanf
("%lg", Конец, &
b
);
11
printf
("Кол-во␣строк␣=␣");
scanf
("%li", &
n
);
12
d
= (
b
- a
) / (
n
- 1);
// Шаг изменения аргумента - символ табуляции o r

(
i
=0;
i
<
n
;
i
++){
18
y
= (2.0 - 2.0/3 +
exp
(
log
(
x
/2.7)/3.0)
19
- sqrt
(
exp
(-3.0*
x
)) ) Рис. 2.13. Результат работы программы из листинга

— 75 Накопление сумм и произведений.

В листинге
2.12
показан пример программы, которая вычисляет произведение + 1)
2𝑘−1
=
𝑎
𝑎 + 1
·
𝑎
2
(𝑎 + 1)
3
·. . .·
𝑎
𝑛
(𝑎 + 1)
2𝑛−1
= Здесь использована рекуррентная формула для вычисления очередного значения сомножителя 𝑥
𝑖
·
𝑎
(𝑎 + На рис.
2.14
показан результат работы программы.
Листинг 2.12: Накопление произведения i n c l u d e

2
# i n c l u d e

3
1   2   3   4   5   6   7   8   9   10   11


написать администратору сайта