Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_Программирование_1.doc
Скачиваний:
8
Добавлен:
19.11.2019
Размер:
501.25 Кб
Скачать

6.4.Указатели и структуры

Структуры часто имеют поля различной длины, поэтому вводить адресную арифметику со структурами не имеет смысла. Указатель на структуру ведет себя как указатель на переменную любого другого типа. Например, так мы можем объявить указатель на структуру типа tovar, рассмотренную в предыдущей лабораторной работе, и присвоить ему значение.

tovar a;

tovar *p=&a;

После этого можно обратиться к полю структуры, на которую указывает указатель:

(*p).price = 10;

Скобки необходимы, поскольку приоритет операции обращения к полю выше, чем приоритет операции разыменования. Обращение к полю структуры, на которую указывает, встречается в программах на языке С очень часто, поэтому для него придумали короткое обозначение:

p->price = 10;

Оператор -> является сокращенной формой записи последовательности двух операций: разыменования и обращения к полю.

Задание к работе

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

  2. Для следующего фрагмента программы записать в виде таблицы значение переменных после каждого шага программы (столбцы соответствуют переменным, строки ­– строкам программы). Тип int и указатели занимают по 4 байта. Компилятор расположил переменные по следующим адресам: a – 100, p1 – 120, p2 – 124, s.x – 128, s.y – 132. Число N – номер варианта.

struct str {int x; int y;};

int a[5] = {1, 2, 3, 4, 5};

int *p1, *p2;

str s;

p1 = &a[N%5+1];

p2 = a+N/5+1;

s.x = *p1;

s.y = *p2++;

*(p1-2)=s.y;

p2=&s;

p2->x=p1[1];

p2–>y=s.y;

a[5]=s.x;

Содержание отчета

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

Контрольные вопросы

  1. Что такое указатель?

  2. Как объявить указатель?

  3. Для чего предназначена операция взятия адреса?

  4. Для чего предназначена операция разыменования?

  5. Можно ли с указателями производить арифметические операции?

  6. Что общего и чем отличаются указатель и массив?

  7. Какие операции можно проводить с указателем на структуру?

Лабораторная работа 7 Функции

Цель работы: Ознакомиться с синтаксисом функция, научиться создавать собственные функции, понять способ передачи аргументов и возврата результата.

Теоретические сведения

7.1.Функции

Функции в программировании имеют два основных назначения.

Во-первых, они позволяют часть действий, которые в программе нужно выполнить несколько раз, записать один раз в виде подпрограммы, а затем обращаться к этой подпрограмме. При этом могут выполняться вычисления с различными аргументами.

Во-вторых, функции позволяют разбить программу на небольшие части. Написать и отладить несколько небольших подпрограмм гораздо проще, чем реализовывать большую программу целиком.

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

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

тип_результата имя функции(аргументы)

{

тело_функции

return результат;

}

Тип результата определяет тип, который возвращает функция. Имя функции это любой идентификатор, с помощью которого можно будет к ней обращаться. Аргументы – это перечисленные через запятую значения переменных, которые передаются функции и которые она будет использовать при вычислении. Тело функции – это инструкции, которые требуются, чтобы реализовать нужное действие. Оператор return возвращает результат работы функции.

Для примера определим функцию, которая вычисляет сумму квадратов двух целых чисел:

int square_sum (int x, int y)

{

int s = x*x+y*y;

return s;

}

Имя функции square_sum. Она имеет два аргумента целого типа x и y и возвращает результат целого типа.

В теле функции определена локальная переменная s. Локальная переменная это переменная, которая объявлена внутри функции. Она находится в памяти и может быть использована только, пока выполняется функция. К ней нельзя обратиться из других частей программы.

В s записывается сумма квадратов аргументов. Оператор return возвращает результат, т.е. содержимое переменной s переписывается в переменную, указанную при вызове функции. После этого функция завершает свою работу, локальная переменная s уничтожается.

Например, где-то в нашей программе встречается вызов этой функции: a=square_sum(2,3);. В первой строке тела функции в s будет записано значение 13, во второй строке это значение будет переписано в переменную a.

Функция в программе должна быть определена до того, как будет использоваться (вызываться). Проще всего определить все функции до функции main().