русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Передача значений функций


Дата добавления: 2015-07-04; просмотров: 705; Нарушение авторских прав


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

При передаче по значению выполняются следующие действия:

● вычисляются значения выражений, стоящие на месте фактических параметров;

● в стеке выделяется память под формальные параметры функции;

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

Например:

double square(double a, double b, double c) {

/*функция возвращает площадь треугольника, заданного длинами сторон а,b,c*/

double s, p=(a+b+c)/2;

return s=sqrt(p*(p-a)*(p-b)*(p-c));//формула Герона

}

 

1) double s1=square(2.5,2,1);

2) double a=2.5,b=2,c=1;

double s2=square(a,b,c);

3) double x1=1,y1=1,x2=3,y2=2,x3=3,y3=1;

double s3=square(

sqrt(pow(x1-x2,2)+pow(y1-y2,2)),//расстояние между 1 и 2

sqrt(pow(x1-x3,2)+pow(y1-y3,2)),//расстояние между 1 и 3

sqrt(pow(x3-x2,2)+pow(y3-y2,2)));//расстояние между 2 и3

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

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

Например:

void Change(int a,int b) { //передача по значению

int r=a; a=b; b=r;

}

int x=1,y=5;

Change(x,y);

cout << ”x=” << x << ”y=” << y;

выведется: x=1 y=5

 

 

void Change(int *a,int *b) { //передача по адресу



int r=*a; *a=*b; *b=r;

}

int x=1,y=5;

Change(&x,&y);

cout << ”x=” << x << ”y=” << y;

выведется: x=5 y=1

 

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

void Change(int &a,int &b){

int r=a; a=b; b=r;

}

int x=1,y=5;

Change(x,y);

cout << ”x=” << x << ”y=” << y;

выведется: x=5 y=1

 

Использование ссылок вместо указателей улучшает читаемость программы, т.к. не надо применять операцию разыменовывания. Использование ссылок вместо передачи по значению также более эффективно, т.к. не требует копирования параметров. Если требуется запретить изменение параметра внутри функции, используется модификатор const. Рекомендуется ставить const перед всеми параметрами, изменение которых в функции не предусмотрено (по заголовку будет понятно, какие параметры в ней будут изменяться, а какие нет).

Пример 1. Для данных трех натуральных чисел найдите их НОД. Разработайте функцию нахождения НОД двух чисел.

#include <stdio.h>

long NOD (long x,long y);

void main (){

long a,b,c,z;

printf("Введите первое число = ");

scanf("%ld",&a);

printf("Введите второе число = ");

scanf("%ld",&b);

printf("Введите третье число = ");

scanf("%ld",&c);

z=NOD(c,NOD(a,b));

printf("Наибольший общий делитель 3 чисел равен %ld",z);

}

 

 

long NOD(long x,long y){

long x1,y1;

while (y!=0){

x1=y;

y1=x%y;

x=x1;

y=y1;

}

return x;

}



<== предыдущая лекция | следующая лекция ==>
Метод процедурной абстракции | Задания


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.277 сек.