68600

Использование функций для решения прикладных задач

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

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

Цель занятия: Совершенствование навыков разработки программ в среде программирования MS Visual C++ Совершенствование навыков использования циклов и ветвлений в программах Получение начальных навыков в объявлении и использовании функций.

Русский

2014-09-23

61.5 KB

0 чел.

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

Тема: Использование функций для решения прикладных задач

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

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

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

Учебные вопросы:

  1.  Изучение порядка объявления и описания функций
  2.  Изучение порядка вызова функций

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

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

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

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


ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

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

С понятием функции в языке C++ связано три следующих компонента:

  •  описание функции;
  •  прототип;
  •  вызов функции.

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

 [тип_результата] <имя_функции> [спсок_параметров])

 {

 /* объявления и операторы

    или, другими словами, тело функции*/

 }    

Здесь тип_результата тип возвращаемого значения. В случае отсутствия спецификатора типа предполагается, что функция возвращает целое значение (int). Если функция не возвращает никакого значения, то на месте типа записывается спецификатор void. В списке параметров для каждого параметра должен быть указан тип. При отсутствии параметров список может быть пустым или иметь спецификатор void.

Тело функции представляет собой последовательность объявлений и операторов, описывающих определенный алгоритм. Важным оператором тела функции является оператор возврата в точку вызова: return [выражение];. Оператор return имеет двойное назначение. Он обеспечивает немедленный возврат в вызывающую функцию и может использоваться для передачи вычисленного значения функции. В теле функции может быть несколько операторов return, но может не быть и ни одного. В последнем случае возврат в вызывающую программу происходит после выполнения последнего оператора тела функции.

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

Компилятор использует прототип функции для сравнения типов аргументов с типами параметров. Язык Cи не предусматривает автоматического преобразования типов в случаях, когда аргументы не совпадают по типам с соответствующими им параметрами, т. е. язык Cи обеспечивает строгий контроль типов. При наличии прототипа вызываемые функции не обязаны размещаться в одном файле с вызывающей функцией. То есть, описание тел функций можно разместить в другом файле, который необходимо подключить к исходному  с использованием директивы #include.

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

В первом случае оператор имеет следующий формат:

[имя_функции] (список_аргументов);

Например:    void Ptint(“Hello World!”);

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

[Переменная] = [имя_функции] (список_аргументов);

Например:  z=max(x,y);

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

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

Возможное решение данной задачи имеет вид:                             

/* включение файла max.cpp с

  телом функции max */

#include "max.cpp"

void main()                                                               

{

int x,y,z;

cout << "\n поочередно введите х и у \n";

cin >> х; cin >> y;

z=max (х, y);       /* вызов функции */

cout << "z=" << z;

return;

}

Описание функции max находится в отдельном файле max.cpp, находящемся в том каталоге, из которого запускается исходная программа, и имеет следующий вид:

int max (int a, int b)

{

int с;         //

c=(a>b)?a:b;   //   тело функции  

return с;      //               

}

Вызов функции является выражением в правой части оператора присваивания z=max(x,y);, при выполнении которого значения аргументов х и у подставляются вместо параметров а и b соответственно (передача параметров в функцию по значению). После выполнения тела функции возвращаемое значение передается в место вызова функции и присваивается переменной z. Описание функции находится в файле, поэтому для включения файла в программу необходимо в тексте программы указать директиву препроцессора #include "max.cpp".

Описание функции может находиться в одном файле с главной программой. При этом директива #include "max.cpp" не указывается, а вместо нее помещается описание функции. В рассмотренной программе функция имеет возвращаемое значение. Существуют задачи, которые не требуют передачи возвращаемого значения. Такой пример приведен ниже.


Пример 2.
Использование функции без возвращаемого значения.

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

void print(char);      // прототип функции

void main()

{

char x;

cout <<”\nВводите символы.

    <<” Enter – окончание ввода”;

do

{

x=getch();

print (x);

} while (x!= 13);

return 0;

}

void print(char a) { cout <<a << “\t“; }

В функции рrint( ) отсутствует возвращаемое значение, поэтому обращение к функции осуществляется оператором вызова функции рrint(x);. В результате обращения к   функции на экран будет выведен символ, введенный с клавиатуры с помощью оператора x=getch().

Язык Си позволяет использовать процедуру перегрузки функций. Суть этого заключается в использовании одного и того же имени функции для решения различных, но схожих по назначению задач. Для реализации этого механизма описывается каждый из вариантов такой функции. Например, рассмотрим задачу нахождения среднего значения двух чисел. При реализации этой задачи требуется описывать отдельную функцию для целых чисел, чисел с плавающей точкой и их комбинации. Это связано с тем, что каждый передаваемый параметр должен иметь свой тип (int, float, double). Следовательно, если в функцию для нахождения среднего значения целых чисел передать числа с плавающей точкой, то в функции в соответствии с прототипом эти числа преобразуются путем отбрасывания дробной части в целые, что приведет к неправильному результату. Поэтому, для решения этой задачи пришлось бы описывать несколько функций с разными именами для разных типов данных. Механизм перегрузки функций позволяет для решения этой задачи использовать несколько функций с одним именем, при этом решение о выборе того или иного варианта функции для конкретного типа данных принимает сама программа.

Рассмотрим листинг такой программы:

Пример 3. Использование механизма перегрузки функции

void  PrintData(int *s, int N);

void  PrintData(char *w);

void main()

 {

 int *a,n; char str[50];

 cout<<”\nEnter the array size: “; cin>>n;

 a=new int[n];

 for (int i=0;i<n;i++) a[i]=rand()%101-50;

  PrintData(a,n);

  cout<<”\nEnter a string: “; cin>>str;

  PrintData(str);

  return;

  }

void  PrintData(int *s, int N)

 {

 cout<<endl;

 for (int i=0;i<N;i++) cout<<s[i]<<”  “;

 return;

 }

void  PrintData(char *w)

 {

 cout<<endl<<w; return;

 }

Как видно из примера, функция PrintData() имеет одно имя, но два разных набора параметров. При вызове функции по списку передаваемых параметров автоматически вызывается тот вариант функции, который соответствует этому набору параметров. Если же функции с таким набором параметров нет, то компилятор выдаст сообщение об ошибке при компиляции листинга программы.

ПРОГРАММА  РАБОТЫ

  1.  Изучение порядка объявления и описания функций
  •  реализовать приведенные в теоретических сведениях примеры 1 - 3 ;
  •  отладить и запустить программы;
  •  разработать прототип и тело функции вычисления факториала числа.
  1.  Изучение порядка вызова функций
  •  разработать программу вычисления факториала числа с использованием пользовательской функции;
  •  отладить и запустить ее в среде программирования.


 

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

5779. Університетська освіта в контексті Болонського процесу 55 KB
  Університетська освіта в контексті Болонського процесу. Поняття вища освіта. Мета, задачі, структура, типи вищих навчальних закладів України. Закон України Про вищу освіту від 17.01.2002 р. спрямований на врегулювання суспільних відносин у галу...
5780. Макроекономіка як наука 183.5 KB
  Макроекономіка як наука Анотація Економіка як об'єкт вивчення економічних наук. Рівневий підхід до вивчення економіки. Предмет макроекономічної теорії. Суб'єкти макроекономіки. Макроринки та їх класифікація. Проблема обмеженості ресурсів і...
5781. Аналіз сировини в кондитерській промисловості 205.5 KB
  Характеристика сировини, що використовується у кондитерському виробництві. Правила її зберігання та підготовка до виробництва. Органолептична оцінка якості: борошна, цукру-піску, цукрової пудри, патоки, яєць, меланжу, яєчного поро...
5782. Поняття регіону. Галузева та функціональна структури регіону 142 KB
  Поняття регіону, територіального та регіонального управління Структура регіону. Галузева та функціональна структури регіону Соціальна інфраструктура регіону Поняття регіону, територіального та регіонального управління Термін...
5783. Статья. О структурном синтезе передаточных механизмов 820 KB
  О структурном синтезе передаточных механизмов Настоящая статья является продолжением работы. Рассматривается метод образования структуры пространственных передаточных механизмов с использованием схем плоских механизмов. Метод основан на построен...
5784. Определение жесткости токарного станка производственным методом 546.5 KB
  Определение жесткости токарного станка производственным методом Цель работы Ознакомиться с производственным методом определения жесткости. Определить суммарную жесткость передней бабки и суппорта, задней бабки и суппорта, построить диаграмму...
5785. Расчет ленточного конвейера и цилиндрического косозубого редуктора 3.47 MB
  Создание машин, отвечающих потребностям народного хозяйства, должно предусматривать их наибольший экономический эффект и высокие тактико-технические и эксплуатационные показатели. Основные требования, предъявляемые к создаваемой машине: выс...
5786. Расчет механической частоты вращения электродвигателя 748.5 KB
  Ведение Электрический привод (ЭП) представляет собой электромеханическую систему, обеспечивающую реализацию различных технологических и производственных процессов в промышленности, сельском хозяйстве, на транспорте, коммунальном хозяйстве и в быту с...
5787. Действительный одноступенчатый поршневой компрессор 1015 KB
  Действительный одноступенчатый поршневой компрессор Цель: Изучить процессы, протекающие в действительном поршневом компрессоре, и их влияние на основные технические характеристики, такие как производительность, работа, мощность, температурный режим,...