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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
Lennadij
3 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 45
#1

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

08.10.2011, 09:19. Просмотров 2921. Ответов 11
Метки нет (Все метки)

//Ввести класс ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и протестировать функцию
//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;}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2011, 09:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс "Историческое событие" (C++):

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

Создать класс комплексных чисел и ввести операции: "+", "-", "*", "/". - C++
пожалуйста-помогите написатьпрограмму!!! сижу на экзамене!!! вот само задание: создать класс комплексных чисел и ввести операции: &quot;+&quot;,...

Наследуемым классом для комплексного числа объявить класс "радиус-вектор", имеющий данные "длина" и "угол" - C++
кто то напишите пожалуйста, вот программа: наследуемым классом для комплексного числа объявить класс &quot;радиус-вектор&quot;, имеющий данные...

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

Не по теме:

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

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

Добавлено через 44 минуты
точнее сказать считает, но не при всех значениях правильно((
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.10.2011, 00:02 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
const std::string get_name() const {return name;}
а чем обусловлено возвращение объекта как константного, в чем профит?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
18.10.2011, 00:53 #11
Jupiter, Ни в чем. Я просто люблю const. И если я возвращаю неизменяемые данные - я использую const.
1
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;
        
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2012, 04:04
Привет! Вот еще темы с ответами:

Класс "Графический объект", от которого будут наследоваться классы "круг" и "квадрат" - C++
Реализовать класс Графический объект от которого будут наследоваться классы &quot;круг&quot; и &quot;квадрат&quot;. Собственно, сам код, который был написан...

Создать иерархию классов: родительский класс "Транспорт", класс-потомок "Техосмотр транспорта" - C++
Помогите пожалуйста написать программу Родительский класс &quot;Транспорт&quot;. Поля класса: тип транспорта, гос.номер, марка, Ф.И.О владельца,...

Базовый класс "Источник напряжения", производные классы "Цепь" и "Аккумулятор" - C++
Дали задачу по программированию: составить класс &quot;Источник напряжения&quot;, для которого нужно реализовать два производных класса: &quot;Цепь&quot; и...

Создать класс "Шар", заданный радиусом, и определить производный класс "Окружность" - C++
Создать класс шар, заданный радиусом. Определить производный класс окружности. Предусмотреть виртуальную функцию для вычисления площади...


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

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

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