ТОП 10:

Разработать класс MyDate (дата-время)



Данные хранятся в виде:

  1. День месяца, месяц ,год
  2. День года, год
  3. День от рождества Христова
  4. День месяца, название месяца ,год
  5. Секунды, минуты, часы , день месяца, месяц ,год
  6. Секунды в текущем часе, час, день месяца, месяц ,год
  7. Секунды в текущем дне, день месяца, месяц ,год
  8. Секунды в текущем месяце, месяц ,год
  9. Секунды в текущем годе, ,год
  10. Секунды от рождества Христова

 

Дополнительно в классе должны быть реализованы следующие функциию

#pragma once

#include "io.h"

class MyDate

{ int day,month,year;

static int daytab[2][13];

static char* MonthName[13];

static char* DayNames[8];

public:

 

int get_day() {return day;}

int get_month() {return month;}

int get_year() {return year;}

int get_day()const {return day;}

int get_month()const {return month;}

int get_year()const {return year;}

 

int validate();

void set_day (int d){int tmp= day; day=d; if(!validate()) day=tmp;}

void set_month (int m){int tmp=month; month=m; if(!validate()) month=tmp;}

void set_year (int y){int tmp=year; year=q; if(!validate()) year=tmp;}

 

char* get_ DayOfWeek();

MyDate get_Now();

MyDate Parser(char*);

void AddDays (long); //аргумент может быть отрицательным числом

void AddMonths (int); //аргумент может быть отрицательным числом

void AddYears (int); //аргумент может быть отрицательным числом

 

static int dayofyear(int y,int m,int d);

static void day_month(int d,int y,int *m,int* dd);

static int vis(int y)

{ return ((!(y%4))&&(y%100)||(!(y%400))); }

 

char* ToPchar();

String* ToString();

unsigned long ToLong();

 

 

public:

MyDate(void);

~MyDate(void);

MyDate(int d,int m,int y);

MyDate (char* s);

MyDate (const MyDate& );

void assign (const MyDate& t);

void dispose ();

MyDate* copy();

 

int equal(const MyDate& t);

int cmp(const MyDate& t);

 

int input(File fp) ;

int input() ;

int output(File f);

int output();

int input(TextBox * t1, TextBox * t2, TextBox * t3) ;

 

};

 

#include "stdafx.h"

#include " MyDate.h"

using namespace System;

using namespace System::Windows::Forms;

 

int MyDate::daytab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};

char* MyDate::MonthName[13]={"Wrong month","January","February","March","April","May","June","July","August","September","October","November","December"};

char* MyDate::DayNames[8]={"Wrong day","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

void MyDate::AddDays(long d)

{

if(d>0)

{

while(d--)

{

day++;

if(day>daytab[vis(year)][month])

{

day=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

}

}

else

{

while(d++)

{

day--;

if(!day)

{

month--;

if(!month)

{

month=12;

year--;

if(!year)

{

year=1;

month=1;

day=1;

return;

}

}

day=daytab[vis(year)][month];

}

}

}

}

void MyDate::AddMonth(long m)

{

if(m>0)

while(m--)

{

month++;

if(month==13)

{

month=1;

year++;

}

}

else

while(m++)

{

month--;

if(!month)

{

month=12;

year--;

if(!year) {year=1;month=1;return;}

}

}

int k;

if (day>(k=daytab[vis(year)][month])) day=k;

}

void MyDate::AddYear(long y)

{

year+=y;

if (year<=0)

{

year=1;

month=1;

day=1;

}

int k;

if (day>(k=daytab[vis(year)][month])) day=k;

}

 

long ToLong();

{

unsigned long d,m,y;

d=day;y=1;m=1;

while(y<year)

{

d+=365+vis(y);

y++;

}

while(m<month)

{

d+=daytab[vis(year)][m];

m++;

}

return d;

}

char* MyDate::get_DayOfWeek()

{

long dd=(get_AllDays())%7+1;

char*s=new char[strlen(DayNames[dd])+1];

strcpy(s,DayNames[dd]);

return s;

}

int MyDate::dayofyear(int y,int m,int d)

{

int dd=d;

while(--m)

{

dd+=daytab[vis(y)][m];

}

return dd;

}

void MyDate::day_month(int d,int y,int *m,int* dd)

{

*m=1;

while(d>daytab[vis(y)][*m])

{

d-=daytab[vis(y)][(*m)++];

}

*dd=d;

return;

}

MyDate::MyDate(void)

{day=month=year=0;

}

 

MyDate::~MyDate(void)

{ }

MyDate::MyDate(int d,int m,int y)

{

day=d;

month=m;

year=y;

if(!validate()) ExeptionInvalidValue("MyDate");

 

}

int MyDate::validate()

{

return (year>0&&month>0&&month<=12&&day>0&&day<=daytab[vis(year)][month]);

}

MyDate::MyDate (char* s){}

MyDate::MyDate (const MyDate& d)

{day=d.day;

month=d.month;

year=d.year;}

void MyDate::assign (const MyDate& d)

{day=d.day;

month=d.month;

year=d.year;}

void MyDate::dispose (){}

MyDate* MyDate::copy()

{return new MyDate();}

char* MyDate::ToPchar()

{char s[256],buf[256],*s1;

s[0]='\0';

itoa(day,buf,10); strcat(s,buf); strcat(s,".");

itoa(month,buf,10); strcat(s,buf); strcat(s,".");

itoa(year,buf,10); strcat(s,buf);

s1=new char[strlen(s)+1];

strcpy(s1,s);

return s1;}

String* MyDate::ToString()

{return new String(ToPchar());}

 

int MyDate::equal(const MyDate& d)

{return day==d.day && month==d.month && year==d.year;}

 

int MyDate::cmp(const MyDate& d)

{if(year!=d.year)return year-d.year;

else if(month!=d.month)return month-d.month;

else return day-d.day;

}

 

int MyDate::input(File fp)

{int state=1;

state&=::input(fp,&day); if(eof( fp)) return 0;

state&=::input(fp,&month); if(eof( fp)) return 0;

state&=::input(fp,&year); if(eof( fp)) return 0;

return state;}

int MyDate::input()

{int state=1;

::output( "day");

state&=::input(&day); if(eof( )) return 0;

::output("month");

state&=::input(&month); if(eof( )) return 0;

::output("year");

state&=::input(&year); if(eof( )) return 0;

return state;}

int MyDate::output(File f)

{return fprintf(f,"%d\t%d\t%d\n",

day,month,year);

}

int MyDate::output()

{return output(stdin);}

int MyDate::input(TextBox * t1, TextBox * t2, TextBox * t3)

{int state=1;

state&=::input(t1,&day) ;

state&=::input(t2,&month) ;

state&=::input(t3,&year ) ;

return state;}

 

2. Разработать класс Price (стоимость)

Класс должен содержать функции ввода и вывода данных , в которых присутствует символ денежной единицы, а так же функции сравнения. Для иностранной валюты ввести коэффициенты перевода в рубли.

Данные хранятся в виде:

  1. Рублей и копеек
  2. Копеек
  3. Долларов и центов
  4. Центов
  5. Евро
  6. Фунтов
  7. В одной из трех денежных единиц : рубли, доллары, евро (Для перевода использовать вспомогательную таблицу).

3. Дополнить класс MyString (строка)

Вариант 1. (оптимальное использование памяти)

 

Память под строку выделяется ровно столько, сколько необходимо для хранения символов. Любая операция, приводящая к увеличению или уменьшению числа символов, сопровождается выделением нового участка памяти и освобождением старого

В классе должны быть определены функции

class MyString

{char* s;

int len;

public:

//…

int find(MyString * item);

MyString* substring(int pos,int count);

MyString* erase(int pos,int count);

MyString* insert(int pos, MyString * item);

MyString* remove(MyString * item);

MyString* replace(MyString *Old, MyString *New);

 

MyString ** split(int& count) Разбивает строку на массив слов

MyString ** split(MyString* splits, int& count); Разбивает строку на массив подстрок, используя строку символов - разделителей

static MyString * concate(MyString* s1, MyString* s2); Соединяет(сцепляет) две строки

static MyString * concate(MyString* mas[], int count); Соединяет(сцепляет) массив строк

static MyString * join(MyString* mas[], int count, char split); Соединяет(сцепляет) массив строк, вставляя между ними символ разделитель

};

 

Вариант 2. ( оптимальная эффективность операций)

 

Память под строку выделяется больше необходимого размера. Выделением нового участка памяти при реализации операций над строками производится только в случае ее исчерпания. Для этого используется функция void resize(int newsize);

В классе должны быть определены функции

#define MAX_SIZE 256

class MyString

{char* s;

char* cur;

int size;

public:

//…

MyString()

{cur=s=new char [size =MAX_SIZE];

*s=’\0’;

}

void resize(int newsize);

 

MyString & mystring::operator= (const MyString & a){

if(this!=&a) {

if(size< a.length())

{delete[] s;

s=new char[a. size];

}

strcpy(s,a.s);

size =a. size;

cur=s+ a.length();

}

return *this;}

 

int find(int first,int last,const MyString & item);

MyString substring(int pos,int count);

int erase(int pos,int count);

int insert(int pos, const MyString & item);

int remove(int first,int last,const MyString & item);

int replace(int first,int last,const MyString &Old,const MyString &New);

 

MyString * split(int& count) Разбивает строку на массив слов

MyString * split(const MyString& splits, int& count); Разбивает строку на массив подстрок, используя строку символов - разделителей

static MyString concate(const MyString& s1, const MyString& s2);

Соединяет(сцепляет) две строки

static MyString concate(MyString mas[], int count); Соединяет(сцепляет) массив строк

static MyString join(MyString mas[],int count ,char split); Соединяет(сцепляет) массив строк, вставляя между ними символ разделитель

};







Последнее изменение этой страницы: 2016-07-11; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 100.24.125.162 (0.017 с.)