Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Модульная структура программы в СИ.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
691.2 Кб
Скачать

Проблема обмена информацией (данными) между функциями.

Объект, определенный в программе, обладает двумя свойствами. Это:

- «время жизни» объекта – это время, в течении которого система гарантирует сохранность информации, записанной в его области памяти;

- «область видимости» объекта – это область программы, в которой информация в памяти объекта доступна для обработки (для чтения и изменения).

Программа состоит из отдельных объектов – функций. Каждая функция – это независимая область памяти.

Если объект – данное определен в теле функции, то такой объект называется локальным объектом.

Локальный объект «живет» в этой функции, то есть записанная в нем информация не будет разрушена, пока функция активна, то есть выполняются ее инструкции. Локальный объект, определенный в функции «жив», но может быть не виден в ней.

Локальный объект «виден» в функции, то есть информация, записанная в нем, доступна для обработки, только в области памяти этой функции от точки определения объекта в инструкции его определения до конца блока, в котором он определен. Блок задается фигурными скобками { }.

В этой функции fun «живут» локальные объекты a, b (два объекта), c, x.

Объект a определен в параметре, который получен по значению. Его область видимости – все тело функции fun.

Объект b, определенный в параметре, получен по значению. Его область видимости – все тело функции fun, кроме области вложенного блока (желтое пространство).

В этом блоке определен другой объект с именем b. Этот объект «живет» в этом вложенном блоке. Его область видимости от точки определения до скобки, закрывающей этот блок. Этот объект b закрывает в этом месте объект b, определенный в параметре. Объект b, определенный в параметрах функции fun, во вложенном блоке «жив», информация в нем не испорчена, но не доступна.

Обратите внимание, что в инструкции return x + b; виден и используется тот объект b, который определен в параметрах.

Объект х создан в инструкции определения float x;. Его область видимости от этой точки определения до конца блока, ограничивающее тело функции fun.

В инструкции-выражении x = (a * b + c); не правомерно использован объект c. Он «живет» и виден во внутреннем блоке функции.

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

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

Есть несколько способов такого обмена информацией. Изучим эти способы.

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

Этот механизм обмена информацией заложен в самом синтаксисе определения объекта типа функции:

тип_возвращаемого_значения имя_объекта_функции (список_формальных_параметров )

{

/* Здесь пишутся инструкции, которые определяют объекты, создаваемые внутри функции – локальные объекты.

Здесь пишутся инструкции, задающие действия над этими объектами - алгоритм работы функции

*/

// инструкция return вернет значение-результат в точку вызова этой функции

// этот результат надо будет « поймать» (сохранить) в точке вызова

// иначе он будет потерян

return выражение;

}

список_формальных_параметров (записывается в скобках) – это последовательность параметров, разделенных запятыми. Для каждого параметра, передаваемого по значению, указывается тип и имя.

Тип определяет типы тех значений, которые требуется передать в функцию при ее вызове. Имя – определяет имя локального объекта указанного типа, который в момент выполнения этой функции будет определен (создан) в ней для хранения полученного при вызове этой функции фактического значения.

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

тип_возвращаемого_значения - это тип того значения, которое будет одним из результатов работы функции и которое вернет инструкция return выражение; в точку вызова функции.

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

Вызывается функция в той функции, где требуется ее выполнение. Такая функция называется вызывающей функцией. Вызов осуществляется оператором ( ), следующим после имени вызываемой функции. В скобках этого оператора указывается список фактических параметров.

имя_вызываемой_функции (список_фактических_параметров )

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

Рассмотрим пример1.

Составить функцию countX, которая, получив а, b и с через параметры по значению, вычисляет х и возвращает результат его вычисления через возвращаемое значение.

В функции main необходимо ввести значения a, , . Используя функцию countX, вычислить значение X

и выдать его на экран.

В функции main не использовать стандартные математические функции cos и sin, а использовать только свою функцию countX, которая будет их использовать.

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

float а

float b float

float c

Заголовок функции countX должен быть таким:

float countX (float a, float b, float c )

В функции countX необходимо вычислить значения математических функций. Их вычисление могут обеспечить стандартные математические функции.

Описания (прототипы) этих функций находятся в хэдерном файле math.h. Для того чтобы воспользоваться этими функциями, необходимо подключить этот файл директивой #include к тексту разрабатываемой функции.

// Текст функции в файле example1.cpp

#include <math.h>

float countX (float a, float b, float c )

{

float x;

x = (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);

return x;

}

Этот текст нужно компилировать, для выявления синтактических ошибок.

Попытка этот текст выполнить, приводит на этапе редактирования (линковки! LNK) к появлению сообщений.

Error 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

Error 2 fatal error LNK1120: 1 unresolved externals

Это сообщения о том , что нет main!!! Без main программа не работает!

В функции main нужно вычислить результат как сумму 1 + а выр1 + 1 / выр2, где

выр1 можно вычислить с помощью разрабатываемой функции countX, если вместо а использовать значение , вместь b значение , а вместо c значение .

выр2 также можно вычислить с помощью разрабатываемой функции countX, но вместо а необходимо использовать значение , вместь b значение , а вместо c значение .

При решении задачи необходимо знать число pi. Эту константу можно задать самим, но грамотней воспользоваться стандартными математическими константами, которые заданы в хэдерном файле math.h

Имена констант

Вычисляемое

выражение

Значение константы

M_E

e

2.71828182845904523536

M_LOG2E

log2(e)

1.44269504088896340736

M_LOG10E

log10(e)

0.434294481903251827651

M_LN2

ln(2)

0.693147180559945309417

M_LN10

ln(10)

2.30258509299404568402

M_PI

pi

3.14159265358979323846

M_PI_2

pi/2

1.57079632679489661923

M_PI_4

pi/4

0.785398163397448309616

M_1_PI

1/pi

0.318309886183790671538

M_2_PI

2/pi

0.636619772367581343076

M_2_SQRTPI

2/sqrt(pi)

1.12837916709551257390

M_SQRT2

sqrt(2)

1.41421356237309504880

Для того, чтобы использовать в программе эти стандартные математические константы, необходимо прописать в тексте программы в указанном порядке следующие директивы препроцессора:

#define _USE_MATH_DEFINES

#include <math.h>

// Добавили в файл example1.cpp функцию main

#define _USE_MATH_DEFINES

#include <math.h>

#include <iostream>

#include <conio.h>

using namespace std;

float countX (float a, float b, float c )

{

float x;

x= (a * cos(b + c) - b * sin(a + c)) / (pow(a,3) + b * b);

return x;

}