Консультация № 176372
28.01.2010, 22:37
42.70 руб.
0 19 0
Уважаемые эксперты!!! Помогите написать программу которая осуществляет автоматическое управление 2-мя проходными и 2-мя запасными ж/д путями. (Поезд может проехать прямо, встать на запасной путь и развернуться)
Заранее благодарен.

Обсуждение

Неизвестный
29.01.2010, 08:58
общий
Svistaplas90:
А обязательно на простом паскале?
Думаю железнодорожников тут не много: не можете поподробнее описать, что должна делать программа?
Что значит автоматическое управление? Или вам вобще надо АСУ или САУ?

P.S. Так вам помочь написать или написать за вас? Если помочь, то определитесь с чем помогать...
давно
Профессионал
304622
583
29.01.2010, 09:58
общий
Svistaplas90:
Присоединяюсь к тому, что спросил Patriotix-N. Уточню лишь.
Вам надо нарисовать на экране, как поезда взъежают с одной стороны экрана (в случайные моменты времени) и распределяются по изображённым на экране путям?
Или вам именно управляющую программу, которая постоянно опрашивает стандартный input или какой-то файл и выдаёт управляюшие команды?

И ещё, схема путей неясна. С любого проходного можно уйти на любой запасной?
давно
Старший Модератор
31795
6196
29.01.2010, 12:13
общий
Svistaplas90:
Пожалуйста уточните вопрос, т.к. в таком виде ответить на него невозможно.

Путевая схема макета, может кому пригодится.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.01.2010, 15:23
общий
Преподаватель мне обьяснил так. Сначала выбираем по какому пути двигается поезд по 1 или 2. И дальше по пути следования он может: проехать прямо, встать на запасной путь и потом уехать прямо, развернуться и уехать так же прямо.
Я думаю должа быть проверка занят ли запасной путь, если да то ехать прямо. Разворот проверить есть ли на другом пути поезд, если нет то развернуться, если есть то надо ждать пока уедет и потом развернуться.
Схему прилагаю
http://letitbit.net/download/7507.7906010e3066dddf7cb9f18a2/__________.JPG.html
давно
Старший Модератор
31795
6196
29.01.2010, 15:35
общий
Svistaplas90:
Пожалуйста, выложите схему на портале, у Вас есть такая возможность:
Цитата: новости портала
С 07.01.2010 для всех, включая посетителей, отменяется плата за хранение файлов на нашем портале. Пользуйтесь услугой Мои файлы (левая панель, серая кнопка внизу) для сохранения изображений и других файлов бесплатно.

Мне к примеру, файлообменники недоступны, из-за политики моей конторы.Спасибо!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.01.2010, 15:44
общий
Вот перезалил :)



вставил изображение. К.Зенченко
Неизвестный
29.01.2010, 16:00
общий
Svistaplas90:
Цитата: 311169
Я думаю должа быть проверка занят ли запасной путь, если да то ехать прямо. Разворот проверить есть ли на другом пути поезд, если нет то развернуться, если есть то надо ждать пока уедет и потом развернуться.

А зачем нужен запасной путь? Я так понимаю, поезд по какой-то причине должен освободить основной путь - что это за причина? А вот уже потом проверять занят ли запасной путь, я бы сделал так...
"Ждать пока уедет" - как это понять? Помимо управления путями надо еще и эмулировать траффик поездов на них? Вопрос можно и перефразировать: каковы исходные данные и их источник?
Неизвестный
29.01.2010, 16:06
общий
Запасной путь я думаю нужен для разгрузки поезда. А "Ждать пока уедет" наверно когда другой поезд освободит путь
Неизвестный
29.01.2010, 16:27
общий
Svistaplas90:
Цитата: 311169
наверно когда другой поезд освободит путь

А когда он его освободит?
Неизвестный
29.01.2010, 16:36
общий
А тут я уже не знаю:) Мб ему задать ему опред время для его нужд:)
Неизвестный
29.01.2010, 19:46
общий
Мб надо добавить светофор который и будет регулировать. Поезд может развернуться если горит зеленый свет, в обратном случае не может.
Неизвестный
29.01.2010, 20:12
общий
Svistaplas90:
Продумайте как должна работать вся программа, откуда брать информацию о поездах.
Я подумаю над этим на досуге, а пока что, могу предложить следующее - сделать процедуру для управления станцией, а в теле программы управлять поездами. Далее встает вопрос - какие элементы программирования можно применять или какие нельзя? Если задачу задал преподаватель, то не будет ли он протестовать против использования объектно-ориентированного подхода? Какого уровня(или объема) должно быть решение?
Неизвестный
29.01.2010, 20:33
общий
Преподаватель задал мне курсач по Теории автоматов. Мне нужно исполнить свой автомат в программе. Он сказал можно писать на любом языке программировании. Прост я немного проходил Паскаль, вот и решил задать свой вопрос тут
Программу можно сделать простую. Сначала выбираем по какому пути идет поезд, а потом действие. Например номер пути выбрали, далее выбор действия, допустим клавиша 1- проехать прямо(поезд поехал дальше), 2- разворот(разворот выполнен поезд поехал дальше, , 3 - встать на запасной путь. Я седня спрашивал у преподавателя, т.к я его замучал он сказал и так можно.
Неизвестный
29.01.2010, 22:29
общий
Svistaplas90:
Я вижу строение программы так:
- переменные:
1. главный_1, главный_2, вспомогательный_1, вспомогательный_2 тип - ложь/правда. Определяют есть ли поезд на данном пути. Используются для решения вопроса: можно ли поехать по данному пути?
2. главный_1_до, главный_1_после, главный_2_до, главный_2_после тип - ложь/правда, возможно еще и аналоги для вспомогательных путей. Определяет подходит ли еще один поезд к станции и есть ли поезд впереди. Для чего используется не знаю, т.к. решительно ничего не понимаю в вышеуказанной схеме и не знаю нужно ли это учитывать вобще.
В самом простом варианте можно ограничиться только первым пунктом. Т.о. мы управляем поездом подходящим к станции.
Я вижу это так:
I. Моделируется ситуация на станции - задаются значения переменных. Их можно генерировать случайно, тогда программа будет работать до отмены ее работы пользователем, в противном же случае программа завершится после конечного числа циклов.
Тут есть 2 варианта:
1. 2 подпрограммы(функции/процедуры) - Первая - генерирует ситуацию на станции, Вторая - управляет поездом подошедшим к станции.
2. Одна подпрограмма(функция/процедура), которая будет управлять поездом, а все ситуации на станции создаются вручную, тогда они либо надо делать процедуру ввода данных(опять получаем 2 подпрограммы), либо просто в коде присваивать нужные значения.
II. Вызывается процедура управления поездом, который подошел к станции.
III. В процедуре проводится проверка какие пути заняты, а какие свободны и принимается решение о направлении поезда.
IV. Выводится результат принятого решения.
Входные данные, заданные любым способом(вручную или сгенерированные) выводятся в следующем виде:
Код:

Основной путь 1: Занят
Основной путь 2: Занят
Вспомогательный путь 1: Свободен
Вспомогательный путь 2: Занят

Выходные данные. Тут надо решить, что должна делать процедура управления. Может ли она сместить поезд находящийся на основном_1 на основной_2, для того чтобы его занял подошедший поезд? Или же подошедший поезд должен будет занять свободное место, т.е. вспомогательный_1, или же вобще развернуться.
Также возникает вопрос в целесообразности и необходимости усложнения программы, что будет заключаться в следующем: Процедура создания ситуации на станции должна не просто создать случайную ситуацию, в которую попадет подошедший поезд, а управлять движением на станции. Тогда надо будет не только принимать, но и отправлять поезда со станции, а также управлять их положением на станции. Возможно тогда придется
В простейшем виде:
Код:

Поезд занял основной путь 1.

В сложном виде:
Код:

Поезд находящийся на основном пути 2 отбыл.
Поезд находящийся на вспомогательном пути 2 перешел на основной путь 2.
Поезд находящийся на основном пути 1 перешел на вспомогательный путь 1.
Подошедший к пути 1 поезд занял основной путь 1.
Подошедший к пути 2 позед занял вспомогательный путь 2.

Ваша задача теперь описать как должны ходить поезда. Т.к. я не представляю для чего служат вспомогательные пути, а также когда и куда поезд должен развернуться.

Также есть предложение задать этот же вопрос в рассылку Delphi. Наглядный вариант не только улучшить визуальное представление, но, думаю, также облегчит само написание программы. Delphi даст возможность реализовать вашу задачу другими способами, которые уместны только в визуальной среде.
Неизвестный
29.01.2010, 22:47
общий
Svistaplas90:
Еще немного о сложном варианте. Его можно реализовать по следующему:
1. Создается начальная ситуация. В таком виде, как описана выше.
Ожидается нажатие любой клавиши...
2. Если есть поезда, ожидающие отбытия, то они отправляются.
Информация выводится на экран.
3. Производится управление станцией, т.е. происходят пермещения поездов внутри нее.
Информация выводится на экран.
Ожидается нажатие любой клавиши...
4. Создается ситуация подошедших поездов: подошел к пути 1, 2 или к обоим сразу, еще можно добавить вариант, когда поезд не подошел ни к одному из путей.
Информация выводится на экран.
5. Производится управление подошедшими поездами(если таковые имеются).
Информация выводится на экран.
Ожидается нажатие клавиши, отвечающей за выбор "Повторения цикла" или клавиши - "выход"...


Сейчас ваша задача(если вы еще не в силах сами справиться с решением данного задания), еще раз повторюсь, написать конкретный алгоритм(простым русским языком), который скажет как управлять поездами. Т.е. критерии принятия решний и сами решения. Пример: Что делать когда поезд подошел к первому пути, а он занят? и т.п.
давно
Старший Модератор
31795
6196
01.02.2010, 19:18
общий
Svistaplas90:
Код:
uses crt,graph;
const
n=10;
m=20;
a:array[0..n,0..m]of byte=((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0),
(0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0),
(3,1,4,2,1,4,2,1,1,1,1,1,1,1,1,1,1,2,4,1,3),
(0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0),
(3,1,4,2,1,1,1,1,1,1,1,1,1,1,2,4,1,2,4,1,3),
(0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0),
(0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0));
var
xA,yA,x_A,y_A,zA:integer;{переменные первого парвоза}
xB,yB,x_B,y_B,zB:integer;{переменные второго паравоза}
wA,wB:boolean;{индикаторы стрелок}
b:array[0..n,0..m]of byte;{}
procedure ShowPath;
var
x,y,z:integer;
begin
ClearDevice;
for x:=0 to n do
for y:=0 to m do
if a[x,y]<>0 then
begin
if b[x,y]>0 then z:=6
else z:=0;
SetColor(7+z);
Circle(100+7*y,100+7*x,3);
end;
{первый паровоз}
SetColor(12);
Circle(100+7*yA,100+7*xA,2);
Circle(100+7*yA,100+7*xA,1);
Circle(100+7*y_A,100+7*x_A,2);
{второй паровоз}
SetColor(11);
Circle(100+7*yB,100+7*xB,2);
Circle(100+7*yB,100+7*xB,1);
Circle(100+7*y_B,100+7*x_B,2);
end;
procedure OneStep(var x,y,k,l,z:integer;var w:boolean);
var
xx,yy:integer;
begin
xx:=x;
yy:=y;
{анализируем состояние пути}
case a[x,y] of
1:begin{следующий шаг}
y:=y+z;
w:=false;
if(a[x,y]=0)then
begin
y:=y-z;
if(a[x+1,y]>0)and((x+1)<>k)then inc(x)
else
if(a[x-1,y]>0)and((x-1)<>k)then dec(x);
end;
end;
2:if w then{переключаем стрелку}
begin
if (random(20)mod 2)>0 then{}
begin{}
if a[x+1,y]>0 then x:=x+1
else x:=x-1;
end
else y:=y+z;
w:=false;
end
else y:=y+z;
3:begin{разворот}
z:=-z;
y:=y+z;
end;
4:begin{включаем стрелку}
w:=true;
y:=y+z;
end;
end;
Delay(30000);
k:=xx;{копируем хвост}
l:=yy;
end;
begin
{переходим в графику}
xA:=detect;{}
InitGraph(xA,yA,'');{входим в графику}
yA:=GraphResult;{получаем результат}
if yA<>0 then
begin
{нет графики стоп}
Writeln('InitGraphError:',yA);
ReadKey;
end
else
begin
{сбрасываем генератор}
randomize;
{начало первый паровоз}
xA:=3;x_A:=3;
yA:=2;y_A:=1;
zA:=1;
{начало второй паровоз}
xB:=7;x_B:=7;
yB:=m-1;y_B:=m;
zB:=-1;
{пока не нажата клавиша}
repeat
{рисуем карту станции и паровозы}
ShowPath;
Delay(30000);
{считаем следующую координату}
OneStep(xA,yA,x_A,y_A,zA,wA);
OneStep(xB,yB,x_B,y_B,zB,wB);
if (abs(xA-xB)+abs(yA-yB))<2then{защита от столкновения}
begin
zA:=-zA;
zB:=-zB;
end;
Delay(30000);
until KeyPressed;
ReadKey;
CloseGraph;
end;
end.

Как временный вариант. Контроля занятости пути нет(вместо неё защита от столкновения), стрелки переключаются в случайном порядке.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
02.02.2010, 17:35
общий
Patriotix-N:
Цитата: 24686
Я подумаю над этим на досуге

Я продли вопрос ещё на 3-е суток.
у Вас готово решение задачи?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
02.02.2010, 18:48
общий
Зенченко Константин Николаевич:
Цитата: Зенченко Константин Николаевич
у Вас готово решение задачи?

Нет
давно
Старший Модератор
31795
6196
03.02.2010, 16:08
общий
Svistaplas90:
Вас моё решение устроит?
Или нужно ещё что нибудь?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа