0 / 0 / 0
Регистрация: 26.12.2018
Сообщений: 11
1

Вычислить дату следующего дня, предыдущего дня и число дней в месяце

26.12.2018, 17:29. Показов 3232. Ответов 2

Дата некоторого дня характеризуется трема натуральными числами - a (год), b (номер месяца), c (число месяца). Необходимо вычислить дату следующего дня, предыдущего дня и найти функцию, которая подсчитывает кол.во дней в том или ином месяце.

Готового когда у меня нет, ибо я не знаю как реализовать эту программу на языке C. Прошу помочь с решением этой проблемы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2018, 17:29
Ответы с готовыми решениями:

Определить дату следующего дня. Количество дней месяца определять функцией
Дата некоторого дня характеризуется тремя числами: G - год, M - номер месяца, D - число месяца....

Определить дату предыдущего дня и дату следующего дня
Условие 1::O_O: Дата некоторого дня определяется двумя натуральными числами m(порядковый номер...

Определить дату следующего (предыдущего) дня
Написать программу, определяющую: -дату следующего(предыдущего) дня -дату которая наступит через...

Дата некоторого дня определяется двумя натуральными числами, найти дату предыдущего дня
Дата некоторого дня определяется двумя натуральными числами m (порядковый номер месяца) и n...

2
1850 / 1073 / 681
Регистрация: 25.04.2016
Сообщений: 3,020
27.12.2018, 21:49 2
Лучший ответ Сообщение было отмечено NzKz как решение

Решение

Все случаи не проверял, потестируйте сами. Программа вычисляет дату следующего дня:

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
#include <stdio.h>
/* ************* проверка на високосность ************* */
int check (int year) { return (year%4 == 0 && year%100 != 0 || year%400 == 0); }
 
int main (void)
{
    int a, b, c;
    printf("Input date (Year, Month, Day): ");
    scanf("%d%d%d", &a,&b,&c);
    if (a<0 || b<0 || c<0) return 1;
 
    int vis[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    int novis[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
    int * months = check(a)? vis : novis;
    int key = b-1;
 
    if (c == 29)
        if (key == 1) { c=1; b=3; }
        else c++;
    else if (key < 11)
        if (c+1 > months[key]) { c=1; b++; }
        else c++;
    else
        if (c+1 > months[key]) { a++; c=b=1; }
        else c++;
 
    printf("Next date is %d %d %d\n", a,b,c);
    return 0;
}
Вам остается лишь по аналогии дописать вариант для вычисления предыдущей даты. Для подсчета числа дней в том или ином месяце, достаточно вывести на экран months[key].

при желании можно, например, проверку введенной даты добавить:
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
#include <stdio.h>
#define DOEXIT printf("Wrong date!\n"); return 1;
/* ******** число дней в месяце такого-то года ******** */
int days (int month, int year)
{
    int key = month-1;
    int months[12] = { 31,0,31,30,31,30,31,31,30,31,30,31 };
    months[1] = (year%4 == 0 && year%100 != 0 || year%400 == 0)? 29 : 28;
    return months[key];
}
 
int main (void)
{
    int a, b, c;
    printf("Input date (Year, Month, Day): ");
    scanf("%d%d%d", &a,&b,&c);
 
    // проверка входящих данных
    if (a<0 || b<1 || b>12 || c<1) { DOEXIT }
    if (c > days(b, a)) { DOEXIT }
 
    if ((c==29 && b==2) || (b<12 && c+1 > days(b, a))) { c=1; b++; }
    else if (b==12 && c+1 > days(b, a)) { a++; c=b=1; }
    else c++;
 
    printf("Next date is %d %d %d\n", a,b,c);
    return 0;
}
2
1850 / 1073 / 681
Регистрация: 25.04.2016
Сообщений: 3,020
09.01.2019, 17:49 3
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
#include <stdio.h>
 
#define DOEXIT printf("Wrong date!\n"); return 1;
 
int days (int month, int year)
{
    int key = month-1;
    int months[12] = { 31,0,31,30,31,30,31,31,30,31,30,31 };
    months[1] = (year%4 == 0 && year%100 != 0 || year%400 == 0)? 29 : 28;
    return months[key];
}
 
int main (void)
{
    int a, b, c;
    printf("Input date (Year, Month, Day): ");
    scanf("%d%d%d", &a,&b,&c);
 
    // проверка входящих данных
    if (a<1 || b<1 || b>12 || c<1) { DOEXIT }
    if (c > days(b, a)) { DOEXIT }
 
    // следующий день
    int nexta = a, nextb = b, nextc = c;
    if (b<12 && c+1 > days(b, a)) { nextc=1; nextb++;}
    else if (b==12 && c+1 > days(b, a)) { nexta++; nextc=nextb=1; }
    else nextc++;
 
    // предыдущий день
    int preva=a, prevb=b, prevc=c;
    if (b>1 && c-1 < 1) prevc = days(--prevb, preva);
    else if (b == 1 && c-1 < 1) prevc = days((prevb=12), --preva);
    else prevc--;
 
    printf("Next date is       %d %d %d\n", nexta,nextb,nextc);
    printf("Current date is    %d %d %d\n", a,b,c);
    printf("Previous date is   %d %d %d\n", preva,prevb,prevc);
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2019, 17:49
Помогаю со студенческими работами здесь

Получить номер дня и месяца и определить дату следующего дня (считая, что год невисокосный)
Всем привет! Буду очень благодарен если поможете составить программу в PascalABC. Условие звучит...

Вычислить дату следующего дня
Написать программу, которая вычисляет дату следующего дня. Ниже представлен рекомендуемый вид...

Для заданной даты "дд.мм.гггг" определить дату предыдущего и следующего дня
Есть код для текущей даты (показывает дату вчерашнего и завтрашнего дня). Подскажите код для...

По дате (число, месяц, год) определить дату следующего дня
1. По дате (число, месяц, год) определить дату следующего дня. Пользоваться оператором CASE ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru