- •Введение
- •Структура программы на языке Си
- •Директивы препроцессора
- •Константы
- •Переменные
- •Арифметические выражения
- •Операция присваивания
- •Ввод информации с клавиатуры и вывод на экран
- •Логические выражения
- •Операторы управления
- •Оператор условного перехода if
- •Оператор выбора варианта
- •Перечисляемый тип данных
- •Циклы
- •Оператор цикла while
- •Оператор цикла do-while
- •Оператор цикла for
- •Локальные и глобальные переменные
- •Переменные с индексами (массивы)
- •Примеры обработки одномерных массивов
- •Многомерные массивы
- •Массивы и указатели
- •Арифметические и логические операции с указателями
- •Обработка массивов с помощью указателей
- •Обработка массивов переменной размерности
- •Обработка матриц переменной размерности
- •Обработка текстовой информации
- •Стандартные строки языка С++
- •Пример 1. Определение длины строки.
- •Пример 2. Копирование одной строки в другую
- •Пример 3. Исключение из строки символа.
- •Пример 4. Вставка в строку символа
- •Пример 5. Проверка правильности расстановки скобок.
- •Строки типа string
- •Массивы указателей
- •Указатели на функции
- •Сводная таблица форм объявления указателей
- •Преобразование типов
- •Ссылки
- •Структуры
- •Объединения
- •Файлы
- •Чтение файла в матрицу
- •Чтение файла в структуру
- •Функции для обработки произвольных полей структур
- •Связные списки
- •Контейнерные классы
- •Стеки
- •Рекурсия
- •Вопросы для самопроверки
- •Литература
56
внешняя. Обычно это требуется для повышения наглядности программы. Пример:
int x;
void _tmain ()
{
. . .
}
table ()
{
extern int x;
}
gist ()
{
int х;
}
sum ()
{
}
В этом примере глобальная переменная x действует в функциях
_tmain (), table(), и sum (). Но переменная x из функции gist () - это локальная переменная, которая действует только в пределах функции gist (), и никакого отношения эта переменная не имеет к глобальной переменной x, действующей в остальных функциях.
Локальные переменные глобальны внутри функции. Если некоторая переменная объявлена внутри функции, она «видима» во всех блоках (внутри пар фигурных скобок) в этой функции. Но если внутри любого блока функции объявлена переменная, она невидима за пределами этого блока.
Переменные с индексами (массивы)
При решении задач часто приходится одинаковым способом обрабатывать множество логически связанных элементов данных. Присвоение разных имен для них не только трудоемко, но и бессмысленно. Более удобно присвоить им одно общее имя, а для того, что-
57
бы отличать элементы друг от друга, использовать номера (нумерация элементов носит условный характер, определяемый, например, порядком ввода этих элементов в компьютер, либо порядком их записи).
При такой организации данных обработку (доступ к элементам) выполняют в циклах, в которых для последовательного обращения к элементам изменяют их номера. Номера элементов называют индексами, а организованное таким образом множество элементов данных называют массивом.
Количество элементов массива может быть произвольным и зависит от решаемой задачи, т.е. задается программистом. Для размещения элементов массива в памяти требуется свободное место, определяемое произведением количества элементов на длину одного элемента. Например, для размещения 10 элементов типа double требуется
10 * 8 = 80 байт.
Размер массива зависит от решаемой задачи. При объявлении массива количество элементов в нем указывается в квадратных скобках после типа элементов данных и имени массива. Например,
double x[25], y[25], sum; char st[100], ch;
В этом объявлении описаны массивы элементов типа double с именами x и y (по 25 элементов каждый) и st с элементами типа char (из 100 элементов). Одновременно объявлены также скалярные переменные sum типа double и ch типа char. Всего для размещения этих переменных требуется (переменная типа double 8 байт и типа char 1 байт)
25 * 8 + 25 * 8 + 8 + 100 * 1 + 1 = 509 байт .
Тип каждого элемента массива совпадает с типом данных, объявленным для всего массива, и имеет некоторое конкретное значение. Например, элемент x[i], объявленного выше массива x, относится к типу double и может иметь значение, например, -1.536. Элементы
58
массива должны иметь значения, не выходящие за пределы диапазона значений для этого типа данных.
В примерах записи в качестве индекса массива указана переменная i, которая может иметь конкретное значение, например, 3. Имя переменной для индекса массива может быть любым, но лучше использовать имена, связанные с принятыми математическими обозначениями.
Для обращения к элементам массива используются индексы, которые записываются в квадратных скобках после имени массива. В качестве индексов и значений, используемых при объявлении массивов, используют целочисленные константы и арифметические выражения, которые при вычислении дают целые числа. Индексы изменяются от 0 до значения на 1 меньше объявленного количества элементов. Так, для упомянутого выше массива st из 100 элементов индексы изменяются от 0 до 99.
Последовательность обработки элементов массива определяется порядком изменения значений индексов массива. При использовании в качестве индекса константы можно обратиться только к одиночному элементу массива. Если же в качестве индекса используется выражение, в которое входит переменная, то порядок обработки элементов массива определяется последовательными значениями, которые получает выражение при изменении этой переменной. В простейшем случае выражение состоит только из переменной.
Многие задачи, в которых используются массивы, при настройке на конкретное применение требуют изменения количества объявляемых элементов массива. Это значение должно также использоваться во всех операторах цикла, с помощью которого полностью обрабатывается массив.
В языке C++ не выполняется проверка выхода за границу массива (т. е. не проверяется, лежит ли значение индекса массива в пределах от нуля до максимального количества элементов массива без единицы). Выход за границу массива обычно приводит к неправильной работе программы, а иногда и к зависанию машины.
59
Наиболее распространенной ошибкой при обработке массивов является неправильное указание максимального значения индекса массива. По этой причине настоятельно рекомендуется задавать количество элементов массива с помощью константы, определяемой директивой препроцессора #define, и эту же константу использовать во всех операторах цикла, с помощью которых обрабатывается массив. Пример такого оформления цикла показан ниже.
Использование директивы препроцессора #define исключает возможность выхода за границу массива. При объявлении массива и во всех операторах цикла для указания предельного количества элементов используется одна и та же константа (а не конкретные числа), поэтому упрощается настройка программы для работы с другими размерами массива. Для этого достаточно в директиве #define изменить число, задающее количество элементов, и вся программа настраивается на обработку нового количества элементов.
Наиболее часто элементы массива обрабатываются в порядке возрастания индексов массива, т.е. переменная цикла возрастает от 0 до предельного значения индекса с шагом 1. Ниже приведена схема оформления оператора цикла для такой обработки.
#define SIZE 20 // Задание количества элементов массива
... |
|
double a[SIZE]; |
//Объявление массива |
int i; |
//Объявление индекса массива |
...
// Оператор цикла, задающий изменение индекса for (i = 0; i < SIZE; i++)
{
//Выполнение действий с элементом массива, например sum = sum + a[i];
}
В примере тип элементов массива объявлен как double, но могут быть указаны и любые другие, допустимые в языке С++ типы данных.