Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/100: Рейтинг темы: голосов - 100, средняя оценка - 4.80
Nadinka______
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
1

класс дата

22.08.2011, 12:41. Просмотров 18322. Ответов 24
Метки нет (Все метки)

Создать класс типа - дата с полями: день (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();   //копирование???
}
Помогите доработать!!!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2011, 12:41
Ответы с готовыми решениями:

Класс Дата
Функция diff в классе Data выводит 0 а не нужное число. Мне нужно что бы все было так как у меня,...

Дата класс
Перешарила интернет. Помогите описать Класс даты,чтобы работало+вычисляла новые даты путем...

Класс Date (Дата)
Определить класс Date (Дата). Класс должен содержать поля: день, месяц и год. Предусмотреть...

Создать класс Дата
Нужно создать класс date, задать день, месяц и год, создать конструктор. Перегрузить операторы...

Создать класс Дата
Добрый день:) Ребята помогите пожалуйста исправить ошибки. Задание звучит так: "Оглашается класс...

24
Kastaneda
Jesus loves me
Эксперт С++
5052 / 3070 / 351
Регистрация: 12.12.2009
Сообщений: 7,767
Записей в блоге: 2
Завершенные тесты: 1
22.08.2011, 13:39 2
Цитата Сообщение от Nadinka______ Посмотреть сообщение
Помогите доработать!!!
Возможно имелось ввиду - разработать ?

Вот, может помочь)
0
Nadinka______
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
22.08.2011, 13:44  [ТС] 3
Спасибо конечно,но ничем не помогло
0
Kastaneda
Jesus loves me
Эксперт С++
5052 / 3070 / 351
Регистрация: 12.12.2009
Сообщений: 7,767
Записей в блоге: 2
Завершенные тесты: 1
22.08.2011, 14:07 4
Цитата Сообщение от Nadinka______ Посмотреть сообщение
Класс имеет конструктор:с параметрами, без параметров,копирования; деструктор; функции-члены получения дня,месяца и года,а также две функции-члены печати по шаблону: "5 января 1997 года" и "05.01.1997";
Из всего этого там есть конструктор с параметрами и вывод даты в формате "5 января 1997".
Цитата Сообщение от Nadinka______ Посмотреть сообщение
функции-члены должны проверять корректность задаваемых параметров.
Для того, чтобы это реализовать, нужно проверить - является ли введеный год високосным, а эта ф-ция там (по ссылке) тоже есть. Думаю стоит внимательно посмотреть на то, что советуют + попробовать что-то сделать самостоятельно. Твоя задача гораздо проще, чем та, что по ссылке
0
22.08.2011, 14:07
Nadinka______
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
22.08.2011, 15:59  [ТС] 5
пробую,спасибо за все))
0
fasked
Эксперт С++
5003 / 2582 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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;
}
2
TBIKC
web dev
104 / 90 / 9
Регистрация: 23.09.2010
Сообщений: 737
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");
                }
0
fasked
Эксперт С++
5003 / 2582 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.08.2011, 15:36 8
TBIKC, в первом куске описаны два конструктора: с параметрами и копирования. Чтобы три раза не писать один и тот же код сделана функция setDate. Во втором куске бросается исключение в случае если дата не корректна.
0
TBIKC
web dev
104 / 90 / 9
Регистрация: 23.09.2010
Сообщений: 737
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 зачем нужен...
0
fasked
Эксперт С++
5003 / 2582 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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? Исключение же можно поймать уровнем выше по иерархии вызовов.
В этом коде плохо то, что исключение может быть брошено из конструктора. Это действительно плохо.
2
TBIKC
web dev
104 / 90 / 9
Регистрация: 23.09.2010
Сообщений: 737
23.08.2011, 16:01 11
То есть без конструктора копирования Написать Date d2 = d1; было бы нельзя, и пришлось писать
Date d1(6, 8, 1989);
я прав ?
0
fasked
Эксперт С++
5003 / 2582 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.08.2011, 16:04 12
Цитата Сообщение от TBIKC Посмотреть сообщение
То есть без конструктора копирования Написать Date d2 = d1; было бы нельзя
В целом Вы правы, но стоит отметить один момент.
В данном случае конструктор копирования мог быть сгенерирован компилятором автоматически, такой конструктор просто скопировал бы побитово содержимое одного объекта в другой. Собственный конструктор копирования пишется для осуществления большего контроля над процессом создания объекта, например, проверка входных данных функцией isValidDate.
1
TBIKC
web dev
104 / 90 / 9
Регистрация: 23.09.2010
Сообщений: 737
23.08.2011, 16:11 13
Посмотрел и в основном же this, указатели,исключения ещё только буду проходить в следующих главах, а ведь пока только прошел
3. Введение в классы и объекты
4. Управляющие конструкции ( if else ) часть 1
Даже не знаю, хорошо ли это, что я вижу и копирую некоторые кусочки кода, но не совсем понимаю зачем они и что это )))
0
fasked
Эксперт С++
5003 / 2582 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.08.2011, 16:25 14
Цитата Сообщение от TBIKC Посмотреть сообщение
Даже не знаю, хорошо ли это, что я вижу и копирую некоторые кусочки кода, но не совсем понимаю зачем они и что это
Разберетесь, все еще впереди
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10576 / 6283 / 1574
Регистрация: 25.07.2009
Сообщений: 11,973
24.08.2011, 00:55 15
Конструктор копирования по-моему здесь всё-таки не нужен потому, что коль скоро удалось создать копируемый объект, значит данные в нём корректные, иначе было бы брошено исключение. А вот чем плохо вызывать исключения в конструкторе и как по-другому бороться с некорректными параметрами при создании объекта - было бы интересно узнать...
0
fasked
Эксперт С++
5003 / 2582 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.08.2011, 10:12 16
Цитата Сообщение от easybudda Посмотреть сообщение
Конструктор копирования по-моему здесь всё-таки не нужен потому, что коль скоро удалось создать копируемый объект, значит данные в нём корректные, иначе было бы брошено исключение. А вот чем плохо вызывать исключения в конструкторе и как по-другому бороться с некорректными параметрами при создании объекта - было бы интересно узнать...
Можно завести в классе булеву переменную is_valid. И в остальных методах проверять ее, соответственно в конструкторе при плохих данных просто выставить ее в true.
0
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;
        
}
Помогите с одной функцией, печати по шаблону, так вроде все сделала
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
1
Миниатюры
класс дата  
Вложения
Тип файла: rar date.rar (1.7 Кб, 141 просмотров)
fasked
Эксперт С++
5003 / 2582 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.09.2011, 17:03 19
Nadinka______, -=ЮрА=-, 30 февраля?
0
-=ЮрА=-
Заблокирован
Автор 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:Сразу сложно написать без багов
0
04.09.2011, 17:28
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 17:28

Описать класс Дата
Описать класс «Дата» - день, месяц (в виде числа), год. Предусмотреть возможность задания месяца в...

Разработать класс Дата
Разработать программу для работы с датами, используя понятие класса. По введенной дате определите...

ООП. Определить класс Дата
Определить класс Дата (Date), в котором производится ввод календарной даты, определение...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.