Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
1

Смоделировать процесс обработки на станке 100 деталей. Подсчитать число заполненных тележек и число потерянных деталей

15.01.2012, 01:21. Показов 2030. Ответов 13
Метки нет (Все метки)

Условие задачи:
С интервалом времени 5 ± 2мин. детали поштучно поступают к станку на обработку и до начала обработки хранятся на рабочем столе, который вмещает 3 детали. Если свободных мест на столе нет, вновь поступающие детали укладываются в тележку, которая вмещает 5 деталей, если тележка заполняется до нормы, ее увозят к другим станкам, а на ее место через 8 ± 3мин. ставят новую тележку. Если во время отсутствия тележки поступает очередная деталь и не находит на столе мест, она считается потерянной. Рабочий берет детали на обработку в первую очередь из тележки, а если она пуста – со стола. Обработка деталей производится за 10 ± 5мин. Смоделировать процесс обработки на станке 100 деталей. Подсчитать число заполненных тележек и число потерянных деталей.

В Windows Forms делал на C#. Не могу понять как описать часть про тележку и 8 ± 3мин.
Создал 3 таймера:
1ый для 5 ± 2мин - поступление детали, работает пока не будет 100 деталей запущено.
2ой для 10 ± 5мин - обработка детали на станке, timer.stop() когда количество деталей =100 и стол пуст и телега пуста.
а вот с 3им для 8 ± 3мин. - проблема. Не могу понять, как описать условие - если интервал таймера закончился, то таймер выключить. Так как потом мы его еще будем включать. Помогите пожалуйста.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2012, 01:21
Ответы с готовыми решениями:

Смоделировать процесс обработки на станке 100 деталей
Помогите пожалуйста разобраться с задачей. Есть код, но не выводит ничего...вот код: void...

Смоделировать процесс обработки на станке 100 деталей
текст задания: С интервалом времени 5 ± 2 мин детали поштучно поступают к станку на обработку и до...

Смоделировать процесс обработки на станке 100 деталей
Помогите с кодом не пойму как исправить ошибку. Я сама новичок в языке GPSS. Задача такая:С...

Смоделировать процесс обработки деталей на станке
Не получается написать модель для данной задачи: С интервалом времени 5 ± 2 мин детали поштучно...

13
Заблокирован
15.01.2012, 06:38 2
Цитата Сообщение от Phant0m Посмотреть сообщение
а вот с 3им для 8 ± 3мин. - проблема. Не могу понять, как описать условие - если интервал таймера закончился, то таймер выключить. Так как потом мы его еще будем включать. Помогите пожалуйста.
Поставьте еще вспомогательный таймер, который в третьем запускается на 6 минут(у него есть счетчик, по достижению максимума счетчика он самоликвидируется).
Хотя, может быть это все решается проще, и вам нужно этот вопрос рассмотреть с другой стороны.
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
15.01.2012, 10:55  [ТС] 3
Почему на 6 минут?
А помочь с синтаксисом кто-нибудь может? Именно написать условие.

примерно в таком ключе:

C#
1
2
3
4
if (timer.Interval закончился) 
{
 timer.stop();
}
я нашел событие time_end, но оно как-то не так работает.
0
Заблокирован
15.01.2012, 11:03 4
Цитата Сообщение от Phant0m Посмотреть сообщение
Создал 3 таймера:
Во-первых покажи, что уже у тебя есть. Во-вторых, из условия задачи, как мне думается, необходимо интервалы твоих таймеров рандомно генерировать после каждого их включения в заданных пределах. Ну например, для первого от трех до семи минут.
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
15.01.2012, 11:44  [ТС] 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
145
146
147
148
149
150
151
152
153
154
155
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace KURSOV
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button3.Enabled = false;
        }
 
        int det_rab = 0; // деталь в обработке    
        int kol_det = 0; // количество деталей вступивших в оборот
        int rab_stol = 0; // количество деталей находящихся на столе
        int telega = 0; // количество деталей находящихся в телеге
        int poteri=0; // количество потерянных деталей
        int kol_teleg = 0; // количество использованных телег
        int result = 0; // количество деталей вступивших в систему
        int worktime = 0; // Общее время работы
        int time_end; //время отсутствия тележки
 
        int time1 = 5; // Основное время поступления детали
        int time2 = 2; // +\- для времени поступления деталей
        int time3 = 8; // Основное время через которое ставят  тележку
        int time4 = 3; // +\- для времени через которое ставят тележку
        int time5 = 10; // Основное время обработки детали на станке
        int time6 = 5; // +\- для времени обработки детали на станке
        int value; // рандом для +\-
        int a;
 
        private void button1_Click(object sender, EventArgs e) // ПРИМЕНЕНИЕ ИЗМЕНЕНИЙ
        {
            time1 = Convert.ToInt32(textBox1.Text);
            time2 = Convert.ToInt32(textBox2.Text);
            time3 = Convert.ToInt32(textBox3.Text);
            time4 = Convert.ToInt32(textBox4.Text);
            time5 = Convert.ToInt32(textBox5.Text);
            time6 = Convert.ToInt32(textBox6.Text);
        }
 
        private void button2_Click(object sender, EventArgs e) // ЗАПУСК
        {
            button2.Enabled = false;
            button3.Enabled = true;
            timer1.Start();
            timer4.Start();
     
            //Задание интервала поступления деталей
            byte value;
            Random PorM = new Random();
            value = (byte)PorM.Next(2);
            if (value == 0)
                 timer1.Interval = time1 + time2;
            else timer1.Interval = time1 - time2;
 
            //Задание времени обработки деталей
            value = (byte)PorM.Next(2);
            if (value == 0)
                 timer3.Interval = time5 + time6;
            else timer3.Interval = time5 - time6;
 
            //Задание времени отсутствия тележки
            value = (byte)PorM.Next(2);
            if (value == 0)
                 timer2.Interval = time3 + time4;
            else timer2.Interval = time3 - time4;
 
        }
 
        private void button4_Click(object sender, EventArgs e) // ВЫСТАВИТЬ УМОЛЧАНИЯ
        {
            time1 = 5;
            time2 = 2;
            time3 = 8;
            time4 = 3;
            time5 = 10;
            time6 = 5;
        }
 
        private void button3_Click(object sender, EventArgs e) // ОСТАНОВИТЬ 
        {
            button2.Enabled = true;
            timer1.Stop();
            timer2.Stop();
            timer3.Stop();
            button3.Enabled = false;
            result = 0;
            worktime = 0;
            poteri = 0;
            kol_teleg = 0;
            kol_det = 0;
            det_rab = 0;
        }
 
        private void timer1_Tick(object sender, EventArgs e) // таймер поступления деталей
        {
            result++;
            kol_det++;
 
            // здесь еще будет код
     
            if (result == 100)
            {
                timer1.Stop();
            }
        }
 
        private void timer2_Tick(object sender, EventArgs e) // таймер смены тележек
        {
              // здесь еще будет код
 
            timer2.Tick += new EventHandler(timer2_Tick); //как это работает???
            timer2.Stop(); // нужно условие для него.
 
        }
        
        private void timer3_Tick(object sender, EventArgs e) // таймер обработки деталей
        {
            
            // здесь еще будет код
 
            if ((rab_stol == 0) & (telega == 0) & (result == 100))
            {
                timer3.Stop();
                timer2.Stop();
                textBox10.Text = Convert.ToString(poteri);
                textBox11.Text = Convert.ToString(kol_teleg);
                MessageBox.Show("Вся нужная информация получена!\n" + "Программа работала " + worktime + " минут");
                button2.Enabled = true;
                button3.Enabled = false;
                result = 0;
                worktime = 0;
                poteri = 0;
                kol_teleg = 0;
                det_rab = 0;
                kol_det = 0;
            }
        } 
 
        
        private void timer4_Tick(object sender, EventArgs e) // таймер основного времени
        {
                 // это таймер общего времени работы программы
        }
 
    }
}
0
Эксперт .NET
15555 / 11804 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
15.01.2012, 11:53 6
Вот это хорошая задачка, люблю такие.
Я бы реализовал паттерн Consumer/Producer через три простых потока, где каждый поток выполняет свою задачу, а потом засыпает на необходимый период времени.
Рабочий <- Тележка <- Станок (-> Рабочий, если тележка пуста).

Архитектура проста:
1. Поток "Станок". Producer. Производит деталь, пытается положить в буфер-стол. Засыпает на 5 +/- 2.
2. Поток "Тележка". Producer/Consumer. Cгребает со стола детали, пока их не наберется пять штук. Как набралось - уезжает (вот тут не совсем понятно: что происходит с деталями в ней? Рабочий их может брать после отъезда?). Поток засыпает на 8 +/- 3, пока тележка "ездит".
3. Поток "Рабочий". Consumer. Пытается взять деталь из тележки. Если детали нет - пытается взять со стола. Если и на столе нет - наверное снова пытается в тележке взять. Как взял деталь - поток засыпает на 10 +/- 5, пока рабочий пилит деталь.

Надо только добавить синхронизацию между потоками (легко делается в .NET4 через BlockingCollection).

Такой подход, на мой взгляд, довольно гибкий для последующего расширения системы: если надо добавить еще одного рабочего или станок, например, то просо запускается дополнительный поток.
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
15.01.2012, 12:05  [ТС] 7
Честно говоря с потоками я не работал, если сможете написать код, буду благодарен.
А насчет задачи сейчас разъясню:

Тележка не может сгребать со стола. В тележку попадают детали только если станок сейчас занят деталью, а на столе нет места, т.е. >=3. Когда приходит деталь и видит что все занято - станок работает, стол полный, и в телеге 5 деталей - тут все и начинаетя: тележка сразу же уезжает. количество телег+1. эта деталь сразу идет в потери(+1). На 8+-3 минут включается таймер - тележка отсутствует и через это время возвращается пустая. детали которые были в телеге или пермаментно плюсуются к обработанным или к потерям, но точно не попадают на станок для обработки.(сделать это не сложно)

Если детали нет - пытается взять со стола. Если и на столе нет. - Такой ситуации не будет, я уже проверял)) время обработки детали больше, потому детали будут скапливаться, изза чего и будут потери(около 20%)

В любом случае, даже зная ваш алгоритм, я не могу его описать. С синтаксисом еще не очень подружился.
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
15.01.2012, 14:57  [ТС] 8
Кто-нибудь может предложить конкретное решение проблемы?
0
Заблокирован
15.01.2012, 15:15 9
Цитата Сообщение от Phant0m Посмотреть сообщение
Кто-нибудь может предложить конкретное решение проблемы?
Проблема в том, что у тебя не правильно всё от начала и до конца. Во-первый интервал таймера задается в миллисекундах, а не в минутах, как у тебя. Во-вторых, 5 ± 2мин - это не 3 и 7. Это любое значение от (3*60*1000) до (7*60*1000). Ну и в третьих, тебе не помощь нужна, а полностью написать прогу за тебя. У меня, например, на это нет времени и желания. Обращайся к фрилансерам.
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
15.01.2012, 15:51  [ТС] 10
мм... 1ое. милисекунды я могу перевести в минуты.
2ое. даже если и так, это тоже можно переделать и довольно просто.
3ее. Я просил помочь с синтаксической реализацией словесного алгоритма, так как тут люди занимаются C# профессионально, я надеялся что мне подскажут синтаксическую конструкцию. Пока что была полезной была только идея с потоками, но к сожалению у меня нет времени чтобы их изучить.
0
30 / 30 / 4
Регистрация: 14.05.2010
Сообщений: 57
15.01.2012, 16:14 11

Не по теме:

Все легко, да разбираться лень.


Вам тут уже идей подкинули самых разных, раскручивайте их. Из чужого кода вы лишь увидите принцип, и так же быстро его забудете.
А вообще с таким настроем вам в раздел фриланса. За скромную сумму там как раз оказывают "помощь с синтаксической реализацией словесного алгоритма".
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
15.01.2012, 17:00  [ТС] 12
Эээ, я попросил синтаксис 1 строчки:
if (timer.Interval закончился)
и зачем мне платить за 1 строчку?

Сейчас вообще пишу уже без таймеров, но неужели никто не сможет ответить на такой простой вопрос о возможностях элемента timer? Если не знаете про таймер, зачем тогда писать здесь ответы?

И кстати для 2ого пункта нужны только целые значения минут, т.е. 3,4,5,6,7.

А настрой у меня любознательный))) а мне и нужен принцип, проблем со словесными алгоритмами у меня никогда не было.
0
Заблокирован
15.01.2012, 20:15 13
Цитата Сообщение от Phant0m Посмотреть сообщение
if (timer.Interval закончился)
когда он закончился, то в его коде нужно прописать что делать.(в Timer1.Tick)
timer.Interval - целое число в милисекундах.
то, что вы написали, примерно так выглядит:
if (6000) {bla-bla-bla}
Цитата Сообщение от Phant0m Посмотреть сообщение
Если не знаете про таймер, зачем тогда писать здесь ответы?
Это о том что в винформсах или в тредингах(уточните)?
Цитата Сообщение от Phant0m Посмотреть сообщение
мм... 1ое. милисекунды я могу перевести в минуты.
2ое. даже если и так, это тоже можно переделать и довольно просто.
3ее. Я просил помочь с синтаксической реализацией словесного алгоритма, так как тут люди занимаются C# профессионально, я надеялся что мне подскажут синтаксическую конструкцию. Пока что была полезной была только идея с потоками, но к сожалению у меня нет времени чтобы их изучить.
1. системе только намекните, что вы перевели, а то не поймет.
2. в чем вопрос тогда?
3. ни у кого нет времени чтоб попусту тратить его.

Добавлено через 12 минут
Таймер
0
0 / 0 / 0
Регистрация: 15.01.2012
Сообщений: 8
15.01.2012, 20:38  [ТС] 14
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace KURSOV
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        bool net_telegi=false; // индикатор телеги
        bool det_rab=false; // =true если деталь в обработке   
 
        int kol_det = 0; // количество деталей вступивших в оборот
        int rab_stol = 0; // количество деталей находящихся на столе
        int telega = 0; // количество деталей находящихся в телеге
       
        int poteri = 0; // количество потерянных деталей
        int kol_teleg = 0; // количество использованных телег
        int result = 0; // количество деталей вступивших в систему
 
        int time1 = 5; // Основное время поступления детали
        int time2 = 2; // +\- для времени поступления деталей
        int time3 = 8; // Основное время через которое ставят  тележку
        int time4 = 3; // +\- для времени через которое ставят тележку
        int time5 = 10; // Основное время обработки детали на станке
        int time6 = 5; // +\- для времени обработки детали на станке
 
        int t1, t2, t3; //временные интервалы
        int k, l, m, tl, tm; // переменные циклов-счетчиков
       
        private void tabPage1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void button1_Click(object sender, EventArgs e) // ПРИМЕНЕНИЕ ИЗМЕНЕНИЙ
        {
            time1 = Convert.ToInt32(textBox1.Text);
            time2 = Convert.ToInt32(textBox2.Text);
            time3 = Convert.ToInt32(textBox3.Text);
            time4 = Convert.ToInt32(textBox4.Text);
            time5 = Convert.ToInt32(textBox5.Text);
            time6 = Convert.ToInt32(textBox6.Text);
        }
 
        private void button4_Click(object sender, EventArgs e) // ВЫСТАВИТЬ УМОЛЧАНИЯ
        {
            time1 = 5;
            time2 = 2;
            time3 = 8;
            time4 = 3;
            time5 = 10;
            time6 = 5;
        }
 
        private void button2_Click(object sender, EventArgs e) // ЗАПУСК
        {
            Random rnd1 = new Random();
            t1 = rnd1.Next(time1-time2,time1+time2);
            textBox14.Text = Convert.ToString(t1);
 
            Random rnd2 = new Random();
            t2 = rnd2.Next(time5 - time6, time5 + time6);
            textBox15.Text = Convert.ToString(t2);
 
            Random rnd3 = new Random();
            t3 = rnd3.Next(time3 - time4, time3 + time4);
            textBox16.Text = Convert.ToString(t3);
            det_rab = true;
 
            if (t1 > t2) { tl = t1; tm=t2;} else { tl = t2; tm=t1; }
            while (l <= tl*100)
            {
            for (m = 0; m <= tm * 100; m++)
            {
               l++;
                    
                    if (m % t2 == 0)
                    {
                        result++;
                        det_rab = false;
 
                        if ((telega != 0) & (net_telegi == false))
                        {
                            telega--;
                            det_rab = true;
                        }
                        else
                        {
                            rab_stol--;
                            det_rab = true;
                        }
                    }
 
 
                    if (l % t1 == 0)
                    {
                        kol_det++;
                        if (rab_stol < 3)
                        {
                            rab_stol++;
                            kol_det--;
                        }
                        else
                            if ((telega < 5) & (net_telegi == false))
                            {
                                telega++;
                                kol_det--;
                            }
 
                            else
                                if (net_telegi == true)
                                {
                                    poteri++;
                                    kol_det--;
 
                                }
                                else
                            {
                                kol_teleg++;
                                poteri++;
                                kol_det--;
                                net_telegi = true;
                                for (k = 0; k <= t3; k++)
                                {
                                    if (k == t3)
                                    {
                                        net_telegi = false;
                                        telega = 0;
                                    }
                                }
 
                            }
                    }
                }
              
                }
            MessageBox.Show("Моделирование завершено!\n" + "Потрачено времени: " + l + " минут");
            textBox11.Text = Convert.ToString(kol_teleg);
            textBox10.Text = Convert.ToString(poteri); 
            textBox9.Text = Convert.ToString(result); 
            textBox7.Text = Convert.ToString(kol_det);  
            textBox8.Text = Convert.ToString(det_rab); 
            textBox12.Text = Convert.ToString(rab_stol);  
            textBox13.Text = Convert.ToString(telega);
            textBox17.Text = Convert.ToString(net_telegi); 
        }
 
        private void button3_Click(object sender, EventArgs e) // ОЧИСТИТЬ ВСЕ
        {
            textBox14.Text = ""; // очистить t1
            textBox15.Text = ""; // очистить t2
            textBox16.Text = ""; // очистить t3
            textBox11.Text = ""; // очистить количество телег kol_teleg
            textBox10.Text = ""; // очистить количество потери poteri
            textBox9.Text = "";  // очистить количество деталей result
            textBox7.Text = "";  // очистить количество деталей kol_det
            textBox8.Text = ""; // очистить детали из обработки det_rab
            textBox12.Text = ""; // очистить рабочий стол rab_stol
            textBox13.Text = ""; // очистить тележку telega
            textBox17.Text = ""; // очистить индикатор net_telegi
            net_telegi = false; // индикатор телеги
            det_rab = false; // =true если деталь в обработке    
            kol_det = 0; // количество деталей вступивших в оборот
            rab_stol = 0; // количество деталей находящихся на столе
            telega = 0; // количество деталей находящихся в телег
            poteri = 0; // количество потерянных деталей
            kol_teleg = 0; // количество использованных телег
            result = 0; // количество деталей вступивших в систему
            k = 0; 
            l = 0; 
            tl = 0;
            tm = 0; 
            m = 0;
 
        }
 
        
    }
}
Добавлено через 4 минуты
Вот программа без таймеров, как мне сделать 2 цикла фор и вайл параллельными? вайл если что можно заменить фором, я просто пытался без параллельности но видимо никак. Я не знаю нужно ли тут параллельность потоков или параллельность процессов, и как это все описывается. А что касается таймеров я уже понял ошибку, щас вот рассматриваю, может вернусь к варианту проги с ними. А скажите без потоков и параллелизма эту задачу, одними таймерами можно решить?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2012, 20:38

Сколько нужно взять деталей, чтобы наивероятнейшее число годных деталей было равно 50?
Сколько нужно взять деталей, чтобы наивероятнейшее число годных деталей было равно 50, если...

Из партии в 100 деталей, содержащей 5 % брака, берут для проверки 5 деталей
2. Из партии в 100 деталей, содержащей 5 % брака, берут для проверки 5 деталей. Партия...

На станке-автомате изготовили 90 деталей
Доброго времени суток! Помогите, пожалуйста решить задачки по теории вероятности: 3. На...

Определите, какое наименьшее число деталей
Ограничение по времени работы программы: 2 секунды Некоторый завод умеет производить N=100000...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru