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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Написать диалоговую программу вычисления значений функции двух переменных z=f(x.y) в различных точках плоскости. http://www.cyberforum.ru/cpp-beginners/thread523876.html
Написать диалоговую программу вычисления значений функции двух переменных z=f(x.y) в различных точках плоскости. Программа должна: 1) выводить сообщение о своих возможностях, 2)предлагать ввести координаты очередной точки, для которой требуется вычислить значение функции, 3)выводить значение функции в указанной точке или сообщение о неопределенности функции, если точка не попадает в...
C++ Составить программу табулирования функции вида y=f(x) на различных интервалах [a,b] (a<b) с различными шагами h (h>0). Составить программу табулирования функции вида y=f(x) на различных интервалах (a<b) с различными шагами h (h>0). Программа должна управляться с помощью простого меню, включающего строку статуса с текущими значениями отрезка и шага табулирования и, по крайней мере, следующие пункты: 0. Выход из программы. 1. Изменение интервала . 2. Изменение шага h, 3. Вывод таблицы на экран. При... http://www.cyberforum.ru/cpp-beginners/thread523869.html
Операции над многочленами на основе структуры данных список C++
Помогите, пожалуйста, реализовать в С! Многочлен представлен в виде |n|An|->|n-1|An-1|->...->|0|Ao|(многочлен Р). Написать программу, реализующую: -вычисление значения в точке х -вычисление производной многочлена Р (Получим многочлен Q) -сложение многочленов P и Q Данные вводятся из файла (коэффициенты), результат выводится на экран.
Обработка исключений C++
класс B является производным от абстрактного класса А. Определить обработчик исключительной ситуации при преобразовании указателя на класс B до указателя на абстрактный класс. #include <iostream> using namespace std; class A { int x; public: A(int x1=0):x(x1) {} ~A() {}
C++ Не компилируется в Code::Blocks http://www.cyberforum.ru/cpp-beginners/thread523837.html
Установил на Windows 7 среду Code::Blocks 10.05 При нажатии на кнопку "Build and run" НИЧЕГО НЕ ПРОИСХОДИТ! В чем дело, подскажите, пожалуйста. В окошке лога пишет: "HelloWorld - Debug" uses an invalid compiler. Probably the toolchain path within the compiler options is not setup correctly?! Skipping..."
C++ поиск в массиве Надо в массиве найти положительные значения в промежутке между наибольшим и наименьшим элементом. Но в массиве наибольшие и наименьшие элементы повторяются, а значит имеется несколько промежутков. Программа может проверить только первый промежуток. Как модифицировать программу, чтобы она прошлась по всем промежуткам и выводила сообщения о количестве положительных значений в каждом... подробнее

Показать сообщение отдельно
-=ЮрА=-
Заблокирован
Автор FAQ
22.03.2012, 15:45     Описать тип struct Date
Ольга Тимонова, вот как и обещал
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 просмотров)
 
Текущее время: 04:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru