- •1.1. Идентификаторы
- •1.5. Структура программы С++
- •1.6. Директивы препроцессора
- •1.8. Функции библиотеки math.h
- •1.9. Форматированный ввод/вывод данных
- •2.3. Целый тип данных
- •2.4. Символьный тип данных
- •2.8. Явное преобразование типов
- •3.2. Операция присваивания
- •3.7. Использование блоков
- •4.1. Оператор условной передачи управления if
- •5.4.4. Функция exit
- •5.4.5. Функция abort
- •6.3. Многомерные массивы
- •7.2.1. Унарные операции
- •7.2.2. Арифметические операции и операции сравнения
- •7.3. Инициализация указателей
- •7.4. Работа с динамической памятью
- •7.5. Создание одномерного динамического массива
- •8.2.2. Передача параметров по ссылке
- •8.2.3. Передача параметров по указателю
- •8.2.6. Передача переменного числа параметров
- •8.3. Встраиваемые функции
- •9.2. Функции для работы со строками
- •9.3. Алгоритмы работы со строками
- •10.2. Объявление и использование объединений
- •11.2. Функции для работы с файлами
- •13.3. Целесообразность использования рекурсии
- •14.1. Простые методы сортировки
- •14.1.1. Метод пузырька
- •14.2. Улучшенные методы сортировки
- •14.2.1. Метод Шелла
- •15.2. Поиск делением пополам
- •15.3. Интерполяционный поиск
- •17.2. Использование древовидных структур
- •19.6. Хеш-таблица на основе связанных списков
- •19.7. Метод блоков
- •3. Программирование циклических алгоритмов
- •5. Использование двумерных массивов
- •7. Программирование с использованием строк
- •9. Программирование с использованием файлов
- •12. Поиск по ключу в одномерном массиве
- •15. Работа с древовидными структурами данных
- •16. Вычисление алгебраических выражений
- •2. Выполнение программы
- •3. Отладка программы
оператором if для того, чтобы при определенных значениях данных завершить текущий цикл и передать управление следующему циклу.
5.4.2. Оператор break
Позволяет перейти к следующему за блоком оператору. Например, в циклах он обеспечивает досрочный выход из цикла, а в операторе switch – выход из блока выбора. Следует обратить внимание на то, что оператор break выходит только из текущего блока, т. е. в случае вложенных циклов выход происходит только из одного цикла.
5.4.3. Оператор return
Завершает выполнение текущей функции и передает управление вызывающей функции. Управление передается следующему за вызовом текущей
функции оператору. |
|
|
|
Р |
Формат оператора: |
|
|
|
|
|
|
|
И |
|
return выражение; |
|
|
|
|
|
|
|
|
|
Если значение выражения задано, то результат возвращается в вызыва- |
||||
ющую функцию в качестве значения вызываемой функцииУ. |
||||
|
5.4.4. Функция exit |
Г |
|
|
Находится в библиотеке stdlib.lib. Корректно прерывает выполнение про- |
||||
|
|
Б |
|
|
граммы, записывая все буферы, закрыв я все потоки. Формат функции: |
||||
void exit(int) |
|
а |
|
|
|
|
|
|
|
Параметр является служебным сообщением системе. Как правило, 0 гово- |
||||
рит об успешном завершении программык, ненулевые значения – об ошибке. |
||||
|
е |
|
|
|
|
5.4.5. Функция abort |
|
|
Находится в библи еке stdlib.lib. Генерирует «молчаливое» исключение,
не связанное с сообщением б шибке. Корректно прерывает выполнение про- |
||
граммы, записывая все буферыт, закрывая все потоки. Формат функции: |
||
|
|
л |
void abort(void)о |
||
|
б |
|
|
|
5.4.6.иОператор безусловного перехода goto |
Передает управ ение оператору, помеченному меткой. Использование |
||
и |
|
|
оператора goto существенно снижает читабельность программы и увеличивает |
||
Б |
|
|
вероятность ошибки. Поэтому использование goto в программах нежелательно. Пр мером обоснованного применения оператора безусловного перехода
может служить необходимость организации выхода сразу из нескольких вложенных циклов:
if (логическое_выражение) goto met;
}
met: …
33
5.5. Организация циклических алгоритмов
Пример 5.1. Вывести таблицу значений функции y(x) = sin(x) на интервале от a до b с шагом h.
Вариант 1 (с использованием оператора цикла for). for (double x=a; x<b+h/2; x+=h)
cout << "x = " << x << " y = " << sin(x) << endl;
Логическое выражение в операторе равно x < b+h/2, а не x<=b. Это вызвано следующим. Счетчик цикла на x каждом шаге увеличивает свое значение на h. Если h – дробное число, то в переменной x могут накапливаться ошибки
округления, которые приводят к тому, что значение x будет, например, равно |
|
И |
|
2.00000000000000001, в то время, когда значение b = 2.0. Результат операции |
|
сравнения x <= b в этом случае будет иметь значение false, и, следовательноР |
, |
последнее значение таблицы не будет выведено на экран. Для того чтобы гарантировать выполнение последней итерации циклического процесса, значение
правой границы интервала увеличивается на величину, не превышающую h |
|||||||||||||
(например на h/2). |
|
|
|
|
|
|
|
|
|
|
У |
||
Вариант 2 (с использованием оператора цикла while). |
|||||||||||||
x = a; |
|
|
|
|
|
|
|
Г |
|||||
|
|
|
|
|
|
|
Б |
|
|||||
while(x<b+h/2) |
|
|
|
|
|
|
|||||||
{ |
|
|
|
|
|
|
а |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|||
|
cout << "x = " << x << " y = " << sin(x) << endl; |
||||||||||||
|
x += h; |
|
|
|
к |
|
|
|
|
|
|||
} |
|
|
|
|
е |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
Пример 5.2. Вычислить интеграл s |
sinx dx методом средних. |
||||||||||||
|
|
|
|
т |
|
|
0 |
|
|
|
|
|
|
|
|
|
о |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
||
|
h=(b-a)/100; |
|
|
|
|
|
|
|
|
|
|
||
for (x=a+h/2,иs=0; x<b; s+=sin(x)*h, x+=h) ; |
|
|
|
|
|||||||||
|
|
л |
|
|
|
|
|
100 |
|
x |
k |
|
|
Пр мер 5.3. Вычислить сумму s(x) ( 1)k |
|
|
. |
||||||||||
|
|
|
|||||||||||
|
б |
|
|
|
|
|
k 1 |
|
k! |
|
|||
Вначале необходимо получить рекуррентную формулу. Для получения |
|||||||||||||
и |
|
|
|
|
|
|
|
|
|
|
|
|
|
Б |
|
|
|
|
|
|
|
|
|
|
|
|
|
формулы вычисляются значения слагаемых при различных значениях k: при
k 1; a |
1 |
x |
; |
при k 2; a |
|
1 |
x x |
; |
при k 3; a |
1 |
x x x |
и т. д. Видно, |
||||||
|
|
|
|
|||||||||||||||
1 |
1 |
|
|
2 |
|
1 2 |
3 |
|
1 2 3 |
|
|
|
|
|||||
что на каждом шаге слагаемое дополнительно умножается на 1 |
x |
. |
Исходя из |
|||||||||||||||
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
k |
|
|
x |
|
|
этого формула рекуррентной последовательности будет иметь вид a |
a |
|
. |
|||||||||||||||
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k |
|
k 1 k |
34
Полученная формула позволяет избавиться от многократного вычисления факториала и возведения в степень.
|
|
|
s =0; |
|
|
|
|
|
// Начальное значение суммы |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
a=1; |
|
// Начальное значение для вычисление очередного |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
// |
члена рекуррентной последовательности |
|
|
|
||||||||||||||||||||||||||
|
|
|
|
for ( int k=1; k<=100; k++) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a*=-x/k; |
// Вычисление очередного члена |
|
|
|
|
|
|
|
|
|
|
|
Р |
|||||||||||||||||||||
|
|
|
|
|
|
|
|
// рекуррентной последовательности |
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
s+=a; |
|
// Суммирование всех слагаемых |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
У |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
|
|
x |
2k |
|
|
|
|
|
|
|
||||||||
|
Пример 5.4. Вычислить сумму s(x) ( 1)k |
|
|
|
|
sin(x). |
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x |
Г |
И |
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k 0 |
|
|
(2k)! |
|
|
|
|
||||||||||||
|
В данной формуле получить рекуррентную зависимость для sin(x) слож- |
|||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Б |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
но, поэтому функция sin(x) будет рассчитываться отдельно (как нерекуррентная |
||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
|
|
2k |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
а |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
часть). Для оставшейся части формулы ( 1)k |
|
|
|
|
рассчитываются значе- |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k 0 |
|
(2k)! |
|
|
|
|
|
|
|
1 |
|
|
|
|
|
||||
ния слагаемых |
при |
различных |
значениях |
k: при |
|
k 0; |
|
a |
1 |
; при |
k 1; |
|||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
последов |
|
|
|
|
|
|
|
|
|
|
1 |
|
|
1 |
|
2 |
|
|
||||||
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
2 |
|
|
|
|||||||
|
|
x |
|
|
|
|
|
|
|
|
|
x |
2 |
|
2 |
|
|
|
|
|
|
|
|
|
|
|
x |
x |
x |
|
|
|||||||
a |
1 |
|
|
; при |
k 2; a |
|
1 |
|
xк; при |
k 3; |
|
a |
|
1 |
|
|
|
|
|
|
и т. д. |
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
k |
|
|
k 1 |
(2k 1) (2k) |
|
2 |
|
чет |
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
1 |
1 2 |
|
|
|
|
|
|
|
1 2 3 4 |
|
|
|
|
|
|
|
|
1 2 3 4 5 6 |
|
|||||||||||||||||||
Формула |
|
|
рекуррентной |
|
|
|
|
|
ательности |
|
|
|
будет |
|
|
|
иметь |
вид |
||||||||||||||||||||
a |
a |
|
|
|
x2 |
|
|
о |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
. Рас |
удобно начинать не с нулевого элемента, а с |
||||||||||||||||||||||||||||||
первого. Поэтому значен |
е нулевого элемента рассчитывается вручную и под- |
|||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
л |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
ставляется в нача ьное значение суммы. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
б |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
Текст программыи: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
s = sin(x); |
|
|
|
|
|
|
// Значение суммы для нулевого элемента |
||||||||||||||||||||||||||||
|
и{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
Б |
a = 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
for (int k=1; k<=100; k++) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
a *= -sqr(x)/(2*k*(2*k-1)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
s += a*sin(x); |
|
|
|
// Здесь добавлена нерекуррентная часть |
||||||||||||||||||||||||||||||
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35
6. Использование массивов
Массив – структура однотипных данных, каждый элемент которой хранится в отдельной ячейке, доступ к которой осуществляется по ее номеру. Массив характеризуется: имением массива, типом хранимых данных, размером (количеством элементов) и размерностью (формой представления элементов массива). Номер ячейки массива называется индексом. Индексы массивов должны
иметь целый тип, а элементы массивов могут иметь любой тип. |
Р |
||
6.1. Одномерные массивы |
|
||
|
|
||
Объявление одномерного массива: |
|
|
|
тип имя_массива [размер]; |
У |
|
|
Пример объявления массива: |
|
||
И |
|||
int с[4]; |
Размер статического массива задается константой или константным вы-
ражением целого типа. |
|
|
|
|
|
||||
Индексы в языке С/С++ начинаются с 0. НапримерГ, вышеобъявленный |
|||||||||
|
|
|
|
|
|
|
|
а |
|
массив состоит из четырех элементов: с[0], c[1], c[2] и c[3]. Расположение эле- |
|||||||||
ментов массива в памяти указано на рис. 6.1. |
Б |
||||||||
|
|
|
|
|
|
|
к |
|
|
|
|
|
|
о |
е |
|
|
||
|
|
|
|
|
|
|
|
||
|
|
|
и |
т |
Рис. 6.1 |
|
|||
|
|
л |
|
|
|
|
|
|
|
Одновременно с объявлением можно инициализировать элементы массива: |
|||||||||
|
б |
|
|
|
|
|
|
|
|
|
double b[4] = {1.5, 2.5, 3.75, 3.04}; |
|
|||||||
Если |
int a[4] = {1, 4}; |
|
|
|
|
||||
|
|
|
|
|
|
||||
Б |
в группе инициализации не хватает начальных значений, то остав- |
||||||||
|
|
|
|
|
|
|
|
|
шиеся элементы заполняются нулями, например, массив a: a[0] = 1, a[1] = 4,
a[2] = 0 a[3] = 0.
При объявлении со списком инициализации количество элементов можно не указывать. В этом случае размер массива будет равен количеству начальных значений. Объявление
char mc[] = {‘3’, ‘f’, w}
создаст массив из трех элементов.
36
Обращение к элементу массива происходит через указание имени массива и в квадратных скобках номера элемента массива. Например:
x = a[3]; a[4] = b[0] + a[2];
6.2. Алгоритмы работы с одномерными массивами
Пример 6.1. Ввод и вывод одномерного массива. int s[10],i,j,n;
// |
|
Ввод одномерного массива |
|
|
|
Р |
||||||
cout << "Vvedite razmer"; |
|
|
|
|
||||||||
|
|
|
И |
|||||||||
cin >> n; |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
||||
|
|
for (i=0; i<n; i++) |
|
|
|
У |
|
|||||
|
|
|
|
} |
|
|
|
|
|
|
||
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
cout << "Vvedite s[" << i << "]= " ; |
БГ |
|
|
|||||||
|
|
cin >> s[i]; |
|
|
|
|
|
|
||||
// |
|
Вывод одномерного массива |
|
|
||||||||
|
|
for (i=0; i<n; i++) |
|
|
а |
|
|
|||||
|
|
|
к |
|
|
|
||||||
|
|
|
{ |
|
|
|
е |
|
|
|
|
|
|
|
|
|
cout << s[i] << " " ; |
|
|
|
|
||||
|
|
|
} |
|
|
т |
|
|
|
|
|
|
|
|
|
|
|
о |
|
|
|
|
|
|
|
Пример 6.2. Нахождение суммы и произведения элементов одномерного |
||||||||||||
массива. |
|
|
|
и |
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
||
|
s = 0; p = 1; |
|
|
|
|
|
|
|
|
|||
|
|
|
л |
|
|
|
|
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
|
|
|||||
|
б |
|
|
|
|
|
|
|
|
|
||
|
|
s += a[i]; |
|
|
|
|
|
|
|
|
||
и |
|
|
|
|
|
|
|
|
|
|
||
|
|
p *= a[i]; |
|
|
|
|
|
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
|
|
|
Пример 6.3. Нахождение минимального и максимального элементов од- |
||||||||||||
номерногоБ |
массива. |
|
|
|
|
|
|
|
|
min = max = a[0]; for (i=1; i<n; i++)
{
if (a[i] < min) min = a[i];
37