Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Московский авиационный институт
(Национальный исследовательский университет)
Кафедра 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
Работа программ
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//такие результаты внутри программы
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//такие результаты внутри программы
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