Форум программистов, компьютерный форум CyberForum.ru

класс дата - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 77, средняя оценка - 4.68
Nadinka______
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
22.08.2011, 12:41     класс дата #1
Создать класс типа - дата с полями: день (1-31), месяц (1-12), год(целое число).Класс имеет конструктор:с параметрами, без параметров,копирования; деструктор; функции-члены получения дня,месяца и года,а также две функции-члены печати по шаблону: "5 января 1997 года" и "05.01.1997"; функции-члены должны проверять корректность задаваемых параметров.
Помогите пожалуйста с определением класса! Вот что у меня:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class date
{
    int day,month,year;
public:
    date();   //конструктор без параметров
    date(int=0,int=0,int=0);   //конструктор с параметрами
    date(const date&);   //конструктор копирования
    ~date();   //деструктор
    void set(int,int,int);   //получение
    void get(int*,int*,int*);   //установка
    void print();   //копирование???
}
Помогите доработать!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2011, 12:41     класс дата
Посмотрите здесь:

C++ Описать класс Дата
Создать класс Дата C++
Класс «Дата» - поля данных и перегруженные операции C++
Дата класс C++
C++ Реализовать класс Date (дата)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.08.2011, 13:39     класс дата #2
Цитата Сообщение от Nadinka______ Посмотреть сообщение
Помогите доработать!!!
Возможно имелось ввиду - разработать ?

Вот, может помочь)
Nadinka______
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
22.08.2011, 13:44  [ТС]     класс дата #3
Спасибо конечно,но ничем не помогло
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.08.2011, 14:07     класс дата #4
Цитата Сообщение от Nadinka______ Посмотреть сообщение
Класс имеет конструктор:с параметрами, без параметров,копирования; деструктор; функции-члены получения дня,месяца и года,а также две функции-члены печати по шаблону: "5 января 1997 года" и "05.01.1997";
Из всего этого там есть конструктор с параметрами и вывод даты в формате "5 января 1997".
Цитата Сообщение от Nadinka______ Посмотреть сообщение
функции-члены должны проверять корректность задаваемых параметров.
Для того, чтобы это реализовать, нужно проверить - является ли введеный год високосным, а эта ф-ция там (по ссылке) тоже есть. Думаю стоит внимательно посмотреть на то, что советуют + попробовать что-то сделать самостоятельно. Твоя задача гораздо проще, чем та, что по ссылке
Nadinka______
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
22.08.2011, 15:59  [ТС]     класс дата #5
пробую,спасибо за все))
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.08.2011, 10:52     класс дата #6
Я начал, попробуйте доделать. Если возникнут трудности, постите свой проблемный код и описывайте проблемы. Но обязательно с Вашей стороны должен быть код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <string>
 
class Date {
public:
    Date(int d = 0, int m = 0, int y = 0) {
        setDate(d, m, y);
    }
 
    Date(const Date &date) {
        setDate(date.day, date.month, date.year);
    }
 
    int getDay() const {
        return day;
    }
 
    int getMonth() const {
        return month;
    }
 
    int getYear() const {
        return year;
    }
 
        void setDay(int day) {
        this->day = day;
    }
 
    void setMonth(int month) {
        this->month = month;
    }
 
    void setYear(int year) {
        this->year = year;
    }
 
    void setDate(int day, int month, int year) {
        if (isValidDate(day, month, year)) {
            setDay(day);
            setMonth(month);
            setYear(year);
        }
        else {
            throw std::string("Not valid date");
        }
    }
 
    void print() const {
            std::cout << day << '/'
                      << month << '/'
                      << year << std::endl;
    }
 
    static bool isValidDate(int day, int month, int year) {
        // Здесь необходимо описать процедуру проверки даты на корректность
        return true;
    }
 
        static bool isLeapYear(int year) {
                // Здесь необходимо проверить является ли год високосным
                return false;
        }
 
        static int dayInMonth(int month) {
                // Здесь определить количество дней в месяце
                return 0;
        }
 
private:
    int day;
    int month;
    int year;
};
 
int main() {
    Date d1(5, 8, 1989);
    d1.print();
 
    Date d2 = d1;
    d2.setDay(6);
    d2.print();
 
    return 0;
}
TBIKC
web dev
 Аватар для TBIKC
