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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 839
Записей в блоге: 1
#1

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

19.09.2013, 20:57. Просмотров 625. Ответов 15
Метки нет (Все метки)

Три файла:
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");
    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 20:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача про дату! (C++):

Определить дату следующего дня (задача) - C++
По дате (день:месяц:год) определить и вывести дату следующего дня (учитывать вариант високосного года). Используя switch.

Задача про биты - C++
Написать функцию, которая возвращает число, полученное из числа X,в котором все розряды, расположенные правее центральной позиции, заменены...

Задача про шахматы - C++
Все доброго времени. Помогите пожалуйста с заданием. Нужно с помощью двумерного массива вывести на экран шахматную доску с...

Задача про рюкзак - C++
Всем привет! Есть программа, которая решает задачу про рюкзак. Когда у меня количество &quot;предметов&quot; 5 или 10, то все работает хорошо....

Задача про кузнечиков - C++
Даны n последовательных столбиков. Кузнечик находится на первом столбе, умеет прыгать на 1,2,...,k столбиков. Найти количество вариантов,...

Задача про яйца - C++
Привет всем. Дана такая задача. У вас есть n яиц и вы живете в k-этажном доме. Какое наименьшее число попыток потребуется для того,...

15
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
19.09.2013, 21:19 #2
Bash
1
2012 2 1Для продолжения нажмите любую клавишу . . .
Цитата Сообщение от DmitryM5 Посмотреть сообщение
cout месяц не тот выводит....
"не тот" это какой именно не тот?
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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;
    }
Вроде всё правильно... Попробуй дебагером зайти.
1
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 839
Записей в блоге: 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...
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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 минуты
Собственно, вариант без звёздочек =)
1
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 839
Записей в блоге: 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);
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
19.09.2013, 21:51 #7
Дался тебе этот assert
http://www.cyberforum.ru/blogs/18334/blog104.html
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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>. К слову, если непонятно, зачем же используется ассерт, то они используются обычно для автоматического тестирования кода.
1
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 839
Записей в блоге: 1
19.09.2013, 21:57  [ТС] #9
И вот про выше,я к примеру мог передавать параметр month по ссылке.
и ему присваивать,правильно?
и тогда бы вызывал inc(month);
Верно?
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
19.09.2013, 22:00 #10
Цитата Сообщение от DmitryM5 Посмотреть сообщение
И вот про выше,я к примеру мог передавать параметр month по ссылке.
и ему присваивать,правильно?
и тогда бы вызывал inc(month);
Верно?
Не совсем, тогда надо будет изменить тело int inc ( month ) и убрать возвращаемое значение. К слову, почему бы не начать JAN c нуля (как положено), закончить EMONTH (после DEC) и сделать как-то так:
C++
1
month = ( month + 1 ) % EMONTH
0
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 839
Записей в блоге: 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);
Вот так бы сработало?
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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);
1
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 839
Записей в блоге: 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);
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
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 (ну или переход к следующему объекту/значению у итераторов). Собственно, для целочисленных применяя оператор ++ (оператор инкримента) мы просто увеличиваем его на один.
1
DmitryM5
Love~
51 / 51 / 3
Регистрация: 27.08.2013
Сообщений: 839
Записей в блоге: 1
20.09.2013, 00:11  [ТС] #15
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Нет, так не сработает, потому что Вы не инкрементируете, а создаёте новое значение на стеке, только никому его не присваиваете.


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

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

Задача про небоскребы - C++
В небоскребе N этажей и всего один подъезд; на каждом этаже по 3 квартиры; лифт может останавливаться только на нечетных этажах....

Задача про зайца - C++
В небольшой посадке живет заяц. Выскочив из норы и бегая по снегу, он оставил следы. Определить где находится заяц. ВХОДНЫЕ ДАНЫЕ Карта...

Задача про матрицу - C++
Вообщем завтра сдать надо бы по хорошему. Мне осталось сделать 1 задачу, которую я не знаю как делать. Может напишет кто-нибудь,...

Задача про календарь - C++
Имеется задача: Два одноклассника Петя и Вася родились не ранее 1993 и не позднее 1994 года, причем, Петя старше Васи. Напишите...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
20.09.2013, 00:11
Ответ Создать тему
Опции темы

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