С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 10
1

Написать программу работы светофора, применив паттерн State

07.03.2016, 16:28. Показов 4667. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно написать программу работы светофора, применив паттерн State. Сам написал вот это и мне сказали что не правильно реализовал паттерн.
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
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
class Traficlight
{
  class State *current;
  public:
    Traficlight();
    void setCurrent(State *s)
    {
        current = s;
    }
    void red();
    void green();
};
 
class State
{
  public:
    virtual void red(Traficlight *m)
    {
        cout << "    RED-light\n";
    }
    
    virtual void green(Traficlight *m)
    {
        cout << "    RED-light\n";
    }
};
 
void Traficlight::red()
{
  current->red(this);
}
 
void Traficlight::green()
{
  current->green(this);
}
 
class RED: public State
{
  public:
    RED()
    {
        HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(console, (WORD) ((0)|4));
        cout << "   Red-light  ";
    };
    ~RED()
    {
        HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(console, (WORD) ((0)|4));
        cout << "   next Red\n-*-*-*-*-*-*-*-*-*-*-*-*-*-*-\n";
    };
    void green(Traficlight *m);
};
 
class GREEN: public State
{
  public:
    GREEN()
    {
        HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(console, (WORD) ((0)|2));
        cout << "   Green-light  ";
    };
    ~GREEN()
    {
        HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(console, (WORD) ((0)|2));
        cout << "   next Green\n";
    };
    void red(Traficlight *m)
    {
       
        m->setCurrent(new RED());
        delete this;
    }
};
 
void RED::green(Traficlight *m)
{
  cout << "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-\n";
  m->setCurrent(new GREEN());
  delete this;
}
 
Traficlight::Traficlight()
{
  current = new RED();
  cout << '\n';
}
 
int main()
{
 
  void(Traficlight:: *ptrs[])() = 
  {
    &Traficlight::green, &Traficlight::red
  };
  Traficlight fsm;
 
  while (1)
  {
      for(int i=0; i<2; i++){
        Sleep(3000);
        //system("pause");
    (fsm.*ptrs[i])();
  }
}
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2016, 16:28
Ответы с готовыми решениями:

Паттерн State
Покажите пожалуйста простой, понятный пример с использованием паттерна состояния на java. В...

State паттерн и QWidget
Здравствуйте! Нужно организовать паттерн State для смены состояний игры (Загрузка,Меню,Игра,Таблица...

Написать программу, моделирующую поведение светофора
1. «Светофор». PD0 - «красный свет», PD1 - «желтый свет», PD2 - «зеленый свет». Красный и зеленый...

Написать программу переключения цветов светофора
Составить алгоритм переключения цветов светофора и написать саму программу. Паскаль АБЦ.НЕТ

14
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
07.03.2016, 17:44 2
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

murad8665,
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
//============================================================================
// Name        : Test2.cpp
 
#include <iostream>
#include <string>
#include <memory>
 
class TrafficLightColor
{
public:
    std::string colorName;
};
 
class ITrafficLight
{
public:
    virtual ~ITrafficLight()
    {
    }
 
    virtual void setColor(const TrafficLightColor& value) = 0;
    virtual TrafficLightColor getColor() const = 0;
};
 
class ITrafficLightState
{
public:
    virtual ~ITrafficLightState()
    {
    }
    virtual void handle(ITrafficLight*) = 0;
};
 
struct TrafficLightStateBroken: ITrafficLightState
{
    void handle(ITrafficLight* value) override
    {
        value->setColor(TrafficLightColor { "Oooops BrokenState" });
    }
};
 
class TrafficLight: public ITrafficLight
{
    std::shared_ptr<ITrafficLightState> currentState_ { std::make_shared<
            TrafficLightStateBroken>() };
    TrafficLightColor color_ { };
 
public:
    TrafficLight()
    {
        currentState_->handle(this);
    }
 
    void setState(const std::shared_ptr<ITrafficLightState>& value)
    {
        if (value != currentState_)
        {
            currentState_ = value;
            currentState_->handle(this);
        }
    }
 
    void setColor(const TrafficLightColor& value) override
    {
        color_ = value;
    }
 
    TrafficLightColor getColor() const override
    {
        return color_;
    }
};
 
struct TrafficLightStateRed: ITrafficLightState
{
    void handle(ITrafficLight* value) override
    {
        value->setColor(TrafficLightColor { "Red" });
    }
};
 
struct TrafficLightStateYellow: ITrafficLightState
{
    void handle(ITrafficLight* value) override
    {
        value->setColor(TrafficLightColor { "Yellow" });
    }
};
 
struct TrafficLightStateGreen: ITrafficLightState
{
    void handle(ITrafficLight* value) override
    {
        value->setColor(TrafficLightColor { "Green" });
    }
};
 
struct TrafficLightStateSineBeliyPowkaryabanniy: ITrafficLightState
{
    void handle(ITrafficLight* value) override
    {
        value->setColor(TrafficLightColor { "Ах эти гребанные школьники" });
    }
};
 
int main()
{
    TrafficLight trafficLight;
    std::cout << trafficLight.getColor().colorName << std::endl;
    trafficLight.setState(std::make_shared<TrafficLightStateGreen>());
    std::cout << trafficLight.getColor().colorName << std::endl;
    trafficLight.setState(std::make_shared<TrafficLightStateYellow>());
    std::cout << trafficLight.getColor().colorName << std::endl;
    trafficLight.setState(std::make_shared<TrafficLightStateRed>());
    std::cout << trafficLight.getColor().colorName << std::endl;
    trafficLight.setState(
            std::make_shared<TrafficLightStateSineBeliyPowkaryabanniy>());
    std::cout << trafficLight.getColor().colorName << std::endl;
}
Вся суть шаблона в том, что есть объект, им "управляет" состояние. И всё, более в шаблоне ничего нет. Переходы между различными состояниями далеко не обязаны быть инкапсулированы в сами состояния.
1
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 10
07.03.2016, 19:48  [ТС] 3
Каким компилятором пользуетесь? Мой компилятор выводит кучу ошибок
0
Модератор
Эксперт CЭксперт С++
5286 / 2373 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
07.03.2016, 20:10 4
Цитата Сообщение от murad8665 Посмотреть сообщение
Каким компилятором пользуетесь? Мой компилятор выводит кучу ошибок
Любой компилятор с поддержкой C++11 Вам подойдёт. Умные указатели std::shared_ptr появились в стандарте C++11.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 10
07.03.2016, 20:24  [ТС] 5
visual studia 12 и все равно ошибки
0
BrainOverflow
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
07.03.2016, 20:25 6
Кликните здесь для просмотра всего текста
murad8665, вы можете их выложить на форум, только тсс..
0
Модератор
Эксперт CЭксперт С++
5286 / 2373 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
07.03.2016, 21:21 7
Цитата Сообщение от murad8665 Посмотреть сообщение
все равно ошибки
Телепаты в отпуске, так что извините, что не можем Вам помочь, прочитав Ваши мысли.
0
GbaLog-
07.03.2016, 21:26
  #8

Не по теме:

gru74ik, Что-то они вечно в отпуске. :D

0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
08.03.2016, 00:03 9

Не по теме:

Цитата Сообщение от makfak Посмотреть сообщение
Что-то они вечно в отпуске.
Так они предчувствуют опасность :D


Цитата Сообщение от murad8665 Посмотреть сообщение
visual studia 12 и все равно ошибки
Оно и в 13 и в 15 слабо как-то
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 10
08.03.2016, 10:49  [ТС] 10
Написать программу работы светофора, применив паттерн State
0
BrainOverflow
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
08.03.2016, 10:57 11
murad8665, ???????
Миниатюры
Написать программу работы светофора, применив паттерн State   Написать программу работы светофора, применив паттерн State  
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
08.03.2016, 11:02 12
murad8665,
1) Напишите нужный конструктор для TrafficLightColor
2) Замените все, для вас неожиданные, фигурные скобки на обычные скобки.
3) Замените везде, где встречается shared_ptr | make_shared, на указатели.

Правьте до исчезновения ошибок.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 10
08.03.2016, 14:19  [ТС] 13
Хорошо, всем спасибо большое
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 10
12.03.2016, 18:17  [ТС] 14
Nosey, не могли бы объяснить немного об handle и shared? Не сталкивался с этим ранее и хотелось бы понять их суть на доступном языке, а не на научном как в книгах
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
14.03.2016, 12:31 15
Цитата Сообщение от murad8665 Посмотреть сообщение
handle
Это обычная виртуальная функция, ровно такая же как и у вас функции red и green.
Цитата Сообщение от murad8665 Посмотреть сообщение
shared
Это "умный укзатель", но тут рассказывать много, так что если оно вам не надо, просто замените на указатели. Если же надо, то по теме "умные указатели" в интернете и на форуме написано несказанно много.
1
14.03.2016, 12:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2016, 12:31
Помогаю со студенческими работами здесь

Написать программу, которая выводит на экран изображение светофора
2.Написать программу, которая выводит на экран изображение светофора. Кто нибудь помогите)=)

Написать программу, которая выводит изображение работающего светофора
Написать программу, которая выводит на экран изображе* ние работающего светофора. Рекомендуемый...

Написать программу которая нарисует на экране изображение светофора?
пожалуйста помогите написать код, прощууу

Написать программу, которая выводит на экран изображение работающего светофора
Есть работающий светофор, но нужно чтобы он работал по алгоритму, который я прикрепил ниже. (СМ....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru