Контрольна робота по "Програмування"

Автор работы: Пользователь скрыл имя, 04 Января 2014 в 21:23, контрольная работа

Описание работы

Об'єктно-орієнтоване програмування – це новий спосіб підходу до програмування. Таке програмування, взявши кращі риси структурного програмування, доповнює його новими ідеями, які переводять у нову якість підхід до створення програм. ([1, c. 12-34])
Найбільш важливим поняттям мов об'єктно-орієнтованого програмування є поняття об'єкта (object). Об'єкт – це логічна одиниця, яка містить дані і правила (методи) обробки цих даних. У мові С++ такими правилами обробки виступають функції, тобто об'єкт у C++ поєднує в собі характеристики та функції, що обробляють ці дані.

Содержание работы

Завдання 1 (№9). 3
Завдання 2 (№16). 13
Література. 17

Файлы: 1 файл

Progamms C++.doc

— 149.50 Кб (Скачать файл)


 

 

 

 

 

 

 

 

 

Контрольна робота

"Програмування"

(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;}        

4. Перевантаження операції помістити в потік і взяти з потоку

C++ здатний вводити  й виводити стандартні типи  даних, використовуючи операцію "помістити в потік" і операцію "взяти з потоку". Ці операції можна перевантажити для того, щоб виконувати введення й вивід типів користувача.

В розроблюваному класі Date потрібно передбачити можливість потокового виведення даних у формі "рік.місяць.день".

ostream& operator<<(ostream& os, const Date & d)

       os<<d.year<<((d.month/10==0) ? ".0" :".")<<d.trio.month<<((d.day/10==0)? ".0" :".")<<d.day; 

               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/10==0)? ".0" :".")<<d.day; 

               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):(trio.day=31); 

       (trio.month%12!=0)?(trio.month%=12):(trio.month=12); 

       trio.display();

       void display(){ 

               char buf[3][10]; 

               cout<<itoa(year,buf[0],10)<<((month/10==0)? ".0" :".")<<itoa(month,buf[1],10)<<((day/10==0)? ".0" :".")<<itoa(day,buf[2],10)<<endl; 

       }

date & date:: min (date & M)

               if (year<M.getYear() ||   year==M.getYear()&&(month<M.getMonth()||

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 ; ";

Информация о работе Контрольна робота по "Програмування"