|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Краткие теоретические сведения. Тема: Функции и указателиЛабораторная работа № 9 Тема: Функции и указатели.
Цель работы: Получение навыков при работе с функциями и указателями на языке Си++.
Краткие теоретические сведения При программировании на языке С функция – это основное понятие, без которого невозможно обойтись. Каждая программа обязательно должна включать единственную функцию с именем main (главная функция). Именно с функции main начинается выполнение программы. Кроме функции с именем main в программу может входить произвольное количество неглавных функций, выполнение которых начинается после обращения к ним прямо или опосредованно из функции main. Для доступности функция должна быть определена или описана до первого обращения к ней. Основная форма определения функции имеет вид:
Тип Имя_функции (список формальных параметров) { Тело функции }
Тип определяет тип значения, которое возвращает функция с помощью оператора return. Список формальных параметров состоит из перечня типов и имен параметров, разделенных запятыми. Функция может не иметь параметров, но круглые скобки необходимы в любом случае. В списке формальных параметров для каждого параметра должен быть указан тип. Пример заголовка функции. float f (float x, int y, int z) Оператор return имеет два варианта использования. Во-первых, этот оператор вызывает немедленный выход из текущей функции и возврат в вызывающую программу. Во-вторых, этот оператор может использоваться для возврата значения функции. Сразу следует отметить, что в теле функции может быть несколько операторов return, но может и не быть ни одного. В этом случае переход в вызывающую программу происходит после выполнения последнего оператора тела функции. Все функции, возвращающие значение, могут использоваться в выражениях, т.е. обращение к таким функциям происходит из выражений.
Пример 1. Для заданных значений a, b, c, d найти минимальное значение, т.е. m=min { a, b, c, d }. Для решения этой задачи воспользуемся функцией, которая будет находить минимум из двух значений x и y, т.е. z=min { x, y }. Тогда решение основной задачи будет выглядеть, например, так: m1=min { a, b }, m2=min { c, d }, m=min { m1, m2 }. Т.е. три раза используя функцию, получаем решение исходной задачи.
Листинг программы. # include < iostream.h > # include < conio.h > float min (float x, float y) { float z; if (x<y) z=x; else z=y; return z; } void main () { float a, b, c, d, m1, m2, m; cin >> a >> b >> c >> d; m1=min (a, b); m2=min (c, d); m=min (m1, m2); cout <<" min= "<< m; getch (); }
Особенностью стандарта ANSI языка С является то, что для создания правильного машинного кода функции ему необходимо сообщить до ее первого вызова тип возвращаемого результата, а также количество и типы аргументов. Для этой цели в С используется понятие прототипа функции. Прототип функции задается следующим образом: Тип Имя_функции (список формальных параметров) Использование прототипа функции является описанием функции, чаще всего прототип функции полностью совпадает с заголовком функции, хотя это и не всегда так. При описании функции компилятору важно знать имя функции, количество и тип параметров и тип возвращаемого значения. При этом имена формальных параметров функции не играют никакой роли и игнорируются компилятором. Поэтому прототип функции может выглядеть так: float f (float x, int y, int z) или так: float f (float, int, int) Два этих описания абсолютно равносильны. Перепишем рассмотренную выше программу с использованием прототипа функции. Параллельно введем в программу некоторые усовершенствования. # include < iostream.h > # include < conio.h > float min (float x, float y) void main () { float a,b,c, d, m; cin >> a >> b >> c >> d; m=min (min (a, b), min (c, d)); cout <<" min ="<< m; getch (); } float min (float x, float y) { if (x<y) return x; else return y; } Когда функция не возвращает никакого значения, она должна быть определена как функция типа void. Например, для вывода на экран горизонтальной строки, состоящей из заданного символа, можно использовать следующую функцию, которая, конечно, не должна возвращать никакого значения. void gorizontal_line (char ch) { for (int i= 0; i <80; i++) cout << ch; } Если функция не имеет аргументов, то при описании прототипа такой функции следует вместо аргументов писать ключевое слово void. Это касается и функции main. Заголовок ее определения может иметь вид: void main (void), void main (), main (void) В языке С есть особенность, связанная с тем, что все аргументы передаются по значению. При вызове функции в стеке выделяется место для формальных параметров функции, и в это выделенное место заносится значение фактического параметра, т.е. значение параметра при вызове функции. Далее функции использует и меняет значения в стеке. При выходе из функции измененные значения параметров теряются. В языке С вызванная функция не может изменить переменные, указанные в качестве фактических аргументов функции при обращении к ней. Например, функция swap, которая должна менять значения параметров, не будет фактически этого делать. void swap (int x, int y) { int t; t=x; x=y; y=t; } Если необходимо, функцию можно приспособить для изменения аргументов. Надо передавать в качестве параметра не значение, а адрес переменной, которую нужно изменять, т.е. передавать указатель на переменную. Такой прием называется передачей параметра по ссылке. Вызванная функция должна описывать аргумент как указатель и обращаться к фактической переменной косвенно, через адрес, находящийся в указателе. Функция swap будет выглядеть тогда так. void swap (int *px, int *py) { int t; t=*px; *px=*py; *py=t; } В качестве использования этой функции приводим следующую задачу.
Пример 2. Заданы значения a, b, c. Требуется упорядочить их в порядке возрастания, т.е. переприсвоить так, чтобы выполнялись неравенства .
# include < iostream.h > # include < conio.h > void swap (int *px, int *py) { int t; t=*px; *px=*py; *py=t; } void main () { int a, b, c; cin >> a >> b >> c; if (a > b) swap (& a, & b); if (a > c) swap (& a, & c); if (b > c) swap (& b, & c); cout << a <<" "<< b <<" "<< c; getch (); } Если в качестве аргумента функции используется массив, есть лишь один способ – передача параметра по ссылке. В качестве параметра функции надо указать адрес начала массива. Следует помнить, что при передаче в качестве аргумента массива возможно появление побочного эффекта, а именно изменение значений элементов массива в результате работы функции.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.012 сек.) |