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


 

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

85518. Проектирование одноступенчатого цилиндрического редуктора 760 KB
  Назначение редуктора – понижение угловой скорости и соответственно повышение вращающего момента ведомого вала по сравнению с ведущим. Механизмы для повышения угловой скорости, выполненные в виде отдельных агрегатов, называют ускорителями или мультипликаторами.
85521. Разработка обобщенной структурной схемы системы связи для передачи непрерывных сообщений дискретными сигналами 646.37 KB
  Разработать структурную схему приемника и структурную схему фильтра рассчитать основные характеристики разработанной системы связи дать оценку пропускной способности и эффективности системы связи и сделать обобщающие выводы по результатам расчетов.
85522. Расчет устойчивости электрической системы 675 KB
  В данной курсовой работе для электрической системы проведены расчеты статической и динамической устойчивости. В частности были рассчитаны идеальные пределы мощности, коэффициенты запаса статической устойчивости в различных случаях регулирования возбуждения.
85523. Численные исследования систем регулирования по отклонению с ПИ-регулятором 85.71 KB
  Цель данной курсовой работы исследовать влияние оптимальных настроек регулятора на критерий точности регулирования системы. Задачи: Исследовать качество системы регулирования по отклонению с ПИрегулятором с настройками по методике В.
85524. Разработка базы данных для учета материальных ценностей в ресторане 25.06 MB
  Программа предназначена для накопления и анализа данных о результатах учета материальных ценностей в ресторане, об их стоимости и количестве. Кроме того, программа должна выдавать справочные данные о МЦ, о контрагентах, о материально-ответственных лицах.
85525. Построение проверяющего и диагностического тестов для непрерывной системы 933 KB
  При изготовлении эксплуатации ремонте и хранении технических объектов необходима проверка их исправности работоспособности правильности функционирования и поиска неисправностей. Таблица функций неисправностей ТФН для функциональной схемы объекта диагноза которая представлена на рисунке...
85526. МНОГОЭТАЖНОЕ ПРОИЗВОДСТВЕННОЕ ЗДАНИЕ 2.06 MB
  В курсовом проекте выполнена разбивка сетки колон. Определены расчетные и нормативные нагрузки на плиту перекрытие. Определена высота поперечного сечения плиты, подобрана арматура. Собраны нагрузки на главную балку, определена высота поперечного сечения балки, подобрана арматура, построена эпюра материалов.