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

Класс "Историческое событие" - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как подключиться к текстовому файлу? http://www.cyberforum.ru/cpp-beginners/thread362950.html
мне надо чтобы программа доставала от туда записи и сама записывала
C++ Описать структуру УЧЕНИК Здравствуйте. Возникла проблема. Пропустил тему в универе а задание требуют. Ввести структуру УЧЕНИК с полями ФИО, ГОД ОБУЧЕНИЯ, НАЗВАНИЯ КЛАССА (БУКВА), ИТОГОВАЯ ОЦЕНКА. Написать и протестировать функцию a) добавления нового ученика в массив учеников; b) вывода на экран массива учеников; c) сортирующую массив учеников по классам; d) подсчитывающего среднюю оценку для каждого класса. ... http://www.cyberforum.ru/cpp-beginners/thread362947.html
C++ Матрицы C++
Помогите, пожалуйста, с задачей! Я новичок, мне пока сложновато.. Напечатать элементы заданной матрицы размером NxN в следующем порядке ....... ._. ._. ........\.\.\.\. ..........\.\.\! !\..........\.\. .\.\..........\! !\.\.\.........
C++ Покритикуйте пожалуйста программу
Student.h#ifndef _STUDENT_H #define _STUDENT_H class Student { public: Student(); void del(); void add_surname(char* y); void add_name(char* y);
C++ Поиск элемента в списке. http://www.cyberforum.ru/cpp-beginners/thread362908.html
Есть список, который содержит объекты класа type. Мне нужно найти в этом списке объект, который будет отвечать некоторым условиям. Пробую реализовать это с помощью рекурсии type GetUnit(std::list<type*> List, std::list<type*>::iterator itr) { if ((*itr)) { if <условие> return itr; if (itr != List.end()) {
C++ Предварительное объявление Добрый вечер, Есть файл file.h и file.cpp, в file.cpp я делаю подключение #include <boost/signal.hpp>, не подключаю в хэдер file.h умышленно, потому что этот хэдер подключается в много других файлов, проблема состоит в том чтобы в file.h объявить указатель на сигнал Signal *errorSignal; пробовал сделать предварительное объявление в file.h так: namespace boost { class signal<void... подробнее

Показать сообщение отдельно
-=ЮрА=-
Заблокирован
Автор FAQ
08.10.2011, 16:17     Класс "Историческое событие"
Lennadij, вот моя С++ реализация (в программе русский ввод + проверка корректности ввода),
тестировал бегло поетому если будут косячки пишем в топик
Листинги
CHistory.h
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
#include <iostream>
using namespace std;
 
//Руссификация перегрузкой оператора вывода
ostream& operator<<(ostream &stream,char* s)
{
    for(char* ps=s; *ps; ps++)
    {
        if(*ps=='ё')
            stream<<char(241);
        else 
        {
            if(*ps=='Ё')
                stream<<char(240);
            else 
            {
                if(*ps>=-64 && *ps<=-17)
                    stream<<char(*ps+64+128);
                else
                {
                    if(*ps<0)
                        stream<<char(*ps+64+176);
                    else
                        stream<<*ps;
                }
            }
        }
    }
    return stream;
}
 
 
//Число дней в месяцах года с 0 элементом не работаем
long DayInMonth[] = {-1,31,28,31,30,31,30,31,31,30,31,30,31};
 
class CHistory
{
private:
    //Мне захотелось год, месяц, день long сделать
    long _Year;
    long _Month;
    long _Day;
    char _Event[33];//Предлагаю отвести под событие 32 символа 
public :
    //Конструктор преобразования с начальным инитом private переменных
    //говорят очень эффективно, ну значит так и запишем 
    CHistory(long iYear = 1, long iMonth = 1, long iDay = 1)
    {
        _Day   = iDay;
        _Month = iMonth;
        _Year  = iYear;
    };
    //Возвращает год события
    long GetYear()  {return _Year;}
    //Возвращает месяц события
    long GetMonth() {return _Month;}
    //Возвращает день месяца события
    long GetDay()   {return _Day;}
    //Возвращает название события
    char * GetEvent(){return &_Event[0];}
 
    bool isLongYear(){return (_Year % 4 == 0);}//Високостный год нацело делиться на 4
 
    //Устанавливает год события
    void SetYear();
    //Устанавливает месяц события
    void SetMonth();
    //Устанавливает день месяца события
    void SetDay();
    //Устанавливает название события
    void SetEvent();
 
    //Возвращает число дней в году
    long GetDaysInYear();
    //Преобразует дату в число дней от начала года
    long GetDayOfYear();
    //В случае если pEvent произошло раньше возвращаем true
    bool isEarlier(CHistory pEvent);
    //Возвращает Число дней между событиями
    long GetDaysBetween(CHistory pEvent);
};
 
void CHistory::SetYear()
{
    std::cout<<"Год : ";std::cin>>_Year;
}
 
void CHistory::SetMonth()
{
    std::cout<<"Месяц : ";std::cin>>_Month;
    if(_Month < 1 || 12 < _Month)
        std::cout<<"Wrong value of Month!Program set it as "<<(_Month = 1)<<"\r\n";
}
 
void CHistory::SetDay()
{
    std::cout<<"День месяца : ";std::cin>>_Day;
    if(DayInMonth[_Month] + (isLongYear() ? 1 : 0) < _Day)
        std::cout<<"Wrong value of Day!Program set it as 1 "<<(_Day = 1)<<"\r\n";
}
 
void CHistory::SetEvent()
{
    std::cout<<"Название события : ";std::cin.getline(_Event,32);
}
 
long CHistory::GetDaysInYear()
{
    return 365 + (isLongYear() ? 1 : 0);
}
 
long CHistory::GetDayOfYear()
{
    long Days = _Day;
    for(long i = 1; i < _Month; i++)
        Days += DayInMonth[i];
    if(isLongYear())
        Days++;//+ 29 feb
    return Days;
}
 
bool CHistory::isEarlier(CHistory pEvent)
{
    bool bRet = false;
    if(pEvent.GetYear()  <= _Year)
    if(pEvent.GetMonth() <= _Month)
    if(pEvent.GetDay()   <  _Day)
        bRet = true;
    return bRet;
}
 
long CHistory::GetDaysBetween(CHistory pEvent)
{
    long Days = 0;
    bool bEarlier = isEarlier(pEvent);
    if(bEarlier)
        Days += pEvent.GetDaysInYear() - pEvent.GetDayOfYear();
    else
        Days += GetDaysInYear() - GetDayOfYear();
    //Определяем разницу в целых годах 
    long Years = (bEarlier ? -1 : 1)*(pEvent.GetYear() - _Year);
    //Учётом что Days   уже содержит дни до конца года 
    //более раннего события т.е нужно отнять 1 год от прямой разницы лет
    if(0 < Years)
        Years--;
 
    //Тут всё просто прибавили число лет *365 дней
    //+ число високостных лет (т.е 29 февраля)
    Days += Years*365 + int(Years % 4); 
    return Days;
}
main.cpp
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
#include "CHistory.h"
#include <conio.h>
 
int main()
{
    long a, b, i, n;//Число событий
    CHistory * lph;//Указатель на массив событий
    do
    {
        std::cout<<"Введите число событий : ";
        std::cin>>n;
        //Объявили массив элементов CHistory (массив событий)
        lph = new CHistory[n];
        for(i = 0; i < n; i++)
        {
            getchar();//Ловим '\n' от предыдущих вводов
            std::cout<<"\tCобытие "<<i + 1<<"\r\n";
            lph[i].SetEvent();
            //Ввод именно в такой последовательсти
            //тогда сможем проверить корректность ввода даты
            lph[i].SetYear();
            lph[i].SetMonth();
            lph[i].SetDay();
        }
        std::cout<<"введите номер 1-го события (А)\r\n";std::cin>>a;a--;
        std::cout<<"введите номер 2-го события (Б)\r\n";std::cin>>b;b--;
        std::cout<<"Событие А произошло ";
        if(lph[a].isEarlier(lph[b]))
            std::cout<<"раньше";
        else
            std::cout<<"позже";
        std::cout<<" события Б\r\n";
        std::cout<<"Число дней между событиями : "<<lph[a].GetDaysBetween(lph[b])<<"\r\n";
        std::cout<<"Нажмите Y для нового ввода\r\n";
        delete [] lph;
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
Миниатюры
Класс "Историческое событие"  
 
Текущее время: 13:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru