## Встроенные алгоритмы

### Текстовое представление чисел

### цел_в_лит

Синтаксис:
алг лит цел_в_лит(цел x)

Описание:

Возвращает строковое представление x.

Пример:
алг
нач
цел а
лит б
а:=5
б:=цел_в_лит(а)
вывод б
кон

### вещ_в_лит

Синтаксис:
алг лит вещ_в_лит(вещ x)

Описание:

Возвращает строковое представление x.

Пример:
алг
нач
вещ а
лит б
а:=5.9999
б:=вещ_в_лит(а)
вывод б
кон

### лит_в_вещ

Синтаксис:
алг вещ лит_в_вещ(лит СТРОКА, рез лог УСПЕХ)

Описание:

Переводит строку СТРОКА в вещественное представление. Если СТРОКА содержит только вещественное число, то в УСПЕХ записывается Да и алгоритм возвращает вещественное значение, иначе в УСПЕХ записывается Нет и алгоритм возвращает значение 0.

Пример:
алг
нач
лит а
вещ б
лог усп
а:="5.9999"
б:=лит_в_вещ(а, усп)
вывод б, " ", усп
кон

### лит_в_цел

Синтаксис:
алг цел лит_в_цел(лит СТРОКА, рез лог УСПЕХ)

Описание:

Переводит строку СТРОКА в целочисленное представление. Если СТРОКА содержит только целое число, то в УСПЕХ записывается Да и алгоритм возвращает целосисленное значение, иначе в УСПЕХ записывается Нет и алгоритм возвращает значение 0.

Пример:
алг
нач
лит а
цел б
лог усп
а:="5"
б:=лит_в_цел(а, усп)
вывод б, " ", усп
кон

### Математика

### Тригонометрические функции

### arccos

Синтаксис:
алг вещ arccos(вещ x)

Описание:

Арккосинус x

Пример:
вещ х
алг
нач
ввод х
х:=arccos (х)
вывод"арккосинус числа х равен ", х
кон

### arcctg

Синтаксис:
алг вещ arcctg(вещ x)

Описание:

Арккотангенс x

Пример:
вещ х
алг
нач
ввод х
х:=arcctg (х)
вывод "арккотангенс числа х равен ", х
кон

### arcsin

Синтаксис:
алг вещ arcsin(вещ x)

Описание:

Арксинус x

Пример:
вещ х
алг
нач
ввод х
х:=arcsin (х)
вывод "арксинус числа х равен ", х
кон

### arctg

Синтаксис:
алг вещ arctg(вещ x)

Описание:

Арктангенс x

Пример:
вещ х
алг
нач
ввод х
х:=arctg (х)
вывод "арктангенс числа х равен ", х
кон

### cos

Синтаксис:
алг вещ cos(вещ x)

Описание:

Косинус x

Примеры:
вещ х
алг
нач
ввод х
х:=cos (х)
вывод "косинус угла х равен ", х
кон
вещ x, y
алг
нач
вывод "угол x="
ввод x
y:=2*sin(x)*cos(x)
вывод "sin2x = ", y
кон

### ctg

Синтаксис:
алг вещ ctg(вещ x)

Описание:

Котангенс x

Пример:
вещ х
алг
нач
ввод х
х:=ctg (х)
вывод "котангенс угла х равен ", х
кон

### sin

Синтаксис:
алг вещ sin(вещ x)

Описание:

Синус x

Примеры:
вещ х
алг
нач
ввод х
х:=sin (х)
вывод "синус угла х равен ", х
кон
вещ x, y
алг
нач
вывод "угол x="
ввод x
y:=2*sin(x)*cos(x)
вывод "sin2x = ", y
кон

### tg

Синтаксис:
алг вещ tg(вещ x)

Описание:

Тангенс x

Пример:
вещ х
алг
нач
ввод х
х:=tg (х)
вывод "тангенс угла х равен ", х
кон

### abs

Синтаксис:
алг вещ abs(вещ x)

Описание:

Абсолютная величина вещественного числа x (|x|)

Пример:
вещ а, б
алг
нач
ввод а,б
а:=а+б
а:=abs(а)
вывод"Модуль суммы чисел равен ", а
кон

### div

Синтаксис:
алг цел div(цел x, цел y)

Описание:

Частное от деления x на y (x,y - целые, y > 0)

Пример:
цел а,б,x,y
алг
нач
ввод а,б
x:=div(а,б)
y:=mod(а,б)
вывод "а/б=",x," с остатком ", y
кон

### exp

Синтаксис:
алг вещ exp(вещ x)

Описание:

e в степени числа x (e=2.718281828459045...)

Пример:
вещ x
цел а
алг
нач
ввод а
x:=exp(а)
вывод "число е в степени ", а, " равно ", x
кон

### iabs

Синтаксис:
алг цел iabs(цел x)

Описание:

Абсолютная величина целого числа x (|x|)

Пример:
цел а, б
алг
нач
ввод а,б
а:=iabs(а)
б:=iabs(б)
вывод а+б
кон

### int

Синтаксис:
алг цел int(вещ x)

Описание:

Целая часть x: максимальное целое число, не превосходящее x

Пример:
вещ а,б
алг
нач
ввод а
б:=int(а)
вывод "Целая часть ", а, " равна ", б
кон

### lg

Синтаксис:
алг вещ lg(вещ x)

Описание:

Десятичный логарифм x

Пример:
вещ а,б,с
алг
нач
ввод а, б
с:=а+б
с:=lg(с)
вывод "десятичный логарифм от суммы чисел ",а," и ",б," равен ",с
кон

### ln

Синтаксис:
алг вещ ln(вещ x)

Описание:

Натуральный логарифм x

Пример:
вещ а,б,с
алг
нач
ввод а, б
с:=а+б
с:=ln(с)
вывод "Натуральный логарифм от суммы чисел ",а," и ",б," равен ",с
кон

### max

Синтаксис:
алг вещ max(вещ x, вещ y)

Описание:

Максимум из чисел x и y

Пример:
вещ а,б,с1, с2
алг
нач
ввод а, б
с1:= max(а,б)
с2:= min(а,б)
вывод с1, нс
вывод с2, нс
кон

### min

Синтаксис:
алг вещ min(вещ x, вещ y)

Описание:

Минимум из чисел x и y

Пример:
вещ а,б,с1, с2
алг
нач
ввод а, б
с1:= max(а,б)
с2:= min(а,б)
вывод с1, нс
вывод с2, нс
кон

### mod

Синтаксис:
алг цел mod(цел x, цел y)

Описание:

Остаток от деления x на y (x,y - целые, y > 0))

Пример:
цел а,б,x,y
алг
нач
ввод а,б
x:=div(а,б)
y:=mod(а,б)
вывод "а/б=",x," с остатком ", y
кон

### rnd

Синтаксис:
алг вещ rnd(вещ х)

Описание:

Случайное число от 0 до x: при последовательных вызовах этой функции получается последовательность случайных чисел, равномерно распределенных на [0,х]

Пример:
алг Построение последовательности случайных вещественных чисел
нач
вещ таб а [1:10]
цел л
вещ б
ввод б
нц для л от 1 до 10
а[л]:=rnd(б)
кц
нц для л от 1 до 10
вывод а[л], " "
кц
кон

### sign

Синтаксис:
алг цел sign(вещ x)

Описание:

Знак числа x (-1, 0 или 1)

-1, если x < 0;
0, если x = 0;
1, если x > 0;

Пример:
цел а, б
алг
нач
ввод а
б:=sign(а)
если б=-1
то вывод а, "<0"
иначе
если б=0
то вывод а, "=0"
иначе вывод а, ">0"
все
все
кон

### sqrt

Синтаксис:
алг вещ sqrt(вещ x)

Описание:

Квадратный корень из x (x≥0).

Пример:
вещ х
алг
нач
ввод х
х:=sqrt (х)
вывод "корень квадратный из числа х равен ", х
кон

### Обработка строк

### код

Синтаксис:
алг цел код(сим c)

Описание:

Возвращает номер символа c в таблице КОИ-8r. (стандарт RFC 1489)

Пример:
алг
нач
сим а
цел ц
вывод "введите символ"
ввод а
ц:=код(а)
вывод ц
кон

### длин

Синтаксис:
алг цел длин(лит S)

Описание:

Возвращает количество символов в строке S.

Пример:
алг
нач
лит а
цел ц
вывод "введите строку"
ввод а
ц:=длин(а)
вывод ц
кон

### символ2

Синтаксис:
алг сим символ2(цел N)

Описание:

Возвращает символ, соответствующий номеру N в таблице Юникода.

Пример:
алг
нач
цел а
сим б
ввод а
б:=символ2(а)
вывод б
кон

### символ

Синтаксис:
алг сим символ(цел N)

Описание:

Возвращает символ, соответствующий номеру N в таблице КОИ-8r. (стандарт RFC 1489)

Пример:
алг
нач
цел а
сим б
ввод а
б:=символ(а)
вывод б
кон

### юникод

Синтаксис:
алг цел юникод(сим c)

Описание:

Возвращает номер символа c в таблице Юникода.

### Система

### пауза

Синтаксис:
алг пауза

Описание:

Приостанавливает выполнение программы. Переводит Кумир в режим паузы.

Пример:

алг
нач
вещ а, б, с
а:=1
б:=2
пауза
с:=а+б
вывод с
кон

### стоп

Синтаксис:
алг стоп

Описание:

Останавливает выполнение программы.

Пример:

алг
нач
вещ а, б, с
а:=1
б:=2
вывод "Остановка перед вычислением значения С"
стоп
с:=а+б
вывод с
кон

### время

Синтаксис:
алг цел время

Описание:

Возвращает текущее время (местное) в миллисекундах.

Пример:

алг
нач
цел а
а := время
вывод а, нс
кон

### клав

Синтаксис:
алг цел клав

Описание:

Ожидает нажатия на клавишу и возвращает её код.

Пример:

алг
нач
цел а
вывод "Нажмите клавишу...", нс
а := клав
вывод "Код нажатой клавиши равен ", а, нс
кон

Коды клавиш, имеющих символьное представление, совпадают с Юникодами соответствующих клавиш.

