- •Идентификаторы
- •Область видимости идентификаторов
- •Связывание идентификаторов
- •Продолжительность хранения
- •Типы данных
- •Объявление и определение идентификаторов
- •Задание
- •Задание 1
- •Примеры вывода:
- •Задание 2
- •Задание 3
- •Задание 4
- •Задание 5
- •Задание 6
- •Задание 7
- •Задание 8
- •Индивидуальные варианты заданий
- •Контрольные вопросы
- •Инструкция выбора switch
- •Условное выражение
- •Задание
- •Задание 1
- •Задание 2
- •Задание 3
- •Индивидуальные варианты заданий
- •Контрольные вопросы
- •Практикум №3 Регулярные и итерационные циклы Цель практикума
- •Краткие теоретические сведения
- •Инструкция цикла while
- •Инструкция цикла for
- •Инструкция цикла do … while
- •Примеры циклов
- •Выход из цикла
- •Индивидуальные варианты заданий
- •Контрольные вопросы
- •Массивы
- •Передача указателей в функцию
- •Задание 6
- •Индивидуальные варианты заданий
- •Контрольные вопросы
- •Задание 4
- •Задание 5
- •Задание 6
- •Объединения
- •Перечисления
- •Задание Задание 1
- •Задание Задание 1
- •Задание 2
- •Задание 3
- •Задание 4
- •Задание 5
- •Задание 6
- •Задание 7
- •Список литературы
- •Программирование в системах информационной безопасности
Массивы
Массивы – это последовательность объектов одного типа. Элементы массива имеют порядковый номер и занимают в памяти соседние ячейки. Определяются массивы путём добавления к идентификатору квадратных скобок с указанием размерности массива.
Имя массива является указателем на его первый элемент. Для доступа к элементу массива можно использовать операцию индексации массива или операцию разыменования указателя. При этом указатель должен указывать на элемент, к которому необходимо обратиться.
Операция индексации массива |
Использование указателей |
int arr[5]; arr[0] = 5; arr[1] = arr[0] * 2; |
int arr[5]; *arr = 5; *(arr + 1) = *arr * 2; |
Обычно элементы массива обходятся в цикле.
Увеличение индекса |
Увеличение указателя |
for (int i = 0; i < 5; ++i) printf("arr[%d] = %d", i, arr[i]); |
for (int *cur = arr; cur - arr < 5; ++cur) printf("arr[%d] = %d\n", cur - arr, *cur); |
Передача указателей в функцию
Указатели передаются в функцию также, как и обычные переменные. Значение указателя копируется в функцию. Значение, на которое указывает указатель не копируется. Поэтому изменение указателя не имеет эффекта на вызывающую функцию, а изменение значения, на которое указывает указатель, влияет на вызывающую функцию. Передача параметра по указателю может быть использована для возвращения из функции более одндого параметра, а также для уменьшения времени копирования больших объектов.
Возврат указателей из функции
Функции могут возвращать указатели. При этом на возвращаемое значение накладываются ограничения: нельзя возвращать адрес локальной переменной или параметра функции, так как после выхода из функции эта память будет освобождена
Передача массивов в функции
Массивы передаются в функцию только по указателю, при этом размер массива необходимо передавать дополнительным параметром:
Способ 1 |
Способ 2 |
void f1(int arr[], int n) { } |
void f2(int *arr, int n) { } |
Задание
Задание 1
Линейный алгоритм функции из задания 1 практикума №1 разделить на две процедуры, выделив в одну вычислительные операции этого алгоритма, а в другую все операции ввода-вывода. Каждую процедуру оформить как функцию. Вычислительную часть алгоритма оформить как функцию с параметрами, передаваемыми по значению с использованием указателей на константные объекты, без возвращаемого значения. Результат вычисления вернуть через параметр-указатель. Прототип функции:
void f(const double *x, double *result) // Если функция имеет один параметр
void f(const double *x, const double *y, double *result) // Если функция имеет два параметра
Другую часть алгоритма оформить как функцию void main(), вызывающую первую функцию нужное количество раз. Записать тексты функций файл с именем task1.с в следующем порядке: функция с параметрами, функция main. Cкомпилировать, скомпоновать и выполнить.
Задание 2
Написать функцию вывода массива целых чисел на экран. Функция получает указатель на первый элемент массива и его длину.
Прототип функции void writeArray(int *arr, int n).
Формат вывода: 1 2 3 4 5 6
Задание 3
Написать функцию ввода массива целых чисел с клавиатуры. Функция получает указатель на первый элемент массива и его длину.
Прототип функции void readArray(int *arr, int n).
Задание 4
Написать функцию сортировки массива с использованием алгоритма сортировки, указанном в индивидуальном задании. Функция должна получать указатель на первый элемент массива и количество элементов в массиве.
Прототип функции void sort(int *arr, int n).
Функция не должна использовать функции консольного ввода-вывода.
Задание 5
Написать функцию, которая создаёт на стеке массив из N элементов (число N определяется константой в коде), выводит на экран N и с помощью разработанных ранее функций (задания 2-4) осуществляет ввод данных, вывод массива на экран, сортировку и повторный вывод отсортированного массива на экран
Прототип функции void sortStackArray(int *arr, int n).
Формат вывода (первая строка – количество элементов массива):
5
5 1 9 7 8
1 5 7 8 9