Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190

Конечный автомат, реализующий работу лифта

01.12.2014, 01:55. Показов 3815. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При нажатии комбинации кнопок cUocDo должен быть таким:
Текущее состояние: oD
Текущее состояние: cD
Текущее состояние: cU
Текущее состояние: oU
Текущее состояние: cU
Текущее состояние: cD
Текущее состояние: oD
Но уже при нажатии кнопок cU появляется такой результат:
Текущее состояние: oD
Текущее состояние: cD
Текущее состояние: oD
Недопустимый переход

Может, нужно учитывать кнопки, которые были нажаты, но как это сделать?

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
 
public class MyForm : Form
{
 
    enum StateType { oD, cD, cU, oU }
    StateType State = StateType.oD;
    private Button button1;
    private Button button2;
    private Button button3;
    private Button button4;
    private void btnClick(Object sender, EventArgs ea)
    {
        Button bt = (Button)sender;
 
        StateType State = StateType.oD;
        try
        {
 
            Console.WriteLine("Текущее состояние: {0}", State);
            switch (State)
            {
                case StateType.oD: switch (bt.Text)
                    {
                        case "c": State = StateType.cD; break;
                        default: throw new Exception();
                    }
                    break;
                case StateType.cD: switch (bt.Text)
                    {
 
                        case "o": State = StateType.oD; break;
                        case "U": State = StateType.cU; break;
                        default: throw new Exception();
                    }
                    break;
                case StateType.cU: switch (bt.Text)
                    {
                        case "D": State = StateType.cD; break;
                        case "o": State = StateType.oU; break;
                        default: throw new Exception();
                    }
                    break;
                case StateType.oU: switch (bt.Text)
                    {
                        case "c": State = StateType.cU; break;
                        default: throw new Exception();
                    }
                    break;
            }
            Console.WriteLine("Текущее состояние: {0}", State);
        }
        catch (Exception)
        {
            Console.WriteLine("Недопустимый переход");
            Console.ReadLine();
        }
    }
 
 
 
    public MyForm()
    {
 
 
        ClientSize = new System.Drawing.Size(600, 400);
        StartPosition = FormStartPosition.CenterScreen;
        this.Text = "All Laucher";
 
        button1 = new Button();
        button1.Name = "c";
        button1.Text = "c";
        button1.Width = 100;
        button1.Height = 30;
        button1.Location = new System.Drawing.Point(50, 150);
        this.button1.Click += new System.EventHandler(this.btnClick);
        button2 = new Button();
        button2.Name = "o";
        button2.Text = "o";
        button2.Width = 100;
        button2.Height = 30;
        button2.Location = new System.Drawing.Point(50, 50);
 
        this.button2.Click += new System.EventHandler(this.btnClick);
        button3 = new Button();
        button3.Name = "U";
        button3.Text = "U";
        button3.Width = 100;
        button3.Height = 30;
        button3.Location = new System.Drawing.Point((ClientRectangle.Width - button1.Size.Width) / 50, ClientRectangle.Height - 150);
 
        this.button3.Click += new System.EventHandler(this.btnClick);
        button4 = new Button();
        button4.Name = "D";
        button4.Text = "D";
        button4.Width = 100;
        button4.Height = 30;
        button2.Location = new System.Drawing.Point(250, 250);
 
        this.button4.Click += new System.EventHandler(this.btnClick);
        Controls.AddRange(new System.Windows.Forms.Control[] { this.button1 });
        Controls.AddRange(new System.Windows.Forms.Control[] { this.button2 });
        Controls.AddRange(new System.Windows.Forms.Control[] { this.button3 });
        Controls.AddRange(new System.Windows.Forms.Control[] { this.button4 });
    }
    public static void Main()
    {
 
 
 
        Application.Run(new MyForm());
        Console.ReadLine();
    }
 
 
}
Добавлено через 3 часа 20 минут
При нажатии "c", видимо, выполняется
C#
1
2
3
4
5
6
case StateType.oD: switch (bt.Text)
                    {
                        case "c": State = StateType.cD; break;
                        default: throw new Exception();
                    }
                    break;
и опять возвращается к StateType.oD, хотя должно переходить к StateType.сD. Как сделать так, чтобы программа переходила к следующему case? Помогите, пожалуйста!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.12.2014, 01:55
Ответы с готовыми решениями:

Построить автомат, реализующий работу лифта
Здравствуйте форумчане, есть задание требующее построить КА реализующий работу 6-этажного лифта с возможностью приёма на борт пассажиров....

Конечный автомат
Всем доброго времени суток! Я в программировании кое-что понимаю, но именно что "кое-что". По болезни пропустил недели две,...

Конечный автомат
Здравствуйте, мне в задании дан недетерминированный конечный автомат и его мне надо преобразовать в конечный автомат, вот что у меня...

14
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
01.12.2014, 08:42
Цитата Сообщение от Julia9311 Посмотреть сообщение
При нажатии комбинации кнопок cUocDo
Допускаю, что ты понимаешь о чём идёт речь. Но все остальные вряд ли. Поясни свою задачу подробно
0
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
01.12.2014, 10:45  [ТС]
Программа представляет собой моделирование лифта при помощи конечного автомата. Лифт имеет 4 состояния: 1 первый этаж, двери закрыты(cD); первый этаж, двери открыты (oD); второй этаж, двери закрыты (cU); второй этаж, двери открыты (oU). Любая команда переводит лифт из одного состояния в другое. cUocDo - комбинация вводимых команд для проверки результата работы программы.
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
01.12.2014, 15:40
Цитата Сообщение от Julia9311 Посмотреть сообщение
cUocDo - комбинация вводимых команд для проверки результата работы программы.
Команды разделяются символом 'o'?

Добавлено через 10 минут
Ты начала писать "в лоб" и это главная ошибка. Сначала разработай модель, потом привязывай её к кнопкам, консоли и чему угодно. Почитай эти статьи:
Простой конечный автомат на Unity
Простые стейт-машины на службе у разработчика
Ну и я подумаю, может что толковое надумается
0
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
01.12.2014, 15:48  [ТС]
ViterAlex, Нет

Добавлено через 7 минут
Команды не разделяются символом 'o'
0
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
01.12.2014, 15:55  [ТС]
Вот схема функционирования лифта
Изображения
 
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
01.12.2014, 16:28
Julia9311, данный код вообще работать не будет. Команды
C#
1
2
 Console.WriteLine("Недопустимый переход");
Console.ReadLine();
не используются в оконных приложениях.
Цитата Сообщение от Julia9311 Посмотреть сообщение
Как сделать так, чтобы программа переходила к следующему case?
Нужно пошагово выполнить программу и посмотреть, что там происходит с переменными (F9 - точка останова, F10 - пошаговое выполнение, F11 - пошагово с входом в методы)
0
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
01.12.2014, 19:06  [ТС]
nio, код работает, только кнопки нажимаются на форме, а все остальное выполняется в консоли

Добавлено через 23 минуты
С точками останова останавливается на этом:
C#
1
2
3
4
5
6
case StateType.oD: switch (bt.Text)
                    {
                        case "c": State = StateType.cD; break;
                        default: throw new Exception();
                    }
                    break;
А при нажатии F10 и F11 стрелочка указывает сюда:
C#
1
2
 public static void Main()
    {
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
02.12.2014, 09:22
Цитата Сообщение от Julia9311 Посмотреть сообщение
С точками останова останавливается на этом
дальше жмёшь F10 или F11 и смотришь, как выполняется программа, и как изменяются переменные
0
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
03.12.2014, 17:20  [ТС]
Тут, скорее всего нужно сделать счетчик. Например, нажали кнопку "c", счетчик учел этот клик, нажали следующую - учел и т.д. Как можно сделать здесь счетчик?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.12.2014, 08:07
У тебя всего четыре функции перехода: c, o, U, D. Которые могут быть сведены к двум: co, UD. А ты попыталась их засунуть в одну и запуталась в switch...case
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
enum StateType { oD, cD, cU, oU }
StateType State = StateType.oD;
/// Нажатие кнопок
private void button_Click(object sender, EventArgs e) {
    Button btn = sender as Button;
    switch (btn.Text) {
        case "o":
            co();
            break;
        case "c":
            co();
            break;
        case "U":
            UD();
            break;
        case "D":
            UD();
            break;
    }
}
/// <summary>Функция перехода по горизонтали</summary>
/// <param name="printstate">Печатать ли состояние?</param>
void co(bool printstate = true) {
    switch (State) {
        case StateType.oD:
            State = StateType.cD;
            break;
        case StateType.cD:
            State = StateType.oD;
            break;
        case StateType.cU:
            State = StateType.oU;
            break;
        case StateType.oU:
            State = StateType.cU;
            break;
    }
    if (printstate) PrintState();
}
 
private void PrintState() {
    Console.WriteLine("Текущее состояние {0}", Enum.GetName(typeof(StateType), State));
}
/// <summary>Функция перехода по вертикали</summary>
/// <param name="printstate">Печатать ли состояние?</param>
void UD(bool printstate = true) {
    switch (State) {
        case StateType.cD:
            State = StateType.cU;
            break;
        case StateType.cU:
            State = StateType.cD;
            break;
        default:
            co();
            UD(false);
            break;
    }
    if (printstate) PrintState();
}
1
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
05.12.2014, 23:53  [ТС]
ViterAlex, спасибо!
0
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
08.12.2014, 05:19  [ТС]
Здесь можно выбрать один из двух вариантов: либо с или о, либо U или D. А как быть, если нужно выбрать один из четырех вариантов? Например, мне нужно выбрать одну из букв: P, A, B или E.
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
08.12.2014, 05:39
Цитата Сообщение от Julia9311 Посмотреть сообщение
мне нужно выбрать одну из букв: P, A, B или E.
Ты неверно формулируешь задачу. Тебе не нужно выбирать буквы. Нужно смотреть на схему работы конечного автомата и плясать от неё. Я ничего не мог понять из твоих объяснений, пока не увидел картинку. Тогда всё стало ясно.
0
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 190
08.12.2014, 09:14  [ТС]
ViterAlex, просто у меня появилась похожая задача. Модель кофейного автомата. Пользователь может выбрать:
1.) обычный кофе, капучино, эспрессо, какао
2.) с сахаром, без сахара,
3.) с молоком, без молока
4.) со стаканом, без стакана
С 2, 3, 4 пунктом все понятно, а как быть с первым?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2014, 09:14
Помогаю со студенческими работами здесь

Конечный автомат
Объясните что представляет из себя конечный автомат. Что это такое? Как он работает?

Конечный автомат
Всем привет, дан код: class Program { static void Main() { int nums = 0, letters = 0; ...

Конечный автомат
Доброго времени суток! Помогите, пожалуйста, разобрать задачу. Дано условие: C*C(aa)b(a)*(aa|ab) Для этого нужно написать задачу на...

Конечный автомат
Господин Usaga, еще раз простите за мою прошлую грубость. Если вы пишете, что посимвольный обход строки быстрее, чем rfind, значит,...

Конечный автомат
Задание типа нахождения кратчайшей последовательности вставок и удалений одного символа превращающий данную цепочку x в такую же данную y,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru