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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
Яна_Max
3 / 3 / 0
Регистрация: 08.11.2011
Сообщений: 137
#1

Как работать с датой? - C++

27.06.2012, 17:49. Просмотров 3406. Ответов 15
Метки нет (Все метки)

Всем привет!
Собственно возник интересный вопрос: как работать с датой в С++? Какой тип данных использовать?чтобы можно было сравнить, перезаписать,вводить в удобном для пользователя формате...
Понятно, что если использовать только год( 2003, 1900,1812...) подойдет
C++
1
int
.
Но, если брать три характеристики: год, месяц, число? И вводить в каком-либо подобном формате: "гггг.мм.дд", "дд.мм.гг" ...
Может кто-то уже встречался с подобным? Пробую найти что-нибудь с использованием DateTime.
Жду предложений, советов!
=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2012, 17:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как работать с датой? (C++):

Как работать с датой, strftime()? - C++
Подскажите, пожалуйста, как получить значение даты (дня) и времени, а то что-то не могу разобраться с strftime() и с другими функциями....

Как работать с указателями и как работать с ссылками - C++
Я в книге дочитал до темы указатели и ссылки, не понимаю как работать с указателями и как работать с ссылками. Я прочитал понятия я понимаю...

Как узнать и прочитать файл до того как с ним начнет работать другая программа - C++
Здрувствуйте! Подскажите пожалуйста, как я могу узнать и прочитать файл до того как с ним начнет работать другая программа. Например ...

Как работать с try - catch в С++? - C++
Доброго времени суток. Подскажите плиз как именно работает try catch? Я попробовал сделать вот так: void f1() { int i = 5; int j...

Как работать с потоками? - C++
Как создать поток? Как его стартануть? В какой он библиотеке? И вообще, как он называется? Когда гуглю, находится много информации про...

как работать с char* - C++
вопщем, есть задание: создайте класс osoba, конструктору которого передаются значения: фамилия, имя (char*), зарплата (double). Нужна...

15
slatch
4 / 4 / 1
Регистрация: 22.02.2011
Сообщений: 49
27.06.2012, 18:13 #2
C++
1
2
3
4
5
6
7
8
9
#include <time.h>
...
struct tm *tim;
 time_t tt = time(NULL);
 tim = localtime(&tt);
 int theDay = tim->tm_mday;
 int theMonth = tim->tm_mon;
 int theYear = tim->tm_year+1900;
 printf ("%d.%d.%d",theYear,theMonth,theDay); // или std::cout << theYear << "." << theMonth << "." << theDay;
Выведет на экран текущие год, месяц и день.
Чтобы вводить дату, можно сделать переменную типа string. Также можно сделать 3 переменных типа int. Можно сделать собственную структуру, где можно хранить введенную дату.
А ещё лучше попонятней написать вопрос.
2
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
27.06.2012, 18:14 #3
А напишите, например, свой класс для работы с датой. Будет полезно
1
Яна_Max
3 / 3 / 0
Регистрация: 08.11.2011
Сообщений: 137
27.06.2012, 18:31  [ТС] #4
Schizorb, Ну да можно=) Просто пока не пойму потом класс (по работе с датой) можно будет реализовать в структуре для динамических типов данных.... Например, одно из полей "элемента" стека - дата:
C++
1
2
3
4
5
6
struct link
{
   int d;//число
   Data d1;//где Data класс
   link *next;
};
не клеится...=)
0
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
27.06.2012, 18:33 #5
Можно сделать что-то вроде этого
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
109
110
111
112
#include <iostream>
#include <string>
 
class Date 
{
public:
    Date(int d = 0, int m = 0, int y = 0) 
    {
        setDate(d, m, y);
    }
 
    Date(const Date &date) 
    {
        setDate(date.day, date.month, date.year);
    }
 
    ~Date()
    {
 
    }
 
    int getDay() const 
    {
        return day;
    }
 
