Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > С++ Задача про даты.Срочно нужна помощь на завтра


Автор: ArgoNKS 3.12.2013, 19:24
Помогите пожалуйста написать задачу на С++

Дата некоторого дня характеризуется тремя натуральными числами: g (год), m (порядковый номер месяца) и n (число). По заданным g, n и m определить: а)    дату предыдущего дня; б)    дату следующего дня. Определить функцию,
вычисляющею количество дней в том или ином месяце.

Автор: rudolfninja 4.12.2013, 08:47
Вот код находящий дату следующего дня и функции, вычисляющей количество дней в определенном месяце.
Код

#include <iostream>

int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int DaysInMonth(int m) {return daysInMonth[m-1];}

int _tmain(int argc, _TCHAR* argv[])
{
    int g, m, n;
    std::cin >> n >> m >> g;
    int nextDay, nextMonth, nextYear;
    if(n == daysInMonth[m-1])
    {
        nextDay = 1;
        if(m == 12)
        {
            nextMonth = 1;
            nextYear = ++g;
        }
        else
        {
            nextMonth = ++m;
            nextYear = g;
        }
    }
    else
    {
        nextDay = ++n;
        nextMonth = m;
        nextYear = g;
    }

    std::cout << nextDay << '.' << nextMonth << '.' << nextYear << std::endl;
    return 0;
}

Код простой, поэтому в комментариях не нуждается. Дату нахождения предыдущего дня сделаешь сам, аналогично дате нахождения следующего дня.
P.S. в коде нет проверки на ввод неверной даты или передачи неверного месяца в функцию. В случае необходимости, сделаешь сам.

Автор: ArgoNKS 4.12.2013, 10:15
Спасибо за помощь)

Автор: volatile 4.12.2013, 10:50
Цитата(rudolfninja @  4.12.2013,  08:47 Найти цитируемый пост)
Вот код находящий дату следующего дня 

а високосы где? 

Автор: bsa 4.12.2013, 11:05

M
bsa
Для домашних заданий, курсовых и т.п. существует \"Центр Помощи\".




Тема перенесена. 

Автор: rudolfninja 4.12.2013, 11:06
Цитата(volatile @  4.12.2013,  10:50 Найти цитируемый пост)
а високосы где?  


Забыл добавить, что не делал проверку на високосный год. Я думаю, что автор темы сам сможет добавить проверку, чтоб год был кратен 4.
Надо тогда, наверное, создать еще 1 массив и переименовать первый

Код

int daysInMonthWithoutLeapYear[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int daysInMonthWithLeapYear[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

А в функции main делать так:

Код

int* daysInMonth = (g%4) ? daysInMonthWithoutLeapYear: daysInMonthWithLeapYear;


Примерно так

Автор: darkart 4.12.2013, 11:14
Бред сивой кобылы was here.

Автор: Pawl 4.12.2013, 11:54
Цитата(darkart @  4.12.2013,  11:14 Найти цитируемый пост)
((g%4)&&(!(g%100))||(g%400)) 

проверки целочисленного деления на 100 и 400 излишни. нет числа, которое бы делилось на 100 и тем более на 400, не делясь при этом на 4.
Ред. Пардон, не заметил восклицательного знака!

Автор: volatile 5.12.2013, 10:16
Всё неправильно.  smile 

Цитата(darkart @  4.12.2013,  11:14 Найти цитируемый пост)
 ((g%4)&&(!(g%100))||(g%400)) ? 

такие формулы вообще лучше никогда не юзать, так ошибиться в них очень лекго,  а заметить практически невозможно
что мы здесь и видим.

http://forum.vingrad.ru/forum/topic-199367/15.html

Автор: darkart 8.12.2013, 22:30
Цитата(volatile @  5.12.2013,  10:16 Найти цитируемый пост)
такие формулы вообще лучше никогда не юзать, так ошибиться в них очень лекго,  а заметить практически невозможно
что мы здесь и видим.


Воистину так...

Код

int daysInMonth* = ( ( ( g%4 == 0 ) && ( g%100 != 0 ) ) || ( g%400 == 0 ) )? daysInMonthWithLeapYear: daysInMonthWithoutLeapYear;


Автор: ФедосеевПавел 9.12.2013, 11:22
Последнее время такие задачи я решаю с помощью математического аппарата http://ru.wikipedia.org/wiki/Юлианская_дата.
Это проще и легче реализовать на ассемблероподобных языках со слабо развитыми типами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)