Лекция 4
Содержание
Операторы
Математические операторы
Пример кода
Побитовые операторы
Операторы присваивания
Логические операторы
Операторы сравнения
Оператор ветвления if
Структурная схема условного оператора
Оператор switch
Структурная схема оператора switch
Пример кода
Цикл с параметром (for)
Чтобы избежать ошибок, рекомендуется:
Оператор goto
Оператор break
Операторы continue и return
Функции ввода/вывода
Основные функции ввода/вывода потока
Функции работы со строками
Пример (программа заполняет массив типа double из строки):
Математические функции
Контрольные вопросы
Список литературы
Список литературы
261.06K
Категория: ПрограммированиеПрограммирование

Стандартные операторы и функции языка С++. Лекция 4

1. Лекция 4

Стандартные операторы и функции
языка С++

2. Содержание

Операторы
Оператор goto
Математические
Оператор break
2
операторы
Побитовые операторы
Операторы присваивания
Логические операторы
Операторы сравнения
Оператор ветвления if
Оператор Switch
Цикл
Операторы continue return
Функции ввода/вывода
Функции работы со
строками
Математические
функции
Контрольные вопросы
Список литературы

3. Операторы

Запись действий, которые должен выполнить
компьютер, состоит из операторов. Язык C++
включает все операторы C и еще несколько новых
операторов. Операторы определяют, какое
вычисление следует выполнить с одним или
несколькими операндами. При выполнении
программы операторы выполняются один за
другим, если только оператор не является
оператором
управления,
который
может
изменить
последовательное
выполнение
программы.
3

4. Математические операторы

4
Оператор
Действие
-
Вычитание, а также унарный минус
+
Сложение
*
Умножение
/
Деление
%
Взятие по модулю (остаток)
--
Уменьшение
++
Увеличение

5.

Операторы +, -, * и / работают в С++ точно так же,
как и в большинстве других языков. Их можно
применять практически ко всем встроенным типам
данных. Когда применяется / к целому числу или
символу, остаток не используется, например: 10/3
равно 3.
Оператор взятия по модулю % работает в С++ так
же, как в некоторых других языках. Надо помнить,
что оператор взятия по модулю выдает остаток от
целочисленного
деления.
%
не
может
использоваться с типами float и double.
5

6. Пример кода

Следующий
фрагмент
демонстрирует
его
использование:
int х, у;
х = 10;
у = 3;
printf("%d", x/y); /* выводит 3 */
printf
("%d",
х%у);
/*выводит1-остаток
целочисленного деления */
x = 1;
y = 2;
printf("%d %d", х/у, х%у)/ /* выводит 0 1*/
Последняя строка печатает 0 и 1, так как в результате
целочисленного деления 1/2 получается 0 с остатком
1. 1 % 2 выдает остаток 1.
6

7. Побитовые операторы

Побитовые операции выполняются над отдельными
разрядами или битами чисел. Данные операции
производятся только над целыми числами.
Оператор
7
Действие
&
битовое И
|
битовое ИЛИ
^
битовое ИСКЛЮЧАЮЩЕЕ ИЛИ
~
битовое НЕ
<<
сдвиг влево
>>
сдвиг вправо

8. Операторы присваивания

Операции присваивания позволяют присвоить некоторое
значения. Эти операции выполняются над двумя операндами,
причем левый операнд может представлять только
модифицируемое
именованное
выражение,
например,
переменную.
Оператор
+=
8
Действие
присваивание после сложения
-=
присваивание после вычитания
*=
присваивание после умножения
/=
присваивание после деления
%=
присваивание после деления по модулю
<<=
присваивание после сдвига разрядов влево
>>=
присваивание после сдвига разрядов вправо

9. Логические операторы

Логические операции образуют сложное (составное)
условие из нескольких простых (два или более) условий.
Эти операции упрощают структуру программного кода в
несколько раз. В следующей таблице приведены все
логические операции в языке программирования С++, для
построения логических условий.
9
Оператор
Действие
&&
логическое И
||
логическое ИЛИ
!
логическое НЕ

10. Операторы сравнения

Сравнивать можно операнды любого типа, но либо они должны
быть оба одного и того же встроенного типа ( сравнение на
равенство и неравенство работает для двух величин любого
типа), либо между ними должна быть определена
соответствующая операция сравнения. Результат - логическое
значение true или false.
10
Оператор
Действие
==
равно
!=
не равно
<
меньше
>
больше
<=
меньше или равно
>=
больше или равно

11. Оператор ветвления if

11
Условный оператор if используется для разветвления процесса
вычислений на два направления. Формат оператора:
if ( выражение ) оператор_1; [else оператор_2;]
Сначала вычисляется выражение, которое может иметь
арифметический тип или тип указателя. Если оно не равно
нулю (имеет значение true), выполняется первый оператор,
иначе - второй. После этого управление передается на
оператор, следующий за условным. Одна из ветвей может
отсутствовать, логичнее опускать вторую ветвь вместе с
ключевым словом else. Если в какой-либо ветви требуется
выполнить несколько операторов, их необходимо заключить в
блок, иначе компилятор не сможет понять, где заканчивается
ветвление. Блок может содержать любые операторы, в том
числе описания и другие условные операторы (но не может
состоять из одних описаний). Необходимо учитывать, что
переменная, описанная в блоке, вне блока не существует.

12. Структурная схема условного оператора

Далее представлены примеры условного оператора:
if (a<0) b = 1;
if (a<b && (a>d || a==0)) b++; else {b* = a; a = 0;}
if (a<b) {if (a<c) m = a; else m = c;} else {if (b<c) m = b; else
m = c;}
if (a++) b++;
if (b>a) max = b; else max = a;
12

13.

В примере 1 отсутствует ветвь else. Подобная конструкция
называется «пропуск оператора», поскольку присваивание либо
выполняется, либо пропускается в зависимости от выполнения
условия.
Если требуется проверить несколько условий, их объединяют
знаками логических операций. Например, выражение в примере
2 будет истинно в том случае, если выполнится одновременно
условие a<b и одно из условий в скобках. Если опустить
внутренние скобки, будет выполнено сначала логическое И, а
потом - ИЛИ.
Оператор в примере 3 вычисляет наибольшее значение из трех
переменных. Фигурные скобки в данном случае не обязательны,
так как компилятор относит часть else к ближайшему if.
Пример 4 напоминает о том, что хотя в качестве выражений в
операторе if чаще всего используются операции отношения, это
не обязательно.
Конструкции, подобные оператору в примере 5, проще и
нагляднее записывать в виде условной операции (в данном
случае: max = (b > a) ? b : a;).
13

14. Оператор switch

Оператор switch (переключатель) предназначен для
разветвления процесса вычислений на несколько
направлений. Формат оператора:
switch ( выражение ){
case константное_выражение_1:
[список_операторов_1]
case константное_выражение_2:
[список_операторов_2]

case константное_выражение _n:
[список_операторов _n]
[default: операторы ]
}
14

15. Структурная схема оператора switch

Выполнение оператора начинается с
вычисления выражения (оно должно
быть
целочисленным),
а
затем
управление
передается
первому
оператору из списка, помеченного
константным выражением, значение
которого совпало с вычисленным.
После
этого,
если
выход
из
переключателя
явно
не
указан,
последовательно
выполняются
все
остальные
ветви.
Выход
из
переключателя обычно выполняется с
помощью операторов break или return.
Оператор break выполняет выход из
самого внутреннего из объемлющих его
операторов switch, for, while и do.
Оператор return выполняет выход из
функции, в теле которой он записан.
15

16. Пример кода

#include <iostream>
int main(){
int a, b, res;
char op;
cout << "\nВведите 1й операнд : "; cin >> a;
cout << "\nВведите знак операции : "; cin >> op;
cout << "\nВведите 2й операнд : "; cin >> b;
bool f = true;
switch (op){
case '+': res = a + b; break;
case '-': res = a - b; break;
case '*': res = a * b; break;
case '/': res = a / b; break;
default : cout <<"\nНеизвестная операция"; f = false;
}
if (f) cout << "\nРезультат : " << res;
return 0;
}
16

17. Цикл с параметром (for)

Цикл с параметром имеет следующий формат:
for ( инициализация; выражение : модификации)
оператор;
Инициализация используется для объявления и
присвоения начальных значений величинам,
используемым в цикле. В этой части можно записать
несколько операторов, разделенных запятой
(операцией «последовательное выполнение»),
например, так.
for (int i = 0, j = 2; …
int k, m;
for (k = 1, m = 0; …
17

18.

Пример (оператор, вычисляющий сумму чисел от 1 до 100):
for (int i = 1, s = 0; i<=100; i++) s += i;
Пример (программа печатает таблицу
значений функции y=x2+1 во введенном
диапазоне):
#include <iostream>
int main(){
float Xn, Xk, Dx, X;
printf("Введите диапазон и шаг изменения
аргумента: ");
scanf("%f%f%f", &Xn, &Xk, &Dx);
printf("| X | Y |\n");
for (X = Xn; X<=Xk; X += Dx)
printf("| %5.2f | %5.2f |\n", X, X*X + 1);
return 0;
}
18
Пример (программа находит
все делители целого
положительного числа):
#include <iostream>
int main(){
int num, half, div;
cout << "\nВведите число : "; cin >> num;
for (half = num / 2, div= 2; div<= half; div++)
if (!(num % div))cout << div <<"\n";
return 0;
}

19. Чтобы избежать ошибок, рекомендуется:

проверить, всем ли переменным, встречающимся в
правой части операторов присваивания в теле
цикла, присвоены до этого начальные значения (а
также
возможно
ли
выполнение
других
операторов);
проверить, изменяется ли в цикле хотя бы одна
переменная, входящая в условие выхода из цикла;
предусмотреть аварийный выход из цикла по
достижению некоторого количества итераций (см.
пример в следующем разделе);
если в теле цикла требуется выполнить более
одного оператора, нужно заключать их в фигурные
скобки.
19

20. Оператор goto

Оператор безусловного перехода goto имеет формат: goto
метка;
В теле той же функции должна присутствовать ровно одна
конструкция вида: метка: оператор;
Оператор goto передает управление на помеченный
оператор. Метка - это обычный идентификатор, областью
видимости которого является функция, в теле которой он
задан.
Использование
оператора
безусловного
перехода
оправдано в двух случаях:
1. принудительный выход вниз по тексту программы из
нескольких вложенных циклов или переключателей;
2. переход из нескольких мест функции в одно
(например, если перед выходом из функции
необходимо всегда выполнять какие-либо действия).
20

21.

В любом случае не следует передавать управление
внутрь операторов if, switch и циклов. Нельзя
переходить
внутрь
блоков,
содержащих
инициализацию
переменных,
на
операторы,
расположенные после нее, поскольку в этом случае
инициализация не будет выполнена:
int k; …
goto metka; …
{ int a = 3, b = 4;
k = a + b;
metka: int m = k + 1; …
}
После выполнения этого фрагмента программы
значение переменной m не определено.
21

22. Оператор break

Оператор break используется внутри операторов
цикла, if или switch для обеспечения перехода в
точку программы, находящуюся непосредственно
за оператором, внутри которого находится break.
22

23. Операторы continue и return

Оператор перехода к следующей итерации
цикла continue пропускает все операторы,
оставшиеся до конца тела цикла, и передает
управление на начало следующей итерации.
Оператор возврата из функции return
завершает выполнение функции и передает
управление в точку ее вызова. Вид оператора:
return [ выражение ]; Выражение должно иметь
скалярный тип. Если тип возвращаемого
функцией значения описан как void, выражение
должно отсутствовать.
23

24. Функции ввода/вывода

Ввод/вывод в С++ реализуется либо с помощью функций,
унаследованных от библиотеки С, либо с помощью потоков С++.
Смешивать эти два способа в одной программе можно только
синхронизировав ввод с помощью функции sync_with_iostream().
Каждый
способ
имеет
свои
преимущества.
Преимущество
использования потоков в том, что они легче в использовании в простых
случаях ввода/вывода, не требующих форматирования, а, главное,
потоковые операции можно переопределить для собственных классов.
Ввод/вывод в стиле С удобнее использовать при форматированном
выводе в программах, не использующих объектно-ориентированную
технику. Кроме того, существуют миллионы строк, написанных на С и
перенесенных на С++, с которыми программисту приходится
сталкиваться. Для использования функций ввода/вывода в стиле С
необходимо подключить к программе заголовочный файл <iostream>
или <ciostream>. При вводе/выводе данные рассматриваются как поток
байтов. Физически поток представляет собой файл или устройство,
например, клавиатуру или дисплей, рассматривающийся как частный
случай файла.
24

25.

Работа с потоком начинается с его открытия. Поток можно
открыть для чтения и/или записи в двоичном или текстовом
режиме. Функция открытия потока имеет формат: FILE* fopen
(const char* filename, const char* mode);
При успешном открытии потока функция возвращает указатель
на предопределенную структуру типа FILE, содержащую всю
необходимую для работы с потоком информацию, или NULL в
противном случае. Первый параметр - имя открываемого файла
в виде С-строки, второй - режим открытия файла:
"r" - файл открывается для чтения;
"w" - открывается пустой файл для записи (если файл
существует, он стирается);
"a" - файл открывается для добавления информации в его
конец;
"r+" - файл открывается для чтения и записи (файл должен
существовать);
"w+" - открывается пустой файл для чтения и записи (если
файл существует, он стирается);
"a+" - файл открывается для чтения и добавления
информации в его конец.
25

26. Основные функции ввода/вывода потока

чтение и запись потока байтов выполняют функции fread и
26
fwrite,
чтение символа из потока - getc, fgetc, из стандартного потока
stdin - getchar,
запись символа в поток - putc, fputc, в стандартный поток
stdout - putchar,
чтение строки из потока - fgets, из стандартного потока stdin gets,
запись строки в поток - fputs, в стандартный поток stdout puts,
форматированный ввод из потока - fscanf, из стандартного
потока stdin scanf, из строки - sscanf,
форматированный вывод в поток - fprintf, в стандартный
поток stdout -printf, в строку - sprintf.

27.

Приведенная ниже программа построчно считывает данные из текстового
файла в буферную переменную s, затем формирует из них структуру mon и
записывает ее в двоичном режиме в выходной файл. Далее иллюстрируется
считывание из этого файла произвольной записи.
#include "pch.h"
#include <iostream>
#include <stdlib >
#include <string >
using namespace std;
int main(){
FILE *fi, *fo;
if((fi = fopen("d:\\c\\file.txt", "r")) == 0){
cout << "Ошибка открытия входного файла";
return 1;}
if((fo = fopen("d:\\c\\binfile.out", "w+b")) == 0){
cout << "Ошибка открытия выходного файла";
return 1;}
const int dl = 80;
char s[dl];
struct{
char type[20];
int opt, rozn;
char comm[40];
}mon;
27
int kol = 0; // Количество записей в файле
while (fgets(s, dl, fi)){
// Преобразование строки в структуру:
strncpy(mon.type, s, 19); // Описание strncpy см. в
приложении 6
mon.type[19]='\0';
mon.opt = atoi(&s[20]); // Описание atoi см. в след. разделе
mon.rozn = atoi(&s[25]);
strncpy(mon.comm, &s[30], 40);
fwrite(&mon, sizeof mon, 1, fo);
kol++;
}
fclose(fi);
int i; cin >> i; // Номер записи
if (i >= kol){cout << "Запись не существует"; return 1;}
// Установка указателя текущей позиции файла на запись
i:
fseek(fo, (sizeof mon)*i, SEEK_SET);
fread(&mon, sizeof mon, 1, fo);
cout << "mon.type " << mon.type << "opt " << mon.opt
<< " rozn " << mon.rozn << endl;
fclose(fo);
return 0;
}

28. Функции работы со строками

Строка представляет собой массив символов, заканчивающийся
нуль-символом. В С++ есть две возможности работы со строками:
функции, унаследованные из библиотеки С (заголовочный файл
<string.h> или <cstring>), и библиотечный класс С++ string,
предоставляющий более широкие возможности представления,
обработки и контроля строк.
В заголовочных файлах <stdlib.h> и <cstdlib> содержатся
полезные функции преобразования строк в числа (обратные
преобразования можно сделать с помощью функции sprintf):
double atof(const char* p) преобразует переданную строку в
double;
int atoi(const char* p) преобразует переданную строку в int;
long atol(const char* p) преобразует переданную строку в long.
28

29. Пример (программа заполняет массив типа double из строки):

#include "pch.h"
#include <iostream>
#include <string >
#include <stdlib>
using namespace std;
int main(){
char s[] = "2, 38.5, 70, 0, 0, 1", *p = s;
double m[10];
int i = 0;
do{
m[i++] = atof(p);
if (i>9)break;
}
while(p = strchr(p, ','), p++);
for( int k = 0; k<i; k++) printf("%5.2f ", m[k]);
return 0;
}
29

30. Математические функции

Тригонометрические функции
tan()
cos()
sin()
acos()
asin()
atan()
вычисление тангенса
вычисление косинуса
вычисление синуса
вычисление арккосинуса
вычисление арксинуса
вычисление арктангенса
atan2()
вычисление арктангенса с двумя параметрами
tan()
cos()
ceil()
floor()
вычисление тангенса
вычисление косинуса
Функции округления
округление до большего
округление к меньшему
fmod()
вычисление остатка от деления
Функции степени
pow()
sqrt()
cbrt()
30
pow()
sqrt()
cbrt()
Другие математические функции библиотеки <cmath>
fabs()
вычисление абсолютного значения
abs()
вычисление абсолютного значения
fma()
умножение и добавление - С++11

31. Контрольные вопросы

1.
2.
3.
4.
5.
6.
7.
31
В чем заключается задача операторов?
Какие операторы упрощают структуру
программного кода в несколько раз?
Какой оператор является заменой
множественного использования операторов if ?
В чем заключается задача оператора switch?
Когда вызываются функции?
Какая функция используется для вычисления
квадратного корня?
В языке С++ допустимо иметь
несколько функций с одним и тем же именем?
Почему?

32. Список литературы

Павловская Т.А. С/С++. Программирование на языке высокого уровня
32
/ Т. А. Павловская. - СПб.: Питер, 2004. - 461 с.: ил.
Павловская Т.А. С/С ++. Структурное программирование: Практикум /
Т.А. Павловская, Ю.А. Щупак. СПб.: Питер, 2007. - 239 с.: ил.
Павловская Т. А., Щупак Ю. А. C++. Объектно-ориентированное
программирование: Практикум. - СПб.: Питер, 2006. - 265 с: ил.
Кольцов Д.М. 100 примеров на Си. - СПб.: “Наука и техника”, 2017 - 256
с.
5 Доусон М. Изучаем С++ через программирование игр. - СПб.: “Питер”,
2016. - 352.
Седжвик Р. Фундаментальные алгоритмы на С++. Анализ/Структуры
данных/Сортировка/Поиск: Пер. с англ. Роберт Седжвик. - К.:
Издательство “Диасофт”, 2001. - 688с.
Сиддкхартха Р. Освой самостоятельно С++ за 21 день. - М.: SAMS, 2013.
- 651 с.
Стивен, П. Язык программирования С++. Лекции и упражнения, 6-е
изд. Пер. с англ. - М.: ООО "И.Д. Вильямс", 2012. - 1248 с.
Черносвитов, А. Visual C++: руководство по практическому изучению
/ А. Черносвитов . - CПб. : Питер, 2002. - 528 с. : ил.

33. Список литературы

33
Страуструп Б. Дизайн и эволюция языка С++. - М.: ДМК, 2000. - 448 с.
Мейерс С. Эффективное использование С++. - М.: ДМК, 2000. - 240 с.
Бадд Т. Объектно-ориентированное программирование в действии. - СПб:
Питер, 1997. - 464 с.
Лаптев В.В. С ++. Объектно-ориентированное программирование: Учебное
пособие.- СПб.: Питер, 2008. - 464 с.: ил.
Страуструп
Б.
Язык
программирования
С++.
Режим
доступа:
http://8361.ru/6sem/books/Straustrup-Yazyk_programmirovaniya_c.pdf.
Керниган Б., Ритчи Д. Язык программирования Си. Режим доступа:
http://cpp.com.ru/kr_cbook/index.html.
Герберт
Шилдт:
С++
базовый
курс.
Режим
доступа:
https://www.bsuir.by/m/12_100229_1_98220.pdf,
Богуславский А.А., Соколов С.М. Основы программирования на языке Си++.
Режим доступа: http://www.ict.edu.ru/ft/004246/cpp_p1.pdf.
Линский,
Е.
Основы
C++.
Режим
доступа:
https://www.lektorium.tv/lecture/13373.
Конова Е. А., Поллак Г. А. Алгоритмы и программы. Язык С++: Учебное пособие.
Режим
доступа:
https://vk.com/
doc7608079_489807856?hash=e279524206b2efd567&dl=f85cf2703018eeaa2
English     Русский Правила