Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Тема- Исследование вопросов передачи параметров в функции вариант 33 Выполнил- студент группы

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 20.5.2024

Московский авиационный институт

(Национальный исследовательский университет)

Кафедра 301

Курсовая работа по дисциплине

«Программирование и основы алгоритмизации»

Тема: Исследование вопросов передачи параметров в функции

вариант №33

Выполнил: студент группы 30-101Б

Есипов А.А

Проверил: д.т.н., доц. каф.  301

Князев В. В.

Москва, 2012.

Содержание

Постановка задачи…………………………………………………….3

Функции. Способы передачи аргумента……………………………5

Листинг………………………………………………………………....9

Результаты и  выводы………………………………………………..16

Список использованных источников………………………………17

2

Постановка задачи

Задание.

Дано: 1. Переменные x, y, z.

2. Функции согласно варианту.

Требуется:

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

2. в основной программе задать значения переменным x, y, z (в соответствии с областями допустимых значений этих переменных в функциях);

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

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

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

по результатам исследований написать пояснительную записку, содержащую:

· титульный лист;

· содержание;

· задание на курсовую работу;

· теоретический материал о передаче значений переменных и самих переменных в функции;

· листинг программы;

3

· результаты работы программы, иллюстрирующие результаты исследований;

· выводы; список литературы.

a= + + ln(x+1)

b=*-z

c=++5*z

4

Функции: Способы передачи аргумента

Функцией называется подпрограмма, содержащая одно или больше предложений C++ и выполняющая конкретную задачу.Очень простые программы содержат только функцию main(), например:

#include <iostream>

int main()

{

   cout << "Hello, world!" << endl;  return 0;

}

Все функции в C++ имеют общую форму:

Имя функции (список параметров )

{

Тело функции

}

Пример функции:

Void box (int length, int width ,int height )

{

Cout<<”Объём равен”<< length*width*height<<”\n”

}

Передать аргументы функции в C++ можно тремя способами [1,2]:

- по значению

-по указателю

-по ссылке Наблюдалось использование аргументов в функции Void box:

Void box (int length, int width , int height ) {}   

5

Передача по значению

Когда аргумент передается по значению, создается копия аргумента, и последняя передается (через стек вызовов) вызываемой функции. Изменение копии не влияют на значение исходной переменной вызывающего [3]. После того как функция завершается, копия уничтожается. Это предотвращает случайные побочные эффекты, препятствующие разработке корректных и надежных программных систем. Недостаток заключается в том, что  при передаче по значению большого объекта копирование может привести к значительным затратам времени и памяти. Пример:

#include <iostream>

using namespace std;

int ByValue( int ); //прототип (передача по значению)

int main() {

   int x=2;

   cout<<"x = "<<ByValue(x)<<endl;

   return 0;

}

int ByValue (int number)

{

   return number*=number;// аргумент вызывающего не изменяется

6

Передача по указателю

Указатель (пойнтер, англ. pointer) - это переменная, содержащая адрес другой переменной [1].

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

Нужно  четко понимать, что компилятору абсолютно безразлично, как написано объявление int *p или int* p. Программист может выбрать свой стиль. Однако символы & и * лучше связывать с переменными, а не типом. Так как в соответствии с правилами языка C++ символ * (как и символ &) связывается с отдельной переменной, а не ее типом. Так как указатель содержит адрес объекта, это дает возможность "косвенного" доступа к этому объекту через указатель.

Переменные задаются следующим образом:

void qwe(float * x,float * y,float * z)

7

Передача по ссылке

Ссылка в программировании — это объект, указывающий на определенные данные, но не хранящий их. Получение объекта по ссылке называется разыменованием. Концептуально ссылка является указателем, но может иметь ряд отличий. Использование указателей в качестве альтернативного способа доступа к переменным таит в себе опасность - если был изменен адрес, хранящийся в указателе, то этот указатель больше не ссылается на нужное значение. Язык C предлагает альтернативу для более безопасного доступа к переменным через указатели. Объявив ссылочную переменную, можно создать объект, который, как указатель, ссылается на другое значение, но, в отличие от указателя, постоянно привязан к этому значению. Таким образом, ссылка на значение всегда ссылается на это значение[4].

Ссылку можно объявить следующим образом:

<имя типа>& <имя ссылки>(<выражение>);

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

В языке С++ существуют ограничения на работу со ссылками. Например, ссылки не могут связываться с другими ссылками. Иначе, говоря, ссылка не имеет адреса. Кроме того, невозможно создать указатель на ссылку. К битовому полю также нельзя обратиться с помощью ссылки. Независимые ссылки должны быть инициализированы в момент своего объявления. Нулевой ссылки не существует.

Для объявления ссылки внутри программы укажите знак амперсанда (&) непосредственно после типа параметра. Объявляя ссылку, вы должны сразу же присвоить ей переменную, для которой эта ссылка будет псевдонимом[5].Например :

Void f(int &i) //здесь i является ссылкой //

8

Листинг

1)Передача по значению:

#include <iostream>

#include <conio.h>

#include <cmath>

using namespace std;

void qwe(float x,float y,float z)

{       

float i,a,b,c;

b=0;

a=(z*z)*y+sqrt(y+x)+log(x+1);

for (i=1;i<=5;i++)

{b=b+(x-i)*pow(i,y)-z;

};

c=((x*x*x)/3)+sqrt(y+1)+5*z;

x=a; y=b; z=c;

cout<<" Values to function "<<endl;

cout<< " in function:"<<endl;

cout<<" x = "<< x << " y = "<< y<<endl<< " z = "<< z<<endl;

}

int main()

{

float x, y, z;

cout<<"input x, y ,z"<<endl;

9

do{

cin>>x;}

while (x<=(-1));

do{

cin>>y;}

while (y<=(-1));

cin>>z;

qwe(x,y,z);

cout<< " in program:"<<endl;

cout<<" x = "<< x << ", y = "<< y<<endl<< ", z = "<< z<<endl;

getch();}

10

2) Передача по ссылке:

#include <iostream>

#include <conio.h>

#include <cmath>

using namespace std;

void qwe(float & x,float & y,float & z)

{       

float i,a,b,c;

b=0;

a=pow(z,2)*y+(sqrt(y+x))+log(x+1);

for (i=1;i<=5;i++)

{b=b+((x-i)*pow(i,y)-z);

};

c=((x*x*x)/3)+sqrt(y+1)+(5*z);

x=a; y=b; z=c;

cout<<" References to function"<<endl;

cout<< " in function:"<<endl;

cout<<" x = "<< x << " y = "<< y<<endl<< " z = "<< z<<endl;

}

int main()

{

float x, y,  z;

cout<<"input x, y ,z"<<endl;

do{

11

cin>>x;}

while (x<=(-1));

do{

cin>>y;}

while (y<=(-1));

cin>>z;

qwe(x,y,z);

cout<< " in program:"<<endl;

cout<<" x = "<< x << " y = "<< y<<endl<< " z = "<< z<<endl;

getch();}

12

3) Передача по указателю:

#include <iostream>

#include <conio.h>

#include <cmath>

using namespace std;

void qwe3(float * x,float * y,float * z)

{       

float i,a,b,c;

b=0;

a=pow((* z),2)*((* y))+sqrt((* y)+(* x))+log((*x)+1);

for (i=1;i<=5;i++)

{b=b+((* x)-i)*pow(i,(* y))-(* z);

}

c=((pow((* x),3))/3)+sqrt((*y)+1)+5*(*z);

*x=a; *y=b; *z=c;

cout<<" Pointers to function"<<endl;

cout<< " in function:"<<endl;

cout<<" x = "<< *x << " y = "<< *y<<endl<< " z = "<< *z<<endl;

}

int main()

{

float x ,y ,  z;

cout<<"input x, y ,z"<<endl;

do{

13

cin>>x;}

while (x<=(-1));

do{

cin>>y;}

while (y<=(-1));

cin>>z;

qwe3(& x,& y,& z);

cout<< " in program:"<<endl;

cout<<" x = "<< x << "y = "<< y<<endl<< " z = "<< z<<endl;

getch();}

14

Работа программ

  1.  При передаче по значению:

Input x y z //приглашение для ввода

Values to function// передача по значению

In function :

x = 20.4252  y = -185

z =17.0654//такие  результаты внутри функции

In program:

x = 1 y = 2

z = 3//такие  результаты внутри программы

  1.  При передаче по ссылке:

Input x y z //приглашение для ввода

References to function// передача ссылке

In function  :

x = 20.4252  y  = -185

z =17.0654

In program:

x = 20.4252  y  = -185

z =17.0654//такие  результаты внутри программы

  1.  При передаче по указателю:

Input x y z //приглашение для ввода

Pointers to function// передача по указателю

In function  :

x = 20.4252  y  = -185

z =17.0654//такие  результаты внутри функции

In program:

x = 20.4252  y  = -185

z =17.0654//такие  результаты внутри программы

15

Результаты  и выводы

Использованы 2 набора чисел :1,2,3 и 4,5,6.

Результаты  приведены в таблицах ниже:

Значения x, y, z в  функциях:

Таблица 1.  

Набор(x,y,z) чисел

По значению(x,y,z)

По

ссылке (x,y,z)

По указателю(x,y,z)

1,2,3

20.4252,  -185, 17.0654

20.4252,  -185,

17.0654

20.4252,  -185, 17.0654

4,5,6

184.609 -2845 53.7828

184.609, -2845, 53.7828

184.609, -2845, 53.7828

Значения x, y, z в  программе:

Таблица 2.  

Набор(x,y,z) чисел

По значению(x,y,z)

По

ссылке (x,y,z)

По указателю(x,y,z)

1,2,3

1 , 2 , 3

20.4252,  -185,

17.0654

20.4252,  -185, 17.0654

4,5,6

4 , 5 , 6

184.609, -2845, 53.7828

184.609, -2845, 53.7828

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

-передача по значению

-передача по ссылкам

-передача по указателям

Показано, что при передаче переменных в функции результаты одинаковы, а при передаче в программу результаты одинаковы для передачи по ссылке и указателю (таблицы 1 , 2).

С помощью компилятора Dev-C++(версия 4.9.9.2) было написано 3 программы , текст каждой из них приведен в разделе «Листинг».

16

Список использованных источников

1)Шилдт Г. C++ шаг за шагом. - М.: Эком, 2011 .стр 215- 230

2)Шилдт Г. C++ полное руководство. - М.: Эком, 2009 . стр 200

Веб-ресурсы:

3) Сайт http://wiki.dieg.info

4) Сайт http://the-programmer.ru

5) Сайт http://ru.wikipedia.org 

17                




1. Оставим же Деда Мороза и чудеса детям а себе дадим слово стать в ближайший месяц
2. Системы кондиционирования воздуха офиса
3. Заходи по профілактиці бродяжництва та бездоглядності cеред неповнолітні
4. Виявлення закономірності формування споживацької вартості ювелірних виробів на сучасному ринку
5.  В современных условиях к образованию предъявляются принципиально новые духовнонравственные и социально
6. Александр Иванович Куприн яркий представитель школы критического реализма xx века
7. Изучение устройства карданной передачи
8. Реферат- Объективная сторона преступлений
9. Это особенно рельефно прослеживается в сферах производства возникших и развивающихся на волне НТП
10. Вариант 4 1 Методы административноправового регулирования свод
11. Мотивация трудовой деятельности персонала предприятия
12. Артефакт http---ndrey
13.  Не механические свойства металлов
14. выбор судьбы Субъективный взгляд на питание голодание и здоровье Автор работы Валентин Николаев сын
15. 1смерть царя Федора Ивановича1598
16. КОНСПЕКТ ЛЕКЦИЙ ПО ДИСЦИПЛИНЕ АРХИТЕКТУРНАЯ КОМПОЗИЦИЯ для специальности- Архитектура зданий и с
17. Тукай теле МУЗЫКА УЙНЫЙ КОШЛАР ТАВЫШЫ
18. Программа Стартинейджер Стартинейджер это увлекательная игра
19. Фінансове забезпечення цивільного захист
20. Тема урока Путешествие на корабле