Теоретические сведения. Подпрограмма – независимая часть программы, выполняющая логически завершенное действие
Подпрограмма – независимая часть программы, выполняющая логически завершенное действие. При структурном программировании задача разбивается на отдельные этапы решения, каждый из которых оформляется в виде отдельной подпрограммы. Порядок выполнения подпрограмм указывается в программном коде основной программы.
В языке С++ все подпрограммы называются функциями и представляют собой совокупность объявлений и операторов, предназначенных для реализации определенного этапа решения задачи. При этом функция может возвращать значение, а может быть предназначена для выполнения действий.
В С++ выделяют следующие виды функций:
● стандартные (библиотечные) – их объявление содержится в файлах формата *.h (например, для математических функций – math.h), а описание реализации – в файлах формата *.lib (для математических функций – math.lib);
● пользовательские – не входят в стандартные библиотеки и разрабатываются при решении конкретных задач.
В любой программе на С++ должна быть функция с именем main (главная функция), с которой начинается выполнение этой программы.
С использованием пользовательских функций связано три понятия: определение, объявление и вызов функции.
Определение функциивключает задание следующих ее характеристик:
● тип возвращаемого значения или указание на отсутствие значения (void);
● имя (идентификатор);
● список формальных параметров и их типов – переменных, используемых в качестве аргументов;
● тело функции – объявления переменных и операторов, определяющих действие функции.
Переменные, которые используются внутри данной функции, называются локальными. Память для них выделяется в стеке, поэтому после окончания работы функции они удаляются из памяти.
Глобальные переменные – это переменные, описанные вне функций. Они видны во всех функциях, где нет локальных переменных с такими именами. Правилами хорошего стиля программирования не рекомендуется давать одинаковые имена локальным и глобальным переменным. Однако, если локальная и глобальная переменные объявлены с одинаковыми именами, то внутри функции будет обращение к локальной переменной.
Синтаксис определения функции имеет вид:
[спецификатор_класса_памяти][спецификатор_типа]имя_функции
([список_формальных_параметров])
{
Тело_функции:
Определения_локальных_объектов
Операторы
[return Выражение]
}
спецификатор_класса_памяти – необязательный параметр, который задает класс памяти функции (static или extern), а также дополнительный модификатор. По умолчанию класс определяется как extern (внешний).
спецификатор_типа – необязательный параметр, который задает тип возвращаемого функцией значения и может быть любым типом. По умолчанию спецификатор типа определяется как int. Для функций, не возвращающих значение, должен использоваться тип void, указывающий на отсутствие возвращаемого значения.
имя_функции – идентификатор, указывающий на область памяти, в которую будет возвращено значение функции (для типа void значение не определяется). Главной функции должно соответствовать имя main.
список_формальных_параметров – последовательность объявлений формальных параметров, разделенная запятыми. Формальные параметры – это переменные, используемые внутри тела функции и получающие значение при вызове функции путем копирования в них значений соответствующих фактических параметров. Список формальных параметров может заканчиваться запятой (,) или запятой с многоточием (,...) – это означает, что число аргументов функции переменно. Предполагается, что функция имеет по крайней мере столько обязательных аргументов, сколько формальных параметров задано перед последней запятой в списке параметров. Такой функции может быть передано большее число аргументов, но над дополнительными аргументами не проводится контроль типов.
Тело_функции – это составной оператор, содержащий операторы, определяющие действие функции. Тело функции может содержать необязательный оператор return – оператор возврата в вызывающую функцию. В теле пользовательской функции не может содержаться описаний других пользовательских функций.
Примеры определения функции:
//Функция вычисления логарифма от числа а по основанию b
float logab(float a, float b) // заголовок функции:
{ // начало тела функции
return log(a)/log(b);
} // окончание тела функции
Пояснение к примеру
Заголовок функции содержит:
float – тип значения функции;
logab – имя функции;
float a, float b – тип и имя формальных параметров.
Тело функции содержит:
return log(a)/log(b) – оператор возвращения значения выражения в качестве значения функции.
//Функция определения количества делителей натурального n
int numdel(int n) // заголовок функции:
{ // начало тела функции
int i, k=1;
for (i=1; i<=n/2; i++)
if (n%i==0) k++;
return k;
} // окончание тела функции
Пояснение к примеру
Заголовок функции содержит:
int – тип значения функции;
numdel – имя функции;
int n – тип и имя формального параметра.
Тело функции содержит:
· реализацию алгоритма подсчета количества делителей натурального числа n;
· return k – оператор возвращения значения переменной k в качестве значения функции.
Объявление функции (прототип, заголовок) – предшествует определению функции и задается именем функции, типом возвращаемого значения и списком передаваемых параметров. Функция объявляется после раздела глобальных объявлений. Использование прототипов функций предусмотрено хорошим стилем программирования, а также реализует возможность включения функций пользователя в отдельный файл.
Синтаксис объявления функции (прототипа):
[спецификатор_типа] имя_функции
([список_формальных_параметров]);
Вызов функциипроисходит следующим образом:
· в точке вызова функции происходит обращение вида
имя_функции ([список_выражений])
· вычисляются значения из списка выражений, которые называются фактическими значениями параметров,
· фактические значения параметров передаются в качестве значений формальных параметров в порядке их следования в описании, поэтому должно соблюдаться соответствие типов и числа параметров,
· управление передается на первый оператор тела функции,
· после выполнения тела функции происходит возвращение в точку вызова функции; при этом или возвращается значение определенного типа (при наличии return), или функция не передает никаких значений.
Пример 1. На отрезке [a,b] с натуральными границами найдите все простые числа (a < b).
/*Программа вывода всех простых чисел на данном отрезке [a,b]*/
#include <iostream.h>
int numdel(int n); // прототип функции
void main() { // тело основной программы
int i,a,b;
cout << "Введите левую границу отрезка \n";
cin >> a;
cout << "Введите правую границу отрезка \n";
cin >> b;
cout << "\nПростые числа, принадлежащие отрезку ["
<< a << ", " << b << "]:\n";
for(i=a;i<=b; i++)
if (numdel(i)==2) // вызов функции
cout << i << " ";
}
//Функция определения количества делителей натурального n
int numdel(int n) { // заголовок функции
// начало тела функции
int i, k=1;
for (i=1; i<=n/2; i++)
if (n%i==0) k++;
return k;
} // окончание тела функции
Пример 2. Заданы координаты сторон треугольника. Если такой треугольник существует, то найти его площадь.
1. Математическая модель:
1) l=sqrt(pow(x1-x2,2)+pow(y1-y2,2));//длина стороны треугольника
2) p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));//формула Герона
3) проверка существования треугольника
(a+b>c&&a+c>b&&c+b>a)
2. Алгоритм:
1) Ввести координаты сторон треугольника (х1,у1),(х2,у2),(х3,у3);
2) Вычислить длины сторон ab, bc, ca;
3) Проверить существует ли треугольник с такими сторонами. Если да, то вычислить площадь и вывести результат.
4) Если нет, то вывести сообщение.
5) Ввести значение переменной v. Если значение v равно 0, то конец выполнения программы, иначе возврат на п.1.
#include <stdio.h>
#include <math.h>
double line(double x1,double y1,double x2,double y2);
double square(double a, double b, double c);
int triangle(double a, double b, double c);
void main() {
double x1,y1,x2,y2,x3,y3;
double point1_2,point1_3,point2_3;
int v;
do {
printf("\nВведите координаты вершин треугольника:\n");
scanf ("%lf",&x1); scanf ("%lf",&y1);
scanf ("%lf",&x2); scanf ("%lf",&y2);
scanf ("%lf",&x3); scanf ("%lf",&y3);
point1_2=line(x1,y1,x2,y2);
point1_3=line(x1,y1,x3,y3);
point2_3=line(x2,y2,x3,y3);
if(triangle(point1_2,point1_3,point2_3)==1)
printf("S=%lf",square(point1_2,point2_3,point1_3));
else printf("\nТреугольник не существует");
printf("\n\tПродолжить выполнение (1-да, 0-нет) > ");
scanf("%d",&v); }
while(!v==0);
}
double line(double x1,double y1,double x2,double y2) {
/*функция возвращает длину отрезка, заданного координатами x1,y1 и x2,y2*/
return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
double square(double a, double b, double c) {
/*функция возвращает площадь треугольника, заданного длинами сторон а,b,c*/
double s, p=(a+b+c)/2;
return s=sqrt(p*(p-a)*(p-b)*(p-c));//формула Герона
}
int triangle(double a, double b, double c) {
/*возвращает true, если треугольник существует*/
if(a+b>c&&a+c>b&&c+b>a) return 1;
else return 0;
}
Задания
1.Рассчитать значение у, выполняя однотипные действия с использованием соответствующей функции .
2.Составьте программу для решения задачи. Разработайте функцию вычисления логарифма по произвольному основанию для нахождения значения y для данных a и b:
3.На плоскости даны координаты трех точек: A(x1,y1), B(x2,y2), C(x3,y3). Составьте программу нахождения площади треугольника ABC, если он существует. В противном случае введите соответствующий комментарий. Для решения задачи разработайте функции вычисления длины отрезка по координатам концов, площади треугольника и проверки существования треугольника.
4.Составьте программу нахождения всех совершенных чисел, расположенных на отрезке [a,b], где a и b – натуральные числа. Для решения задачи разработайте функцию определения совершенного числа. Натуральное число называется совершенным, если оно равно сумме всех своих делителей, кроме себя самого.
Домашние задания
1.Наберите коды программ из Примеров 1 и 2. Выполните компиляцию и запуск программ.
2.Определить значение , где max(x, у)есть максимальное из чисел x, у.
3.Составьте программу вычисления биномиального коэффициента для данных неотрицательных целых m, n ( ): . Разработайте необходимые функции.
Дата добавления: 2015-02-16; просмотров: 908;