Процедурное программирование на языке С. Часть 2. Указатели на объекты. Многоуровневая адресация: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование»

Страницы работы

Содержание работы

МИНИСТЕРСТВО

ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Московский государственный институт электроники и математики

(Технический университет)

Кафедра математического обеспечения систем обработки информации и управления

Процедурное программирование на языке С

Часть 2. Указатели на объекты.

 Многоуровневая адресация

Методические указания к лабораторным работам по курсам

«Алгоритмические языки и программирование»,

«Процедурное программирование»

Москва 2005

Составитель  канд. техн. наук, доц.  Т.Л. Федосеева

УДК 681.3

Процедурное программирование на языке С. Часть 2. Указатели на объекты. Многоуровневая адресация: Метод. указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование» / Моск. гос. ин-т электроники и математики; Сост. –  Т.Л. Федосеева. М., 2005. –  39 с.

Библиогр.: 2 назв.

Приведены задания к лабораторным работам, предназначенным для практического освоения приемов работы с указателями на функции, строки и массивы в языке С. Кратко изложен необходимый теоретический материал: рассмотрены примеры использования указателей на функции, некоторые полезные функции и приемы обработки строк, продемонстрировано  моделирование двумерного динамического массива.

Для студентов I и II курсов ФПМ и технических факультетов, изучающих программирование на языке С.

ISBN 5–94506–100–X

ЛАБОРАТОРНАЯ  РАБОТА  4

Целью лабораторной работы  4 является освоение приемов работы с указателями на функции.

ЗАДАНИЕ

В дополнение к программе лабораторной работы 3 описать  три функции:

q  Функция fff()  располагает элементы массива-параметра по возрастанию;

q  Функция ggg() располагает элементы массива-параметра по убыванию; помимо массива обе эти функции имеют еще один параметр –  размер массива.

q  Функция ffgg() имеет четыре формальных параметра: два указателя на массивы,  размер массивов (предполагается, что массивы имеют одинаковое количество элементов), указатель на номер массива, – и выполняет следующие действия:

§  вычисляет sum1 – сумму элементов первого массива,

§  вычисляет sum2 – сумму элементов второго массива,

§  если  sum1 > sum2, возвращает указатель на функцию fff() , а значением указателя на номер массива является 1, иначе – указатель на функцию ggg(), а значением указателя на номер массива является 2.

В главной функции с клавиатуры ввести k  – размер массива, объединяющего переменные  (– из лабораторной работы 2), динамически выделить память под этот массив и ввести значения всех элементов массива. Передать все элементы массива в функцию fun(), параметрами которой являются и переменные k,  n и m.

В функции fun() динамически выделяется память под массив переменных, соответствующих    и вычисляются их значения с использованием функций fun1() и fun2() из лабораторной работы 2.

Результаты работы функции fun(), т.е. значения , а также значения переменных  передаются в функцию ffgg(), определяющую, какой массив и как следует упорядочить.

Далее в главной функции осуществляется вызов функции,  которая упорядочивает  массив, по ее адресу. Упорядоченные значения   выводятся на экран в главной функции.


ТЕОРЕТИЧЕСКИЙ   МАТЕРИАЛ

4.1. ВЫЗОВ ФУНКЦИИ ПО АДРЕСУ

По аналогии с именем статического массива (имя такого массива является его константным адресом) имя функции является ее константным адресом. После компиляции каждая функция программы занимает в оперативной памяти некоторый участок. Начальный адрес этого участка и является адресом функции, который доступен программе как значение указателя-константы, соответствующей имени  функции.

В соответствии с синтаксисом языка С в общем случае синтаксическая форма  вызова функции имеет вид:

 <адресное выражение> ([<список фактических параметров>]).

Поскольку имя функции является ее константным  адресом, вызов функции по имени является частным случаем приведенной синтаксической формы.

Вызов функции по имени – более нагляден и понятен. Однако возможны ситуации, когда в некоторой точке программы необходимо организовать ветвление в зависимости от конкретных условий, выявленных в ходе работы предыдущих операторов программы. Каждая ветвь может быть реализована одной из множества однотипных функций: т.е. все функции  этого множества при вызове получают одни и те же аргументы и возвращают  объект одного и того же типа (либо все функции имеют тип void).

Для вызова функции после предварительного определения ее адреса необходима переменная, значение которой соответствует конкретному адресному выражению, адресу функции. Такой переменной является переменная-указатель на функцию.

4.2.ОБЪЯВЛЕНИЕ УКАЗАТЕЛЯ НА ФУНКЦИЮ

Оператор объявления переменной-указателя на функцию четко соответствует прототипу данной функции.

Синтаксическая форма прототипа функции имеет вид:

<спецификация типа>  func_name ([<список типов параметров>]);

Похожие материалы

Информация о работе