- •Основные типы данных
- •Спецификаторы типов данных
- •Вещественные типы данных
- •Логический тип данных
- •Символьный тип данных
- •Управляющие последовательности
- •Логические операции
- •Побитовые логические операции
- •Форматирование ввода-вывода с помощью функций потоков ввода-вывода
- •Основные понятия структурного программирования
- •Базовый набор управляющих структур
Примеры применения побитовых операций Печать n-го разряда: a&(1<<n) Задать 0 в n-м разряде: a&(~(1<<n)) Задать 1 в n-м разряде: a|(1<<n) Инвертировать n-й разряд: a^(1<<n)
Условная операция и её использование a ? b : c поиск максимума среди двух: m = a > b ? a : b;
Определение объёма памяти, необходимого для размещения объектов sizeof(<тип данных>) sizeof(<выражение>)
Понятие приоритета операций и его влияние на результаты вычислений Самая приоритетная: ++, --; Самая неприоритетная: ==, +=, -=, …; Изменить приоритет операций можно с помощью круглых скобок.
Вывод простых типов данных на экран printf(…) cout << … cout << “Это”\ “длинная”\ “строка”; cout << “Это” << “длинная” << “строка”;
Ввод данных с клавиатуры scanf(...) cin >> …
Флаги форматирования потоков ввода-вывода Начиная с “ios::”:
left — выравнивание по левому краю
right — выравнивание по правому краю
dec — десятичная форма чисел
oct — восьмеричная форма чисел
hex — шестнадцатеричная форма чисел
Форматирование ввода-вывода с помощью манипуляторов cout << endl; cout << hex << 15; cout << fixed << 1.23e-10 //0.000000000123 #include <iomanip> cout << setw(10) << right << 123;
Форматирование ввода-вывода с помощью функций потоков ввода-вывода
Управление шириной поля вывода и выравниванием данных при выводе cout.width(10); cout.fill('$'); cout << left << 123; //123$$$$$$$
Управление форматом вывода вещественных значений cout.precision(3) cout << fixed << 1.2345; //1.234
Основные понятия структурного программирования
Пошаговая разработка программы.
Разбиение сложных задач на более простые.
Использование базового набора управляющих структур.
Базовый набор управляющих структур
последовательность
ветвление
цикл
Управляющие структуры и инструкции языка C++
Ветвление if, switch
Цикл for, while, do while
Переход break, continue, return, goto
Условная инструкция (if) Выбирает одно из двух направлений if (<условие>) {…} else {…}
Инструкция множественного выбора (switch) Ветвление во многих направлениях switch (<выражение (целого типа)>) { case <константа1>: … (break;) case <константа2>: … (break;) … (default:) … }
Цикл с предусловием (while) while (<условие>) {…}
Цикл с постусловием (do while) do {…} while (<условие>)
Итерационный цикл (for) for (<инициализатор>; <условие>; <модификация>) {…}
Инструкция перехода break Прекращает цикл, в теле которого она расположена.
Инструкция перехода continue Пропускает оставшуюся часть кода тела цикла и переходит к следующей итерации.
Инструкция перехода goto Переходит к инструкции, отмеченной меткой. … M1: …; … if (…) goto M1; …
Понятие рекуррентных вычислений, примеры Вычисление значения последовательности, зависимое от предыдущих значений этой последовательности. unsigned f(unsigned n){ if (n == 0) return 1; else return n*f(n-1); }
Понятие и определение массива Массив — индексированная последовательность однотипных элементов с заранее определённым количеством элементов.
Одномерные и многомерные массивы Объявление одномерных: <тип> <идентификатор>[<кол-воЭлементов>] short S[3] = {1, 2, 3}; short S1[] = {1, 2, 3}; Объявление многомерных: <тип> <идентификатор>[<кол-воЭлементов>][<кол-воЭлементов>][<кол-воЭлементов>]… short A[2][3] = { 1, 2, 3, 1, 2, 3 };
Вывод элементов массивов на экран for (int i = 0; i < n; ++i)
cout << setw(8) << left << A[i];
Ввод элементов массивов с клавиатуры for (int i = 0; i < n; ++i) cin >> A[i]; cin.sync(); //очистка ввода
Декларативная и программная инициализация массивов Декларативная: int A[3] = {1, 2, 3} Программная: int A[3]; for (int i = 0; i < 3; ++i) A[i] = i+1;
Копирование массивов for (int i = 0; i < n; ++i) a[i] = b[i] #include <string.h> memcpy(a, b, sizeof(a));
Нахождение минимальных и максимальных значений в массивах int min = A[0], max = A[0]; for (int i = 1; i < n; ++i) { if (min > A[i]) min = A[i]; if (max < A[i]) max = A[i]; }
Сдвиг элементов массивов int tmp = A[0]; for (int i = 1; i < n; ++i) A[i - 1] = A[i]; A[n - 1] = tmp;
Перестановка элементов в массивах void swap(int* A, int index1, int index2) { int tmp = A[index1]; A[index1] = A[index2]; A[index2] = tmp; }
Поиск данных в массивах int search (int* A, int n, int query) { for (i = 0; i < n; ++i) if (query == A[i]) return i; return -1; }
Сортировка данных в массивах for (i = 0; i < n - 1; ++i){ for (j = 0; i <n – 1 - i; ++j) if (A[j] > A[j+1]) { int tmp = A[j+1]; A[j+1] = A[j]; A[j] = tmp; } }
Вычисление сумм и произведений элементов массивов int sum = 0; int product = (n > 0)? 1 : 0; for (i = 0; i < n; ++i) { sum += A[i]; product *= A[i]; }
Представление текстовых строк в виде массива символов Текстовая строка представляет набор символов, заканчивающийся ‘\0’. char S1[] = “Текст”; char S2[6] = “Ошибка”;
Ввод-вывод символьных строк cout << S1; #include <stdio.h> gets(S2);
Определение фактической длины строки int strlen(char* str){ int value = 0; while (str[value++]); return value - 1; }
Копирование символьных строк void strcpy(char* destination, char* source) { int i = 0; while (source[i]) { destination[i] = source[i]; ++i; } destination[i] = ‘\0’; }
Основные функции обработки строк библиотеки cstring strlen(char* S) strcpy(char* destination, char* source) strcat(char* destination, char* source) strcmp(char* str1, char* str2)
Массивы текстовых строк (двумерные массивы символов) char str_array[3][21] = {“ABC”, “АБВ”, “123”} //3 строки по 20 символов (+ ‘\0’)
Указатели При определении переменной, она располагается в памяти по адресу. Получение адреса переменной: &A — 4-байтовое значение Указатель — переменная, служащая для хранения адреса. <тип данных>* <идентификатор> int* ptr = &A;
Арифметика указателей При добавлении/вычитании единицы, значение указателя изменяется на размер базового типа.
Индексирование указателей int A[10]; int* p; p = A; // можно A = p; // нельзя, так как переменная массива — константа
Ссылки Ссылка — неявный указатель, который при использовании автоматически разыменовывается. Объявление ссылки: <тип>& <идентификатор> = <другая переменная>
Определение функции <тип возвращаемого значения> <идентификатор>(<параметры>){…} void — возвращаемое значение отсутствует
Инструкция return Инструкция return позволяет немедленно выйти из функции и вернуть значение в точку вызова.
Завершение работы функции 1) (только для void) выполнение последней инструкции в теле функции 2) return
Механизмы передачи данных через параметры функций При вызове функции для каждого параметра создаётся переменная соответствующая типу данных параметра, в которую копируются значения аргументов, используемых при вызове.
Передача данных по значению void func(int a) { a += 20; } int main() { int a = 123; func(a); return 0; }
Передача данных через указатели void func(int* a) { a += 20; } int main() { int a = 123; func(&a); return 0; }
Передача данных по ссылке void func(int& a) { a += 20; } int main() { int a = 123; func(a); return 0; } void func2(const int& a) { a += 20; //ошибка }