Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
Луноход-4
Language:
Ada
Assembly
Bash
C#
C++ (gcc)
C++ (clang)
C++ (vc++)
C (gcc)
C (clang)
C (vc)
Client Side
Clojure
Common Lisp
D
Elixir
Erlang
F#
Fortran
Go
Haskell
Java
Javascript
Kotlin
Lua
MySql
Node.js
Ocaml
Octave
Objective-C
Oracle
Pascal
Perl
Php
PostgreSQL
Prolog
Python
Python 3
R
Rust
Ruby
Scala
Scheme
Sql Server
Swift
Tcl
Visual Basic
Layout:
Vertical
Horizontal
program Lunohod; { На Луне находится луноход. Луноход управляется с Земли. Он должен понимать команды: движение, поворот, подготовка, эксперимент, стоп. Команды имеют свои двоичные коды: 1000 - начать движение (drive) 0100 - начать вращение (rotate) 0010 - подготовка экспериментальной установки (их может быть 4 штуки) (prepare) 0001 - начать эксперимент (бурение, спектрометрия,..) (experiment) 0000 - остановить выполнение любой команды. Кроме того, команды имеют параметры: движение имеет 4 скорости; вращение - постоянная угловая скорость; экспериментальная установка - одна из четырёх. Можно сделать 4 скорости вращения, тогда будет одна эксприментальная установка. Можно сделать и то, и другое, но в этом случае нужно будет больше одного байта. Команды передаются с Земли в принимающее устройство Лунохода. Команды формируются с помощью пульта управления. Пульт - это набор из 8 кнопок, имеющих два состояния: нажато и не нажато. Кнопкам соответствуют разряды: 7 6 5 4 3 2 1 0 Если нажата кнопка 3, то разряд 3 устанавливается в 1, если был 0, и наоборот. Разряд 3 - это команда начать (с первой скоростью) движение, если он = 1 или прекратить движение, если он = 0. Десятичный эквивалент команды - число 8. Одновременно значение каждого разряда участвует в логике поведения лунохода. Например, если разряд 3 установлен в 1, то экспериментальное бурение невозможно. Или, если идёт бурение, то прежде чем начать движение, необходимо отключить бурение и установить сверло в штатную позицию. Разряды 7 и 6 - определяют скорость движения. Разряды 5 и 4 определяют тип эксперимента. Так как разряды объединены в пары, то возможны 4 состояния: 4 скорости движения, 4 эксперимента. Логические связки. Если есть движение, то бурение невозможно, вращение невозможно, подготовка невозможна. Если есть вращение, то бурение невозможно, движение невозможно, подготовка ВОЗМОЖНА. Если есть бурение, то движение невозможно, вращение невозможно, подготовка невозможна. Если есть подготовка, то движение невозможно, вращение ВОЗМОЖНО, бурение ВОЗМОЖНО. Работа программы. На вход подаётся сигнал. Сигнал обрабатывается анализатором (оператором if) Из памяти выбирается код команды и преобразуется в управляющую инструкцию. Луноход выполняет действие. Управляющая инструкция моделируется функцией или процедурой. } const move = 8; move1 = 64 + 8; move2 = 128 + 0 + 8; move3 = 128 + 64 + 8; const rotate = 4; const prepare = 2; const test = 1; function receive ( var s : integer ) : integer; begin readln (s); case s of 0, test, prepare, rotate, move, move1, move2, move3 : receive := s; else begin writeln ('Неизвестная команда'); //readln(s); receive := s; end; end; { if s = 8 then receive := s else if s = 0 then receive := 0 else begin writeln ('Неизвестная команда'); //readln(s); receive := s; end } end; procedure drive (var x : integer); begin if x <> 0 then begin if x = move then write('MOVE ') else if x = move1 then write('MOVE move ') else if x = move2 then write('MOVE move MOVE ') else if x = move3 then write('MOVE move MOVE move ') end; writeln; end; procedure twist (var x : integer); begin if x = 4 then write ('Rotate '); writeln; end; procedure setting (var x : integer); begin if x = 2 then write ('Prepare '); writeln; end; procedure experiment (var x : integer); begin if x = 1 then write ('Experiment '); writeln; end; var signal, m, r, p, e : integer; begin m := 0; r := 0; p := 0; e := 0; while receive ( signal ) <> 0 do begin if((signal = move) or (signal = move1) or (signal = move2) or (signal = move3)) then if (r = 0) and (p = 0) and (e = 0) then begin drive(signal); // функция движения m := 1 // луноход в движении end else begin if r = 1 then // включено вращение begin writeln ('Аппарат вращается.'); writeln ('Что делать: остановить вращение "0", или нет "4"?'); if receive (signal) = 0 then begin r := 0; writeln ('Вращение прекращено'); end else begin r := 1; writeln ('Вращение продолжается'); end end; if p = 1 then // включена подготовка к эксперименту begin writeln ('Идёт подготовка к эксперименту.'); writeln ('Что делать: остановить подготовку "0", или нет "2"?'); if receive (signal) = 0 then begin p := 0; writeln ('Подготовка отменена.'); end else begin p := 1; writeln ('Подготовка продолжается'); end end; if e = 1 then // идёт эксперимент begin writeln ('Идёт эксперимент.'); writeln ('Что делать: остановить эксперимент "0", или нет "1"?'); if receive (signal) = 0 then begin e := 0; writeln ('Эксперимент остановлен.'); end else begin e := 1; writeln ('Эксперимент продолжается'); end end; twist (r); setting (p); experiment (e); end else if signal = rotate then begin r := 1; twist (signal); // функция вращения m := 0; p := 0; e := 0; // остальным "стоп" end else if signal = prepare then begin p := 1; setting (signal); // функция подготовки m := 0; e := 0; // остальным "стоп" кроме r: вращение возожно end else if signal = test then begin e := 1; experiment (signal); // функция эксперимента m := 0; r := 0; p := 0; // остальным "стоп" end else writeln ('ERROR'); end; writeln ('STOP'); end.
Show compiler warnings
[
+
]
Show input
edit mode
|
history
|
discussion