Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
1

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

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

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

Используя две емкости 3 л. и 5 л., нужно набрать в столитровую бочку M литров воды
Используя две емкости 3л і 5л нужно набрать в столитровую бочку бочку M литров воды, при этом...

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

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

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

16
1991 / 1162 / 444
Регистрация: 20.12.2014
Сообщений: 3,087
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
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
02.04.2015, 13:03  [ТС] 3
Спасибо. Только если на первом шаге открыть вторую трубу воды станет -6 литров) Буду исправлять
0
1991 / 1162 / 444
Регистрация: 20.12.2014
Сообщений: 3,087
02.04.2015, 15:07 4
Цитата Сообщение от bbq Посмотреть сообщение
Только если на первом шаге открыть вторую трубу воды станет -6 литров)
Времени не было ограничения отрабатывать. Замените 41 строку:
C#
1
If (v1 > 0) v1 -= 6;
0
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
02.04.2015, 16:37  [ТС] 5
Объясните ещё пожалуйста, для чего нужны
C#
1
2
int coef = 0;
int wrk = 5;
и почему wrk = 5?
0
1991 / 1162 / 444
Регистрация: 20.12.2014
Сообщений: 3,087
02.04.2015, 16:57 6
Цитата Сообщение от bbq Посмотреть сообщение
и почему wrk = 5?
Принципиально без разницы чему по умолчанию равен coef, да и wrk может быть любым кроме 0, я и выбрал в первом случае 0, а во втором 5 - "ничего не делаем", потому что еще ничего не делали
0
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
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
1991 / 1162 / 444
Регистрация: 20.12.2014
Сообщений: 3,087
07.04.2015, 21:39 8
В общем, принцип тот же, только с учетом открытия/закрытия и с использованием функций? С функциями я не очень дружу , но попробовать можно.
0
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
07.04.2015, 22:39  [ТС] 9
именно так. Наличие функций было аргументировано тем, что если будет например 10 труб, то гораздо легче копипастить функции, а не переделывать много кода
0
1991 / 1162 / 444
Регистрация: 20.12.2014
Сообщений: 3,087
07.04.2015, 22:51 10
Логично. А что со временем?
0
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
07.04.2015, 23:05  [ТС] 11
что именно со временем?
0
1991 / 1162 / 444
Регистрация: 20.12.2014
Сообщений: 3,087
07.04.2015, 23:21 12
Срок, когда это должно быть готово
0
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
07.04.2015, 23:28  [ТС] 13
если супер в идеале, то завтра до 13 по Москве, но можно и через неделю)
0
Эксперт .NETАвтор FAQ
10120 / 4946 / 1798
Регистрация: 11.01.2015
Сообщений: 6,158
Записей в блоге: 34
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
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
07.04.2015, 23:51  [ТС] 15
Storm23, код классный и работает как надо, но боюсь, что с моим нубо-знанием язык будет сложно разобраться в коде
0
1991 / 1162 / 444
Регистрация: 20.12.2014
Сообщений: 3,087
08.04.2015, 00:26 16
bbq, код действительно классный. После него писать что-то более примитивное даже как-то неудобно . Так вы используете его, или нет? Если нет, то до завтра, конечно, не получится, но в течение недели, думаю можно попробовать сделать "упрощенный" вариант.
0
210 / 207 / 146
Регистрация: 20.11.2014
Сообщений: 1,159
08.04.2015, 11:13  [ТС] 17
вроде приняли, спасибо вам!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2015, 11:13

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

Смешано V1 литров воды температуры
Смешано V1 литров воды температуры t1 c V2 литрами воды температуры t2. Найти объём и температуру...


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

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

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