68599

Исследование способов работы с функциями

Лабораторная работа

Информатика, кибернетика и программирование

В данной функции значения переменных x и y являющихся формальными параметрами меняются местами но поскольку эти переменные существуют только внутри функции chnge значения фактических...

Русский

2014-09-23

60.5 KB

0 чел.

Лабораторная работа № 3

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

Цель занятия:

  •  Совершенствование навыков разработки программ в среде программирования MS Visual C++
  •  Совершенствование навыков в программировании с использованием указателей
  •  Исследование способов передачи параметров в функцию
  •  Исследование порядка возвращения параметров из функции

Время на выполнение  работы: 2 часа

Программа исследований:

  1.  Исследование способа передачи параметров в функцию по значению
    1.  Исследование способов передачи параметров в функцию по адресу
    2.  Исследование порядка возвращения параметров из функции

Подготовка к выполнению работы:

  1.  Изучить материал настоящего руководства и рекомендованную литературу (структура программы на языке высокого уровня, алфавит и элементарные конструкции языка Си, переменные и константы, стандартные типы данных, выражения и операции в языке Си, циклы, массивы и указатели, функции).
  2.  Практически освоить порядок работы на ПЭВМ в среде программирования MS Visual C++.

Материалы для подготовки к занятию:

  1.  Конспект лекций
  2.  [1] стр. 73-82

Содержание отчета:

  1.  Цели исследования.
  2.  Программу работы.
  3.  Листинги программ
  4.  Результаты исследований
  5.  Выводы по каждому пункту и общий вывод.


МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

Все переменные, объявленные в теле функции без указания класса памяти, имеют класс памяти auto, т.е. они являются локальными. При вызове функции локальным переменным отводится память в стеке и производится их инициализация. Управление передается первому оператору тела функции и начинается выполнение функции, которое продолжается до тех пор, пока не встретится оператор return или последний оператор тела функции. Управление при этом возвращается в точку, следующую за точкой вызова, а локальные переменные становятся недоступными. При новом вызове функции для локальных переменных память распределяется вновь, и поэтому старые значения локальных переменных теряются.

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

Пример:  

      /*    использование параметров по значению  */

 void change (int x, int y);

void main()

  {

  int a=5,b=15;

  cout<<”\na=”<<a<<”, b=”<<b;

  change(a,b);

  cout<<”\na=”<<a<<”, b=”<<b;

  return;

  }

      void change (int x, int y)

        {    

  int k=x;

        x=y;

        y=k;

  }

В данной функции значения переменных x и y, являющихся формальными параметрами, меняются местами, но поскольку эти переменные существуют только внутри функции change, значения фактических параметров, используемых при вызове функции, останутся неизменными, то есть значения переменных a и b как были 5 и 15 соответственно, так и остались. Для того чтобы менялись местами значения фактических аргументов можно использовать функцию приведенную в следующем примере.

Пример:

     /*    использование параметров по адресу  */

      void change (int *x, int *y)

      {  int k=*x;

            *x=*y;

            *y=k;}

При вызове такой функции в качестве фактических параметров должны быть использованы не значения переменных, а их адреса  change (&a,&b);. Тогда функция будет оперировать не с локальными значениями, а со значениями по адресам, переданным в функцию в качестве параметров, что приведет к обмену значениями переменных a и b.

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

Пример:

      /*    использование параметров по ссылке  */

 void change (int &x, int &y)

      {    int k=x;

               x=y;

               y=k;}

При вызове такой функции в качестве фактических параметров должны быть использованы имена переменных:  change (a,b);. При этом, в функции мы будем работать с самими переменными a и b, но через альтернативные их имена: x и y.

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

Функция возвращает значение если ее выполнение заканчивается оператором return, содержащим некоторое выражение. Указанное выражение вычисляется, преобразуется, если необходимо, к типу возвращаемого значения и возвращается в точку вызова функции в качестве результата. Если оператор return не содержит выражения или выполнение функции завершается после выполнения последнего ее оператора (без выполнения оператора return), то возвращаемое значение не определено. Для функций, не использующих возвращаемое значение, должен быть использован тип void, указывающий на отсутствие возвращаемого значения. Если функция определена как функция, возвращающая некоторое значение, а в операторе return при выходе из нее отсутствует выражение, то поведение вызывающей функции после передачи ей управления может быть непредсказуемым.


ЗАДАНИЕ НА ИССЛЕДОВАНИЕ

  1.  Исследование способа передачи параметров в функцию по значению
    •  реализовать в среде программирования следующий листинг:

void Swap(int a, int b);

int main(int argc, char* argv[])

{

int x,y;

cout<<"\nEnter two numbers: ";

 cin>>x>>y;

cout<<"\nx="<<x<<", y="<<y;

Swap(x,y);

    cout<<"\nx="<<x<<", y="<<y;

 cout<<endl;

return 0;

}

void Swap(int a, int b)

{

int c;

c=a;

a=b;

b=c;

 return;

}

  •  с использованием режима отладки исследовать процесс исполнения программы в микропроцессоре. Обратить внимание на способ и место хранения значений локальных переменных a,b и c.
  1.   Исследование способа передачи параметров в функцию по адресу
    •  реализовать в среде программирования следующий листинг:

void Swap(int *a, int *b);

int main(int argc, char* argv[])

{

int x,y;

cout<<"\nEnter two numbers: ";

 cin>>x>>y;

cout<<"\nx="<<x<<", y="<<y;

Swap(&x,&y);

   cout<<"\nx="<<x<<", y="<<y;

 cout<<endl;

return 0;

}

void Swap(int *a, int *b)

{

int c;

c=*a;

*a=*b;

*b=c;

 return;

}

  •  с использованием режима отладки исследовать процесс исполнения программы в микропроцессоре. Обратить внимание на способ и место хранения значений локальных переменных a,b и c;
    •  реализовать в среде программирования следующий листинг:

void Swap(int &a, int &b);

int main(int argc, char* argv[])

{

int x,y;

cout<<"\nEnter two numbers: ";

 cin>>x>>y;

cout<<"\nx="<<x<<", y="<<y;

Swap(x,y);

   cout<<"\nx="<<x<<", y="<<y;

 cout<<endl;

return 0;

}

void Swap(int &a, int &b)

{

int c;

c=a;

a=b;

b=c;

 return;

}

  •  с использованием режима отладки исследовать процесс исполнения программы в микропроцессоре. Обратить внимание на способ и место хранения значений локальных переменных a,b и c;
    •  сделать выводы по рассмотренным методам.
  1.  Исследование порядка возвращения параметров из функции
    •  реализовать в среде программирования следующий листинг:

int Max(int a, int b);

int main(int argc, char* argv[])

{

int x,y,c;

cout<<"\nEnter a two numbers: ";

 cin>>x>>y;

c=Max(x,y);

   cout<<"\nMaximum is "<<c;

cout<<endl;

return 0;

}

int Max(int a, int b)

{

int c;

c=(a>b)?a:b;

return c;

}

  •  с использованием режима отладки исследовать процесс исполнения программы в микропроцессоре. Обратить внимание на способ и место хранения значений локальных переменных a,b иc;
  •  реализовать в среде программирования следующий листинг:

int* GetMem();

int main(int argc, char* argv[])

{

int *a;

a=GetMem();

   cout<<"\n a is "<<a;

cout<<"\n*a is "<<*a;

cout<<endl;

return 0;

}

int* GetMem()

{

int *c=new int(5);

 return c;

}

  •  с использованием режима отладки исследовать процесс исполнения программы в микропроцессоре;
  •  сделать выводы.


 

А также другие работы, которые могут Вас заинтересовать

81281. Система права и система законодательства 36.02 KB
  Система права как его содержание это внутренняя структура права соответствующая характеру регулируемых им общественных отношений. Система законодательства внешняя форма права выражающая строение его источников т. Структура права носит объективный характер и обусловлена экономическим базисом общества.
81282. Типология правовых систем 38.05 KB
  При классификации правовых систем используют различные факторы начиная с этических расовых географических религиозных и заканчивая юридической техникой и стилем права. Она основана на сочетании двух критериев: идеологии включающей религию философию экономические и социальные структуры и юридической техники включающей в качестве основной составляющей источники права. Основным признаком этой правовой семьи является ее формирование на основе римского права. Решающая роль в становлении ее принадлежала средневековым университетам Европы...
81283. Публичное и частное право. Материальное и процессуальное право. Международное и национальное право 41.33 KB
  Материальное и процессуальное право. Международное и национальное право. Основное деление всего права есть деление его на право публичное и частное или гражданское.
81284. Правотворчество: понятие, субъекты, стадии, принципы. Юридическая техника 38.91 KB
  Разработка проекта нормативно-правового акта и вынесение на рассмотрение компетентных лиц. Отклонение проекта или принятие на его основе нормативно-правового акта. Принятие решения внести изменения в систему действующих норм права может мотивироваться следующими обстоятельствами: Решение может приниматься по собственной инициативе правотворческого органа признавшего что его нормативно-правовой акт в той или иной части устарел и нуждается в изменении или коренной переработке. Вторым обстоятельством является вступление в силу...
81286. Действие нормативно-правовых актов во времени, в пространстве и по кругу лиц 36.5 KB
  Можно выделить несколько вариантов вступления нормативно-правовых актов в действие. начало действия некоторых актов определяется моментом их принятия или официального опубликования. Прекращение действия нормативных актов связывается со следующими обстоятельствами: истечением срока действия на который был принят тот или иной акт; 2 в связи с прямой отменой нормативного акта уполномоченным на то органом; 3 в связи с фактической заменой нормативного акта иным актом регулирующим ту же группу общественных отношений.
81289. Применение права: понятие, стадии. Акты правоприменения 37.77 KB
  Акты правоприменения Реализация права в большинстве случаев происходит без участия государства его органов. Граждане и организации добровольно без принуждения по взаимному согласию вступают в правовые отношения в рамках которых используют субъективные права исполняют обязанности и соблюдают установленные законом запреты. Например реализация права на пенсию включает в качестве необходимого элемента постановление комиссии органа социального обеспечения о назначении пенсии отдельному гражданину.