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

Задача про дату! - C++

Восстановить пароль Регистрация
 
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 746
Записей в блоге: 1
19.09.2013, 20:57     Задача про дату! #1
Три файла:
1.date.cpp
2.date.h (заголовочный)
3.main.cpp
Ну собственно в main.cpp, cout месяц не тот выводит....
И если в assert false, то происходит исключение?или как..

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
#include "date.h"
 
// return next month
Month inc(Month m) {
    return (m == DEC) ? JAN : static_cast<Month> (m + 1);
}
 
// return previous month
Month dec(Month m) { 
    return (m==JAN) ? DEC :static_cast<Month> (m-1);
}
 
// check if given year is leap
bool isLeap(int year) {
    if  (year % 400==0)
        return true;
    else
    if  ((year % 100!=0)&&(year % 4 ==0))
        return true;
    else
        return false;
 
}
 
// set next date (account leap years)
void nextDate(int & year, Month & month, Day & day)  { 
    switch(day) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    case 10:
    case 11:
    case 12:
    case 13:
    case 14:
    case 15:
    case 16:
    case 17:
    case 18:
    case 19:
    case 20:
    case 21:
    case 22:
    case 23:
    case 24:
    case 25:
    case 26:
    case 27: {
        day++;
        break;
    }
    case 28: {
        if (!(isLeap(year))&&(month==FEB)) {
            day=1;
            inc(month);
        }
        else day++;
        break;
    }
    case 29: {
        if (month==FEB){
            inc(month);
            day=1;
            
        }
        else day++;
        break;
    }
    case 30: {
        if ((month==APR)||(month==JUN)||(month==SEP)||(month==NOV)) {
            day=1;
            inc(month);
        }
        else
            day++;
        break;
    }
    case 31: {
        if (month==DEC)
        year++;
        day=1;
        inc(month);
        break;
     }
  }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef DATE_H
#define DATE_H
 
// type for representing day in a month: [1, 31]
typedef int Day;
 
// type for representing a month: JAN for January, etc.
enum Month {JAN =1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};
 
// return next month
Month inc(Month m);
 
// return previous month
Month dec(Month m);
 
// check if given year is leap
bool isLeap(int year);
 
// set next date (account leap years)
void nextDate(int & year, Month & month, Day & day);
 
#endif /* DATE_H */
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
#include <iostream>
#include <cassert>
 
#include "date.h"
 
using namespace std;
int main() {
    assert(JAN == inc(DEC));
    assert(FEB== inc(JAN));
 
    assert(JAN == dec(FEB));
    assert(DEC==dec(JAN));
    
    assert(isLeap(2000)); //Високосный true
    assert(!isLeap(2100));//Високосный false,т.к. !
    assert(isLeap(1200));// Високосный true
    assert(!isLeap(1994));//Не Високосный 
    
    
    int y = 2012;
    Month m = FEB;
    Day d = 28;
    
    nextDate(y, m, d);
    assert(y == 2012);
    assert(m == FEB);
    assert(d == 29);
 
    nextDate(y, m, d);
cout<<y<<" "<<m<<" "<<d;
    
    
    system("pause");
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 20:57     Задача про дату!
Посмотрите здесь:

C++ Задача про слона 0о
C++ Задача про шахматы
задача про массивы C++
C++ Задача про год
Задача про рюкзак C++
Задача про температуру C++
Задача про торт C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
19.09.2013, 21:19     Задача про дату! #2
Bash
1
2012 2 1Для продолжения нажмите любую клавишу . . .
Цитата Сообщение от DmitryM5 Посмотреть сообщение
cout месяц не тот выводит....
"не тот" это какой именно не тот?
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
19.09.2013, 21:32     Задача про дату! #3
Попробуй cout.flush () сразу после вывода. Или не делай system ( "pause" ). Потому что всё должен печатать (код здесь не виноват).
void assert ( int ) никаких исключений не бросает, так как это Си, не умеющий кидать исключения, но зато она умеет печатать в stderr и завершать работу.

Добавлено через 5 минут
Не понял вопроса. Вообще-то действительно не тот месяц он выводит.

C++
1
2
3
4
5
6
7
8
9
    case 29: {
        if (month==FEB){
            inc(month);
            day=1;
            
        }
        else day++;
        break;
    }
Вроде всё правильно... Попробуй дебагером зайти.
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 746
Записей в блоге: 1
19.09.2013, 21:35  [ТС]     Задача про дату! #4
Цитата Сообщение от kravam Посмотреть сообщение
Bash
1
2012 2 1Для продолжения нажмите любую клавишу . . .
"не тот" это какой именно не тот?
Ну вначале указано 28.02.2012г (Это високосный год, 29 дней февраля.)
Делаем nexdate 29.02.2012г
Еще раз nexdate 01.03.2012г
у меня выводит как и у вас месяц 2...
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
19.09.2013, 21:42     Задача про дату! #5
Тьфу. Что делает функция Month inc ( Month m )??? Похоже, она возвращает месяц, а не инкрементирует!

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
* * case 29: {
* * * * if (month==FEB){
* * * * * * inc(month);
* * * * * * day=1;
}
* * * * else day++;
* * * * break;
* * }
Должно быть:
C++
1
2
3
4
5
6
7
8
* * case 29: {
* * * * if (month==FEB){
* * * * * * month = inc(month);
* * * * * * day=1;
}
* * * * else day++;
* * * * break;
* * }
UPD:

Не по теме:

Звёздочки? Ты смеёшся? Что за ..?



Добавлено через 4 минуты
Собственно, вариант без звёздочек =)
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 746
Записей в блоге: 1
19.09.2013, 21:48  [ТС]     Задача про дату! #6
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Тьфу. Что делает функция Month inc ( Month m )??? Похоже, она возвращает месяц, а не инкрементирует!

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
* * case 29: {
* * * * if (month==FEB){
* * * * * * inc(month);
* * * * * * day=1;
}
* * * * else day++;
* * * * break;
* * }
Должно быть:
C++
1
2
3
4
5
6
7
8
* * case 29: {
* * * * if (month==FEB){
* * * * * * month = inc(month);
* * * * * * day=1;
}
* * * * else day++;
* * * * break;
* * }
UPD:

Не по теме:

Звёздочки? Ты смеёшся? Что за ..?

Ехууу спасибо)
Извиняюсь,просто пару недель в С++ и программа была уже наполовину готова была по заданию,не заметил

Так все таки,если срабатывает assert то что происходит??
Допустим x=5;

assert(x==7);
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
19.09.2013, 21:51     Задача про дату! #7
Дался тебе этот assert
http://www.cyberforum.ru/blogs/18334/blog104.html
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
19.09.2013, 21:56     Задача про дату! #8
Я ссылку давал, там всё расписано. Плюс я ещё повторил:
Цитата Сообщение от AnyOne697 Посмотреть сообщение
void assert ( int ) никаких исключений не бросает, так как это Си, не умеющий кидать исключения, но зато она умеет печатать в stderr и завершать работу.
Она печатает в stderr (std::cerr туда пишет) номер строки, имя файла и завершает работу через void exit ( int ).

Добавлено через 4 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Дался тебе этот assert
http://www.cyberforum.ru/blogs/18334/blog104.html
ОМГ, совершенно бессмысленная вещь. Намакросили ненужных пакостей и выключить никак нельзя. Это требуется в очень редких проектах и обычно там вполне хватает assert'а из <assert.h>. К слову, если непонятно, зачем же используется ассерт, то они используются обычно для автоматического тестирования кода.
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 746
Записей в блоге: 1
19.09.2013, 21:57  [ТС]     Задача про дату! #9
И вот про выше,я к примеру мог передавать параметр month по ссылке.
и ему присваивать,правильно?
и тогда бы вызывал inc(month);
Верно?
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
19.09.2013, 22:00     Задача про дату! #10
Цитата Сообщение от DmitryM5 Посмотреть сообщение
И вот про выше,я к примеру мог передавать параметр month по ссылке.
и ему присваивать,правильно?
и тогда бы вызывал inc(month);
Верно?
Не совсем, тогда надо будет изменить тело int inc ( month ) и убрать возвращаемое значение. К слову, почему бы не начать JAN c нуля (как положено), закончить EMONTH (после DEC) и сделать как-то так:
C++
1
month = ( month + 1 ) % EMONTH
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 746
Записей в блоге: 1
19.09.2013, 22:03  [ТС]     Задача про дату! #11
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Не совсем, тогда надо будет изменить тело int inc ( month ) и убрать возвращаемое значение. К слову, почему бы не начать JAN c нуля (как положено), закончить EMONTH (после DEC) и сделать как-то так:
C++
1
month = ( month + 1 ) % EMONTH
C++
1
2
3
4
5
Month inc(Month & m) {
     m == DEC ? m=JAN : static_cast<Month> (m + 1);
}
 
inc(month);
Вот так бы сработало?
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
19.09.2013, 22:18     Задача про дату! #12
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Вот так бы сработало?
Разве так сложно проверить?.. Нет, не сработал бы. Можно придумать сто и один способ цикличного инкримента, но этот вариант не работает, так как static_cast здесь не нужен ну вообще никак. Любой enum в Си (равно как и в Си++) это typedef EnumName int, собственно, он взаимозаменяем с знаковым целочисленным: простой и дубовый, но очень удобный способ. По крайне менее - так в Си. В Си++ проверка типов немного другая, но это всё лишняя информация.
Собственно, лучшый вариант такой:
C++
1
2
3
4
5
void inc(Month & m) {
     if ( m == DEC ) m = JAN; else m++;
}
 
inc(month);
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 746
Записей в блоге: 1
19.09.2013, 22:45  [ТС]     Задача про дату! #13
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Разве так сложно проверить?.. Нет, не сработал бы. Можно придумать сто и один способ цикличного инкримента, но этот вариант не работает, так как static_cast здесь не нужен ну вообще никак. Любой enum в Си (равно как и в Си++) это typedef EnumName int, собственно, он взаимозаменяем с знаковым целочисленным: простой и дубовый, но очень удобный способ. По крайне менее - так в Си. В Си++ проверка типов немного другая, но это всё лишняя информация.
Собственно, лучшый вариант такой:
C++
1
2
3
4
5
void inc(Month & m) {
     if ( m == DEC ) m = JAN; else m++;
}
 
inc(month);
Ну это можно сказать как массив string?
Вы увеличили m++ т.е. индекс стал больше на единицу и следовательно другой месяц стал?

Добавлено через 9 минут
Просто не пойму в вашем выше коду m=JAN- тут с перечислимым типом вы работаете (string) ,а m++(m=m+1) -тут работа с целым типом(int)...


ой ошибка была с возвращаемым значением.вот так бы сработало думаю.
void inc(Month & m) {
m == DEC ? m=JAN : static_cast<Month> (m + 1);
}

inc(month);
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
19.09.2013, 23:53     Задача про дату! #14
Цитата Сообщение от DmitryM5 Посмотреть сообщение
ой ошибка была с возвращаемым значением.вот так бы сработало думаю.
void inc(Month & m) {
m == DEC ? m=JAN : static_cast<Month> (m + 1);
}
inc(month);
Нет, так не сработает, потому что Вы не инкрементируете, а создаёте новое значение на стеке, только никому его не присваиваете.
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Ну это можно сказать как массив string?
Вы увеличили m++ т.е. индекс стал больше на единицу и следовательно другой месяц стал?
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Просто не пойму в вашем выше коду m=JAN- тут с перечислимым типом вы работаете (string) ,а m++(m=m+1) -тут работа с целым типом(int)...
Забавная аналогия с индексом строки...

Эх, ликбез сложная штука, по хорошему Вас бы отправить читать учебник о Си++.
В общем, обращение по индуксу в Си++ удел новичков, есть более мощный аппарат - итератор. Впрочем, индекс редко используется, если точно знаем, что надо проверять.
По поводу инкримента - причём тут индекс вообще?.. Я же написал, что любой enum - это int. Более того - индекс тоже int. Итераторы - это другое, но индекс именно целочисленный. Операция инкремента ++ - самая обычная операция, имеющая семантику увеличения значения на 1 (ну или переход к следующему объекту/значению у итераторов). Собственно, для целочисленных применяя оператор ++ (оператор инкримента) мы просто увеличиваем его на один.
DmitryM5
Love~
 Аватар для DmitryM5
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 746
Записей в блоге: 1
20.09.2013, 00:11  [ТС]     Задача про дату! #15
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Нет, так не сработает, потому что Вы не инкрементируете, а создаёте новое значение на стеке, только никому его не присваиваете.


Забавная аналогия с индексом строки...

Эх, ликбез сложная штука, по хорошему Вас бы отправить читать учебник о Си++.
В общем, обращение по индуксу в Си++ удел новичков, есть более мощный аппарат - итератор. Впрочем, индекс редко используется, если точно знаем, что надо проверять.
По поводу инкримента - причём тут индекс вообще?.. Я же написал, что любой enum - это int. Более того - индекс тоже int. Итераторы - это другое, но индекс именно целочисленный. Операция инкремента ++ - самая обычная операция, имеющая семантику увеличения значения на 1 (ну или переход к следующему объекту/значению у итераторов). Собственно, для целочисленных применяя оператор ++ (оператор инкримента) мы просто увеличиваем его на один.
Сложно это все,ну частично понял
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2013, 02:07     Задача про дату!
Еще ссылки по теме:

Задача про триугольник C++
Задача про гостей C++
C++ Задача про фермера
C++ Задача про метеостанции
C++ Определить дату следующего дня (задача)

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

Или воспользуйтесь поиском по форуму:
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
20.09.2013, 02:07     Задача про дату! #16

Не по теме:

Цитата Сообщение от DmitryM5 Посмотреть сообщение
Сложно это все,ну частично понял
Продолжайте писать код. Пишите. Много пишите. Читайте. Много читайте. Читайте Седжвика, Страуструпа, можно и Шилдта почитать. Когда там всё станет понятно, рекомендую Коплиена - интересные нестандартные подходы к программированию на Си++. И снова пишите код. Много пишите. Очень много пишите. Чем больше кода - тем лучше. Вы сами поймёте, когда стоит остановиться и начать думать, а пока просто пишите код. Будут проблемы - пишите здесь. Иными словами - Вы пока что на правильном пути.

Знал и знаю некоторых людей, которые совсем не глупы, а наоборот - очень смышлённые и многое даётся им легко (особенно позавидовал бы их способности к язкам, способность запоминать), но они настолько ленивы, что программирование им даётся с трудом, просто потому, что они не пишут код, не учаться.

Но есть один момент, без которого количество не станет качество - нужно критично относиться к своему коду. Важно считать свой код гавном. Только тогда когда-нибудь возможно истинное прозрение. Но и тогда важно считать свой код гавном. Иначе - прогресс остановиться, а деградация не останавливается никогда. Да и сами технологии не стоят на месте.

Извините, наболело.



Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Когда там всё станет понятно, рекомендую Коплиена - интересные нестандартные подходы к программированию на Си++
Наверное погорячился. Можно читать её и раньше. Просто язык не очень простой, но это очень сильная книга, хоть и старовата.

Yandex
Объявления
20.09.2013, 02:07     Задача про дату!
Ответ Создать тему
Опции темы

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