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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Ольга Тимонова
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 36
#1

Описать тип struct Date - C++

21.03.2012, 16:27. Просмотров 2704. Ответов 12
Метки нет (Все метки)

Описать тип struct Date, задающий дату (день, месяц, год).
Реализовать в виде отдельных функций следующие операции над
датами: а) вычисление даты, отстоящей на d дней от заданной (d
может быть как положительным, так и отрицательным);
б) проверка корректности даты; в) проверка високосности года для
заданной даты; г) вычисление расстояния в днях между двумя
заданными датами; д) вывода даты в формате “ДД месяц ГГГГ”;
е) количества дней, прошедших с начала года; ж) количества дней,
прошедших с начала квартала. С использованием описанных типа
и функций разработать программу, которая для заданного набора
из N дат находит 1) три наиболее близких даты, с невисокосным
годом; 2) дату, наиболее близкую к заданной дате D, и генерирует
все даты в рамках того же года, отстоящие от найденной на 15k
дней.
Не знаю как написать в Visual Studio...... помогите.........пожалуйста.......
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2012, 16:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Описать тип struct Date (C++):

Описать тип struct Point - C++
Пожалуйста, помогите решить задачу в Visual Studio Описать тип struct Point, задающий на действительной плоскости точку с именем...

Описать тип struct Square, задающий на плоскости замкнутый квадрат с центром в точке (x, y) - C++
Описать тип struct Square, задающий на плоскости замкнутый квадрат с центром в точке (x, y), длиной стороны a и сторонами,...

Компилятор выдаёт ошибку: error C2011: Confection::Date: переопределение типа "struct". Как исправить? - C++
#pragma once #pragma warning #ifndef Confection_H #define Confection_H #include <string> #include "Filling.h" using namespace...

Описать структуру с именем DATE - C++
Описать структуру с именем DATE, состоящую из: Фамилия, имя, номер телефона, дата рождения (массив из трех чисел). В программе использовать...

Неизвестный тип DATE - C++
Приветствую! Пытаюсь собрать пример внешней компоненты для 1С в среде Microsoft Visual C++ 2008 Express edition, научился...

Описать тип TDate - C++
Описать тип TDate — запись с полями целого типа Day (день), Month (месяц) и Year (год) и описать функцию DaysInMonth(D) целого типа с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
21.03.2012, 16:40 #2
поиск по форуму, подобная задача была
Ольга Тимонова
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 36
21.03.2012, 16:47  [ТС] #3
panicwassano, не могу найти........может скажите как тема называется или ссылку киньте, пожалуйста!!!
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.03.2012, 16:51 #4
boost::gregorian
Ольга Тимонова
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 36
21.03.2012, 17:11  [ТС] #5
go, это что???

Добавлено через 12 минут
panicwassano, Помогите, пожалуйста...если можете!!! Очень нужно.....!!!
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.03.2012, 17:28 #6
Цитата Сообщение от Ольга Тимонова Посмотреть сообщение
go, это что???
Что именно?
boost::gregorian::date Очевидно, какой-то класс.
alkagolik
Заблокирован
21.03.2012, 18:26 #7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
 
typedef struct DATE {
    uint8_t date;
    uint8_t month;
    uint8_t year;
} t_date;
 
int main ( void )
{
    t_date x;
    
    ...
 
    exit( EXIT_SUCCESS );
}
Ольга Тимонова
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 36
21.03.2012, 18:35  [ТС] #8
alkagolik, это начало...оно у меня есть...а как дальше??
-=ЮрА=-
Заблокирован
Автор FAQ
22.03.2012, 15:45 #9
Ольга Тимонова, вот как и обещал
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <cstdio>
#include <ctime>
#include <conio.h>
using namespace std;
 
struct Date
{
    unsigned int day;
    unsigned int mon;
    int year;
};
 
//Делаю индексацию с 0-цы для простоты
//0 - январь 11 - декабрь
unsigned int month_len[] = 
{
    31,28,31,
    30,31,30,
    31,31,30,
    31,30,31
};
 
char * month_name[] = 
{
    "jan","feb","mar",
    "apr","may","jun",
    "jul","aug","sep",
    "oct","nov","dec",
    NULL
};
 
//проверка года на вискосность
bool CheckLongYear(int year);
//возвращаемое значение - строка с текстовым форматом даты
char * getTextDate(Date pst);
//Ввод даты
bool EnterDate(Date &pst);
//Проверка корректности даты
bool CheckDate(Date pst);
//количество дней, прошедших с начала года
long getDaysFromYearBeg(Date pst);
//Проверяет равенство дат pst1 и pst2
bool EqualDate(Date pst1, Date pst2);
//Проверяет меньше ли дата pst1 чем pst1
bool CompDate(Date pst1, Date pst2);
//функция будет производить запрос ввода
//пока не будет введенакорректная дата
Date EnterDate();
//Функция возвратит дату отличную от данной на число дней nDays
Date getDateWithDiference(Date pst, long nDays);
//Возвращает число дней между 2-мя датами
long getDaysAmongDates(Date pst1, Date pst2);
//Рандомная генерация корректной даты из указанного диапазона лет
Date getRandDate(int min_year, int max_year);
//Обменивает значения pst1 и pst2
void SwapDate(Date &pst1, Date &pst2);
 
//Функции обработчики пунктов меню
void p1();
void p2();
void p3();
//Данная функция отвечает за динамическое выделение памяти 
//по адресу ptr (сразу скажу что для студии можно было обойтись и 
//без фильтации bad_alloc, но делаю по всем канонам)
template <class T>
T * alloc_mem(T * ptr, unsigned long count);
 
int main()
{
    //setlocale(LC_ALL, "Russian");
    system("chcp 1251");//Руссификация для старых типов компиляторов
    while(true)
    {
        system("cls");
        cout<<"\t***MENU***\n";
        cout<<"1 - три наиболее близких даты, с невисокосным годом;\n";
        cout<<"2 - дата, наиболее близкая к заданной дате D\n";
        cout<<"    и генерация всех дат в рамках того же года,\n";
        cout<<"    отстоящие от найденной на 15k дней\n";
        cout<<"3 - вывод даты в формате ДД месяц ГГГГ\n";
        //кто рассово не приемлит getch уж введите замену сами - это пара мин дела
        switch(getch() - '0')
        {
        case 1:
            p1();
            break;
        case 2:
            p2();
            break;
        case 3:
            p3();
            break;
        }
        system("pause");
    }       
    return 0;
}
 
template <class T>
T * alloc_mem(T * ptr, unsigned long count)
{
    try
    {
        ptr = new T[count];
    }
    catch(bad_alloc &e)
    {
        cout<<e.what()<<"\n";
        ptr = NULL;
    }
    return ptr;
}
 
void p1()
{
    srand(time(NULL));
    unsigned int i,j,N;
    char sDate[12] = {0};
    Date * array = NULL;
    
    cout<<"Введите N : ";
    if(!(cin>>N))
        cout<<"Ошибка ввода\n";
    else
    if(!(array = alloc_mem(array,N + 1)))
        cout<<"Ошибка выделения памяти под массив дат\n";
    else
    {
        array[0] = EnterDate();
        cout<<"Массив сгененрированных дат\n";
        for(i = 1; i <= N; i++)
        {
            //Генерируем случайным образом массив дат
            array[i] = getRandDate(-100,2100);
            if(!strcpy(sDate,getTextDate(array[i])))
                cout<<"Ошибка вывода строкового описания даты\n";
            else
                cout<<sDate<<endl;
        }
        //Чтобы вывести 3 близких даты
        //отсортируем наш массив по убыванию
        //тогда первые даты будут наиболее близкими
        for(i = 1    ; i <= N; i++)
        for(j = i + 1; j <= N; j++)
        {
            if( CompDate(array[i],array[j]))
                SwapDate(array[i],array[j]);
        }
        cout<<"Наиболее близкие даты с невисокосным годом\n";
        for(i = 1; i <= N; i++)
        {
            if(!strcpy(sDate,getTextDate(array[i])))
                cout<<"Ошибка вывода строкового описания даты\n";
            else
                cout<<sDate<<endl;
        }
        delete [] array;//Чистим память
    }
}
 
void p2()
{
    long k;
    char sDate[12] = {0};
    Date pst = EnterDate();
    Date buf = pst;
    int year = pst.year;
    for(k = 1; buf.year == year; k++)
    {
        buf = getDateWithDiference(pst, 15*k);
        if(!strcpy(sDate,getTextDate(buf)))
            cout<<"Ошибка вывода строкового описания даты\n";
        else
            cout<<sDate<<endl;
    }
}
 
void p3()
{
    char sDate[12] = {0};
    Date pst = EnterDate();
    if(!strcpy(sDate,getTextDate(pst)))
        cout<<"Ошибка вывода строкового описания даты\n";
    else
        cout<<sDate<<endl;
}
 
//проверка года на вискосность
bool CheckLongYear(int year)
{
    bool bLong = false;
    if(year % 4 == 0)
        bLong = true;
    return bLong;
}
 
char * getTextDate(Date pst)
{
    char sDate[16] = {0};
    if(!sprintf(sDate,"%02d %03s %d",pst.day, month_name[pst.mon - 1], pst.year))
        sprintf(sDate,"%s","format error");
    return &sDate[0];
}
 
//Ввод даты
bool EnterDate(Date &pst)
{
    bool bCorrect = true;
    if((cout<<"Enter year : ") && !(cin>>pst.year))
        bCorrect = false;
    if((cout<<"Enter month: ") && !(cin>>pst.mon))
        bCorrect = false;
    if((cout<<"Enter day  : ") && !(cin>>pst.day))
        bCorrect = false;
    return bCorrect;
}
 
//Проверка корректности даты
bool CheckDate(Date pst)
{
    //т.е високосный год и февраль
    int addDays   = (CheckLongYear(pst.year) && pst.mon == 1) ? 1 : 0;
    bool bCorrect = true;
    if(pst.mon < 1 || 12 < pst.mon)
        bCorrect = false;
    else
    if(!pst.day || (month_len[pst.mon - 1] +  addDays  < pst.day))
        bCorrect = false;
    return bCorrect;
}
 
//функция будет производить запрос ввода
//пока не будет введенакорректная дата
Date EnterDate()
{
    Date pst = {0};
    //Будем крутиться в цикля пока всё таки не введём норм дату
    while(true)
    {
        //Наша исходная дата будет с 0 индексом
        cout<<"Введите исходную дату\n";
        if(!EnterDate(pst))
            cout<<"Ошибка ввода\n";
        else
        if(!CheckDate(pst))
            cout<<"Введена некорректная дата\n";
        else
            break;
    }
    return pst;
}
 
//количество дней, прошедших с начала года
long getDaysFromYearBeg(Date pst)
{
    long nDays = 0;
    bool isLongYear = CheckLongYear(pst.year);
    for(int i = 1; i < pst.mon; i++)
    {
        if(i == 2 && isLongYear)
            nDays += 1;
        nDays += month_len[i - 1];
    }
    nDays += pst.day;
    return nDays;
}
//Проверяет равенство дат pst1 и pst2
bool EqualDate(Date pst1, Date pst2)
{
    bool bEqual = true;
    if(pst1.year!= pst2.year)
        bEqual = false;
    else
    if(pst1.mon != pst2.mon)
        bEqual = false;
    else
    if(pst1.day != pst2.day)
        bEqual = false;
    return bEqual;
}
 
//Проверяет меньше ли дата pst1 чем pst1
bool CompDate(Date pst1, Date pst2)
{
    bool bGreather = true;
    if(pst2.year < pst1.year)
        bGreather = false;
    else
    if(pst2.mon < pst1.mon && pst1.year == pst2.year)
        bGreather = false;
    else
    if(pst2.day < pst1.day && pst1.mon == pst2.mon)
        bGreather = false;
    return bGreather;
}
 
//Функция возвратит дату отличную от данной на число дней nDays
Date getDateWithDiference(Date pst, long nDays)
{
    if(nDays < pst.day)
        pst.day -= nDays;
    else//Будем крутиться по месяцам и годам пока не исчерпаем дни
    {
        nDays -= pst.day;
        for(pst.mon -= 1; 0 < nDays; pst.mon--)
        {
            if(pst.mon < 1)
            {
                pst.mon = 12;
                pst.year--;
            }
            nDays -= month_len[pst.mon - 1];
        }
        pst.day = 0 - nDays;
    }
    return pst;
}
 
long getDaysAmongDates(Date pst1, Date pst2)
{
    Date beg = pst1;
    Date end = pst2;
    long year, nDays= 0;
    if(!EqualDate(pst1,pst2))
    {
        if(!CompDate(pst1, pst2))
        {
            beg = pst2;
            end = pst1;
        }
        nDays =  365 - getDaysFromYearBeg(beg);
        nDays += CheckLongYear(beg.year);
        for(year = beg.year + 1; year < end.year; year++)
            nDays += 365 + CheckLongYear(year);
        nDays += CheckLongYear(year);
    }
    return nDays;
}
 
//Рандомная генерация корректной даты из указанного диапазона лет
Date getRandDate(int min_year, int max_year)
{
    Date pst = {0};
    while(!CheckDate(pst))
    {
        pst.mon  = 1 + rand()%11;
        pst.day  = 1 + rand()%(month_len[pst.mon - 1] - 1);
        pst.year = min_year + rand()%(max_year - min_year);
    }
    return pst;
}
 
//Обменивает значения pst1 и pst2
void SwapDate(Date &pst1, Date &pst2)
{
    Date buf = pst1;
    pst1 = pst2;
    pst2 = buf;
}
Алгоритм большой так что пояснения буду давать на конкретные вопросы. Скажу лишь пару слов о руссификации, я писал на старом компиляторе VS6.0 там всё руссифицируется с помощью system("chcp 1251");, если у вас новый компилятор то раскоментируйте вот эту строку //setlocale(LC_ALL, "Russian"); и обязательно закоментируйте system("chcp 1251"); (функции вместе не работают).
Ниже скрины работы и само приложение
Миниатюры
Описать тип struct Date   Описать тип struct Date  
Вложения
Тип файла: rar CalcDate.exe.rar (48.2 Кб, 24 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
22.03.2012, 15:51 #10
PS:Для тех кто скачает экзешник и вместо русского вылезут каракули рекомендую настроить шрифт приложения, как это сделать по ссылке Выставить шрифт консоли
Ольга Тимонова
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 36
22.03.2012, 15:57  [ТС] #11
-=ЮрА=-, Спасибо огромнейшее!!!
Ольга Тимонова
0 / 0 / 0
Регистрация: 22.02.2012
Сообщений: 36
24.05.2012, 18:54  [ТС] #12
Здравствуйте, возможно я покажусь очень глупой, но, пожалуйста, объясните всю программку на словах... что и зачем идет.... просто мне нужно преподавательнице рассказать...
-=ЮрА=-
Заблокирован
Автор FAQ
28.05.2012, 11:43 #13
Цитата Сообщение от Ольга Тимонова Посмотреть сообщение
Здравствуйте, возможно я покажусь очень глупой, но, пожалуйста, объясните всю программку на словах... что и зачем идет.... просто мне нужно преподавательнице рассказать...
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Алгоритм большой так что пояснения буду давать на конкретные вопросы. Скажу лишь пару слов о руссификации, я писал на старом компиляторе VS6.0 там всё руссифицируется с помощью system("chcp 1251");, если у вас новый компилятор то раскоментируйте вот эту строку //setlocale(LC_ALL, "Russian"); и обязательно закоментируйте system("chcp 1251"); (функции вместе не работают).
Ниже скрины работы и само приложение
Миниатюры
Смогу ответить лишь на конкретный вопрос(ы)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 11:43
Привет! Вот еще темы с ответами:

Как описать абстрактный тип данных? - C++
очередь

Описать в виде БНФ строковый тип с++ - C++
Описать в виде БНФ или диаграммы Вирта cтроковый тип языка С++. Подскажите пожалуйста. Я описал строку в виде БНФ и диаграммы Вирта, а...

Как правильно описать тип данных - C++
Парни, переделываю программу на Delphi в С++. Столкнулся с проблеммой. Не знаю, как в С++ описыватся такой тип данных. type ...

Структурный тип данных. Описать структуру с именем STUDENT - C++
Пожалуйста, помогите написать программу: Описать структуру с именем STUDENT, содержащую следующие поля: Фамилия и инициалы; Номер...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.05.2012, 11:43
Ответ Создать тему
Опции темы

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