Коды клавиш, не имеющих символьное представление, приведены в таблице:

Клавиша | Код
Tab | 16777217
Backspace | 16777219
Enter | 16777220
Enter на цифровом блоке клавиатуры | 16777221
Insert | 16777222
Delete | 16777223
Pause | 16777224
Print Screen | 16777225
Home | 16777232
End | 16777233
Стрелка влево | 16777234
Стрелка вверх | 16777235
Стрелка вправо | 16777236
Стрелка вниз | 16777237
Page Up | 16777238
Page Down | 16777239
Shift | 16777248
Ctrl (на Macintosh - Command) | 16777249
Meta [логотип Windows] (на Macintosh - Control) | 16777250
Caps Lock | 16777252
Num Lock | 16777253
Scroll Lock | 16777254
F2 | 16777265
F3 | 16777266
F4 | 16777267
F5 | 16777268
F6 | 16777269
F7 | 16777270
F8 | 16777271
F9 | 16777272
F10 | 16777273
F11 | 16777274
F12 | 16777275
F13 | 16777276
F14 | 16777277
F15 | 16777278

## Конструкции языка

### Структура программы

### Программа

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

Конструкции алг-нач-кон должны располагаться вплотную друг к другу, между ними могут быть только пустые строки и строки с комментариями.

Схема программы без вступления и исполнителей:
алг первый алгоритм
|
кон
алг второй алгоритм
|
кон
...
алг последний алгоритм
|
кон

Выполнение такой программы состоит в выполнении первого алгоритма (остальные алгоритмы будут выполняться при вызове из первого).

Схема программы со вступлением и без исполнителей:
| вступление
алг первый алгоритм
|
кон
алг второй алгоритм
|
кон
...
алг последний алгоритм
|
кон

Выполнение такой программы состоит в выполнении вступления, а затем первого алгоритма.

### Описание алгоритма

Алгоритм на языке КуМир записывается так:
алг тип_алгоритма имя_алгоритма (описание_параметров)
дано условие_применимости_алгоритма
надо цель_выполнения_алгоритма
нач
¦ последовательность команд
кон
и состоит из заголовка (часть до служебного слова нач) и тела алгоритма (часть между словами нач и кон). Алгоритм-функция отличается от алгоритма-процедуры формой записи заголовка (перед именем алгоритма надо указать тип возвращаемого значения) и использованием специального служебного слова знач.

Для алгоритмов-процедур тип_алгоритма должен быть опущен. Для алгоритмов-функций на месте тип_алгоритма должен быть указан один из простых типов алгоритмического языка (вещ, цел и т.д.), определяющий тип значений, которые принимает данная функция.

Пример алгоритма-процедуры:
алг гипотенуза (вещ a,b, рез вещ c)
дано a>=0 и b>=0 |длины катетов треугольника
надо |c = длинa гипотенузы этого треугольника
нач
c := sqrt( a**2 + b**2 )
кон

Пример алгоритма-функции:
алг вещ площадь (вещ a,b,c)
дано a>=0 и b>=0 и c>=0 |длины сторон треугольника
надо |значение функции равно площади этого треугольника
нач
вещ p |полупериметр
p := (a+b+c)/2
знач := sqrt(p*(p-a)*(p-b)*(p-c))
кон

Значение, которое должно стать результатом алгоритма-функции, надо присвоить особой величине с именем знач. Ее описанием служит заголовок алгоритма, но в остальном величина знач используется так же, как и любая другая промежуточная величина. Вызов алгоритма-функции производится путем указания его имени в выражении. Встретив это имя при вычислении выражения, КуМир выполняет алгоритм-функцию и затем подставляет в выражение вместо имени алгоритма значение величины знач.

### Параметры алгоритма

Если алгоритм не имеет параметров (аргументов и результатов), то в строке алг записывается только имя алгоритма.

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

После каждого из служебных слов арг, рез, арг рез должно располагаться одно или несколько описаний одной или нескольких величин. Имена величин и описания разделяются запятыми. Если в начале описания нет служебных слов арг, рез, арг рез, то предполагается, что первыми идут описания аргументов (арг).

В заголовке алгоритма
алг тест (рез цел m,n, цел i, арг вещ y)
служебное слово рез относится к описаниям цел m,n и цел i, а параметр вещ y будет аргументом.

Запрещается писать в теле алгоритма команды, изменяющие значения параметров-аргументов (описанных как арг). Результаты алгоритма (рез, но не арг рез) в начале выполнения алгоритма принимают неопределенные значения.

### Описание исполнителя

После последнего алгоритма программы может идти одна или несколько конструкций исполнитель. Таким образом, в самом общем виде программа имеет такой вид:

вступление программы
первый алгоритм
второй алгоритм
...
последний алгоритм
первый исполнитель
второй исполнитель
...
последний исполнитель

Конструкция "исполнитель" на языке КуМир записывается так:
исп имя исполнителя
¦ вступление исполнителя
¦ алг первый алгоритм исполнителя
¦ ¦
¦ кон
¦ ...
¦ алг последний алгоритм исполнителя
¦ ¦
¦ кон
кон_исп

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

При выполнении программы вначале выполняется ее вступление, затем, по порядку, вступления всех исполнителей, а затем начинает выполняться первый алгоритм программы.

### Разбиение строк

Разбиение строк редактора на канонические строки

Терминология.
Р-строки – строки редактора; к-строки – канонические строки.

1. Точка с запятой (ТЗ) приравнивается к переносу строки. Две ТЗ подряд или ТЗ в конце р-строки не считаются ошибкой, но пустая к-строка при этом не порождается.

Пример:
алг
нач
цел а; вещ в
а:=5; в:=0.1
кон

2. "Неявные" переносы строк вставляются в следующих случаях:
1) перед словами все, кц, кц_при
2) после ксимволов нач, выбор, нц (только в случае цикла «нц-кц»), раз
3) перед и после ксимволов то, иначе, при
4) перед ксимволом при и после двоеточия в при-строке

Пример:
алг цел модуль(вещ а)
нач
если а<0 то знач:=-а иначе знач:=а все
кон

### Имена, величины, выражения

### Имя

1. Имя бывает у величин, таблиц, алгоритмов и исполнителей.

Имя – это последовательность слов, разделенных пробелами. Первое слово имени не должно начинаться с цифры. Ни одно из слов не должно быть ключевым словом.

Примеры имен: m, погода на завтра, Ноябрь 7, Седьмое ноября, дом_57б

Примеры неправильных имен: 7е ноября (первое слово начинается с цифры); альфа-бета (‘-‘ – недопустимый символ); альфа или омега (или – ключевое слово)

Примечание. Ключевое слово не можно вставлять внутрь многословных «логических» имен.

2. Слово – это последовательность словарных символов. Разрешенными символами являются:
1) буквы (кириллические и латинские, прописные и строчные);
2) цифры;
3) два специальных знака: @ _

Примеры слов: бета123, 3кг, мама, Linux, КоСтЯ, kumir@infomir_ru

Примеры не слов: альфа-123, ма%ма, С++

3. Ключевые слова языка КУМИР – это: алг нач кон исп кон_исп дано надо арг рез аргрез знач цел вещ лог сим лит таб целтаб вещтаб логтаб симтаб литтаб и или не да нет утв выход ввод вывод нс если то иначе все выбор при нц кц кц_при раз пока для от до шаг

4. Многословные не-имена.
В отрицаниях логических величин, таблиц и алгоритмов функций ключевое слово не можно вставлять между словами многословного имени.

Пример:
лог л, завтра будет дождь
…
л := не завтра будет дождь | Правильно
л := завтра не будет дождь | Правильно
л := завтра будет не дождь | Правильно
л := завтра будет дождь не | Неправильно
л := не завтра не будет дождь | Неправильно
Первые три присваивания присваивают логической величине л значение, противоположное значению логической величины завтра будет дождь. Четвертая строка синтаксически неверна – не нельзя ставить после имени. Последняя строка также неверна: нельзя использовать более одного не.

### Константы

1. Константы бывают целые, вещественные, логические, символьные и литеральные.

2. Целые константы бывают положительные и отрицательные. Целая константа по абсолютной величине должна быть строго меньше 2 в 31-й степени. Целые константы можно записывать в десятичной и 16-ричной форме. Шестнадцатеричные константы начинаются с символа $.

Примеры: 123, -100000, $100.

3. Вещественные константы бывают положительные и отрицательные. Вещественная константа по абсолютной величине должна быть строго меньше 2 в 1024-й степени. Вещественные константы можно записывать в десятичной и экспоненциальной форме. В качестве разделителя в экспоненциальной записи можно использовать любой вариант буквы ‘e’: строчный или прописной, латинский или кириллический.

Примеры: 1.23, -0.56, 1e+4, 5E-7.

4. Логическая константа – это одно из ключевых слов да, нет.

5. Символьные константы.
Допустимый символ – это любой символ, который можно набрать на стандартной клавиатуре.
Символьная константа имеет вид ‘c’ или "с" (здесь с – допустимый символ).

Примеры. ‘a’, “%”, ‘"’, "’".

6. Литеральные константы.
Текстовая константа имеет вид ‘Т’ или "Т". Здесь Т – строка, состоящая из допустимых символов. При этом, если константа ограничена простыми (двойными) кавычками, то Т не содержит простую (двойную) кавычку.

### Простые команды

### Присваивание

Команда присваивания предназначена для изменения значения простых переменных и элементов таблиц и имеет общий вид:
<ВЕЛИЧИНА> := <ВЫРАЖЕНИЕ>

<ВЕЛИЧИНА> - это имя простой величины или описание элемента таблицы.
<ВЫРАЖЕНИЕ> - это выражение, составленное из <ВЕЛИЧИН>, констант, вызовов алгоритмов-функций и знаков операций.

Примеры:
n := 0;
m := n;
m := m+1;
m := 2*длин(t)+div(n,2);
c := (x+y)/2;
площадь:=a*b*sin(C)/2;
d:=b**2-4*a*c;
x[1]:=(-b+sqrt(d))/(2*a);
a[i]:=2*a[i-2]+a[i-1];
b[i,j]:=-b[j,i]

При этом все переменные должны быть описаны, а их типы – согласованы.

### Контроль

Всего существует три команды контроля: утв, дано, надо.

Формат вызова:
утв <ЛОГ ВЫРАЖЕНИЕ>
дано <ЛОГ ВЫРАЖЕНИЕ>
надо <ЛОГ ВЫРАЖЕНИЕ>

Все три команды выполняются так. Проверяется условие. Если условие не соблюдается (равно нет), то КуМир прекращает выполнение алгоритма и сообщает, что возник отказ. Если же условие соблюдается, то выполнение алгоритма нормально продолжается так, как если бы команды контроля не было вовсе.

Команда дано проверяет условие в начале выполнения алгоритма, команда надо - в конце выполнения алгоритма, а командой утв можно проверить условие в процессе выполнения алгоритма.

Пример 1:
алг абс (рез вещ х)
дано х<=0
надо х>=0
нач
если х<0
то х:=-х
все
кон

Пример 2:
алг вещ кв (вещ х)
нач
вещ к
к := х*х
утв к>=0
знач := к
кон

### Ввод-вывод

1. вывод
Вывод на экран

Формат вызова:
вывод выражение1, ..., выражениеN

Каждое выражение может быть либо арифметическим, логическим или литерным выражением, либо командой перехода на новую строку (ключевое слово нс). Значения выражений выводятся последовательно в строку и разделяются пробелом. Когда строка полностью заполнена, автоматически происходит переход к началу новой строки. Когда окно ввод-вывода полностью заполнено, последующие команды вывода будут сдвигать содержимое окна вверх, вытесняя верхние строки окна.

Пример:
алг
нач
нц 5 раз
вывод "Hello!", нс
кц
кон

2. ввод
Ввод с клавиатуры значений величин с указанными именами

Формат вызова:
ввод имя1, ... ,имяN

При выполнении этой команды КуМир выводит курсор в окно ввода-вывода и ждет, пока пользователь введет соответствующие значения. По окончании введенные значения присваиваются указанным величинам. В качестве имен величин можно указывать имена переменных простых типов или элементов таблиц (с указанием индексов). Признаком конца ввода служит нажатие на клавишу Enter. При вводе нескольких чисел они отделяются друг от друга запятой или пробелом.

Пример:
алг
нач
целтаб т[1:10]
цел ц, а
ввод ц
нц для а от 1 до ц
ввод т[а]
кц
нц для а от 1 до ц
вывод т[а], нс
кц
кон

### Вызов алгоритма

Существует два вида вспомогательных алгоритмов в языке КуМир - процедуры и функции. Алгоритм-функция возвращает значение по окончании своего выполнения, алгоритм-процедура - нет.

Если в записи алгоритма X встречается вызов алгоритма Y, то Y называется вспомогательным для X, а X - основным по отношению к Y. Один и тот же алгоритм может выступать и в роли вспомогательного и в роли основного. Вызовом вспомогательного алгоритма-процедуры или алгоритма-функции называется запись, приказывающая КуМиру выполнить алгоритм для заданных аргументов и результатов.

Вызов алгоритма-функции состоит во включении записи
имя_алгоритма-функции (список_параметров_вызова)
в какое-нибудь выражение подходящего типа. Само это выражение может быть записано в правой части команды присваивания, в команде вывода, и т.д. Вызов алгоритма-функции выполняется при вычислении содержащего этот вызов выражения.

Пример 1:
алг
нач
вывод кв(2), нс
кон
алг цел кв(цел а)
нач
знач := а*а
кон

Вызов алгоритма-процедуры является отдельной командой алгоритмического языка и имеет вид:
имя_алгоритма-процедуры или
имя_алгоритма-процедуры ( список_параметров_вызова )

Пример 2:
алг
нач
подпр
кон
алг подпр
нач
вывод "Мы в подпрограмме", нс
кон

Пример 3:
алг
нач
подпр(2.4, 7.6)
кон
алг сум(вещ а, вещ б)
нач
вывод "Сумма = ", а+б, нс
кон

### Составные команды

### Команды ветвления

### если то иначе все

Общий вид команды:
если условие
то серия1
иначе серия2
все

Серия2 вместе со служебным словом иначе может отсутствовать:
если условие
то серия1
все

При выполнении команды если КуМир сначала проверяет условие, записанное между если и то. При соблюдении этого условия выполняется серия1, в противном случае - серия2 (если она есть), после чего КуМир переходит к выполнению команд, записанных после слова все.

Если условие не соблюдается, а серия2 вместе с иначе отсутствует, то КуМир сразу переходит к выполнению команд, записанных после слова все.

Пример 1:
если a<b
то b:=b-a; p:=p+q
иначе a:=a-b; q:=q+p
все

Пример 2:
если x>m
то m:=x; n:=n+1
все

### выбор при иначе все

Общий вид команды:
выбор
при условие 1 : серия 1
при условие 2 : серия 2
...
при условие n : серия n
иначе серия n+1
все

Ключевое слово иначе вместе с соответствующей серией команд может отсутствовать :
выбор
при условие 1 : серия 1
при условие 2 : серия 2
...
при условие n : серия n
все

