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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
Lennadij
3 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 45
08.10.2011, 09:19     Класс "Историческое событие" #1
//Ввести класс ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и протестировать функцию
//a)ввода исторического события;
//b)вывода на экран списка исторических событий;
//c)вычисляющую интервал в днях, прошедший между двумя заданными историческими событиями;
//d)сортирующую массив исторических событий по полю СОБЫТИЕ.

Я сделала так(не могу сделать под с и d):

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
#pragma once
#ifndef __History_H
#define __History_H
class History
{   int year;
    int month;
    int day;
char event [10];
    int visokos(int year) const;//скрытый метод, проверяющий является ли год високосным 
public:
History();//Конструктор
    int get_year() const {return year;}//метод,возвращающий год
    int get_month() const {return month;}
    int get_day() const {return day;} 
    char get_event() const {return event[10];} 
    void vvod();// метод , обеспечивающий ввод события
    void vivod() const; // константный метод, обеспечивающий вывод списка событий
    void interval() ; // константный метод, вычисляющую интервал в днях, прошедший между двумя заданными историческими событиями
    void massiv (); //  сортирующую массив исторических событий по полю СОБЫТИЕ.       
};
#endif
 
 
 
 
#include "StdAfx.h"
#include "History.h"
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <ctime>
#include <conio.h>
using namespace std;
int tab_day [2][12]= {{31,28,31,30,31,30,31,31,30,31,30,31},
                    {31,29,31,30,31,30,31,31,30,31,30,31}};
 
History:: History (){}
int History:: visokos(int year) const
{int k=year%4==0&&year%100!=0||year%400==0;
 return k;
}
 
///////////метод, обеспечивающий  ввод исторического события
void  History::vvod()
{
N: cout<<"Vvesti day, month, year, event:\n";
cin>>day>>month>>year>>event;
int k=visokos(year);
if (day<1||day>tab_day[k][month-1]||month<1||month>12||year<0||year>2012)
{cout<<"oschibka vvoda:\n"; /*goto N*/ getch ();}
else {cout<<"Istor. event vvedeno\n"; getch ();}
}
 
////////////метод, обеспечивающий вывод исторического события
void History:: vivod () const
{cout<<setw(2)<<day<<'.'<<month<<'.'<<setw(2)<<year<<' '<<setw(2)<<event<<"\n"; getch (); }
 
 
 
 
// 1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
# include <iostream>
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <ctime> 
# include "History.h"
using namespace std;
 
 
int _tmain()
{system ("cls");
cout<< "Viberite function\n";
    cout<<" 1 = Vvoda Istor. event\n";
cout<<" 2 = Vivoda na screen spiska Istor. event\n";
cout<<" 3 = vichisl. interval v day, mejdu Istor. event\n";
cout<<" 4 = sortir. massiv Istor. event po polj EVENT\n";
cout<<" 0 = Vihod iz programmi\n";
int nom;
cin>>nom;
switch (nom)
{
case 0: exit(0);
case 1: {History h; h.vvod(); break;}
case 2: {History h; cout<<"\nVvesti kolichestvo date: ";
        int n; cin>>n;
        History* mas = new History [n];
        for (int i=0; i<n; i++)
        mas[i].vvod(); 
        for (int i=0; i<n; i++)
         mas[i].vivod();break;}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2011, 09:19     Класс "Историческое событие"
Посмотрите здесь:

C++ Создать класс "точка" и производный класс "отрезок"
C++ Класс "линия" наследуется классом "отрезок"
Абстрактный базовый класс "звонок" с виртуальной функцией "стоимость" C++
Ввести структуру Историческое событие C++
C++ Из класса "Дата" с полями день, месяц, год создать класс "Время" с дополнительными полями час, минута, секунда
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TBIKC
web dev
 Аватар для TBIKC
104 / 91 / 1
Регистрация: 23.09.2010
Сообщений: 738
08.10.2011, 12:46     Класс "Историческое событие" #2
Используйте теги форматирования кода !
Lennadij
3 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 45
08.10.2011, 13:16  [ТС]     Класс "Историческое событие" #3
и как это сделать?
Nequti
08.10.2011, 14:22
  #4

Не по теме:

Не пишите латиницией =(

bretba
 Аватар для bretba
63 / 58 / 5
Регистрация: 24.07.2011
Сообщений: 343
08.10.2011, 14:38     Класс "Историческое событие" #5
Lennadij,в твоем задание не точно сказано,что эти функции должны быть именно внутри класса,тоесть методами!У тебя написано:
"Составить и протестировать функцию...."-а это не значит что это методы класса.Значит можно сделать просто подпрограммами по идее?Значит в классе будет только поля и все!
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
08.10.2011, 14:43     Класс "Историческое событие" #6
Цитата Сообщение от Lennadij Посмотреть сообщение
и как это сделать?
http://www.cyberforum.ru/misc.php?do=bbcode
-=ЮрА=-
Заблокирован
Автор FAQ
08.10.2011, 16:17     Класс "Историческое событие" #7
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;
}
Миниатюры
Класс "Историческое событие"  
Lennadij
3 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 45
17.10.2011, 22:49  [ТС]     Класс "Историческое событие" #8
что то не считает промежуток между 2 датами(((

Добавлено через 44 минуты
точнее сказать считает, но не при всех значениях правильно((
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.10.2011, 23:50     Класс "Историческое событие" #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
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <boost/date_time/gregorian/gregorian.hpp>
 
class Event
{
public:
   Event(const boost::gregorian::date& dt, const std::string& nm):date(dt), name(nm)
   {
   }
   const boost::gregorian::date get_date() const {return date;}
   const std::string get_name() const {return name;}
private:
  boost::gregorian::date date;
  std::string name;
};
 
std::ostream& operator <<(std::ostream& os, const Event& event)
{
    os << "Date: "  << event.get_date() << std::endl;
    os << "Name: " << event.get_name() << std::endl;
    return os;
}
 
struct CompareEventsByNameLess
{
    bool operator () (const Event& first, const Event& second)
    {
         return first.get_name() < second.get_name();
    }
};
 
boost::gregorian::date_duration between_two_events(const Event& first, const Event& second)
{
    if (first.get_date() > second.get_date())
    {
       return first.get_date() - second.get_date();
    }
    else
    {
       return second.get_date() - first.get_date();
    }
}
 
int main()
{
    std::vector<Event> events = {
    Event(boost::gregorian::date(1991, 10, 12), "something"),
    Event(boost::gregorian::date(1991, 10, 9), "other event"),
    Event(boost::gregorian::date(1991, 9, 8), "event")};
    std::copy(events.begin(), events.end(), std::ostream_iterator<Event>(std::cout));
    std::sort(events.begin(), events.end(), CompareEventsByNameLess());
    std::copy(events.begin(), events.end(), std::ostream_iterator<Event>(std::cout));
    std::cout << "Between two events: " << between_two_events(events[0], events[1]) << " days" << std::endl;
}
http://liveworkspace.org/code/9fe14a...ac1451b52da52a
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2011, 00:02     Класс "Историческое событие" #10
Цитата Сообщение от ForEveR Посмотреть сообщение
const std::string get_name() const {return name;}
а чем обусловлено возвращение объекта как константного, в чем профит?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.10.2011, 00:53     Класс "Историческое событие" #11
Jupiter, Ни в чем. Я просто люблю const. И если я возвращаю неизменяемые данные - я использую const.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2012, 04:04     Класс "Историческое событие"
Еще ссылки по теме:

C++ Иерархия: класс "карта", "колода карт"
Класс "Матрица". Перегрузка оператора "минус" C++
C++ Создать класс "прямоугольник" и перегрузить операцию отношения "равно"

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

Или воспользуйтесь поиском по форуму:
Dzhenn
Сообщений: n/a
02.06.2012, 04:04     Класс "Историческое событие" #12
Спасибо. Твой вариант решения очень помог.
Правильный вариант нахождения промежутка между двумя датами:

C++
1
2
3
4
5
6
7
8
9
10
// операцию разности двух дат (результат в виде количества дней между датами)
    int operator-(Date Event){
        bool Earlier = isEarlier(Event);
        if(Earlier)
            day = Event.GetDaysInYear() - Event.GetDayOfYear() + GetDayOfYear();
        else
            day = GetDaysInYear() - GetDayOfYear() + Event.GetDayOfYear();
        return day;
        
}
Yandex
Объявления
02.06.2012, 04:04     Класс "Историческое событие"
Ответ Создать тему
Опции темы

Текущее время: 22:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru