- •Лабораторна робота n 2.
- •2.1. Перевантаження методів
- •Форматований вивід має вигляд:
- •2. Перевантаження операцій.
- •Результат роботи програми:
- •2.3. Використання friend-функцій для доступу до private-змінних класу.
- •У наступних завданнях, виконавши табуляцію деякої функції, виконати наступне:
- •Виконати перевантаження методів.
Лабораторна робота n 2.
Назва: Перевантаження методів класу і операцій.
Мета : Ознайомлення зі змістом поняття 'перевантаження' в
С++ та використання 'friend-функцій'.
2.1. Перевантаження методів
Методи класів, так як і звичайні функції С++, можна перевантажувати. Перевантаження функцій означає, що в поточній області дії одне і теж ім'я можуть використовувати декілька функцій. Компілятор вибирає потрібну функцію, враховуючи кількість і тип аргументів, використаних при її викликові.
В приведеному прикладі значення кута передається методам класу в двох форматах: як числа типу double або у вигляді строки. За допомогою перевантаження методів можна опрацьовувати обидва ці типи.
Приклад.
Програма дозволяє вводити значення кута в десятковому форматі або в форматі "градуси/м·нути/секунди". Один метод класу отримує дані типу double а другий - типу
string. Програма повертає значення синуса, косинуса тангенса.
Файл trig.h (протокол класу).
# include <iostream.h>
# include <math.h>
# include <string.h>
const double DEG_TO_RAD = 0.01745329;
class trigon
{
double angle;
double answer_sine;
double answer_cosine;
double answer_tangent;
public:
void trig_calc (double);
void trig_calc (char*);
};
Файл реалізації trig.cpp.
void trigon :: trig_calc(double degrees)
{
angle = degrees;
answer_sine = sin(angle * DEG_TO_RAD);
answer_cosine = cos(angle * DEG_TO_RAD);
answer_tangent = tan(angle * DEG_TO_RAD);
cout << "\n For angle: " << angle << " degrees " << endl; cout << "Sinus = " << answer_sine << endl;
cout << "Cosinus =" << answer_cosine << endl;
cout << "Tangens =" << answer_tangent << endl;
}
void trigon :: trig_calc(char*dat)
{
char * deg, *min, *sec;
deg = strtok (dat,"*");
min = strtok (0,"'");
sec = strtok (0,"’’");
angle = atof(deg) + ((atof(min)/60.0) + ((atof(sec)/360.0);
answer_sine = sin(angle * DEG_TO_RAD);
answer_cosine = cos(angle * DEG_TO_RAD);
answer_tangent = tan(angle * DEG_TO_RAD);
cout << "\n For angle: " << angle << " degrees " << endl; cout << "Sinus =" << answer_sine << endl; cout << "Cosinus =" << answer_cosine << endl; cout << "Tangens =" << answer_tangent << endl;
#include "trig.h"
#include "trig.cpp"
main ()
{
trigon data;
data.trig_calc(75.0);
data.trig_calc("35*75'20''");
data.trig_calc(145.72);
data.trig_calc("65*45'30''");
return (0);
}
В програмі використовується вбудована функція strtok(), прототип якої знаходиться в файлі string.h.
Ця функція має прототип:
char strtok (str1,*str2);
char *str1;
const char *str2;
Функція strtok() сканує першу строку str1 і шукає в ній послідовності символів (лексеми) - ( в даному приклад· це : *, ', '', - градуси, м·нути, секунди). Реальна довжина лексем може бути різна. В str2 міститься набір розділювачів: пробіли,, коми та інші особливі символи. Лексеми в str1 відокремлюються розділювачами, як і в str2. Після першого виклику strtok() повертає вказівник на першу лексему. При наступних викликах вона повертеµ вказівники на інші лексеми. Якщо в стрічці більше немаµ лексем, то повертається null-вказ·вник.
В наведеному прикладі значення кута можна зчитувати в двох форматах: або як десяткове значення, або як кутові градуси, мінути і секунди. У другому випадку для знаходження першої лексеми використовується символ градуса (*) , для знаходження мінут - символ ('), для секунд - ('').