Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2016, 16:32   #1
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию Найти сколько дней прошло от одной даты до другой (структуры)

Решите следующую задачу, используя структуры. При решении задачи использовать функции:

Даны две даты в виде «dd.mm.yyyy». Найти сколько дней прошло от одной
даты до другой.
ggjgj вне форума Ответить с цитированием
Старый 09.12.2016, 20:02   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
//g++  4.9.3

#include <iostream>
#include <locale>

#include <boost/date_time/gregorian/gregorian.hpp>
int main()
{
    
    std::cin.imbue(std::locale(std::cin.getloc(), new boost::gregorian::date_input_facet("%d.%m.%Y")));
    boost::gregorian::date d1;
    boost::gregorian::date d2;
    std::cin >> d1 >> d2;
    if (d1 > d2)
        std::swap(d1, d2);
    std::cout << (d2 - d1);
}
http://rextester.com/YTEQH63015
Croessmah вне форума Ответить с цитированием
Старый 09.12.2016, 22:47   #3
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Хорошее решение, красивое!

Цитата:
Сообщение от ggjgj Посмотреть сообщение
Решите следующую задачу, используя структуры. При решении задачи использовать функции:
Только вряд ли его зачтут педагоги, придумавшие эту задачу.
Тем более, что они, судя по всему, имели в виду классический C, а не C++
olej.tsil вне форума Ответить с цитированием
Старый 09.12.2016, 22:49   #4
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от olej.tsil Посмотреть сообщение
Только вряд ли его зачтут педагоги, придумавшие эту задачу.
Всё зависит от препода.
Croessmah вне форума Ответить с цитированием
Старый 13.12.2016, 17:33   #5
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию

А можете прокомментировать ваши действия в программе? Не очень понятно, если честно
ggjgj вне форума Ответить с цитированием
Старый 13.12.2016, 19:07   #6
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от ggjgj Посмотреть сообщение
Не очень понятно, если честно
Я бы даже предположил, что абсолютно ничего не понятно
olej.tsil вне форума Ответить с цитированием
Старый 14.12.2016, 18:49   #7
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию

Как сделать так ,что бы все таки было
Код:

Код:
struct date

пробовал набросать,но как закончить и вообще собрать программу ,как то затруднительно 

Код:

#include<iostream>
#include<string>
using namespace std;
struct date{
int day;
int month;
int year;
};
bool vis(int y){
return (y%4==0 && y%100!=0)|| y%400==0;
}
int EndofMonth(int m,int y){
switch(m){
case 1: case 3: case 5:
case 7:case 8: case 10: case 12: return 31;
case 4:case 6: case 9: case 11:return 30;
case 2: if(vis(y)) return 29;
else return 28;
 
}
}
 
int main(){
date one, two;
one=two;
cin>>one.day>>one.month>>one.year;
cin>>two.day>>two.month>>two.year;
cout<<..;
return 0;
}

Последний раз редактировалось Аватар; 14.12.2016 в 19:14.
ggjgj вне форума Ответить с цитированием
Старый 14.12.2016, 20:31   #8
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от ggjgj Посмотреть сообщение
Как сделать так ,что бы все таки было
1. Я уже здесь кому-то отвечал: Никогда! Никогда!! Никогда!!! - не устраивайте свой "ручной" календарь ... с 30/31, 265/266 ... и прочими деталями как вы их сами себе (неправильно) представляете.
Пользуйтесь только библиотечными функциями даты/времени, которых более чем достаточно.

2. Если вас не устраивает решение на C++ с библиотекой Boost (вполне приличное!), или нужно только C, то попробуйте вот такое решение с POSIX C библиотечными функциями:
Код:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

// Даны две даты в виде «dd.mm.yyyy».
// Найти сколько дней прошло от одной даты до другой. 

time_t normalize( struct tm *date ) {
   time_t t = mktime( date );
   *date = *localtime( &t );
   return t;
} 

int main( int argc, char **argv ) {
   if( argc != 3 ) printf( "число параметров\n" ), exit( 1 ); 
   struct tm date[ 2 ] = { {}, {} }; 
   time_t t[ 2 ]; 
   for( int i = 0; i < 2; i++ ) {
      int num = 0;
      char *token = strtok( argv[ i + 1 ], "." );
      while( token != 0 ) {
         if( 0 == atoi( token ) ) printf( "формат даты\n" ), exit( 1 );
         switch( num++ ) {
            case 0: date[ i ].tm_mday = atoi( token ); break;   
            case 1: date[ i ].tm_mon = atoi( token ) - 1; break;
            case 2: date[ i ].tm_year = atoi( token ) - 1900; break;
            default: printf( "формат даты\n" ), exit( 1 );
         }
         token = strtok( NULL, "." );
      }
      if( num != 3 ) printf( "формат даты\n" ), exit( 1 );
      t[ i ] = normalize( date + i ); 
      printf( "%s дата:\t%s", i ? "конечная" : "начальная", asctime( &date[ i ] ) );
   }
   if( t[ 1 ] < t[ 0 ] ) printf( "последовательность дат\n" ), exit( 1 );
   unsigned day = 0;
   while( date[ 0 ].tm_year < date[ 1 ].tm_year ) {
      struct tm last = {       
         .tm_mday = 31, .tm_mon = 11, .tm_year = date[ 0 ].tm_year
      };
      normalize( &last );
      day += last.tm_yday - date[ 0 ].tm_yday + 1;
      date[ 0 ].tm_mday = 1; date[ 0 ].tm_mon = 0;
      date[ 0 ].tm_year = date[ 0 ].tm_year + 1;
      normalize( date );
   } // пока годы различаются
   day += date[ 1 ].tm_yday - date[ 0 ].tm_yday; 
   printf( "между ними дней: %d\n", day ); 
   return 0;
}
Здесь (чтоб не показалось много) большая часть - это форматирование даты в удобном вам формате, а само вычисление - порядка 14 строк.
Напоминание:
Код:
          struct tm {
               int tm_sec;    // Seconds (0-60)   
               int tm_min;    // Minutes (0-59)   
               int tm_hour;   // Hours (0-23)   
               int tm_mday;   // Day of the month (1-31)   
               int tm_mon;    // Month (0-11)   
               int tm_year;   // Year - 1900   
               int tm_wday;   // Day of the week (0-6, Sunday = 0)   
               int tm_yday;   // Day in the year (0-365, 1 Jan = 0)   
               int tm_isdst;  // Daylight saving time   
           };
Обратите внимание на результаты:
Код:
[olej@dell time]$ ./difd 01.01.2015 01.01.2016
начальная дата: Thu Jan  1 00:00:00 2015
конечная дата:  Fri Jan  1 00:00:00 2016
между ними дней: 365
[olej@dell time]$ ./difd 01.01.2016 01.01.2017
начальная дата: Fri Jan  1 00:00:00 2016
конечная дата:  Sun Jan  1 00:00:00 2017
между ними дней: 366
[olej@dell time]$ ./difd 01.01.2000 01.01.2001
начальная дата: Sat Jan  1 00:00:00 2000
конечная дата:  Mon Jan  1 00:00:00 2001
между ними дней: 366
[olej@dell time]$ ./difd 01.01.1900 01.01.1901
начальная дата: Mon Jan  1 00:00:00 1900
конечная дата:  Tue Jan  1 00:00:00 1901
между ними дней: 365

Последний раз редактировалось olej.tsil; 14.12.2016 в 20:35.
olej.tsil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужны комментарии к программе на C# ( С некоторой даты по настоящий день прошло m месяцев, определить название месяца неизвестной даты) Ирина1304 Помощь студентам 5 28.11.2016 19:21
Дни между двумя датами - Нужно посчитать сколько дней осталось с одной даты до другой даты m0nr Общие вопросы Delphi 7 14.08.2016 01:05
Помогите найти ошибку. Сколько дней понадобится Саше и Маше, чтобы посетить все достопримечательности? Koneru Общие вопросы C/C++ 0 08.07.2016 16:11
С некоторого момента прошло 234 дня. Сколько полных недель прошло за этот период ( Delphi ) shablakov Помощь студентам 9 24.06.2013 15:50
Вывести на экран монитора сколько прошло дней с нового года На С++ K[Lanc]N Помощь студентам 3 18.02.2009 21:06