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

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

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

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

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

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

от 25%

Подписываем

договор

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

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

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

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

Кафедра 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. Як сонце тількино червонило небо на сході Арсен уже сидів у човні біля своєї верби і пил
4. Реферат- Анатомические основы воли
5. Анализ финансовой устойчивости ЗАО СПП Коелгинское
6. Розвиток науки управліня
7.  Более того известен целый ряд пауэрлифтеров которые вообще отказались от занятий становой тягой на трени
8. ЛЮБОЕ ВРЕМЯ ПО ЗАПИСИОТ 3 ЧЕЛОВЕК ДНЕВНЫЕ ГРУППЫ В ЛЮБОЕ ВРЕМЯ ПО ЗАПИСИОТ 3 ЧЕЛОВЕК
9. связок beon и weorюn с причастием II переходных глаголов
10. Реферат- Профсоюзы в российской экономике