- •Федеральное агентство связи
- •Базовые стандартные типы данных
- •Определение объекта типа функции.
- •Проблема обмена информацией (данными) между функциями.
- •Передача информации в функцию через параметры по значению. Возврат значения одного результата из функции через возвращаемое значение.
- •Прототип (описание) функции. Понятие глобального объекта.
- •Передача параметров по ссылке.
- •Обмен данными между функциями через глобальные объекты.Функции без возвращаемого значения. Функции без параметров.
- •Смешанный обмен данными между функциями
- •Программы, состоящие из двух и более файлов.
- •Void countX (float c, float& X); // описанa функция countX для расширения ее // области видимости. Ее определение
- •Приложение 1
Обмен данными между функциями через глобальные объекты.Функции без возвращаемого значения. Функции без параметров.
Глобальные объекты определяются вне функции и их область видимости начинается от точки их определения до конца файла. Структурно программу можно построить так, что глобальные объекты будут видны во всех функциях, которые расположены между определением глобального объекта и концом файла, в котором записана программа.
А если объект виден сразу в нескольких функциях, то этот объект можно использовать для обмена информацией между этими функциями. Одна функция записывает информацию в глобальный объект, другая читает эту информацию.
Рассмотрим пример той же задачи, которую делали, нооткажемся от обмена информацией между функциями через параметры и возвращаемое значение.
Составить функцию countX, которая, получив значенияа, b ис через глобальные объекты, вычисляет результатхи возвращает его значение через глобальный объект.
В функции mainввести значенияa, , . Используя функциюcountX, вычислить значениеXи выдать на экран.
В функции main не использовать стандартные математические функции.
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
float aGl, bGl, cGl, xGl; // определены 4 глобальных объектов
void countX (void)
{ // значения в глобальных объектах aGl, bGl, cGl для вычисления в этой
// инструкции готовит функция main при каждом новом вызове функции
xGl= (aGl * cos(bGl + cGl) - bGl * sin(aGl + cGl)) /
(pow(aGl,3) + bGl * bGl);
// оператор = записывает результат в глобальный xGl,
// а использоваться этот результат будет в функции main
}
void main ( void )
{
Cout << endl << "vvedite a, x1, x2\t";
float x1, a;
double x2;
cin >> a >> x1 >>x2;
aGl = x1*x1; // подготовлены значения для первого вызова
bGl = x2; // функции countX ()- записана ирформация
cGl = M_PI_2; // в глобальные объекты aGl, bGl, cGl
countX ();
float vir1 = xGl; // результат вычислен при первом вызове countX () в
// глобальном объекте xGl и, чтобы не потерять его
// при втором вызове функции countX (), его значение
// сохраняется оператором = в локальном объекте vir1
// готовятся новые значения для второго вызова функции countX ()
aGl = x2;
bGl = x1 + 1.2;
cGl = 0;
countX();
// в глобальном xGl записан новый результат работы функции countX (),
// полученный при ее втором вызове
float x=1./11. + a * vir1 + 1 / xGl;
cout << endl << "\tX = " << x;
getch();
}
При работе этой программы область видимости глобальных объектов aGl, bGl, cGl, xGl распространяется на обе функции программы: main и countX (). Это позволяет организовать взаимный обмен данными.
Подготовка и первый вызов функции countX ()
Подготовка и второй вызов функции countX ()
Смешанный обмен данными между функциями
При проектировании программ пользователь может воспользоваться любым из рассмотренных выше способов обмена информации между функция.
Рассмотрим примеры подобного применения.
Вариант 1.
Составить функцию countX, которая, получива, с через параметры по значению,b через глобальный объект, вычисляетхи возвращает результат его вычисления через возвращаемое значение.
В функции mainввести значенияa, , . Используя функциюcountX, вычислить значениеXи выдать на экран.
В функции main не использовать стандартные математические функции.
// файл variant1.cpp
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
float bGl; // определен глобальный объектов
float countX (float а, float c)
{ // значения в глобального объекта bGl для вычисления в этой
// инструкции готовит функция main при каждом новом вызове функции
float х = (a * cos(bGl + c) - bGl * sin(a + c)) / (pow(a,3) + bGl * bGl);
// результат из локального x возвращает оператор return
return x;
}
void main ( void )
{
Cout << endl << "vvedite a, x1, x2\t";
float x1, a;
double x2;
cin >> a >> x1 >>x2;
// подготовлено значение bGl для первого вызова функции countX
bGl = x2; // записана ирформация в глобальный объект bGl
float vir1;
vir1 = countX (x1*x1 , M_PI_2);
// готовится новое значение для второго вызова функции countX ()
bGl = x1 + 1.2;
// второй вызов функции countX осуществляется в выражении 1/countX(x2, 0)
// 1 делится на результат, который вернула функции в точку вызова
float x = 1/11. + a * vir1 + 1 / countX(x2, 0);
cout << endl << "\tX = " << x;
getch();
}
Вариант 2.
Составить функцию countX, которая, получивс через параметр по значению,а, b через глобальные объекты, вычисляетхи возвращает результат его вычисления через параметр по ссылке.
Вфункцииmainввести значенияa, , . Используя функциюcountX, вычислить значениеXи выдать на экран.
В функции main не использовать стандартные математические функции.
// файл variant2.cpp
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
float aGl, bGl; // определены 2 глобальных объекта
void countX (float c, float& x)
{ // значения в глобальных объектах aGl, bGl, cGl для вычисления в этой
// инструкции готовит функция main при каждом новом вызове функции
x = (aGl * cos(bGl + c) - bGl * sin(aGl + c)) / (pow(aGl,3) + bGl * bGl);
// оператор = записывает результат в глобальный xGl,
// а использоваться этот результат будет в функции main
}
void main ( void )
{
Cout << endl << "vvedite a, x1, x2\t";
float x1, a;
double x2;
cin >> a >> x1 >>x2;
aGl = x1*x1;
bGl = x2; // функции countX ()- записана ирформация
// в глобальные объекты aGl, bGl
float vir1;
countX (M_PI_2, vir1);
// результат вычислен при первом вызове countX и записан в объекте
// vir1, который передан в эту функции через параметр по ссылке
// готовятся новые значения для второго вызова функции countX ()
aGl = x2;
bGl = x1 + 1.2;
float vir2;
countX(0, vir2 );
// результат вычислен при втором вызове countX и записан в объекте
// vir2, который передан в эту функции через параметр по ссылке
cout << endl << "\tX = " << 1./11 + a * vir1 + 1 / vir2;
getch();
}