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

Даты ввод вывод разность - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Наташа2009
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 6
15.03.2009, 18:35     Даты ввод вывод разность #1
Нужно написать программу, которая принимает от пользователя 2 даты-строки вида- ЦЦ. ЦЦ. ЦЦЦЦ, где Ц-это любая цифра из диапазона(0-9). Далее она вычисляет полное количество дней, прошедших между введенными датами и выводит на экран.


ПОМОГИТЕ, ВЫ ЖЕ ОЧЕНЬ УМНЫЕ, я знаю!Вам это ничего не стоит, а я "погибаю"....
Наташа.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2009, 18:35     Даты ввод вывод разность
Посмотрите здесь:

C++ Вывод даты, времени в лог
C++ Структура tm. Вывод даты.
C++ Ввод даты
Вывод даты С++. C++
C++ Вывод на экране текущей даты
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Illustris
15.03.2009, 19:25
  #2

Не по теме:

Вы наверно думаете что если написать под женским ником, то все кинутся решать ваши проблемы?

G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
15.03.2009, 23:08     Даты ввод вывод разность #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
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
#include <cstdlib>
#include <iostream>
#include <windows.h>
 
 
using namespace std;
 
 
int main(int argc, char *argv[])
{
    int day,month,year,day1,month1,year1;/*dannye nachala/konca otscheta*/
    int god[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
/*vood dannyh*/ 
 
/*nachal'nye den'/mesyac/god*/
 
    cout << "in\nday:";
    cin >>  day;
    cout << "month:";
    cin >> month;
    cout << "year:";
    cin >> year;
    
/*konechnye den'/mesyac/god*/
    
    cout << "out\nday:";
    cin >> day1;
    cout << "month:";
    cin >> month1;
    cout << "year:";
    cin >> year1;
    
/*podschet dney*/   
 
    int summa = 0;/*obschaya summa dney*/
 
/*podschet dney v nachal'nom gode*/ 
 
    for (int i = month; i <=11; i++)
        summa = summa + god[i];
    
    if (year%4 == 0) /*proverka na vysokosnost' nachal'nogo goda*/
        summa++;
 
    summa = summa - day;
    
/*podschet dney m konechnom gode*/
    
    for (int i = 0; i < month1; i++)
            summa = summa + god[i];
            
    if (year1%4 == 0) /*proverka na vysokosnost' konechnogo goda*/
        summa++;
    
    summa = summa + day1;
    
/*vycheslenie kolichestva dney mejdu nachal'nym i konechnym godom*/ 
 
    if (year1 - year > 1)
    {
        int raznica = year; /*raznica mejdu nachal'nym i konechnym godom*/
        
        for(int i = 1; i < year1 - year; i++)
        {
            raznica = raznica + 1;
            
            for(int j = 0; j <= 11; j++)
                summa = summa + god[j];
                
            if (raznica%4 == 0) /*proverka na vysokosnost'*/
                summa++;
        }
    }
    
    cout << summa << "\n";
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
громоздко и я уверен, что есть более простой способ...но я пока сам тока учусь
Наташа2009
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 6
16.03.2009, 08:05  [ТС]     Даты ввод вывод разность #4
Illustris очень жаль, что вы не верите людям, и просто по-человечески не можете им помочь.
P.S. Наташа-мое настоящее имя!
Вертолётчик
1 / 1 / 0
Регистрация: 01.12.2008
Сообщений: 113
16.03.2009, 09:28     Даты ввод вывод разность #5
Цитата Сообщение от Illustris Посмотреть сообщение

Не по теме:

Вы наверно думаете что если написать под женским ником, то все кинутся решать ваши проблемы?

Ну судя по результату- ответ да.
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
16.03.2009, 09:45     Даты ввод вывод разность #6
а по теме есть идеи как сделать более компактным решение данной задачи? пораграммлю из под Dev-Cpp, может есть какие нибудь другие решения?
Вертолётчик
1 / 1 / 0
Регистрация: 01.12.2008
Сообщений: 113
16.03.2009, 09:47     Даты ввод вывод разность #7
Цитата Сообщение от G-Cat Посмотреть сообщение
а по теме есть идеи как сделать более компактным решение данной задачи? пораграммлю из под Dev-Cpp, может есть какие нибудь другие решения?
Может функция есть , которая дату в секунды переводит
Illustris
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 8
16.03.2009, 12:54     Даты ввод вывод разность #8
Я попытался написать эту задачу на c++ но споткнулся об работу со строками... (в с# с этим гораздо проще)
У меня появился вопрос, как разбить строку на составляющие...
input: dd.mm.yyyy
мне надо присвоить int переменным значения dd, mm и yyyy
Наташа2009
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 6
16.03.2009, 13:43  [ТС]     Даты ввод вывод разность #9
Цитата Сообщение от Вертолётчик Посмотреть сообщение
Ну судя по результату- ответ да.
Да что такого, что я девушка?!)))
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
16.03.2009, 14:19     Даты ввод вывод разность #10
Цитата Сообщение от Наташа2009 Посмотреть сообщение
Да что такого, что я девушка?!)))
Большинство девушек с компьютером ну никак не ладят даже на пользовательском уровне, а тут программинг
Наташа2009
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 6
16.03.2009, 14:44  [ТС]     Даты ввод вывод разность #11
Цитата Сообщение от Бартимеус Посмотреть сообщение
Большинство девушек с компьютером ну никак не ладят даже на пользовательском уровне, а тут программинг
Ну так и я не в ладах с программированием, вот поэтому и прошу помощи у людей, которые в этом деле "дышат полной грудью")))
Zeag
2 / 2 / 0
Регистрация: 09.03.2009
Сообщений: 13
16.03.2009, 20:25     Даты ввод вывод разность #12
Для расчета разницы дат еще есть очень полезная штука -- юлианские даты (JD). Применяются в астрономии. Дата приводится к числу дней после заданной, после чего остается вычесть одно из другого. Вот программка-тест, еще в 1995 написанная.
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
/*
* Advance date to +/- N days using Julian dates.
* 25.01.95 15:38
*/
 
#include <stdio.h>
#include <dos.h>
 
#define INT(a) (long)(a)
#define FRAC(a) ((a)-INT(a))
 
void date_new(struct date *dt, long days)
{
double JD, JD1, F, Y, M, D, Mn, A, B, C, E, Q, Z, y, m, IsGrig;
 
Y = dt->da_year;
M = dt->da_mon ;
D = dt->da_day ;
 
/* --- Only after 1582, Oct 15 --- */
/*
JD = 367*Y - INT( 7 * (Y + INT( (M+9)/12 )) / 4) +
INT(275 * M/9) + D + 1721013.5;
*/
 
if(INT(M) > 2) { y = Y; m = INT(M); }
else { y = Y-1; m = INT(M)+12; } /* относим к предыдущему году */
 
IsGrig = ((Y*100)+INT(M))*100+D;
 
if(IsGrig > 15821015L) /* григорианская дата */
{ A = INT(y/100); B = 2 - A + INT(A/4); }
 
JD = INT(365.25*y) + INT(30.6001 * (m+1)) + D + 1720994.5;
 
if(IsGrig > 15821015L) JD += B; /* исх. дата - григорианская */
 
JD += days; /* Add period and convert back to DMY */
 
JD1 = JD + 0.5;
Z = INT (JD1);
F = FRAC(JD1);
 
if(Z < 2299161L) A = Z;
else {
Q = INT( (Z - 1867216.25) / 36524.25);
A = Z + 1 + Q - INT(Q/4);
}
 
B = A + 1524;
C = INT((B - 122.1)/365.25);
D = INT(365.25*C);
E = INT((B - D) / 30.6001);
 
M = (E <= 13) ? E - 1 : E - 13; /* месяц */
Mn = B - D - INT(30.6001 * E) + F; /* число (с дес. долями) */
Y = (M > 2.5) ? C - 4716 : C - 4715; /* год */
 
dt->da_day = INT(Mn);
dt->da_mon = M;
dt->da_year = Y;
}
 
#ifdef TEST
 
void main(void)
{
struct date dt;
 
getdate(&dt);
printf("Current date is %02d.%02d.%04d\n", dt.da_day, dt.da_mon, dt.da_year);
date_new(&dt, 1802); /* For 25.01.95 --> 01.01.2000 */
printf("Date%+6ld days is %02d.%02d.%04d\n", 1802L, dt.da_day, dt.da_mon, dt.da_year);
 
getdate(&dt);
date_new(&dt, -25); /* For 25.01.95 --> 31.12.1994 */
printf("Date%+6ld days is %02d.%02d.%04d\n", -26L, dt.da_day, dt.da_mon, dt.da_year);
}
 
#endif
На Borland C можно еще так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
* Advance date to +/- N days.
* (written by KIO -- 24.01.95 19:50)
*/
 
#include <stdio.h>
#include <time.h>
#include <dos.h>
 
void main(void)
{
long days = 1802; /* Must be long ! (or cast need) */
time_t first, second;
struct tm *tblock;
 
first = time(NULL); /* Gets system time in seconds */
second = first + days*24*60*60; /* Add N days */
 
tblock = localtime(&second); /* Converts date/time to a structure */
 
printf("New date/time is: %s", asctime(tblock)); /* Print out */
}
Humanitis
 Аватар для Humanitis
170 / 162 / 5
Регистрация: 12.01.2009
Сообщений: 430
16.03.2009, 21:30     Даты ввод вывод разность #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#define uint unsigned int
int count_day_in_months[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
 
    uint date_to_uint(uint day,uint month,uint year)
    {
        uint days_in_months=count_day_in_months[month-1];
        if(!(year%4)&&month>2)
            days_in_months++;   
        return (year-1)*365.25+days_in_months+day-1;
    }
 
int main()
{
    std::cout<<date_to_uint(12,3,1981)-date_to_uint(12,3,1980)<<'\n';
    system("pause");
    return 0;
}
Illustris
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 8
17.03.2009, 01:07     Даты ввод вывод разность #14
Может я не правильно понял код... но мне показалось что он не считает с 100% точностью.

Добавлено через 29 минут 47 секунд
Разобрался в коде
Классное решение!
Можно только узнать зачем использовать unsigned int вместо обычного? (в этом конкретном случае)
Humanitis
 Аватар для Humanitis
170 / 162 / 5
Регистрация: 12.01.2009
Сообщений: 430
17.03.2009, 08:23     Даты ввод вывод разность #15
ох,в другой задаче использовал эту функцию.там это нужно было
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2010, 10:59     Даты ввод вывод разность
Еще ссылки по теме:

Как организовать ввод в консольную строку даты в виде: dd/mm/yyyy C++
Календарь. Ввод даты - вывод дня недели C++
C++ Потокобезопасный вывод даты

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

Или воспользуйтесь поиском по форуму:
neoMitya
24 / 24 / 1
Регистрация: 27.10.2009
Сообщений: 81
19.03.2010, 10:59     Даты ввод вывод разность #16
вот взял на себя смелость доработать код G-Cat'а. Два варианта, побольше и поменьше, кому что будет интереснее.
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
        TDateTime *dt1=new TDateTime(), *dt2=new TDateTime();
        *dt1=DateTimePicker1->Date;   //Узнаем дату
        *dt2=DateTimePicker2->Date;   //Узнаем дату
 
        Word day, month, year, day1, month1, year1, day2, month2, year2;//dannye nachala/konca otscheta
        int god[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int god1[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
        DecodeDate(*dt1, year, month, day);
        DecodeDate(*dt2, year1, month1, day1);
 
        int summa = 0;//obschaya summa dney
 
     if ((year1 - year) < 0)
     {
       year2 = year1;
       year1 = year;
       year = year2;
       month2 = month1;
       month1 = month;
       month = month2;
       day2 = day1;
       day1 = day;
       day = day2;
     }
     if ((year1 == year)&&((month1 - month) < 0))
     {
       month2 = month1;
       month1 = month;
       month = month2;
       day2 = day1;
       day1 = day;
       day = day2;
     }
 
     if (year1 - year >= 1)
     {
        //podschet dney v nachal'nom gode
        for (int i = month; i <=11; i++)
                summa = summa + god[i];
 
        if ((IsLeapYear(year) == true)&&(month <= 2)) //proverka na vysokosnost' nachal'nogo goda
                summa++;
        if ((IsLeapYear(year) == true)&&(month == 2)&&(day == 29)) //proverka na vysokosnost' nachal'nogo goda
                summa--;
 
        summa = summa - day;
 
        //podschet dney m konechnom gode
        for (int i = 0; i < month1; i++)
                        summa = summa + god[i];
 
        if ((IsLeapYear(year1) == true)&&(month1 > 2)) //proverka na vysokosnost' konechnogo goda
                summa++;
 
        summa = summa + day1;
     }
 
     if (year1 - year == 0)
     {
        if ((IsLeapYear(year) == true)) //proverka na vysokosnost' goda
        {
           //podschet dney v vysokosnom gode
           for (int i = day; i < god1[month - 1]; i++)
                summa++;
           for (int i = 1; i <= day1; i++)
                summa++;
           if((month1 - month) > 1)
              for (int i = month; i < month1 - 1; i++)
                   summa = summa + god1[i];
        }
        else if ((IsLeapYear(year) != true)) //proverka na vysokosnost' goda
        {
           //podschet dney v gode
           for (int i = day; i < god[month - 1]; i++)
                summa++;
           for (int i = 1; i <= day1; i++)
                summa++;
           if((month1 - month) > 1)
              for (int i = month; i < month1 - 1; i++)
                   summa = summa + god[i];
        }
        if (month == month1) //proverka na vysokosnost' goda
        {
           summa = 0;
           //podschet dney v gode
           for (int i = day; i < day1; i++)
                summa++;
        }
     }
 
//vycheslenie kolichestva dney mejdu nachal'nym i konechnym godom
     if (year1 - year > 1)
     {
        int raznica = year; //raznica mejdu nachal'nym i konechnym godom
 
        for(int i = 1; i < year1 - year; i++)
        {
            raznica = raznica + 1;
 
            for(int j = 0; j <= 11; j++)
                summa = summa + god[j];
 
            if (IsLeapYear(raznica) == true) //proverka na vysokosnost'
                summa++;
        }
     }
     Label1->Caption = summa;
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
        TDateTime *dt1=new TDateTime(), *dt2=new TDateTime();
        *dt1=DateTimePicker1->Date;   //Узнаем дату
        *dt2=DateTimePicker2->Date;   //Узнаем дату
 
        Word day, month, year, day1, month1, year1, day2, month2, year2;//dannye nachala/konca otscheta
 
        DecodeDate(*dt1, year, month, day);
        DecodeDate(*dt2, year1, month1, day1);
 
     if ((year1 - year) < 0)
     {
       year2 = year1;
       year1 = year;
       year = year2;
       month2 = month1;
       month1 = month;
       month = month2;
       day2 = day1;
       day1 = day;
       day = day2;
     }
     if ((year1 == year)&&((month1 - month) < 0))
     {
       month2 = month1;
       month1 = month;
       month = month2;
       day2 = day1;
       day1 = day;
       day = day2;
     }
        *dt1 = EncodeDate(year, month, day);
        *dt2 = EncodeDate(year1, month1, day1);
 
        Label1->Caption=(DaysBetween(*dt1, *dt2));
так работает точно правильно
Yandex
Объявления
19.03.2010, 10:59     Даты ввод вывод разность
Ответ Создать тему
Опции темы

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