Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/231: Рейтинг темы: голосов - 231, средняя оценка - 4.87
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
1

Класс дата

22.08.2011, 12:41. Показов 44206. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать класс типа - дата с полями: день (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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2011, 12:41
Ответы с готовыми решениями:

Класс Дата
Создать класс с полями, указанными в индивидуальном задании. Реализовать в классе методы: -...

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

Класс Дата
С++ Помогите, пожалуйста. Нужно Создать класс с полями, указанными в индивидуальном задании....

Класс Дата
Створити клас із полями, зазначеними в індивідуальному завданні . Реалізувати в класі методи: -...

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

28
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
22.08.2011, 13:39 2
Цитата Сообщение от Nadinka______ Посмотреть сообщение
Помогите доработать!!!
Возможно имелось ввиду - разработать ?

Вот, может помочь)
0
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
22.08.2011, 13:44  [ТС] 3
Спасибо конечно,но ничем не помогло
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
22.08.2011, 14:07 4
Цитата Сообщение от Nadinka______ Посмотреть сообщение
Класс имеет конструктор:с параметрами, без параметров,копирования; деструктор; функции-члены получения дня,месяца и года,а также две функции-члены печати по шаблону: "5 января 1997 года" и "05.01.1997";
Из всего этого там есть конструктор с параметрами и вывод даты в формате "5 января 1997".
Цитата Сообщение от Nadinka______ Посмотреть сообщение
функции-члены должны проверять корректность задаваемых параметров.
Для того, чтобы это реализовать, нужно проверить - является ли введеный год високосным, а эта ф-ция там (по ссылке) тоже есть. Думаю стоит внимательно посмотреть на то, что советуют + попробовать что-то сделать самостоятельно. Твоя задача гораздо проще, чем та, что по ссылке
0
1 / 1 / 0
Регистрация: 12.08.2011
Сообщений: 29
22.08.2011, 15:59  [ТС] 5
пробую,спасибо за все))
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
web dev
107 / 93 / 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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
23.08.2011, 15:36 8
TBIKC, в первом куске описаны два конструктора: с параметрами и копирования. Чтобы три раза не писать один и тот же код сделана функция setDate. Во втором куске бросается исключение в случае если дата не корректна.
0
web dev
107 / 93 / 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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
web dev
107 / 93 / 9
Регистрация: 23.09.2010
Сообщений: 737
23.08.2011, 16:01 11
То есть без конструктора копирования Написать Date d2 = d1; было бы нельзя, и пришлось писать
Date d1(6, 8, 1989);
я прав ?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
23.08.2011, 16:04 12
Цитата Сообщение от TBIKC Посмотреть сообщение
То есть без конструктора копирования Написать Date d2 = d1; было бы нельзя
В целом Вы правы, но стоит отметить один момент.
В данном случае конструктор копирования мог быть сгенерирован компилятором автоматически, такой конструктор просто скопировал бы побитово содержимое одного объекта в другой. Собственный конструктор копирования пишется для осуществления большего контроля над процессом создания объекта, например, проверка входных данных функцией isValidDate.
1
web dev
107 / 93 / 9
Регистрация: 23.09.2010
Сообщений: 737
23.08.2011, 16:11 13
Посмотрел и в основном же this, указатели,исключения ещё только буду проходить в следующих главах, а ведь пока только прошел
3. Введение в классы и объекты
4. Управляющие конструкции ( if else ) часть 1
Даже не знаю, хорошо ли это, что я вижу и копирую некоторые кусочки кода, но не совсем понимаю зачем они и что это )))
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
23.08.2011, 16:25 14
Цитата Сообщение от TBIKC Посмотреть сообщение
Даже не знаю, хорошо ли это, что я вижу и копирую некоторые кусочки кода, но не совсем понимаю зачем они и что это
Разберетесь, все еще впереди
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12459 / 7483 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
24.08.2011, 00:55 15
Конструктор копирования по-моему здесь всё-таки не нужен потому, что коль скоро удалось создать копируемый объект, значит данные в нём корректные, иначе было бы брошено исключение. А вот чем плохо вызывать исключения в конструкторе и как по-другому бороться с некорректными параметрами при создании объекта - было бы интересно узнать...
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
24.08.2011, 10:12 16
Цитата Сообщение от easybudda Посмотреть сообщение
Конструктор копирования по-моему здесь всё-таки не нужен потому, что коль скоро удалось создать копируемый объект, значит данные в нём корректные, иначе было бы брошено исключение. А вот чем плохо вызывать исключения в конструкторе и как по-другому бороться с некорректными параметрами при создании объекта - было бы интересно узнать...
Можно завести в классе булеву переменную is_valid. И в остальных методах проверять ее, соответственно в конструкторе при плохих данных просто выставить ее в true.
0
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
Миниатюры
Класс дата  
Вложения
Тип файла: rar date.rar (1.7 Кб, 264 просмотров)
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2011, 17:28
Помогаю со студенческими работами здесь

класс Дата
Здравствуйте, помогите решить задачу : Создайте класс с именем Date, приватные переменные: год,...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru