- •Введение
- •План лекции
- •Лекция 1.2. Работа в среде Visual Studio План лекции
- •Практические задания
- •Контрольные вопросы
- •Лекция 2.1. Структура простой программы План лекции
- •Лекция 2.2. Использование функций План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 3: Переменные и константы Лекция 3.1. Встроенные типы данных. План лекции
- •Лекция 3.2. Константы, перечисления, синонимы типа План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 4: Операции и выражения Лекция 4.1. Математические операторы и выражения План лекции
- •Лекция 4.2. Логические операторы и выражения. План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 5: Функции. Лекция 5.1. Личные и встроенные функции. План лекции
- •Основные библиотечные функции c для работы с символьными массивами (string.H)
- •Лекция 5.2. Параметры. Значения по умолчанию. Перегрузка. Рекурсия. План лекции
- •Inline-функции
- •Практические задания
- •Контрольные вопросы
- •Тема 6: Структуры. Классы и объекты. Лекция 6.1. Структуры в языке с. План лекции
- •Лекция 6.2. Классы с открытыми данными. План лекции
- •Лекция 6.3. Конструкторы и деструктор.Cкрытие данных. План лекции
- •Лекция 6.4. Введение в библиотеки классов План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 7: Циклы, выбор вариантов. Лекция 7.1. Циклы. План лекции
- •Лекция 7.2. Выбор из вариантов. План лекции
- •Практические задания
- •Контрольные вопросы
- •Заключение
- •Литература
- •Содержание
Лекция 2.2. Использование функций План лекции
Функции.
Вызов функций
Возврат значений
Примеры программ с функциями
Личные файлы заголовков и реализаций
Многомодульные проекты
Функции.
Кроме функции main() в С++-программе может быть использовано множество личных и библиотечных (встроенных, системных) функций. Личные функции нужно предварительно объявить, написав только их заголовки (прототипы). Прототип состоит из типа возвращаемого значения, имени функции и параметров (аргументов) функции. Для использования библиотечных функций необходимо подключать системные заголовочные файлы, в которых и находятся прототипы встроенных функций.
Вызов функций
Главная функция выполняет вызов других функций по их имени, передавая в них значения фактических параметров. Фактические параметры могут быть именами переменных, константами и выражениями. Функции принимают значения фактических параметров и выполняют действия над формальными параметрами – копиями фактических параметров. Формальные параметры – это обязательно имена переменных. Формальные параметры являются локальными переменными функции. Имена у фактических и формальных параметров обычно разные, но могут быть и одинаковыми.
Возврат значений
Операторы функций выполняют действия и возвращают вычисленное значение с помощью оператора return. Оператор return завершает выполнение функции и возобновляет работу main(). Если функция имеет тип возврата не void, то нужно принять вычисленный в ней результат, сохранив его в переменной такого же типа, как ее тип возврата. Большие программы обязательно разбиваются на части с помощью функций.
// Пример 2.2.1
// Использование личных функций
#include <iostream>
using namespace std;
// объявление функции для вычисления среднего арифметического двух целых
double AVG(int,int);
// Главная функция
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int a,b; // исходные данные - локальные переменные функции main()
double r; // среднее арифметическое
cout << "Мы в main()-функции!\n";
cout << "Введите два числа через пробел: ";
cin >> a >> b;
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(a,b); // вызов функции
// a,b -фактические параметры -> целые переменные
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(5,7); // вызов функции
// 5,7 - фактические параметры -> целые константы
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(5*a,7-b); // вызов функции
// 5*a,7-b - фактические параметры -> выражения
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
return 0;
}
// реализация функции для среднего арифметического двух целых
double AVG(int x, int y) // x,y - формальные параметры ->
// имена локальных переменных функции
{
double result;
cout << "Мы в функции AVG(). x=" << x << "; y=" << y << endl;
result=(x+y)/2.;
cin.get();
return result;
}
Примеры программ с функциями
// Пример 2.2.2
// Использование личных функций для выполнения математических операций
#include <iostream>
using namespace std;
// прототипы личных функций для вычислений
int sum(int a,int b); // сумма
int raznost(int x, int y); // разность
int proiz(int x, int y); // произведение
double del(int x, int y); // частное
double sred(int x, int y); //среднее арифметическое
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int a,b; // входные данные
int S; // сумма
int R; // разность
int P; // произведение
double D; // частное - результат деления
double Sr; //среднее арифметическое
//Ввод исходных данных
cout << "Введите a,b через пробел и нажмите ENTER: ";
cin >> a >> b;
//Вычисления с помощью функций
S=sum(a,b);
R=raznost(a,b);
P=proiz(a,b);
D=del(a,b);
Sr=sred(a,b);
// Вывод результатов
cout << "\tS=" << S << "\tR=" << R << "\tP=" << P
<< "\tD=" << D << "\tSr=" << Sr << endl;
cin.get(); cin.get();
}
// Реализация личных функций
// сумма
int sum(int a,int b) {
int res;
res=a+b;
return res;
}
// разность
int raznost(int x, int y) {
return x-y;
}
// умножение
int proiz(int x, int y) {
return x*y;
}
// деление
double del(int x, int y) {
return (double)x/y;
}
// среднее
double sred(int x, int y) {
return (x+y)/2.;
}
// Пример 2.2.3
// Использование личных функций для вычисление массы тела
#include <iostream>
using namespace std;
// прототипы личных функций
void avtor(); // сведения об авторе
double calc(double,double); // вычисление массы
void print(double); // вывод на экран
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
avtor(); // сведения об авторе
// объявление переменных
double plotnost=0, obem=0, massa=0;
// ввод данных для вычислений
cout << "Введите плотность и обьем через пробел и нажмите ENTER \n";
cout << "Плотность в кг/куб.м, а объем в куб.м. \n";
cin >> plotnost >> obem; // множественный ввод
// вычисления с помощью функции
massa=calc(plotnost,obem);
// вывод результатов на экран
print(massa);
cin.get(); cin.get();
}
// реализация личных функций
// сведения об авторе
void avtor() {
cout << "Автор - ..." << endl;
cin.get();
}
// вычисление массы
double calc(double p, double o) {
return p*o;
}
// вывод на экран
void print(double m) {
cout << "Масса равна " << m << " кг." << endl;
}
// Пример 2.2.4
// Вычисление параметров окружности, круга, шара
#include <iostream>
using namespace std;
// библиотека математические функции и констант
#define _USE_MATH_DEFINES
#include <math.h>
// прототипы личных функций
double dlina(double r); // вычисление длины окружности
double ploshad(double r); // вычисление площади круга
double obem(double r); // вычисление объема шара
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double r; // радиус
double C; // длина окружности
double S,V; // площадь круга, объем шара
// ввод радиуса
cout << "Введите значение радиуса (в см.) и нажмите ENTER: " ;
cin >> r;
//Вычисления с помощью функций
C=dlina(r);
S=ploshad(r);
V=obem(r);
// Вывод результатов
cout << "\tC=" << C << endl;
cout << "\tS=" << S << endl;
cout << "\tV=" << V << endl;
cin.get();
}
// реализации личных функций
// вычисление длины окружности
double dlina(double r) {
return 2*3.14*r; // Число Πi задано неименованной константой - 3.14
}
// вычисление площади круга
double ploshad(double r) {
const double PI=3.14; // Число Πi задано именованной константой - PI
double S=0;
S=2*PI*r*r;
return S;
}
// вычисление объема шара
double obem(double r) {
double V=0;
V=4./3. * M_PI * r * r *r; // Число Πi объявлено в math.h - M_PI
return V;
}
Личные файлы заголовков и реализаций
Прототипы личных функций и их реализации могут быть вынесены в отдельные программные файлы. Первому файлу обычно дают расширение имени .h или .hpp , а второму – c. или .cpp. Включение этих файлов в программу выполняется директивой препроцессора #include “имя_файла”. Двойные кавычки этой директивы указывают, что эти файлы находятся в вашей личной папке, а не в системной. Внешний вид менджера решений и файлов проекта показан на рисунках.
// Пример 2.2.5
// использование личных файлов заголовков и реализаций функций
// прототипы личных функций - файл MyFunc.h
// объявление функции для вычисления среднего арифметического двух целых
double AVG(int,int);
// реализации личных функций- файл MyFunc.cpp
// включение прототипов личных функций из файла MyFunc.h
#include "MyFunc.h"
// реализация функции для среднего арифметического двух целых
double AVG(int x, int y) {
double result;
cout << "Мы в функции AVG(). x=" << x << "; y=" << y << endl;
result=(x+y)/2.;
cin.get();
return result;
}
// Главная программа - файл L2.5.5.cpp
#include <iostream>
using namespace std;
// включение личных функций из файла MyFunc.сpp
#include "MyFunc.cpp"
// Главная функция
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int a,b; // исходные данные - локальные переменные функции main()
double r; // среднее арифметическое
cout << "Мы в main()-функции!\n";
cout << "Введите два числа через пробел: ";
cin >> a >> b;
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(a,b); // вызов функции, a,b - параметры -> переменные
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(5,7); // вызов функции, 5,7 - параметры -> константы
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(5*a,7-b);// вызов функции, 5*a,7-b - параметры -> выражения
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
return 0;
}
Аналогичным образом можно оформить проекты для примеров 2.2.2,
2.2.3, 2.2.4.
Многомодульные проекты
Разбиение программы на несколько файлов позволяет организовать многомодульный проект программы, в котором можно выполнять раздельную компиляцию отдельных частей проекта (только тех, которые были изменены) и сборку приложение из объектных модулей. При этом нужно помнить, что необходимые для компиляции библиотеки нужно подключать в каждом модуле. Внешний вид менджера решений и файлов проекта показан на рисунках.
// Пример 2.2.6
// многомодульные проекты
// прототипы личных функций - файл MyFunc.h
// объявление функции для вычисления среднего арифметического двух целых
double AVG(int,int);
// реализации личных функций- файл MyFunc.cpp
// подключение системных библиотек
#include <iostream>
using namespace std;
// включение прототипов личных функций из файла MyFunc.h
#include "MyFunc.h"
// реализация функции для среднего арифметического двух целых
double AVG(int x, int y) {
double result;
cout << "Мы в функции AVG(). x=" << x << "; y=" << y << endl;
result=(x+y)/2.;
cin.get();
return result;
}
// Главная программа - файл L2.5.6.cpp
#include <iostream>
using namespace std;
// включение личных функций из файла MyFunc.сpp
#include "MyFunc.h"
// Главная функция
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int a,b; // исходные данные - локальные переменные функции main()
double r; // среднее арифметическое
cout << "Мы в main()-функции!\n";
cout << "Введите два числа через пробел: ";
cin >> a >> b;
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(a,b); // вызов функции, a,b - параметры -> переменные
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(5,7); // вызов функции, 5,7 - параметры -> константы
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
cout << "\nmain: Вызываю функцию AVG()\n";
r=AVG(5*a,7-b);// вызов функции, 5*a,7-b - параметры -> выражения
cout << "Мы снова в main()-функции!\n";
cout << "r= " << r << endl;
cin.get();
return 0;
}
Аналогичным образом можно оформить проекты для примеров 2.2.2,
2.2.3, 2.2.4.