    int getMonth() const 
    {
        return month;
    }
 
    int getYear() const 
    {
        return year;
    }
 
    void setDay(int day) 
    {
        this->day = day;
    }
 
    void setMonth(int month) 
    {
        this->month = month;
    }
 
    void setYear(int year) 
    {
        this->year = year;
    }
 
    void setDate(int day, int month, int year) 
    {
        if (isValidDate(day, month, year)) 
        {
            setDay(day);
            setMonth(month);
            setYear(year);
        }
        else {
            throw std::string("Not valid date");
        }
    }
 
    void print() const 
    {
        std::cout << day << '.'
            << month << '.'
            << year << std::endl;
    }
 
    static bool isValidDate(int day, int month, int year) 
    {
        if ((day<1 || day>31) || (month<1 || month>12))
        {
            std::cout<<"Not valid date"<<std::endl;
        }
        return true;
    }
 
    static bool isLeapYear(int year) 
    {
 
        return ((year % 4 == 0 && year% 100 != 0) || year % 400);
 
    }
 
    static int dayInMonth(int month) 
    {
        int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(isLeapYear)days[1]=29;
        return days[month-1];
    }
 
private:
    int day;
    int month;
    int year;
};
 
int main() 
{
    Date d1(31, 1, 1997);
    d1.print();
    Date d2 = d1;
    d2.setDay(6);
    d2.print();
    Date d3(d2);
    system ("pause");
    return 0;
 
}
0
Яна_Max
3 / 3 / 0
Регистрация: 08.11.2011
Сообщений: 137
27.06.2012, 18:41  [ТС] #6
slatch, Попонятней:
1) ввести с клавиатуры дату №1 (например: "27.06.2012")
2)ввести с клавиатуры дату №2 ("10.01.1999")
3)сравнить их, какая из дат "моложе" (в данном случае вторая)
=)

Добавлено через 6 минут
yuron_477, Интересно....=)
Единственное, если с датой работать в больших программах подобным образом, получается сверхбольшой объем. =)) Поэтому хотелось еще узнать, может есть стандартные "функции", способы работы..вот
Но спасибо!
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
27.06.2012, 18:49 #7
yuron_477, надо уж тогда в проверке даты на валидность сделать что-то типа:

C++
1
if ((day<1 || day>dayInMonth(month)) || (month<1 || month>12))
Яна_Max, о каком объёме речь? Вам же не придётся каждый раз копировать определение класса. Просто используйте созданный вами тип Date...

А стандартное может быть и есть, я не силён в этом вопросе
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
27.06.2012, 19:09 #8
boost::date_time.
Так же можно посмотреть на std::chrono (но это не совсем то).
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
27.06.2012, 19:44 #9
boost, зачем придумывать велосипед? Чтобы квадратные колеса были? Посвети один вечер на изучение и юзай на здоровье. Все уже придумано, а сказки про сложности boosta рассказывают старые пердуны и сишные эльфы.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
27.06.2012, 19:49 #10
MrGluck, Ну если почитать исходники - большинство либ из буста действительно крайне сложно написаны. А так в целом согласен.
0
Mar_Av
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 3
25.11.2013, 21:08 #11
DiffEreD, Здравствуйте, у меня тоже проблемы с датой,вроде у вас все понятно, но вот если у меня есть текстовый файл,в котором уже записаны даты...Я создаю структуру,которая берет данные из данного файла,одним из полей данной структуры и является дата в виде 12.12.12.... при выводе данных на экран мне выдает ошибки, подскажите,пожалуйста,что делать
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
25.11.2013, 22:04 #12
Mar_Av, для начала выложить код (лучше в отдельной теме)
0
Mar_Av
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 3
25.11.2013, 22:24 #13
#include<iostream>
#include<iomanip>
#include<string>
#include<clocale>
#include<fstream>
#include <iostream>
using namespace std;
struct Klient
{
char name[20]; //Фамилия
char country[20]; //Страна
char data[20]; //Нужен формат даты
int kolvo; //Количество поездок
int sum; //Сумма всех поездок
};
int read_f(fstream &f,fstream &out)//Чтение из текстового файла и запись в бинарный
{
int i=0; Klient a;
while(!f.eof()) //Пока не достигнут конец файла
{
f>>a.name; f>>a.country; f>>a.data; f>>a.sum; f>>a.kolvo;
out.write((char*) &a,sizeof a);
i++;
}
return i;
}
void outfile ( fstream &f, int n)//Вывод
{
Klient a;
f.seekg(0); //установить указатель на начало файла
cout<<setw(17)<<"Фамилия|"<<setw(17)<<"Страна|"<<setw(17)<<"Дата поездки|"<<setw(16)<<"Сумма поездок|"<<setw(11)<<"Поездки|"<<endl;
for(int i=0;i<n;i++)
{
f.read((char*)&a,sizeof a); //Чтение из файла
cout<<setw(78)<<"________________________________________________________________________"<<endl;
cout<<setw(16)<<a.name<<"|"<<setw(16)<<a.country<<"|"<<setw(16)<<a.data<<"|"<<setw(15)<<a.sum<<"|"<<setw(10)<<a.kolvo<<" |"<<endl;
cout<<endl;
}
cout<<endl<<endl;
}
int print_post(fstream &f,fstream &f_new,int n)//Постоянные клиенты
{
Klient a;int l=0;
f.seekg(0);f_new.seekp(0);
for(int i=0;i<n;i++)
{
f.read((char*) &a,sizeof a);
if(a.kolvo>=2){l++; f_new.write((char*) &a,sizeof a);}
}
return l;
}
int print_str(fstream &f,fstream &f_new,int n)//Вывод инф о клиентах,посещавших опр страну с заданный временной период
{
char y[20]; char u[20]; //char v[20]; - Невозможно сравнение
cout<<"y = "; cin>>y; cout<<"u = ";cin>>u; //cout<<"v = "; cin>>v;
Klient a;int h=0;
f.seekg(0);f_new.seekp(0);
for(int i=0;i<n;i++)
{
f.read((char*) &a,sizeof a);
if(strcmp(a.country,y)==0){ h++; f_new.write((char*) &a,sizeof a);}
}
return h;
}

int print_klient(fstream &f,fstream &f_new,int n) //Скидки
{
int c; int d; int x;
cin>>x; system("cls"); cout<<"Для скидки в "<<x<<"%"<<endl;
cout<<"c = ";cin>>c; cout<<"d = "; cin>>d;
Klient a;int k=0;
f.seekg(0);f_new.seekp(0);
for(int i=0;i<n;i++)
{
f.read((char*) &a,sizeof a);
if(a.sum>=c&&a.sum<d){ k++; f_new.write((char*) &a,sizeof a);}
}
return k;
}
int main()
{
setlocale(LC_CTYPE,"Russian");
fstream in("Klient.txt",ios::in);
if(!in){cout<<"Файл Klient не открыт"<<endl;return 1;}
fstream out("Klient.dat",ios::out|ios::binary);
if(!out){cout<<"Файл Klient не открыт"<<endl;return 1;}
int size_f=read_f(in,out);
in.close(); out.close();
fstream out_f("Klient.dat",ios::in|ios::out|ios::binary);
if(!out_f){cout<<"Файл Klient не открыт"<<endl;return 1;}
fstream out_f1("Klient.dat",ios::in|ios::out|ios::binary);
if(!out_f1){cout<<"Файл Klient не открыт"<<endl;return 1;}
fstream out_f2("Klient.dat",ios::in|ios::out|ios::binary);
if(!out_f2){cout<<"Файл Klient не открыт"<<endl;return 1;}
fstream out_f3("Klient.dat",ios::in|ios::out|ios::binary);
if(!out_f3){cout<<"Файл Klient не открыт"<<endl;return 1;}

int x;
do
{

cout<<"1 - Просмотреть список клиентов"<<endl;
cout<<"2 - Поиск постоянных клиентов"<<endl;
cout<<"3 - Поиск клиентов,посещавших данную страну в данный временной период"<<endl;
cout<<"4 - Скидки"<<endl;
cout<<"5 - Завершение"<<endl;
cin>>x;
switch(x)
{
case 1:
{cout<<"Исходный список клиентов"<<endl<<endl;
outfile(out_f,size_f);} break;
case 2:
{cout<<"Постоянные клиенты"<<endl<<endl;
outfile(out_f1,print_post(out_f,out_f1,size_f));} break;
case 3:
{cout<<"Посещение"<<endl<<endl;
outfile(out_f2,print_str(out_f,out_f2,size_f));} break;
case 4:
{cout<<"Скидки"<<endl<<endl;
outfile(out_f3,print_klient(out_f,out_f3,size_f));} break;
default: break;
}
}
while(x!=5);
out_f.close(); out_f1.close(); out_f2.close(); out_f3.close();
return 0;

}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
25.11.2013, 22:26 #14
Для оформления кода используйте теги CPP, это повысит удобочитаемость.
0
Mar_Av
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 3
25.11.2013, 22:28 #15
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include<iostream>
#include<iomanip>
#include<string>
#include<clocale>
#include<fstream>
#include <iostream>
using namespace std;
struct Klient
{
    char name[20]; //Фамилия
    char country[20]; //Страна 
    [COLOR="Red"]char data[20]; //Нужен формат даты[/COLOR]
    int kolvo; //Количество поездок
    int sum; //Сумма всех поездок
};
int read_f(fstream &f,fstream &out)//Чтение из текстового файла и запись в бинарный
{
    int i=0; Klient a;
    while(!f.eof()) //Пока не достигнут конец файла
    {
        f>>a.name; f>>a.country; f>>a.data; f>>a.sum; f>>a.kolvo; 
        out.write((char*) &a,sizeof a);
        i++;
    }
    return i;
}
void outfile ( fstream &f, int n)//Вывод
{
    Klient a;
    f.seekg(0); //установить указатель на начало файла
    cout<<setw(17)<<"Фамилия|"<<setw(17)<<"Страна|"<<setw(17)<<"Дата поездки|"<<setw(16)<<"Сумма поездок|"<<setw(11)<<"Поездки|"<<endl;
    for(int i=0;i<n;i++)
    {
        f.read((char*)&a,sizeof a); //Чтение из файла
        cout<<setw(78)<<"________________________________________________________________________"<<endl;
        cout<<setw(16)<<a.name<<"|"<<setw(16)<<a.country<<"|"<<setw(16)<<a.data<<"|"<<setw(15)<<a.sum<<"|"<<setw(10)<<a.kolvo<<"|"<<endl;
        cout<<endl;
    }
    cout<<endl<<endl;
}
int print_post(fstream &f,fstream &f_new,int n)//Постоянные клиенты
{
    Klient a;int l=0;
    f.seekg(0);f_new.seekp(0);
    for(int i=0;i<n;i++)
    {
        f.read((char*) &a,sizeof a);
        if(a.kolvo>=2){l++; f_new.write((char*) &a,sizeof a);}
    }   
    return l;
}
int print_str(fstream &f,fstream &f_new,int n)//Вывод инф о клиентах,посещавших опр страну с заданный временной период
[COLOR="Red"]{
     char y[20]; char u[20]; //char v[20]; - Невозможно сравнение 
    cout<<"y = "; cin>>y; cout<<"u = ";cin>>u; //cout<<"v = "; cin>>v; 
    Klient a;int h=0;
    f.seekg(0);f_new.seekp(0);
    for(int i=0;i<n;i++)
    {       
        f.read((char*) &a,sizeof a);
        if(strcmp(a.country,y)==0){ h++; f_new.write((char*) &a,sizeof a);} 
    }   
    return h;
}[/COLOR]
int print_klient(fstream &f,fstream &f_new,int n) //Скидки
{
    int c; int d; int x;
    cin>>x; system("cls"); cout<<"Для скидки в "<<x<<"%"<<endl;
    cout<<"c = ";cin>>c; cout<<"d = "; cin>>d;
    Klient a;int k=0;
    f.seekg(0);f_new.seekp(0);
    for(int i=0;i<n;i++)
    {       
        f.read((char*) &a,sizeof a);
        if(a.sum>=c&&a.sum<d){ k++; f_new.write((char*) &a,sizeof a);}  
    }   
    return k;
}
int main()
{
    setlocale(LC_CTYPE,"Russian");
    fstream in("Klient.txt",ios::in);
    if(!in){cout<<"Файл Klient не открыт"<<endl;return 1;}
    fstream out("Klient.dat",ios::out|ios::binary);
    if(!out){cout<<"Файл Klient не открыт"<<endl;return 1;}
    int size_f=read_f(in,out);
    in.close(); out.close();
    fstream out_f("Klient.dat",ios::in|ios::out|ios::binary);
    if(!out_f){cout<<"Файл Klient не открыт"<<endl;return 1;}
    fstream out_f1("Klient.dat",ios::in|ios::out|ios::binary);
    if(!out_f1){cout<<"Файл Klient не открыт"<<endl;return 1;}  
    fstream out_f2("Klient.dat",ios::in|ios::out|ios::binary);
    if(!out_f2){cout<<"Файл Klient не открыт"<<endl;return 1;}  
    fstream out_f3("Klient.dat",ios::in|ios::out|ios::binary);
    if(!out_f3){cout<<"Файл Klient не открыт"<<endl;return 1;}
    
    int x;
    do
    {
        
      cout<<"1 - Просмотреть список клиентов"<<endl;
        cout<<"2 - Поиск постоянных клиентов"<<endl;
        cout<<"3 - Поиск клиентов,посещавших данную страну в данный временной период"<<endl;
        cout<<"4 - Скидки"<<endl;
      cout<<"5 - Завершение"<<endl;
        cin>>x;
        switch(x)
        {
                    case 1:
                        {cout<<"Исходный список клиентов"<<endl<<endl;
                        outfile(out_f,size_f);} break;                  
                            case 2: 
                                {cout<<"Постоянные клиенты"<<endl<<endl;
                                outfile(out_f1,print_post(out_f,out_f1,size_f));} break;
                                case 3:
                                    {cout<<"Посещение"<<endl<<endl;
                                    outfile(out_f2,print_str(out_f,out_f2,size_f));} break;
                                    case 4:
                                        {cout<<"Скидки"<<endl<<endl;
                                        outfile(out_f3,print_klient(out_f,out_f3,size_f));} break;
                                        default: break;
        }
    }
    while(x!=5);
    out_f.close(); out_f1.close(); out_f2.close(); out_f3.close();
    return 0;
 
}
0
25.11.2013, 22:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 22:28
Привет! Вот еще темы с ответами:

Как работать с Bluetooth - C++
Здравствуйте, необходимо сделать проект, связанный с bluetooth. Я начинающий программист, поэтому максимум что я программировал это...

как работать с временем? - C++
нпример я хочу чтобы через 5 секунд выводило сообщение, как реализовать?

Как работать с шаблонами - C++
Простенькая програмка, но не компилируеться. Не могу я понять как работать с шаблонами, сколько уже перечитал, все-равно не въеду что не...

Как заставить работать do while - C++
Печатает пока 100 строк не будут заполнены, нужно при вводе символа n закончить принятие данных и вывести те, которые ввели. Если не...


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

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

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