Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
1

Написать автомат, который покажет сколько литров воды в ёмкости после каждого воздействия

01.04.2015, 10:51. Просмотров 748. Ответов 16
Метки нет (Все метки)

Не очень понимаю в автоматах требуется помощь. Задача звучит так: есть некая емкость и 2е трубы с вентелями, которые открывают или закрывают трубы. Через одну трубу вода втекает, через другую вытекает. Есть состояния у вентелей открыт/закрыт/открывается/закрывается. В открытом состоянии трубы пропускают 6 литров воды, в открывающемся/закрывающемся - 3 литра. Также есть 5 воздействий: 1. Открыть первую трубу. 2. Закрыть первую трубу. 3. Открыть вторую трубу. 4. Закрыть вторую трубу. 5. Ничего не делать. Требуется написать автомат, который покажет сколько литров воды в ёмкости после каждого воздействия. Начинаем с состояния обе трубы закрыты.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2015, 10:51
Ответы с готовыми решениями:

В посуде А (c) литров воды, в посуде В (х) литров воды. Из А сосуды вылили половину воды в сосуд В , потом из
В посуде А (c) литров воды, в посуде В (х) литров воды. Из А сосуды вылили половину воды в сосуд В...

Сколько литров каждого сока надо взять, чтобы приготовить S литров коктейлей?
В кафе готовят коктейль из малинового и ананасового соков. Известно, что X литров малинового сока...

Бассейн Сколько литров воды зальётся за минуту
2) В бассейн, в первую секунду было залито 15 литров воды, во вторую 20 литров, в третью секунду...

Разделить 12 литров воды поровну с помощью 2 пустых ведер с емкостью 8 и 5 литров
Имеется 12 литров воды,нужно разделить поровну с помощью 2 пустых ведер с емкостью 8 и 5 литров.

Написать код который покажет значения массива а потом его перевернет
Не могу написать код в с++ который покажет и потом перевернет рандом не значения массива.Помогите...

16
chumich
1483 / 845 / 280
Регистрация: 20.12.2014
Сообщений: 2,164
02.04.2015, 09:24 2
Лучший ответ Сообщение было отмечено bbq как решение

Решение

Вот, посмотрите для примера вариант воплощения вашей задачи без учета состояния вентилей - только через состояние труб (то есть по команде открыть, труба сразу пропускает/выпускает 6 л, по команде закрыть - сразу прекращает поток):
Кликните здесь для просмотра всего текста
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
        static void Main(string[] args)
        {
            Console.Write("Инструкция по эксплуатации: ");
            Console.Write("\n0 - конец рабочего дня(выход из программы)\n1 - открыть первую трубу\n2 - закрыть первую трубу\n3 - открыть вторую трубу\n4 - закрыть вторую трубу\n5 - ничего не делать\n\n");
            Console.Write("Ввести объем емкости: ");
            int v = Convert.ToInt32(Console.ReadLine());
            int v1 = 0; // количество воды в емкости
            bool openclose1 = false;
            bool openclose2 = false;
            int coef = 0;
            int wrk = 5;
            while (wrk != 0)
            {
                Console.Write("\nСостояние объекта: ");
                if (openclose1 == false) Console.Write("\nТруба 1 закрыта");
                else Console.Write("\nТруба 1 открыта");
                if (openclose2 == false) Console.Write("\nТруба 2 закрыта");
                else Console.Write("\nТруба 2 открыта");
                Console.Write("\nОбъем воды в емкости: " + v1 + "л");
                if (v <= v1 && openclose1 == true) Console.Write("\nЁмкость полна, закройте трубу 1");
                if (v1 <= 0 && openclose2 == true) Console.Write("\nЁмкость пуста, закройте трубу 2");
                if (openclose1 == false && openclose2 == false) coef = 11;
                if (openclose1 == true && openclose2 == false) coef = 22;
                if (openclose1 == true && openclose2 == true) coef = 33;
                if (openclose1 == false && openclose2 == true) coef = 44;
                Console.Write("\n\nЧто делаем? ");
                wrk = Convert.ToInt32(Console.ReadLine());
                switch (coef)
                {
                 case 11:
                    switch (wrk)
                    {
                        case 1:
                            v1 += 6;
                            openclose1 = true;
                            break;
                        case 2:
                            Console.Write("\nОна и так закрыта!");
                            break;
                        case 3:
                            v1 -= 6;
                            openclose2 = true;
                            break;
                        case 4:
                            Console.Write("\nОна и так закрыта!");
                            break;
                        case 5:
                            Console.Write("\nПохоже у нас перекур...");
                            break;
                        default:
                            if (wrk == 0) Console.Write("\nДо новых встреч!");
                            else Console.Write("\nВведите число от 0 до 5");
                            break;
                    }
                    break;
                case 22:
                    switch (wrk)
                    {
                        case 1:
                            Console.Write("\nОна и так открыта!");
                            v1 += 6;
                            break;
                        case 2:
                            openclose1 = false;
                            break;
                        case 3:
                            openclose2 = true;
                            break;
                        case 4:
                            Console.Write("\nОна и так закрыта!");
                            v1 += 6;
                            break;
                        case 5:
                            Console.Write("\nПохоже у нас перекур...");
                            v1 += 6;                          
                            break;
                        default:
                            if (wrk == 0) Console.Write("\nДо новых встреч!");
                            else Console.Write("\nВведите число от 0 до 5");
                            break;
                    }
                    break;
                case 33:
                    switch (wrk)
                    {
                        case 1:
                            Console.Write("\nОна и так открыта!");
                            break;
                        case 2:
                            openclose1 = false;
                            v1 -= 6;
                            break;
                        case 3:
                            Console.Write("\nОна и так открыта!");
                            break;
                        case 4:
                            openclose1 = false;
                            v1 += 6;
                            break;
                        case 5:
                            Console.Write("\nПохоже у нас перекур...");
                            break;
                        default:
                            if (wrk == 0) Console.Write("\nДо новых встреч!");
                            else Console.Write("\nВведите число от 0 до 5");
                            break;
                    }
                    break;
                case 44:
                    switch (wrk)
                    {
                        case 1:
                            openclose1 = true;
                            break;
                        case 2:
                            Console.Write("\nОна и так закрыта!");
                            v1 -= 6;
                            break;
                        case 3:
                            Console.Write("\nОна и так открыта!");
                            v1 -= 6;
                            break;
                        case 4:
                            openclose2 = false;
                            break;
                        case 5:
                            Console.Write("\nПохоже у нас перекур...");
                            v1 -= 6;
                            break;
                        default:
                            if (wrk == 0) Console.Write("\nДо новых встреч!");
                            else Console.Write("\nВведите число от 0 до 5");
                            break;
                    }
                    break;
                }
            }
            Console.Read();
        }

Если учитывать состояние вентилей, то можно использовать этот же подход, просто увеличится число вариантов в свитчах.
1
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
02.04.2015, 13:03  [ТС] 3
Спасибо. Только если на первом шаге открыть вторую трубу воды станет -6 литров) Буду исправлять
0
chumich
1483 / 845 / 280
Регистрация: 20.12.2014
Сообщений: 2,164
02.04.2015, 15:07 4
Цитата Сообщение от bbq Посмотреть сообщение
Только если на первом шаге открыть вторую трубу воды станет -6 литров)
Времени не было ограничения отрабатывать. Замените 41 строку:
C#
1
If (v1 > 0) v1 -= 6;
0
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
02.04.2015, 16:37  [ТС] 5
Объясните ещё пожалуйста, для чего нужны
C#
1
2
int coef = 0;
int wrk = 5;
и почему wrk = 5?
0
chumich
1483 / 845 / 280
Регистрация: 20.12.2014
Сообщений: 2,164
02.04.2015, 16:57 6
Цитата Сообщение от bbq Посмотреть сообщение
и почему wrk = 5?
Принципиально без разницы чему по умолчанию равен coef, да и wrk может быть любым кроме 0, я и выбрал в первом случае 0, а во втором 5 - "ничего не делаем", потому что еще ничего не делали
0
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
07.04.2015, 21:03  [ТС] 7
запароли всю задачу сегодня. Нужна снова ваша помощь. Реализовать нужно примерно так(псевдокод):
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        public void truba1(int state, int input)
        {
            switch по state 4 штуки: открывается, закрывается, открыта, закрыта
            возврат newstate
        }
 
 
        public void truba2(int state, int input);
        {
            switch по state 4 штуки: открывается, закрывается, открыта, закрыта
            возврат newstate
        }
        static void Main(string[] args)
        {
 
            int wrk = 5;
            while (wrk != 0)//бесконечный цикл
            {
 
                считали входное 1-5: открыть первую закрыть первую, открыть вторую, закрыть вторую, ничего не делать
                   свич по этим входным
                  запуск функции труба 
                 вывод итоговый объем
                }
 
            }
        }
У нас 2е трубы и 2 крана(по одному на трубу).Начальное положение оба крана закрыты. Мы посылаем на первый команду открыть(в процессе открытия вливается некий объем воды, например 3 литра), вывод в консоли: кран 1 - открывается, 2- закрыт. открытие/закрытие происходит в течении одной команды. далее например жмем открыть второй кран, в консоли уже будет первый открыт 2 открывается
0
chumich
1483 / 845 / 280
Регистрация: 20.12.2014
Сообщений: 2,164
07.04.2015, 21:39 8
В общем, принцип тот же, только с учетом открытия/закрытия и с использованием функций? С функциями я не очень дружу , но попробовать можно.
0
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
07.04.2015, 22:39  [ТС] 9
именно так. Наличие функций было аргументировано тем, что если будет например 10 труб, то гораздо легче копипастить функции, а не переделывать много кода
0
chumich
1483 / 845 / 280
Регистрация: 20.12.2014
Сообщений: 2,164
07.04.2015, 22:51 10
Логично. А что со временем?
0
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
07.04.2015, 23:05  [ТС] 11
что именно со временем?
0
chumich
1483 / 845 / 280
Регистрация: 20.12.2014
Сообщений: 2,164
07.04.2015, 23:21 12
Срок, когда это должно быть готово
0
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
07.04.2015, 23:28  [ТС] 13
если супер в идеале, то завтра до 13 по Москве, но можно и через неделю)
0
Storm23
Эксперт .NETАвтор FAQ
7153 / 4235 / 1552
Регистрация: 11.01.2015
Сообщений: 5,488
Записей в блоге: 32
07.04.2015, 23:37 14
Лучший ответ Сообщение было отмечено bbq как решение

Решение

Цитата Сообщение от bbq Посмотреть сообщение
Задача звучит так: есть некая емкость и 2е трубы с вентелями, которые открывают или закрывают трубы. Через одну трубу вода втекает, через другую вытекает. Есть состояния у вентелей открыт/закрыт/открывается/закрывается. В открытом состоянии трубы пропускают 6 литров воды, в открывающемся/закрывающемся - 3 литра. Также есть 5 воздействий: 1. Открыть первую трубу. 2. Закрыть первую трубу. 3. Открыть вторую трубу. 4. Закрыть вторую трубу. 5. Ничего не делать. Требуется написать автомат, который покажет сколько литров воды в ёмкости после каждого воздействия. Начинаем с состояния обе трубы закрыты.
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
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication176
{
    class Program
    {
        static void Main(string[] args)
        {
            //создаем емкость
            var tank = new Tank();
            //добавляем две трубы
            tank.Pipes.Add(new Pipe() { Name = "Труба 1", Direction = PipeDirection.Incoming });
            tank.Pipes.Add(new Pipe() { Name = "Труба 2", Direction = PipeDirection.Outcouming });
            //
            var cmd = "";
            do
            {
                //обновялем состояние емкости
                tank.Update();
                //выводим состояние емкости
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(tank);
                Console.ResetColor();
                //обновляем состояние труб
                tank.UpdatePipes();
                //подсказка
                Console.WriteLine("1 Открыть первую трубу\r\n2 Закрыть первую трубу\r\n3 Открыть вторую трубу\r\n4 Закрыть вторую трубу\r\n5 Ничего не делать\r\n9 Выход");
                //читаем управляющее воздействие
                cmd = Console.ReadLine();
                switch (cmd)
                {
                    case "1": tank.Pipes[0].SetState(PipeState.Opened); break;
                    case "2": tank.Pipes[0].SetState(PipeState.Closed); break;
                    case "3": tank.Pipes[1].SetState(PipeState.Opened); break;
                    case "4": tank.Pipes[1].SetState(PipeState.Closed); break;
                }
            } while (cmd != "9");
        }
    }
 
    class Tank
    {
        public string Name { get; set; }
        public float Capacity { get; set; }
        public float CurrentVolume { get; set; }
        public List<Pipe> Pipes { get; private set; }
 
        public Tank()
        {
            Name = "Емкость";
            Pipes = new List<Pipe>();
            Capacity = 100;
        }
 
        public void Update()
        {
            foreach(var pipe in Pipes)
                CurrentVolume += pipe.Bandwidth*(int)pipe.Direction;
 
            if (CurrentVolume > Capacity)
                CurrentVolume = Capacity;
 
            if (CurrentVolume < 0)
                CurrentVolume = 0;
        }
 
        public void UpdatePipes()
        {
            foreach (var pipe in Pipes)
                pipe.GoToNextState();
        }
 
        public override string ToString()
        {
            var sb = new StringBuilder();
            foreach(var pipe in Pipes)
                sb.AppendFormat("{0}: {1}\r\n", pipe.Name, pipe.State);
            
            return string.Format("Текущий объем жидкости в {0}: {1:G}\r\n{2}", Name, CurrentVolume, sb);
        }
    }
 
    class Pipe
    {
        public string Name { get; set; }
        public PipeState State { get; private set;}
        public Dictionary<PipeState, float> Bandwidthes { get; private set; }
 
        public float Bandwidth{ get{ return Bandwidthes[State];} }
        public PipeDirection Direction { get; set;}
 
        public Pipe()
        {
            Bandwidthes = new Dictionary<PipeState,float>();
            Bandwidthes[PipeState.Closed] = 0;
            Bandwidthes[PipeState.Opened] = 6;
            Bandwidthes[PipeState.Opening] = Bandwidthes[PipeState.Closing] = 3;
            Direction = PipeDirection.Incoming;
        }
 
        public void SetState(PipeState newState)
        {
            switch(newState)
            {
                case PipeState.Opened: 
                    if(State != PipeState.Opened) State = PipeState.Opening;
                    break;
 
                case PipeState.Closed: 
                    if(State != PipeState.Closed) State = PipeState.Closing;
                    break;
 
                default:
                    State = newState;
                    break;
            }
        }
 
        public void GoToNextState()
        {
            switch(State)
            {
                case PipeState.Opening: State = PipeState.Opened; break;
                case PipeState.Closing: State = PipeState.Closed; break;
            }
        }
    }
 
    enum PipeState
    {
        Closed = 0,
        Opening = 1,
        Closing = 2,
        Opened = 3
    }
 
    enum PipeDirection : int
    {
        Incoming = 1,
        Outcouming = -1
    }
}
2
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
07.04.2015, 23:51  [ТС] 15
Storm23, код классный и работает как надо, но боюсь, что с моим нубо-знанием язык будет сложно разобраться в коде
0
chumich
1483 / 845 / 280
Регистрация: 20.12.2014
Сообщений: 2,164
08.04.2015, 00:26 16
bbq, код действительно классный. После него писать что-то более примитивное даже как-то неудобно . Так вы используете его, или нет? Если нет, то до завтра, конечно, не получится, но в течение недели, думаю можно попробовать сделать "упрощенный" вариант.
0
bbq
198 / 198 / 143
Регистрация: 20.11.2014
Сообщений: 1,104
08.04.2015, 11:13  [ТС] 17
вроде приняли, спасибо вам!
0
08.04.2015, 11:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2015, 11:13

В сосуде А с литров воды, в сосуде В х литров воды
В сосуде А с литров воды, в сосуде В х литров воды. Из сосуда А вылили половину воды в сосуд В,...

Создать устройство автоматического наполнения воды в ёмкости с 1 концевым датчиком
Доброго времени суток! Хочу создать устройство автоматического наполнения воды в ёмкости с 1...

смешали v1 литров воды с температурой t1 градусов Цельсия с v2 литрами воды с температурой t2 градусов Цельсия. Вычислите объем и температуру
смешали v1 литров воды с температурой t1 градусов Цельсия с v2 литрами воды с температурой t2...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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