КуМир сначала проверяет условие 1. Если оно соблюдается, то КуМир выполняет команды из серии 1, после чего переходит к выполнению команд, записанных после слова все. В противном случае КуМир делает то же самое с условием 2 и командами из серии 2 и т.д.

Команды, записанные после слова иначе, выполняются в том случае, когда не соблюдено ни одно из условий.

В команде выбор всегда выполняется не более одной серии команд, даже если несколько условий окажутся истинными. Выполнение команды выбор заканчивается после того, как найдено первое (по порядку следования) условие со значением да (и выполнена соответствующая серия команд).

Пример 1:
выбор
при а>1: i:=i+1
при а<0: j:=j-1
иначе t:=i; i:=j; j:=t
все

Пример 2:
выбор
при а[i]<b[j] : i:=i+1
при а[i]>b[j] : j:=j+1
при а[i]=b[j] : i:=i+1; j:=j+1
все

### Команды цикла

### для

Общий вид цикла для:
нц для i от i1 до i2
тело цикла
кц

Здесь i - величина типа цел (она называется параметром цикла), а i1 и i2 - целые выражения. При выполнении цикла для тело цикла выполняется последовательно для i=i1, i=i1+1, ..., i=i2. Если i1=i2, то тело цикла выполнится один раз для i=i1. Если же i1> i2, то тело цикла не выполнится ни разу.

Общий вид цикла для с шагом:
нц для i от i1 до i2 шаг i3
тело цикла
кц

Если шаг i3 (который также должен быть целым выражением) равен положительному числу d, то тело цикла будет выполняется последовательно для i=i1, i=i1+d, i=i1+2*d, ... до тех пор, пока значение i удовлетворяет условию i≤i2.

Если же шаг i3 отрицателен и равен -d, то тело цикла будет выполняется последовательно для i=i1, i=i1-d, i=i1-2*d, ... до тех пор, пока значение i удовлетворяет условию i≥i1.

Пример 1:
нц для j от 1 до длин(t)
t1[j]:=t[длин(t)+1-j]
кц

Пример 2:
нц для i от 1 до 100 шаг 2
а[i+1]:=a[i]
кц

Пример 3:
нц для i от 100 до 1 шаг -2
а[i]:=a[i-1]
кц

В теле любого из циклов может быть использована команда выход . При выполнении этой команды содержащий ее цикл будет завершен. Если команда выход используется во вложенных циклах, то завершается самый внутренний.

### пока

Общий вид цикла пока:
нц пока условие
тело цикла (серия)
кц

При выполнении цикла пока КуМир циклически повторяет следующие действия:
_ проверяет записанное после служебного слова пока условие;
_ если условие не соблюдается, то выполнение цикла завершается и КуМир начинает выполнять команды, записанные после кц. Если же условие соблюдается, то КуМир выполняет тело цикла, снова проверяет условие и т.д.

Пример:
нц пока а<10
а := а + 1
кц

В теле любого из циклов может быть использована команда выход . При выполнении этой команды содержащий ее цикл будет завершен. Если команда выход используется во вложенных циклах, то завершается самый внутренний.

### до тех пор

Общий вид цикла до тех пор:
нц
тело цикла (серия)
кц_при условие

При выполнении цикла до тех пор КуМир циклически повторяет следующие действия:
_ выполняет тело цикла;
_ проверяет записанное после служебного слова кц_при условие;
_ если условие соблюдается, то выполнение цикла завершается и КуМир начинает выполнять команды, записанные после кц_при. Если же условие не соблюдается, то КуМир выполняет тело цикла, снова проверяет условие и т.д.

Пример:
нц
x := 2*x
кц_при x>100

Условие окончания цикла может быть добавлено в любую команду повторения, например, в цикл N раз.

Пример:
нц 5 раз
ввод x,y,z
вывод нс,"Координаты:",x,y,z
кц_при x+y+z>100

В этом примере тело цикла выполнится не менее одного и не более пяти раз.

В теле любого из циклов может быть использована команда выход . При выполнении этой команды содержащий ее цикл будет завершен. Если команда выход используется во вложенных циклах, то завершается самый внутренний.

### N раз

Общий вид цикла N раз:
нц N раз
тело цикла (серия)
кц

Здесь N - целое выражение, задающее число повторений. При выполнении алгоритма последовательность команд циклически повторяется указанное число раз.

Пример:
нц 4 раз
ввод x,y,z
вывод нс,"Координаты:",x,y,z
кц

В теле любого из циклов может быть использована команда выход . При выполнении этой команды содержащий ее цикл будет завершен. Если команда выход используется во вложенных циклах, то завершается самый внутренний.

### нц-кц

Общий вид цикла:
нц
тело цикла (серия)
кц

Пример:
нц
а := а + 1
если а>100 то выход все
кц

КуМир не проверяет, встречается ли в теле цикла команда выход. Если такой команды нет, то цикл будет выполняться до бесконечности.

В теле любого из циклов может быть использована команда выход . При выполнении этой команды содержащий ее цикл будет завершен. Если команда выход используется во вложенных циклах, то завершается самый внутренний.

## Встроенные исполнители

### Робот

### влево

Синтаксис:
алг влево

Описание:

Перемещает робота влево на одну позицию.

### вверх

Синтаксис:
алг вверх

Описание:

Перемещает робота вверх на одну позицию.

### вправо

Синтаксис:
алг вправо

Описание:

Перемещает робота вправо на одну позицию.

### вниз

Синтаксис:
алг вниз

Описание:

Перемещает робота вниз на одну позицию.

### слева свободно

Синтаксис:
алг лог слева свободно

Описание:

Возвращает да, если робот может перейти влево, иначе - нет.

### сверху свободно

Синтаксис:
алг лог сверху свободно

Описание:

Возвращает да, если робот может перейти вверх, иначе - нет.

### справа свободно

Синтаксис:
алг лог справа свободно

Описание:

Возвращает да, если робот может перейти вправо, иначе - нет.

### снизу свободно

Синтаксис:
алг лог снизу свободно

Описание:

Возвращает да, если робот может перейти вниз, иначе - нет.

### слева стена

Синтаксис:
алг лог слева стена

Описание:

Возвращает да, если слева от робота находится стена, нет, если нет стены.

### сверху стена

Синтаксис:
алг лог сверху стена

Описание:

Возвращает да, если сверху от робота находится стена, нет, если нет стены.

### справа стена

Синтаксис:
алг лог справа стена

Описание:

Возвращает да, если справа от робота находится стена, нет, если нет стены.

### снизу стена

Синтаксис:
алг лог снизу стена

Описание:

Возвращает да, если снизу от робота находится стена, нет, если нет стены.

### закрасить

Синтаксис:
алг закрасить

Описание:

Закрашивает клетку, на которой стоит робот.

### клетка закрашена

Синтаксис:
алг лог клетка закрашена

Описание:

Возвращает да, если клетка закрашена, и нет, если клетка не закрашена.

### клетка чистая

Синтаксис:
алг лог клетка чистая

Описание:

Возвращает нет, если клетка закрашена, и да, если клетка чистая.

### радиация

Синтаксис:
алг вещ радиация

Описание:

Возвращает значение радиации в клетке, где находится робот.

### температура

Синтаксис:
алг вещ температура

Описание:

Возвращает значение температуры в клетке, где находится робот.

### Чертежник

### установить цвет

Синтаксис:
алг установить цвет(лит цвет)

Описание:

Устанавливает цвет пера чертежника. Цвет задается строкой цвет, может принимать одно из значений: ”черный”, ”белый”, ”красный”, ”оранжевый”, ”желтый”, ”зеленый”, ”голубой”, ”синий”, ”фиолетовый”.

### опустить перо

Синтаксис:
алг опустить перо

Описание:

Переводит чертежника в режим рисования.

### рисунок в окно

Синтаксис:

Описание:

Мастабирует чертеж до его полного умещения в окне Чертежника.

### сместиться в точку

Синтаксис:
алг сместиться в точку(вещ x, вещ y)

Описание:

Перемещает чертежника в точку с координатами (x, y).

### сместиться на вектор

Синтаксис:
алг сместиться на вектор(вещ dX, вещ dY)

Описание:

Перемещает чертежника в точку на dX вправо и dY вверх.

### поднять перо

Синтаксис:
алг поднять перо

Описание:

Переводит чертежника в режим перемещения.

### Файлы

### создать файл

Синтаксис:
алг создать файл(лит имя_файла)

Описание:

Создает новый пустой файл c именем имя_файла в текущем каталоге ввода-вывода.

Пример:
алг
нач
лит имяФайла
имяФайла:="t1.txt"
создать файл(имяФайла)
...

### открыть на чтение

Синтаксис:
алг открыть на чтение(лит имя_файла, рез цел ключ)

Описание:

Открывает файл имя_файла на чтение и присваивает ему идентификатор ключ

Пример:
алг
нач
цел Ключ
лит имяФайла
имяФайла := "t1.txt"
создать файл(имяФайла)
открыть на чтение(имяФайла, Ключ)
........
закрыть (Ключ)

### открыть на запись

Синтаксис:
алг открыть на запись(лит имя_файла, рез цел ключ)

Описание:

Открывает файл имя_файла на запись и присваивает ему идентификатор ключ

Пример:
алг
нач
цел Ключ
лит имяФайла
имяФайла := "t1.txt"
открыть на запись(имяФайла, Ключ)
......
закрыть(Ключ)

### ф_ввод

Оператор. Ввод данных из файла c идентификатором ключ.

Формат вызова: ф_ввод ключ, п1, п2, ...

Пример:
алг
нач
цел Ключ
лит имяФайла
имяФайла := "t1.txt"
создать файл(имяФайла)
открыть на чтение(имяФайла, Ключ)
вещ buf
ф_ввод Ключ, buf
закрыть(Ключ)

### ф_вывод

Оператор. Вывод данных в файл с идентификатором ключ.

Формат вызова: ф_вывод ключ, п1, п2, ...

Пример:
алг
нач
цел Ключ
лит имяФайла
имяФайла := "t1.txt"
создать файл(имяФайла)
открыть на запись(имяФайла, Ключ)
ф_вывод Ключ, "сумма чисел равна 5"
закрыть(Ключ)

### конец файла

Синтаксис:
алг лог конец файла(цел ключ)

Описание:

Проверяет, достигли ли мы конца файла с ключом ключ

Пример:
алг
нач
цел Ключ
лит имяФайла
имяФайла := "t1.txt"
создать файл(имяФайла)
открыть на чтение(имяФайла, Ключ)
цел n
n := 0
вещ таб a[1:100]
вещ buf
нц пока не конец файла(Ключ)
n := n+1
ф_ввод Ключ, buf
вывод buf, нс
a[n] := buf
кц

### закрыть

Синтаксис:
алг закрыть(цел ключ)

Описание:

Закрывает файл ключ после того, как он был открыт на чтение или на запись

Примеры:
алг
нач
цел Ключ
лит имяФайла
имяФайла := "t1.txt"
создать файл(имяФайла)
открыть на чтение(имяФайла, Ключ)
........
закрыть (Ключ)

алг
нач
цел Ключ
лит имяФайла
имяФайла := "t1.txt"
открыть на запись(имяФайла, Ключ)
......
закрыть(Ключ)

### существует файл

Синтаксис:
алг лог существует файл(лит имя_файла)

Описание:

Проверяет, существует ли файл с именем имя_файла в текущем каталоге ввода-вывода

Пример:
алг
нач
цел Ключ
лит имяФайла
имяФайла := "tmp.dat"
если не существует файл(имяФайла)
то создать файл(имяФайла)
все

## Внешние исполнители

### Создание внешних исполнителей

Внешние исполнители системы Кумир описываются в файлах с расширением .kum. Эти файлы могут содержать описание одного или нескольких исполнителей:

первый исполнитель
второй исполнитель
...
последний исполнитель

Конструкция "исполнитель" на языке КуМир записывается так:

исп имя_исполнителя
¦ пролог
¦ алг первый алгоритм исполнителя
¦ ¦
¦ кон
¦ ...
¦ алг последний алгоритм исполнителя
¦ ¦
¦ кон
кон_исп

См. пример файла с описанием внешнего исполнителя.

### Пример внешнего исполнителя

    исп Дроби

    цел числитель
    цел знаменатель

    алг сложить (цел ч1, з1, ч2, з2)
    нач
    числитель := ч1*з2+ч2*з1
    знаменатель := з1*з2
    сократить дробь(числитель, знаменатель)
    кон

    алг вычесть (цел ч1, з1, ч2, з2)
    нач
    числитель := ч1*з2-ч2*з1
    знаменатель := з1*з2
    сократить дробь(числитель, знаменатель)
    кон

    алг умножить (цел ч1, з1, ч2, з2)
    нач
    числитель := ч1*ч2
    знаменатель := з1*з2
    сократить дробь(числитель, знаменатель)
    кон

    алг разделить (цел ч1, з1, ч2, з2)
    нач
    числитель := ч1*з2
    знаменатель := з1*ч2
    сократить дробь(числитель, знаменатель)
    кон

    алг сократить дробь(цел а, цел б)
    нач
    цел нод
    если а<>0 и б<>0
    то
    нод := НОД(а, б)
    числитель := div(а, нод)
    знаменатель := div(б, нод)
    иначе
    числитель := а
    знаменатель := б
    все
    кон

    алг цел НОД(цел а, б)
    нач
    цел нод1, нод2
    нод1 := а
    нод2 := б
    нц пока не (нод1 = нод2)
    нц пока нод1 > нод2
    нод1 := нод1 - нод2
    кц
    нц пока нод1 < нод2
    нод2 := нод2-нод1
    кц
    кц
    |вывод "НОД = ", нод1, нс
    знач := нод1
    кон

    алг вывод_дроби
    нач
    вывод числитель, " / ", знаменатель
    кон

    кон_исп

### Использование внешних исполнителей

### Подключение внешних исполнителей

Для подключения исполнителя, который описан во внешнем файле с расширением .kum, следует:

- В главном меню выбрать пункт "Инструменты" - "Исполнители".
- В появившемся окне "Регистрация исполнителей" нажать кнопку "Зарегистрировать новый".
- В диалоговом окне открытия файлов выбрать необходимый .kum-файл.
- После этого появится окно "Выбор исполнителей", в котором указан список исполнителей, содержащихся в файле. Необходимо выбрать из списка нужные исполнители и нажать кнопку "ОК".

### Использование внешних исполнителей

Для использования зарегистрированного исполнителя необходимо в начале программы добавить строку использовать имя_исполнителя.

Пример программы, работающей с представленным исполнителем Дроби:

использовать Дроби
алг
нач
сложить(1,2,1,6)
вывод_дроби
кон

Результат выполнения: 2 / 3

### Отключение внешних исполнителей

Для отключения зарегистрированного исполнителя следует:

- В главном меню выбрать пункт "Инструменты" - "Исполнители".
- В появившемся окне "Регистрация исполнителей" выбрать исполнитель и нажать кнопку "Удалить".