Теория/h2>
Стандартные функции
Математические функции объявлены с включением библиотеки <cmath>
:
#include <cmath> abs(x); floor(x); sin(x); pow(x, y); sqrt(x); |
Пользовательские функции
пример 1:
//... int abs(int x) { return x > 0 ? x : -x; // выход из функции } int main() { cout << abs(-35); // 35 system("pause"); return 0; } |
Функция abs
возвращает целочисленное значение по модулю и имеет единственный целочисленный параметр x
.
пример 2:
//... void print(int i) { cout << "значение = " << i; } int main() { print(40); system("pause"); return 0; } |
Функция print
не возвращает никакого значения и имеет единственный целочисленный параметр i
. Мы можем назвать это процедурой (потому что она не возвращает значение).
Инкапсуляция
В C++ данные и функции разделены на две отдельные группы с уровнем доступа: public и private.
Уровень определяет доступ, который «клиентский код» имеет к данным или функциям:
- Доступ к объектам с уровнем доступа Public можно получить из клиентского кода.
- Доступ к объектам с уровнем доступа Private получить из клиентского кода невозможно (доступ только из самих функций).
В C++ объявление функций (в файле .h
) отделены от ее реализации (в файл .cpp
).
Многофайловая компоновка
Для создания приложения обычно требуется создать 3 файла: файл заголовка (.h
), файл реализации (.cpp
) и основной файл (.cpp
).
- Заголовочный файл (
.h
) определяет интерфейс к функциям, то есть объявление(я) функции(й). - Файл реализации
.cpp
содержит всю логику функций или методов (то есть тело функций). Кроме того, здесь должен быть включен файл заголовка.h
. - Основной файл
.cpp
содержит функциюmain
— так называемая «точка входа», с которой осуществляется запуск программ на C++, и сюда также необходимо включить заголовочный файл.h
.
Рассмотрим на примере (три файла одного и того же приложения):
Пример заголовочного файла (tasks.h):
#ifndef TASKS_H #define TASKS_H //вычисляет периметр треугольника double perimeter(double, double, double); #endif TASKS_H |
Пример файла реализации (.cpp):
#include "tasks.h" //вычисляет периметр треугольника double perimeter(double a, double b, double c) { //операторы } |
Пример главного файла (.cpp):
#include <iostream> #include "tasks.h" using namespace std; void main() { //запросить у пользователя ввод данных //вызов функции //вывод результатов system("pause"); } |
Файлы .cpp
запрашивают подключение различных файлов заголовков.
После чего файл cpp
со всем дополнительным включенным содержимым будет скомпилирован в объектный файл (имеет расширение .o
, то есть объектный файл). Каждый файл cpp компилируется в объектный файл отдельно .
Лабораторные работы
Выполнить: Создайте приложение для нахождения объема и площади поверхности куба. Дана длина стороны куба (она вводится).
Примечание: Необходимо представить три решения: 1) Без пользовательских функции и без многофайлового приложения, 2) С пользовательскими функциями, 3) Создание многофайлового приложения.
Примерный вывод:
Введите длину стороны куба: 3.48 Объем: 42.1442 Площадь поверхности: 72.6624
[Имя проекта: Lesson_2Lab1
, имена файлов HeaderL2Lab1.h
, ImpL2Lab1.cpp
, MainL2Lab1.cpp
]
✍ Алгоритм:
- Откройте Microsoft Visual Studio. Выберите в меню Файл/File -> Новый проект/New project. Выберите язык C++ и консольное приложение.
- Назовите проект Lesson_2Lab1.
- В окне Обозреватель решений/Solution Explorer найдите папку Файлы источники/Source files и в контекстном меню папки выбрать Добавить/Add -> Новый файл/New Item. Необходимо создать два
.cpp
файла и назвать их:ImpL2Lab1.cpp
– файл реализации иMainL2Lab1.cpp
– файл с функцией main. - Затем найдите папку Файлы заголовков/Header files и в контекстном меню папки выберите Добавить/Add -> Новый файл/New Item. Добавьте заголовочный файл с расширением
.h
и назовите егоHeaderL2Lab1.h
. - Сначала выполним задание без пользовательских функций. То есть, необходимо задать значение для стороны куба и посчитать объем и площадь поверхности куба.
- Объявите переменную типа
double
и назовите ееlength
. Запросите ввести значение для нее. Не забудьте подключить библиотекуiostream
для осуществления ввода и вывода в консоль: - Для того, чтобы окно консоли не закрылось сразу после вывода, необходимо добавить паузу (pause). Функция main должна возвратить 0:
- Объявите переменные для объема и площади. Выполните вычисление по формулам и присвойте результаты переменным:
- Выведите результаты в консоль:
- Запустите приложение и проверьте вывод. Покажите преподавателю
- Теперь будем создавать пользовательские функции для расчета объем и площади.
- Найдите строки кода с объявлением переменных и расчетами. Закомментируйте их:
- Создадим метод (функцию) с названием
getVolume
для вычисления объема. Метод должен возвращать значение типа double (вещественный тип), так как сторона куба тоже вещественного типа. Объявление метода необходимо расположить до функцииmain
: - Добавьте объявление переменной length в функцию
main
: - Создайте метод
getSurfaceArea
для вычисления площади поверхности куба. Метод также должен возвращать значение типаdouble
. Расположите код перед функциейmain
: - Компилятор не извлечет функции, пока мы их не вызовем. Таким образом, необходимо вызвать функции и результат, который они вернут сохранить в переменные. Расположите код в функцию
main
: - Запустите приложение и проверьте вывод. Результаты должны быть такими же, как и при первом выполнении задания. Покажите результаты преподавателю.
- В окне Обозреватель решений/Solution Explorer выберите заголовочный файл (
HeaderL2Lab1.h
). В код файла добавьте объявление методов, предварительно вырезав их из главного файла (в главном файле их не должно остаться): - В окне Обозреватель решений / Solution Explorer выберите файл реализации (
ImpL2Lab1.cpp
). В данном файле необходимо разместить тело функций — их реализацию (вырежьте эти фрагменты кода из главного файла и добавьте сюда). И не забудьте подключить заголовочный файл в самой верхней строке: - Now, we can go ahead and clear up the parts of a code we don’t need anymore within the main function. So, this is what you have in your
MainL2Lab1.cpp
: - Run the application and check the output. The results must be as they were.
- Three files must be uploaded to the moodle system:
HeaderL2Lab1.h
,ImpL2Lab1.cpp
,MainL2Lab1.cpp
.
1) Без пользовательских функций и без многофайлового приложения:
#include <iostream> int main() { double length; std::cout << "Введите длину стороны куба: "; std::cin >> length; // … }
//… system("pause"); return 0; }
double volume = length * length * length; double surfaceArea = 6 * length * length;
std::cout << "Объем: " << volume << std::endl; std::cout << "Площадь поверхности: " << surfaceArea << std::endl;
2) Использование пользовательских функций:
//double volume = length * length * length;
//double surfaceArea = 6 * length * length;
double getVolume(double length); double getVolume(double length) { return length * length * length; } int main() { //…
int main() { double length;
double getSurfaceArea(double length); double getSurfaceArea(double length) { return 6 * length * length; }
double volume = getVolume(length); double surfaceArea = getSurfaceArea(length);
3) Создание многофайлового приложения
#pragma once // вычисление объема куба double getVolume(double length); // вычисление площади поверхности double getSurfaceArea(double length);
.h
мы не добавляем код реализации функции, а только ее объявление (сигнатуру функции). Для тог, чтобы увидеть код работы функции (ее реализации) необходимо перейти в .cpp
файл.— Директива
pragma once
дает команду компилятору выполнять код только один раз. Даже если много файлов (пользователей) одновременно будут использовать данный класс, объявление методов должно быть единственным.— Перед каждой функцией необходимо размещать комментарии с пояснением того, для чего служит эта функция.
#include "HeaderL2Lab1.h" double getVolume(double length) { return length * length * length; } double getSurfaceArea(double length) { return 6 * length * length; }
— We have a pound (
#
) include that includes a reference to our header.— We have the implementation of our two functions that were defined in our
.h
file.
#include <iostream> #include " HeaderL2Lab1.h" int main(){ double length; std::cout << "please enter the cube side length: "; std::cin >> length; //double volume = length * length * length; //double surfaceArea = 6 * length * length; double volume = getVolume(length); double surfaceArea = getSurfaceArea(length); std::cout << "Volume: " << volume << std::endl; std::cout << "Surface area: " << surfaceArea << std::endl; system("pause"); return 0; }
Notes on all tasks
Lesson_2Lab1 folder
.[Solution and Project name: Lesson_2Lab1
, files’ names tasks.h
, tasks.cpp
, main.cpp
]