Автор работы: Пользователь скрыл имя, 04 Января 2014 в 21:23, контрольная работа
Об'єктно-орієнтоване програмування – це новий спосіб підходу до програмування. Таке програмування, взявши кращі риси структурного програмування, доповнює його новими ідеями, які переводять у нову якість підхід до створення програм. ([1, c. 12-34])
Найбільш важливим поняттям мов об'єктно-орієнтованого програмування є поняття об'єкта (object). Об'єкт – це логічна одиниця, яка містить дані і правила (методи) обробки цих даних. У мові С++ такими правилами обробки виступають функції, тобто об'єкт у C++ поєднує в собі характеристики та функції, що обробляють ці дані.
Завдання 1 (№9). 3
Завдання 2 (№16). 13
Література. 17
Контрольна робота
"Програмування"
(13249)
Зміст
Завдання 1 (№9). 3
Завдання 2 (№16). 13
Література. 17
№9
Розробити клас для реалізації операцій з датами
1. Вступ
Об'єктно-орієнтоване програмування – це новий спосіб підходу до програмування. Таке програмування, взявши кращі риси структурного програмування, доповнює його новими ідеями, які переводять у нову якість підхід до створення програм. ([1, c. 12-34])
Найбільш важливим поняттям мов об'єктно-орієнтованого програмування є поняття об'єкта (object). Об'єкт – це логічна одиниця, яка містить дані і правила (методи) обробки цих даних. У мові С++ такими правилами обробки виступають функції, тобто об'єкт у C++ поєднує в собі характеристики та функції, що обробляють ці дані.
Одним з найголовніших понять мови С++ є поняття класу (class). У мові С++ для того, щоб визначити об'єкт, треба спочатку визначити його форму за допомогою ключового слова class. Класи надають можливість програмісту моделювати об’єкти, які мають атрибути (подані як дані-елементи) та варіанти поведінки або операції (подані як функції-елементи). Функції елементи також ще називають методами.
В подальшому розглянемо процес побудови класу для реалізації основних операцій з датами.
1. Визначення способів доступу до елементів класу
Перш за все потрібно зазначити, що визначення будь-якого класу починається з ключового слова class. Тіло визначення класу знаходиться у фігурні дужки.
В нашому випадку, клас Date буде містити три поля з даними year, month, day та елементи функції, які більш детально визначимо далі.
В кожному класі присутні мітки, які визначають спосіб доступу до елементів класу: public – відкрита і private – закрита. Вони ще називаються специфікаторами доступу до елементів. Будь-які дані-елементи й функції-елементи, об’явлені після специфікатора доступу до елементів public: (і до наступного специфікатора доступу до елементів), доступні при будь-якому звертанні програми до об'єкта класу. Будь-які дані-елементи й функції-елементи, об’явлені після специфікатора доступу до елементів private: (і до наступного специфікатора доступу до елементів), доступні тільки функціям-елементам цього класу. Специфікатори доступу до елементів завжди закінчуються двокрапкою (:) і можуть з'являтися у визначенні класу багато разів і в будь-якому порядку. ([2, c.410-412])
Дані-елементи year, month, day оголошені специфікатором доступу до елементів private. Ці закриті дані-елементи класу звичайно недоступні поза класом. Це зроблене в зв’язку з тим, що реальне становище даних усередині класу не стосується клієнтів класу.
2. Конструктори та деструктори класу
Перш за все необхідно
реалізувати конструктор класу
– спеціальну функцію-елемент, яка
ініціалізує дані-елементи об’єкта
цього класу. Конструктор викликається
автоматично при створенні об’
Створення декількох конструкторів пов’язано з тим, що дата може записуватись різними способами. ([4, c.512-523])
Перш за все необхідний конструктор за замовченням. Враховуючи, що такого поняття як нульова дата не існує (на відміну, наприклад, від нульового часу), конструктор буде встановлювати дату 1 січня 1990 року.
Date::Date(){
year=1900; month=1; day=1;}
Далі також створимо конструктор з параметрами
Date::Date(int d,int mth,int yr){
year=yr;
month=(mth>=1 && mth<13) ? mth : 1;
day=(d>=1 && mth<=30) ? d : 1;
}
В даному випадку в конструкторі також здійснюється перевірка правильності значень (для полегшення роботи було прийнято, що всі місяці року мають 30 днів). Якщо значення даних невірні, то конструктор їх "обнуляє".
Це гарантує, що об'єкт при його створенні перебуває у відомому стані. Неправильні значення не можуть зберігатися в даних-елементах об'єкта типу Date, оскільки конструктор автоматично викликається при створенні об'єкта типу Date.
Відзначимо, що дані-елементи класу не можуть одержувати початкові значення в тілі класу, де вони оголошуються. Ці дані-елементи повинні одержувати початкові значення за допомогою конструктора класу або їм можна присвоїти значення через функції.
Деструктор - це спеціальна обумовлена користувачем функція-член, що автоматично викликається, коли об'єкт виходить із області видимості або коли до покажчика на об'єкт застосовується операція delete. Ім'я цієї функції створено з імені класу з попереднім символом “тильда" (~).
В нашому випадку члени класу мають прості значення, пам'ять для об’єктів даного класу виділяється та звільняється компілятором автоматично на початку й наприкінці його життя. Отже, деструктор не потрібний.
3. Методи класу.
Далі розглянемо функції, що реалізують такі дії з датами:
Відмітимо, що функції, якими клас постачає зовнішній світ, визначаються міткою public. Відкриті функції реалізують всі можливості класу, необхідні для його клієнтів. Відкриті функції класу називають інтерфейсом класу або відкритим інтерфейсом.
Також при реалізації класу потрібно передбачити можливість ініціалізації рядком "рік.місяць.день".
Оголошення класу містить оголошення даних-елементів і функцій-елементів класу. Оголошення функцій-елементів є прототипами функцій. Функції-елементи можуть бути описані в середині класу, але бажано це робити поза визначенням класу.([2, c.422-442])
Функції зміни окремих полів місяця та дати повинні забезпечувати перевірку на правильність значень. Таким чином, отримаємо таку реалізацію
void Date::setDay (int d) {
day=(d>=1 && d<=30) ? d : 1;
}
void Date::setMonth (int m) {
month= (m >=1 && m<=12) ? m :1;
}
void Date::setYear (int y){
if(y==0) year=1 else year=y;
}
Оскільки функції отримання значень полів року, місяці, числа не повинні допускати зміни, то краще за все оголосити їх константними.
int getYear() const {return year;}
int getMonth() const {return month;}
int get_day() const {return day;}
C++ здатний вводити
й виводити стандартні типи
даних, використовуючи
В розроблюваному класі Date потрібно передбачити можливість потокового виведення даних у формі "рік.місяць.день".
ostream& operator<<(ostream& os, const Date & d)
{
os<<d.year<<((d.month/10==0) ? ".0" :".")<<d.trio.month<<((d.day/1
return os;
}
Відмітимо, що функції operator повинна бути оголошена в class Date не як функція-елемент, а як дружня функція. Ця операція не може бути елементом, тому що об'єкт класу Date з'являється як правий операнд операції; а для перевантаженої операції, записаної як функція-елемент, операнд класу повинен з'являтися ліворуч.
Перевантажені операції помістити в потік і взяти з потоку повинні об’являтися як дружні, якщо вони повинні мати прямий доступ до закритих елементів класу з міркувань продуктивності.
5. Реалізація класу Date
Враховуючи все вище зазначене, наведемо реалізацією класу Data, який призначений для виконання основних операцій з датами.
class Date{
private:
int year;
int month;
int day;
public:
Date();
Date(int,int,int);
Date(Date&);
void show();
int getYear() const {return year;}
int getMonth() const {return month;}
int get_day() const {return day;}
void setDay(int);
void setMonth(int);
void setYear(int);
void initialize(char*);
void dayPassed(int);
date & min (date & )
friend ostream& operator<<(ostream& os,const Date&);
};
Date::Date(){
year=1900; month=1; day=1;}
}
Date::Date(int d,int mth,int yr){
year=yr;
month=(mth>=1 && mth<13) ? mth : 1;
day=(d>=1 && mth<=30) ? d : 1;
}
}
ostream& operator<<(ostream& os, const Date & d)
{
os<<d.year<<((d.month/10==0) ? ".0" :".")<<d.trio.month<<((d.day/1
return os;
}
void Date::setDay (int d) {
day=(d>=1 && d<=30) ? d : 1;
}
void Date::setMonth (int m) {
month= (m >=1 && m<=12) ? m :1;
}
void Date::setYear (int y){
if(y==0) year=1 else year=y;
}
int Date::getDay() { return day; }
int Date::getMonth() { return month; }
int Date::getYear() { return year; }
void Date::initialize(char* str){
char* st=new char[50];
strcpy(st,str);
char* s=".";
char* w=strtok(st,s);
year=atoi(w);
w=strtok(0,s);
month=atoi(w);
w=strtok(0,s);
day=atoi(w);
display();
delete st;
}
void Date::dayPassed(int d){
//вважається, що в кожному місяці 30 днів
day+=d;
month+=day/30;
if(day%30==0)
month--;
year+=month/12;
if(month%12==0)
year--;
(day%30!=0)?(trio.day%=31):(tr
(trio.month%12!=0)?(trio.month
trio.display();
}
void display(){
char buf[3][10];
cout<<itoa(year,buf[0],10)<<((
}
date & date:: min (date & M)
{
if (year<M.getYear() || year==M.getYear()&&(month<M.ge
month==M.getMonth()&& day<M.getDay())) return *this;
return M;
}
6. Клас TDate
Запропонований нами варіант реалізації класу для роботи з датами можна використовувати в подальшій роботі при створенні будь-яких інших класів, що одним з полів використовують дату.
В той же час необхідно відмітити, що в С++ існує клас ТDate, який забезпечує обробку дат (Borland C++). Функції-елементи, що представлені в даному класі, наведені у таблиці. ([5, с.680-694])
Constructor |
Будує об’єкт TDate. |
AsString |
Конвертує об’єкт TDate в рядок. |
Between |
Повертає 1, если об’єкт TDate знаходиться між двома заданими датами. |
CompareTo |
Повертає 1, якщо цільовий TDate більше параметра TDate, або -1, якщо менше. |
Day |
Повертає день в році (от 1 до 365). |
DayName |
Повертає рядок з ім’ям дня тижня. |
DayOfMonth |
Повертає число місяця (от 1 до 31). |
DayOfWeek |
Повертає число, пов’язане з ім’ям дня тижня. |
DaysInYear |
Повертає число днів в указаному році. |
DayWithinMonth |
Повертає 1, якщо заданий день року знаходиться в указаному місяці. |
FirstDayOfMonth |
Для заданого TDate повертає номер першого дня в місяці. |
Hash |
Повертає для дати хеш-значення. |
IndexOfMonth |
Повертає номер указанного месяца (от 1 до 12). |
IsValid |
Повертає 1, якщо TDate є допустимим, і 0 в протилежному випадку. |
Jday |
Перетворює дату григоріанського календаря у відповідну дату юліанського. |
Leap |
Повертає 1, якщо рік TDate є високосним, і 0 в протилежному випадку. |
Max |
Порівнює даний TDate з заданим аргументом дати і повертає дату с більшим юліанським числом. |
Min |
Порівнює даний TDate з заданим аргументом дати і повертає дату з меншим юліанським числом. |
Month |
Повертає для даного TDate номер місяця. |
MonthName |
Повертає назву місяця по його номеру. |
NameOfDay |
Повертає для даного TDate назву дня. |
NameOfMonth |
Повертає для даного TDate назву місяця. |
Previous |
Повертає для TDate попередній dayTime або навпаки. |
SetPrintOption |
Встановлює для всіх об’єктів TDate параметр друку и повертає старі значення. |
WeekDay |
Повертає номер дня тижня. |
Year |
Повертає для даного TDate рік. |
AssertIndexOf-Month |
Повертає 1, якщо заданий аргумент лежить між 1 та 12 включно, інакше повертає 0. |
AssertWeekDay-Number |
Повертає 1, якщо заданий аргумент лежить між 1 і 7 включно, інакше повертає 0. |
Крім того, для даного класу визначені операції <, <==, >, <=, >=, ==, !=, -, +, ++, --, +=, -=, << и >>.
7. Висновок
Класи спрощують програмування, тому що клієнт (або користувач об'єкта класу) має справу тільки з операціями, інкапсульованими або вбудованими в об'єкт. Такі операції звичайно проектуються орієнтовними саме на клієнта, а не на зручну реалізацію. Інтерфейси міняються, але не так часто, як реалізації. При зміні реалізації відповідно повинні змінюватися орієнтовані на реалізацію коди. А шляхом приховання реалізації ми виключаємо можливість для інших частин програми виявитися залежними від особливостей реалізації класу.
№16
Розробка класу та
відповідних методів для
Рішення.
Був створений клас для одновимірного масиву дійсних чисел.
Для даного класу були розроблені такі методи:
Текст програми: визначення класу + тестова програма.
#include <iostream>
using namespace std;
int const NMax =50; // размер масива
class Masiv{
private :
double M[NMax];
int Size;
public:
Masiv(){cout<<"\n Input size of masive :"; cin>>Size; for(int i=0; i<Size;i++) cin>>M[i];}
~Masiv(){};
void SetI(double Data,int i);
int GetI(int i){return M[i];}
int Length () {return Size;}
void Sort();
double MinM();
double MaxM();
void FindM(double d);
void view();
};
void Masiv::SetI(double Data,int i){
M[i]=Data;
}
void Masiv::Sort(){ // сортировка по возрастанию
double t;
for (int i = 1; i < Size; i++) {
t = M[i];
for (int j = i-1; j >= 0 && (M[j]>t); j--)
M[j+1] = M[j];
M[j+1] = t;
}
}
double Masiv::MinM() {
double s=M[0];
for(int i=1; i<Size;i++)
{ if(s>M[i]) s=M[i];}
return s;
}
double Masiv::MaxM() {
double s=M[0];
for(int i=1; i<Size;i++)
{ if(s<M[i]) s=M[i];}
return s;
}
void Masiv::FindM(double d)
{
cout << " Found N :";
for(int i=0; i<Size;i++)
{if (M[i]==d) cout << i<<'\t';}
cout << '\n';
}
void Masiv::view(){
for (int i=0;i<Size;i++)
cout << i<<'\t'<< M[i]<<endl;
};
int main (){
double d;
Masiv A;
cout<<"Minimum :"<< A.MinM()<<"\n";
cout<<"Maximum :"<< A.MaxM()<<"\n";
cout<<"\n Input a number for search ; ";