104 / 91 / 1
Регистрация: 23.09.2010
Сообщений: 738
23.08.2011, 15:26     класс дата #7
Столкнулся с этой же задачей, поясните пожалуйста данные куски кода:
C++
1
2
3
4
5
6
7
        Date(int d = 0, int m = 0, int y = 0) {
                setDate(d, m, y);
        }
 
        Date(const Date &date) {
                setDate(date.day, date.month, date.year);
        }
и
C++
1
2
3
else {
                        throw std::string("Not valid date");
                }
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.08.2011, 15:36     класс дата #8
TBIKC, в первом куске описаны два конструктора: с параметрами и копирования. Чтобы три раза не писать один и тот же код сделана функция setDate. Во втором куске бросается исключение в случае если дата не корректна.
TBIKC
web dev
 Аватар для TBIKC
104 / 91 / 1
Регистрация: 23.09.2010
Сообщений: 738
23.08.2011, 15:52     класс дата #9
Из php знаю обработка исключений происходит так:
PHP
1
2
3
4
5
6
try {
    throw new Exception("Exception message");
    echo "That code will never been executed";
} catch (Exception $e) {
    echo $e->getMessage(); //выведет "Exception message"
}
Вот я и удивился почему только 1 слово throw написано, когда можно было просто вывести так
C++
1
cout << "Ошибка ... " << endl;
2 конструктора, первый то мне понятен, а вот 2 зачем нужен...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.08.2011, 15:58     класс дата #10
Цитата Сообщение от fasked Посмотреть сообщение
C++
1
2
3
4
5
Date d1(5, 8, 1989);
* * * * d1.print();
Date d2 = d1;
* * * * d2.setDay(6);
* * * * d2.print()
Для d1 вызывается конструктор с параметрами, для d2 - конструктор копирования.
После выполнения на экран выведено будет две даты: 5/08/1989 и 6/08/1989. Обратите внимание, что у объекта d2 был вызван метод setDay. А первоначально значения скопированы из объекта d1.
Цитата Сообщение от TBIKC Посмотреть сообщение
почему только 1 слово throw написано, когда можно было просто вывести так
Если просто вывести, то ошибку можно заметить только на консоли (ну или куда stdout будет перенаправлен) - это плохо, так как присутствует зависимость от интерфейса представления данных. А что если данный класс будет использоваться с GUI? Исключение же можно поймать уровнем выше по иерархии вызовов.
В этом коде плохо то, что исключение может быть брошено из конструктора. Это действительно плохо.
TBIKC
web dev
 Аватар для TBIKC
104 / 91 / 1
Регистрация: 23.09.2010
Сообщений: 738
23.08.2011, 16:01     класс дата #11
То есть без конструктора копирования Написать Date d2 = d1; было бы нельзя, и пришлось писать
Date d1(6, 8, 1989);
я прав ?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.08.2011, 16:04     класс дата #12
Цитата Сообщение от TBIKC Посмотреть сообщение
То есть без конструктора копирования Написать Date d2 = d1; было бы нельзя
В целом Вы правы, но стоит отметить один момент.
В данном случае конструктор копирования мог быть сгенерирован компилятором автоматически, такой конструктор просто скопировал бы побитово содержимое одного объекта в другой. Собственный конструктор копирования пишется для осуществления большего контроля над процессом создания объекта, например, проверка входных данных функцией isValidDate.
TBIKC
web dev
 Аватар для TBIKC
104 / 91 / 1
Регистрация: 23.09.2010
Сообщений: 738
23.08.2011, 16:11     класс дата #13
Посмотрел и в основном же this, указатели,исключения ещё только буду проходить в следующих главах, а ведь пока только прошел
3. Введение в классы и объекты
4. Управляющие конструкции ( if else ) часть 1
Даже не знаю, хорошо ли это, что я вижу и копирую некоторые кусочки кода, но не совсем понимаю зачем они и что это )))
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.08.2011, 16:25     класс дата #14
Цитата Сообщение от TBIKC Посмотреть сообщение
Даже не знаю, хорошо ли это, что я вижу и копирую некоторые кусочки кода, но не совсем понимаю зачем они и что это
Разберетесь, все еще впереди
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.08.2011, 00:55     класс дата #15
Конструктор копирования по-моему здесь всё-таки не нужен потому, что коль скоро удалось создать копируемый объект, значит данные в нём корректные, иначе было бы брошено исключение. А вот чем плохо вызывать исключения в конструкторе и как по-другому бороться с некорректными параметрами при создании объекта - было бы интересно узнать...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.08.2011, 10:12     класс дата #16
Цитата Сообщение от easybudda Посмотреть сообщение
Конструктор копирования по-моему здесь всё-таки не нужен потому, что коль скоро удалось создать копируемый объект, значит данные в нём корректные, иначе было бы брошено исключение. А вот чем плохо вызывать исключения в конструкторе и как по-другому бороться с некорректными параметрами при создании объекта - было бы интересно узнать...
Можно завести в классе булеву переменную is_valid. И в остальных методах проверять ее, соответственно в конструкторе при плохих данных просто выставить ее в true.
Nadinka______
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
03.09.2011, 16:15  [ТС]     класс дата #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// 11111.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
 
class Date 
{
public:
        Date(int d = 0, int m = 0, int y = 0) 
        {
                setDate(d, m, y);
                std::cout<<"Constructor"<<std::endl;
        }
 
        Date(const Date &date) 
        {
                setDate(date.day, date.month, date.year);
                std::cout<<"Constructor copy"<<std::endl;
        }
 
        ~Date()
        {
            
        }
 
        int getDay() const 
        {
                return day;
        }
 
        int getMonth() const 
        {
                return month;
        }
 
        int getYear() const 
        {
                return year;
        }
 
        void setDay(int day) 
        {
                this->day = day;
        }
 
        void setMonth(int month) 
        {
                this->month = month;
        }
 
        void setYear(int year) 
        {
                this->year = year;
        }
 
        void setDate(int day, int month, int year) 
        {
                if (isValidDate(day, month, year)) 
                {
                        setDay(day);
                        setMonth(month);
                        setYear(year);
                }
                else {
                        throw std::string("Not valid date");
                }
        }
 
        void print() const 
        {
                        std::cout << day << '.'
                                  << month << '.'
                                  << year << std::endl;
        }
 
        void print1() const 
        {
            
            //функция печати по шаблону 5 января 1997
        }
                        
 
        static bool isValidDate(int day, int month, int year) 
        {
                if ((day<1 || day>31) || (month<1 || month>12))
                {
                    std::cout<<"Not valid date"<<std::endl;
                }
                return true;
        }
 
        static bool isLeapYear(int year) 
        {
               return ((year % 4 == 0 && year% 100 != 0) || year % 400);
            
        }
 
        static int dayInMonth(int month) 
        {
                  int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
                  if(isLeapYear)days[1]=29;
                  return days[month-1];
        }
 
private:
        int day;
        int month;
        int year;
};
 
int main() 
{
        Date d1(5, 1, 1997);
            d1.print();
 
            Date d2 = d1;
            d2.setDay(6);
            d2.print();
        
 
        Date d3(d2);
            //d3.print2();
            return 0;
        
}
Помогите с одной функцией, печати по шаблону, так вроде все сделала
-=ЮрА=-
Заблокирован
Автор FAQ
04.09.2011, 11:55     класс дата #18
Цитата Сообщение от Nadinka______ Посмотреть сообщение
Создать класс типа - дата с полями: день (1-31), месяц (1-12), год(целое число).Класс имеет конструктор:с параметрами, без параметров,копирования; деструктор; функции-члены получения дня,месяца и года,а также две функции-члены печати по шаблону: "5 января 1997 года" и "05.01.1997"; функции-члены должны проверять корректность задаваемых параметров.
- Предлагаю свой класс data, в классе предусмотрена проверка введенных параметров + печать по шаблону

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#ifndef DATE_H
#define DATE_H
 
#include <stdio.h>
 
int LongMonth[] = {1,3,5,7,8,10,12};
char * sMonth[] = 
{
    "января",
    "февраля",
    "марта",
    "апреля",
    "мая",
    "июня",
    "июля",
    "августа",
    "сентября",
    "октября",
    "ноября",
    "декабря"
};
 
class date
{
private:
    int day, month, year;
    bool bChangeDay,bChangeMonth,bChangeYear;//Флаги указывающие на корректировку 
    char sDate[256];//Дата в строковом формате
public:
    date();                               //конструктор без параметров
    date(int iDay, int iMonth, int iYear);//конструктор с параметрами
    date(const date &val);                //конструктор копирования
    ~date();                              //деструктор
 
    int getDay()    {return day;}
    int getMonth()  {return month;}
    int getYear()   {return year;} 
 
    void setDay(int iDay); 
    void setMonth(int iMonth);
    void setYear(int iYear); 
    //Сигнализируют пользователя о некрректности ввода даты
    bool IsChangeDay(){return bChangeDay;}
    bool IsChangeMonth(){return bChangeMonth;}
    bool IsChangeYear(){return bChangeYear;}
 
    char * ShowDate(int ifmt);
};
 
date::date()
{
    day   = 1;
    month = 1;
    year  = 1900;
    
    bChangeDay   = false;
    bChangeMonth = false;
    bChangeYear  = false;
 
    sDate[0] = '\0';
}
 
date::date(int iDay, int iMonth, int iYear)
{
    bChangeDay   = false;
    bChangeMonth = false;
    bChangeYear  = false;
 
    setDay(iDay);
    setMonth(iMonth);
    setYear(iYear);
 
    sDate[0] = '\0';
}
 
date::date(const date &val)
{
    day   = val.day;
    month = val.month;
    year  = val.year;
 
    sDate[0] = '\0';
}
 
date::~date()
{
    //Память не выделяли так что думаю, 
    //кроме установки дефалтных значений 
    //ничего сделать и не можем
    day   = 1;
    month = 1;
    year  = 1900;
 
    sDate[0] = '\0';
}
 
void date::setDay(int iDay)
{
    if(iDay < 1 || 31 < iDay)
        bChangeDay   = true;
    if(bChangeDay)
        day = 1;
    day = iDay;
}
 
void date::setMonth(int iMonth)
{
    int i, nMonth = sizeof(LongMonth)/sizeof(int);
    if(iMonth < 1 || 12 < iMonth)
        bChangeMonth = true;
    if(bChangeMonth)
        month = 1;
    //Если месяц не 31-дневный, 
    //а day == 31,
    //то устанавливаем day == 1
    if(day == 31)
    {
        for(i = 0; i < nMonth; i++)
        {
            if(iMonth == LongMonth[i])
                break;
        }
        if(nMonth <= i)
            bChangeDay = true;
    }
    if(bChangeDay)
        day = 1;
    month = iMonth;
}
 
void date::setYear(int iYear)
{
    if(iYear < 1)
        bChangeYear = true;
    if(bChangeYear)
        iYear = 1;
    if(28 < day && month == 2)
    if(iYear % 4 != 0)
        bChangeDay = true;
    if(bChangeDay)
        day = 1;
    year = iYear;
}
 
char * date::ShowDate(int ifmt)
{
    switch(ifmt)
    {
        case 1 :
            sprintf(sDate,"%02d %s %04d\r\n",day,sMonth[month - 1],year);
            break;
        default :
            sprintf(sDate,"%02d.%02d.%04d\r\n",day,month,year);
            break;
    }
    return &sDate[0];
}
 
#endif
Миниатюры
класс дата  
Вложения
Тип файла: rar date.rar (1.7 Кб, 108 просмотров)
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.09.2011, 17:03     класс дата #19
Nadinka______, -=ЮрА=-, 30 февраля?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 17:28     класс дата
Еще ссылки по теме:

C++ Разработать класс Дата
Класс «Дата». Сложение/вычитание дат C++
Класс Триада, Дата и Время C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
04.09.2011, 17:28     класс дата #20
Цитата Сообщение от fasked Посмотреть сообщение
Nadinka______, -=ЮрА=-, 30 февраля?
- Да понял баг, нужно модернизировать функцию setYear(int iYear) и ввести ветвь с проверкой условия 28 < day при не високосном годе
C++
1
2
3
4
5
6
7
8
9
10
11
12
void date::setYear(int iYear)
{
    if(iYear < 1)
        bChangeYear = true;
    if(bChangeYear)
        iYear = 1;
    if(month == 2 && 28 + ((iYear % 4 == 0) ? 1 : 0) < day)
            bChangeDay = true;
    if(bChangeDay)
        day = 1;
    year = iYear;
}
PS:Сразу сложно написать без багов
Yandex
Объявления
04.09.2011, 17:28     класс дата
Ответ Создать тему
Опции темы

Текущее время: 11:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru