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.  Изучение порядка вызова функций
  •  разработать программу вычисления факториала числа с использованием пользовательской функции;
  •  отладить и запустить ее в среде программирования.


 

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

7588. Генезис і еволюція фінансів. 143 KB
  Тема: Генезис і еволюція фінансів. План: Зародження фінансових відносин у стародавньому світі. Фінанси феодальної держави. Фінанси феодального міста та їх вплив на формування і розвиток державних фінансів. Роль державних фіна...
7589. Фінансова політика і фінансове право 47.5 KB
  Тема 4 Фінансова політика і фінансове право План Фінансова політика, її сутність, види і значення Фінансова політика суб’єктів господарювання фінансова політика домогосподарств фінансова політика у сфері міжнародних фінансів...
7590. Податки. Податкова система України 153.5 KB
  Тема 5. Податки. Податкова система України Економічна сутність податків: визначення поняття, характеристика функцій Характеристика елементів оподаткування Податкове законодавство України. Принципи оподаткування Загальнодержа...
7591. Бюджет. Бюджетна система 61 KB
  ТЕМА 6. Бюджет. Бюджетна система Питання до лекції Економічна сутність та призначення бюджету, його функції. Склад доходів і видатків бюджету. Бюджетна система України та принципи її побудови. Бюджетний процес: сутність, хар...
7592. Семіотичний характер логіки. 39.5 KB
  Семіотичний характер логіки. Всю множину мов можна поділити на дві підмножини: природні і штучні мови. Природні мови виникають стихійно, в умовах практичної взаємодії між людьми. Вони використовуються насамперед з комунікативною метою як ефективний ...
7593. Логічний аналіз імен 43 KB
  Взагалі всі ознаки в логіці підрозділяються на відмінні і суттєві. Відмінна ознака відрізняє певні предмети від усіх інших. Суттєві ознаки виражають якісну специфіку предмета, його сутність. Кожна суттєва ознака є відмінною але не навпаки. У змісті імені фіксується лише суттєві ознаки.
7594. Операції з іменами 45 KB
  Поділ - це здійснення переходу від одного родового імені до множини родових імен. Це процес виявлення можливий родових імен. Ім'я, обсяг якого підлягає поділу, називається подільним. Видові імена, які отримані в результаті поділу і в яких зафіксовані результати поділу називаються членами поділу. Ознака, за якою обсяг подільного імені поділяється на обсяги видових імен, називається основою поділу
7595. Класична логіка висловлювань 56.5 KB
  Класична логіка висловлювань. Характерні ознаки класичної логіки висловлювань (=пропозиційної логіки) такі: 1) В межах пропозиційної логіки розглядаються лише такі міркування, засновки і висновки яких складаються із дескриптивних висловлювань....
7596. Моделі даних. Загальні поняття 105.5 KB
  Моделі даних Загальні поняття. Термін база данихговорить про те, що йдеться про дані, тобто про інформацію, яка характеризує певний об’єкт, та, що ці дані є базовими, основними. З погляду користувача, який екс...