Слайд 1Стандартные операторы и функции языка С++
Лекция 4
Слайд 2Содержание
Операторы
Математические операторы
Побитовые операторы
Операторы присваивания
Логические операторы
Операторы сравнения
Оператор ветвления if
Оператор Switch
Цикл
Оператор goto
Оператор
break
Операторы continue return
Функции ввода/вывода
Функции работы со строками
Математические функции
Контрольные вопросы
Список литературы
Слайд 3Операторы
Запись действий, которые должен выполнить компьютер, состоит из операторов. Язык C++
включает все операторы C и еще несколько новых операторов. Операторы
определяют, какое вычисление следует выполнить с одним или несколькими операндами. При выполнении программы операторы выполняются один за другим, если только оператор не является оператором управления, который может изменить последовательное выполнение программы.
Слайд 5Операторы +, -, * и / работают в С++ точно
так же, как и в большинстве других языков. Их можно
применять практически ко всем встроенным типам данных. Когда применяется / к целому числу или символу, остаток не используется, например: 10/3 равно 3.
Оператор взятия по модулю % работает в С++ так же, как в некоторых других языках. Надо помнить, что оператор взятия по модулю выдает остаток от целочисленного деления. % не может использоваться с типами float и double.
Слайд 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.
Слайд 7Побитовые операторы
Побитовые операции выполняются над отдельными разрядами или битами чисел.
Данные операции производятся только над целыми числами.
Слайд 8Операторы присваивания
Операции присваивания позволяют присвоить некоторое значения. Эти операции выполняются
над двумя операндами, причем левый операнд может представлять только модифицируемое
именованное выражение, например, переменную.
Слайд 9Логические операторы
Логические операции образуют сложное (составное) условие из нескольких простых
(два или более) условий. Эти операции упрощают структуру программного кода
в несколько раз. В следующей таблице приведены все логические операции в языке программирования С++, для построения логических условий.
Слайд 10Операторы сравнения
Сравнивать можно операнды любого типа, но либо они должны
быть оба одного и того же встроенного типа ( сравнение на
равенство и неравенство работает для двух величин любого типа), либо между ними должна быть определена соответствующая операция сравнения. Результат - логическое значение true или false.
Слайд 11Оператор ветвления if
Условный оператор if используется для разветвления процесса
вычислений на два направления. Формат оператора:
if ( выражение )
оператор_1; [else оператор_2;]
Сначала вычисляется выражение, которое может иметь арифметический тип или тип указателя. Если оно не равно нулю (имеет значение true), выполняется первый оператор, иначе - второй. После этого управление передается на оператор, следующий за условным. Одна из ветвей может отсутствовать, логичнее опускать вторую ветвь вместе с ключевым словом else. Если в какой-либо ветви требуется выполнить несколько операторов, их необходимо заключить в блок, иначе компилятор не сможет понять, где заканчивается ветвление. Блок может содержать любые операторы, в том числе описания и другие условные операторы (но не может состоять из одних описаний). Необходимо учитывать, что переменная, описанная в блоке, вне блока не существует.
Слайд 12Структурная схема условного оператора
Далее представлены примеры условного оператора:
if (a
b = 1;
if (ad || a==0)) b++;
else {b* = a; a = 0;}
if (aif (a++) b++;
if (b>a) max = b; else max = a;
Слайд 13В примере 1 отсутствует ветвь else. Подобная конструкция называется «пропуск
оператора», поскольку присваивание либо выполняется, либо пропускается в зависимости от
выполнения условия.
Если требуется проверить несколько условий, их объединяют знаками логических операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие aОператор в примере 3 вычисляет наибольшее значение из трех переменных. Фигурные скобки в данном случае не обязательны, так как компилятор относит часть else к ближайшему if.
Пример 4 напоминает о том, что хотя в качестве выражений в операторе if чаще всего используются операции отношения, это не обязательно.
Конструкции, подобные оператору в примере 5, проще и нагляднее записывать в виде условной операции (в данном случае: max = (b > a) ? b : a;).
Слайд 14Оператор switch
Оператор switch (переключатель) предназначен для разветвления процесса вычислений на
несколько направлений. Формат оператора:
switch ( выражение ){
case константное_выражение_1: [список_операторов_1]
case константное_выражение_2:
[список_операторов_2]
…
case константное_выражение _n: [список_операторов _n]
[default: операторы ]
}
Слайд 15Структурная схема оператора switch
Выполнение оператора начинается с вычисления выражения (оно
должно быть целочисленным), а затем управление передается первому оператору из
списка, помеченного константным выражением, значение которого совпало с вычисленным.
После этого, если выход из переключателя явно не указан, последовательно выполняются все остальные ветви. Выход из переключателя обычно выполняется с помощью операторов break или return. Оператор break выполняет выход из самого внутреннего из объемлющих его операторов switch, for, while и do. Оператор return выполняет выход из функции, в теле которой он записан.
Слайд 16Пример кода
#include
int main(){
int a, b, res;
char op;
cout
1й операнд : "; cin >> a;
cout
операции : "; 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;
}
Слайд 17Цикл с параметром (for)
Цикл с параметром имеет следующий формат:
for (
инициализация; выражение : модификации) оператор;
Инициализация используется для объявления и присвоения
начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой (операцией «последовательное выполнение»), например, так.
for (int i = 0, j = 2; …
int k, m;
for (k = 1, m = 0; …
Слайд 18Пример (оператор, вычисляющий сумму чисел от 1 до 100):
for (int
i = 1, s = 0; i
i;
Пример (программа находит все делители целого положительного числа):
#include
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;
}
Пример (программа печатает таблицу значений функции y=x2+1 во введенном
диапазоне):
#include
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;
}
Слайд 19Чтобы избежать ошибок, рекомендуется:
проверить, всем ли переменным, встречающимся в правой
части операторов присваивания в теле цикла, присвоены до этого начальные
значения (а также возможно ли выполнение других операторов);
проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;
предусмотреть аварийный выход из цикла по достижению некоторого количества итераций (см. пример в следующем разделе);
если в теле цикла требуется выполнить более одного оператора, нужно заключать их в фигурные скобки.
Слайд 20Оператор goto
Оператор безусловного перехода goto имеет формат: goto метка;
В теле
той же функции должна присутствовать ровно одна конструкция вида: метка:
оператор;
Оператор goto передает управление на помеченный оператор. Метка - это обычный идентификатор, областью видимости которого является функция, в теле которой он задан.
Использование оператора безусловного перехода оправдано в двух случаях:
принудительный выход вниз по тексту программы из нескольких вложенных циклов или переключателей;
переход из нескольких мест функции в одно (например, если перед выходом из функции необходимо всегда выполнять какие-либо действия).
Слайд 21В любом случае не следует передавать управление внутрь операторов if,
switch и циклов. Нельзя переходить внутрь блоков, содержащих инициализацию переменных,
на операторы, расположенные после нее, поскольку в этом случае инициализация не будет выполнена:
int k; …
goto metka; …
{ int a = 3, b = 4;
k = a + b;
metka: int m = k + 1; …
}
После выполнения этого фрагмента программы значение переменной m не определено.
Слайд 22Оператор break
Оператор break используется внутри операторов цикла, if или switch
для обеспечения перехода в точку программы, находящуюся непосредственно за оператором,
внутри которого находится break.
Слайд 23Операторы continue и return
Оператор перехода к следующей итерации цикла continue
пропускает все операторы, оставшиеся до конца тела цикла, и передает
управление на начало следующей итерации.
Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. Вид оператора: return [ выражение ]; Выражение должно иметь скалярный тип. Если тип возвращаемого функцией значения описан как void, выражение должно отсутствовать.
Слайд 24Функции ввода/вывода
Ввод/вывод в С++ реализуется либо с помощью функций,
унаследованных от библиотеки С, либо с помощью потоков С++. Смешивать
эти два способа в одной программе можно только синхронизировав ввод с помощью функции sync_with_iostream().
Каждый способ имеет свои преимущества. Преимущество использования потоков в том, что они легче в использовании в простых случаях ввода/вывода, не требующих форматирования, а, главное, потоковые операции можно переопределить для собственных классов. Ввод/вывод в стиле С удобнее использовать при форматированном выводе в программах, не использующих объектно-ориентированную технику. Кроме того, существуют миллионы строк, написанных на С и перенесенных на С++, с которыми программисту приходится сталкиваться. Для использования функций ввода/вывода в стиле С необходимо подключить к программе заголовочный файл или . При вводе/выводе данные рассматриваются как поток байтов. Физически поток представляет собой файл или устройство, например, клавиатуру или дисплей, рассматривающийся как частный случай файла.
Слайд 25Работа с потоком начинается с его открытия. Поток можно открыть
для чтения и/или записи в двоичном или текстовом режиме. Функция
открытия потока имеет формат: FILE* fopen (const char* filename, const char* mode);
При успешном открытии потока функция возвращает указатель на предопределенную структуру типа FILE, содержащую всю необходимую для работы с потоком информацию, или NULL в противном случае. Первый параметр - имя открываемого файла в виде С-строки, второй - режим открытия файла:
"r" - файл открывается для чтения;
"w" - открывается пустой файл для записи (если файл существует, он стирается);
"a" - файл открывается для добавления информации в его конец;
"r+" - файл открывается для чтения и записи (файл должен существовать);
"w+" - открывается пустой файл для чтения и записи (если файл существует, он стирается);
"a+" - файл открывается для чтения и добавления информации в его конец.
Слайд 26Основные функции ввода/вывода потока
чтение и запись потока байтов выполняют функции
fread и 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
#include
#include
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;
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, предоставляющий более широкие возможности представления, обработки и контроля строк.
В заголовочных файлах и содержатся полезные функции преобразования строк в числа (обратные преобразования можно сделать с помощью функции sprintf):
double atof(const char* p) преобразует переданную строку в double;
int atoi(const char* p) преобразует переданную строку в int;
long atol(const char* p) преобразует переданную строку в long.
Слайд 29Пример (программа заполняет массив типа double из строки):
#include "pch.h"
#include
#include
#include
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; kreturn 0;
}
Слайд 31Контрольные вопросы
В чем заключается задача операторов?
Какие операторы упрощают структуру программного
кода в несколько раз?
Какой оператор является заменой множественного использования операторов
if ?
В чем заключается задача оператора switch?
Когда вызываются функции?
Какая функция используется для вычисления квадратного корня?
В языке С++ допустимо иметь несколько функций с одним и тем же именем? Почему?
Слайд 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Список литературы
Страуструп Б. Дизайн и эволюция языка С++. - М.:
ДМК, 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