- •Синтаксис языка c. Структура программы. Характеристика функции main.
- •Директивы препроцессора (основные).
- •Базовые типы данных.
- •Декларация объектов программы на языке c, атрибуты: тип, класс памяти и область действия.
- •Константы в программах на языке c.
- •Целочисленные константы
- •Константы вещественного типа
- •Символьные константы
- •Строковые константы
- •Функции вывода информации. Использование модификаторов и управляющих последовательностей.
- •Функции ввода информации.
- •Ввод/вывод потоками (cin, cout).
- •Синтаксис операторов языка c, операторы-выражения, управляющие операторы в языке с.
- •Условные операторы
- •Арифметические операции, преобразование типов операндов арифметических операций. Средство "typedef".
- •Линейный алгоритм. Операции присваивания, разновидности сокращений записи операции присваивания.
- •Сокращенная запись операции присваивания
- •Операции отношений (сравнения) и логические операции.
- •Логические операции
- •Операторы передачи управления goto, continue, break, return.
- •Оператор безусловного перехода goto
- •Оператор continue
- •Оператор break
- •Оператор return
- •Ветвящийся алгоритм. Условный оператор if, условная операция «? :».
- •Оператор выбора альтернатив (переключатель) switch.
- •Операция ",".
- •Оператор с предусловием while
- •Оператор цикла с постусловием do - while.
- •Оператор цикла с предусловием и коррекцией for.
- •Функции в с. Способы описания функции, операция вызова функции.
- •Особенности использования параметров функций.
- •Указатели как тип данных. Операции * и &. Операции над указателями.
- •Операции над указателями (косвенная адресация)
- •Одномерные массивы и связь с указателями.
- •Применение указателей
- •Cтроковые данные в с. Библиотечные функции для их обработки.
- •Указатель на указатель, многомерные массивы.
- •Многомерные массивы
- •Динамическая память, функции и операции работы с памятью.
- •Пример создания двуxмерного динамического массива:
- •Указатели на функцию.
- •Тип данных «структура», общая характеристика.
- •Вложенные структуры, указатели на структуру, массивы структур.
- •Массивы структур
- •Файлы в с. Типы файлов, понятие файловой переменной и увязка ее с физическим файлом.
- •Закрытие файла
- •Запись - чтение информации
- •Посимвольный ввод-вывод
- •Построчный ввод-вывод
- •Блоковый ввод-вывод
- •Текстовые файлы.
- •Основные режимы работы с бинарными файлами, последовательный и прямой доступ.
Многомерные массивы
Как уже отмечалось, в языке Си кроме одномерных массивов возможна работа с многомерными массивами. Объявление многомерного массива:
<тип> < ID >[размер1][размер2]…[размерN]={{список начальных значений},
{список начальных значений},…};
Наиболее быстро изменяется последний индекс элементов массива, поскольку многомерные массивы в языке Си размещаются в памяти компьютера в последовательности столбцов.
Например, элементы двухмерного массива b[3][2] размещаются в памяти компьютера в следующем порядке:
b[0][0], b[0][1], b[1][0], b[1][1], b[2][0], b[2][1].
Следующий пример иллюстрирует определение массива целого типа, состоящего из трех строк и четырех столбцов, с одновременным присвоением его элементам (инициализацией) начальных значений:
int a[3][4] = {{1,2,0,0},{9,-2,4,1},{-7,0,0,0}};
Если в какой-то группе { } список значений короче, то оставшимся элементам присваивается 0.
Динамическая память, функции и операции работы с памятью.
В языке С размерность массива при объявлении должна задаваться константным выражением. При необходимости работы с массивами переменной размерности вместо массива достаточно объявить указатель требуемого типа и присвоить ему адрес свободной области памяти (захватить память). После обработки массива занятую память надо освободить. Библиотечные функции работы с памятью описаны в файле alloc.h.
Пример создания динамического массива:
float *x;
int n;
printf("\nРазмерность - "); scanf(" %d",&n);
if ((x = calloc(n, sizeof(*x)))==NULL) { // Захват памяти
printf("\n Предел размерности “);
exit(1);
}
else {
printf("\n Массив создан !");
...
for (i=0; i<n; i++)
printf("\n%f",x[i]);
...
free(x); // Освобождение памяти
}
В С++ введены две операции: захват памяти - new, освобождение, захваченной ранее памяти - delete.
Общий формат записи:
указатель = new type (значение);
. . .
delete указатель;
Например:
int *a;
a = new int (8);
В данном случае создана целочисленная динамическая переменная, на которую установлен указатель a и которой присвоено начальное значение 8. После работы с ней освобождаем память:
. . .
delete a;
Операции new и delete для массивов:
указатель = new тип [количество] ;
Результат операции – адрес начала области памяти для размещения данных, указанного количества и типа. При нехватке памяти – результат NULL. Операция delete:
delete [ ] указатель;
Пример создания одномерного динамического массива:
Массив объявляем указателем.
...
double *x;
int i, n;
...
puts(" Введите размер массива: ");
scanf(“%d”, &n);
x = new double [n] ;
if (x == NULL) {
puts(" Предел размерности ! ");
return;
}
for (i=0; i<n; i++) // Ввод элементов массива
scanf(“%lf”, &x[i]);
...
delete [ ]x; // Освобождение памяти
...
Пример создания двуxмерного динамического массива:
Напомним, что ID двухмерного массива - указатель на указатель (рис. 4):
...
int **m, n1, n2;
puts(" Введите размеры массива (количество строк и столбцов: ");
scanf(“%d%d”, &n1, &n2);
m = new int * [n1]; // Захват памяти для указателей - А (n1=3)
for ( int i=0; i<n1; i++) // Захват памяти для элементов - B (n2=4)
m[i] = new int [n2];
. . .
for ( i=0; i<n1; i++)
for ( j=0; j<n2; j++)
m[i] [j] = i+j; // *(*(m+i)+j) = i+j;
. . .
for ( i=0; i<n1; i++) // Освобождение памяти
delete [ ] m[i];
delete [ ] m;
. . .