- •Программирование
- •На языке высокого уровня
- •Часть 1. Основы языка Си
- •Методические указания
- •К выполнению лабораторных работ
- •Составитель: л.А. Прокушев
- •Подписано к печати Формат 60х84 1/16. Бумага тип. №3
- •Редакционно-издательский отдел
- •190000, Санкт-Петербург, ул. Б. Морская, 67 Общие методические указания
- •Алгоритмизация вычислительных процессов
- •Средства программирования вычислительных процессов Базовые элементы языка Си
- •Данные и их типы
- •Константы
- •Переменные
- •Ввод-вывод данных
- •Форматированный ввод
- •Форматированный вывод
- •Консольный ввод-вывод
- •Функция ввода символа (без отображения)
- •Функция очистки экрана результатов
- •Структура Си-программы
- •Директивы препроцессора
- •Выражения и операции
- •Логические выражения и операции
- •Работа с ветвящимися процессами Операторы
- •Оператор присваивания
- •Условный оператор (if)
- •Операторы передачи управления Пустой оператор
- •Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор.
- •Оператор выбора (switch)
- •Действие оператора выбора состоит в следующем:
- •Введите 2 числа х, y : 3 8
- •Работа с циклическими вычислительными процессами
- •Циклы с фиксированным числом повторений Оператор цикла с предусловием (while)
- •Прерывание цикла
- •Циклы с неизвестным числом повторений Вычисление рекуррентных последовательностей
- •Оператор цикла с постусловием (do)
- •Вложенные циклы и организация диалога в программе
- •Оператор цикла с параметром (for)
- •Программа:
- •Программа:
- •Программа:
- •Работа с массивами
- •Описание массива
- •Доступ к элементам массива
- •Указатель
- •Занесение данных в массив
- •Многомерные массивы
- •Работа с функциями
- •Определение функции
- •Вызов функции
- •Передача параметров функции
- •Передача данных по значению
- •Передача данных по адресу
- •Пример. Составить функцию обмена значениями между переменными X и y. Верным решением является применение передачи данных по адресу.
- •Прототип (шаблон) функции
- •Блочная структура программы
- •Внешние описания переменных
- •Многомодульные программы Проект программы
- •Внешние ссылки
- •Создание проекта программы
- •Работа с указателями Объявления объектов со сложными описателями
- •Массивы указателей
- •Указатель на указатель
- •Указатель на функцию
- •Использование указателя на функцию как аргумента
- •Массивы указателей на функции
- •Часть 1. Основы языка Си 1
Описание массива
Описание массива должно соответствовать формату:
тип имя [размер1] [размер2],…; причем скобки [ ] обязательны для каждой размерности.
Например,
int ar[5]; /* одномерный массив из 5-ти целых чисел */
char st [20], buf[80]; /* символьные массивы */
float R[2][3]; /* двумерный массив вещественных чисел */
В математике массив R представляется матрицей из 2-х строк и 3-х столбцов:
В памяти двумерные массивы заполняются построчно, то есть второй индекс меняется чаще: R[2][3] = { R[0][0], R[0][1], R[0][2], R[1][0], R[1][1], R[1][2], R[1][3] }. По всем размерностям нижний индекс равен 0, а верхний N–1, где N – число элементов по данной размерности.
Доступ к элементам массива
Существует два способа обращения к элементам:
Традиционный – использование индексных выражений вида имя [индексное выражение] , где индексное выражение определяет местоположение элемента в массиве.
Пример. Для массива с описанием int ar[5]
элементы массива можно задавать как ar[0], ar[j], ar[i+1].
В языке Си не выполняется контроль допустимости значений индекса элементов массива, эта задача ложится на программиста.
Использование указателей и адресных выражений.
Указатель
Механизм указателей одна из наиболее привлекательных для программистов особенностей языка Си, который позволяет получить доступ к адресам ячеек оперативной памяти.
Указатель-константа – это значение адреса ячейки в 16-чной системе счисления.
Указатель-переменная (просто указатель) – это переменная, которая может хранить адрес другого объекта программы. Доступ к объекту теперь обеспечивается теперь не прямо через имя переменной, а косвенно, через указатель, хранящий адрес этой переменной. Для описания указателя-переменной используется модификатор * перед этой переменой, как особый тип данных “указатель на что-либо”:
int var, *ptr; /* переменная и указатель на объект целого типа */
Определены две специальные операции для работы с переменными через указатели: операция & (получение адреса объекта) и операция * (разадресация, косвенный доступ к содержимому ячейки через указатель на нее). Кроме того доступны арифметические операции с указателями (как целыми величинами) и операции присваивания.
Пример.
float var=5.1, *ptr; /* переменная и указатель вещественного типа */
ptr = &var; /* получение адреса var и запись его в указатель */
*ptr = *ptr+2.5; /* изменение var косвенно, через указатель */
printf (“var=%f”, var); /* результат var = 7.6 */
В Си существует непосредственная связь между указателями и массивами, поскольку имя массива является указателем-константой, то есть адресом элемента с индексом 0 (точнее адресом первого байта этого элемента).
Пример. Пусть данные описания :
int ar [4], *ptr; /* массив и указатель на объект целого типа */
Пусть элементы массива размещены в памяти, начиная с байта с адресом 100:
-
Элементы :
ar [0]
ar [1]
ar [2]
ar [3]
Байты памяти:
Адреса байтов:
100
102
104
106
Адреса элементов:
&ar[0]
&ar[1]
&ar[2]
&ar[3]
Указатели:
ar
ar+1
ar+2
ar+3
Таким образом ar+i = &ar[i] (в частности ar=&a[0]), поскольку адрес элемента вычисляется по формуле: адрес элемента = имя массива + индекс * sizeof(тип массива), где функция sizeof (тип) определяет размер элемента в байтах.
Поскольку имя массива является указателем-константой, его нельзя изменить оператором присваивания вида ar= выражение, но им можно инициировать при описании указатель-переменную, например,
int ar[4], *ptr=ar;
либо присвоить имя массива указателю-переменной:
ptr = ar;
либо получить адрес массива в 16-й системе счисления:
printf (“Адрес массива ar=%x”, ar).
Адресное выражение образуется на основе имени массива или указателя на массив, например,
ar+i, ptr+i или i+ar, i+ptr.
Доступ к элементам массива через адресное выражение осуществляется с помощью операции * (разадресации): *(ar+i) или *(ptr+i).