Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_УчебноеПособие.doc
Скачиваний:
44
Добавлен:
03.05.2015
Размер:
862.21 Кб
Скачать

Обмен данными между функциями через глобальные объекты.Функции без возвращаемого значения. Функции без параметров.

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

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

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

Составить функцию 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();

}