Синтаксис языка
Типы данных
| Тип | Описание | Пример |
|---|---|---|
цел |
Целое число (64-bit) | цел x |
вещ |
Вещественное число (double) | вещ pi |
лог |
Логический (булев) | лог флаг |
лит |
Строка | лит имя |
сим |
Символ | сим буква |
файл |
Файл (см. Работа с файлами) | файл f |
Объявление переменных
цел a, b, c
вещ x, y
лог готово
лит сообщение
Объявление переменных с инициализацией
цел МАКС = 100
вещ ПИ = 3.14159
лит имя = "Вася"
сим буква = 'я'
В объявлении начальное значение задаётся знаком =. Запись цел x := 0 — ошибка: := используется только в присваивании.
Литералы
- Строки — в двойных кавычках:
"текст" - Символы — в одинарных кавычках:
'я' - Вещественные числа — через точку:
3.14
Массивы (таблицы)
Одномерные массивы
цел таб A[1:10] | массив из 10 элементов (индексы 1-10)
вещ таб B[0:99] | массив из 100 элементов (индексы 0-99)
Вместо цел таб можно писать слитно: целтаб, вещтаб, логтаб, литтаб, симтаб.
литтаб слова[1:5]
Двумерные массивы
цел таб матрица[1:3, 1:3]
вещ таб поле[0:7, 0:7]
Доступ к элементам
A[1] := 42
матрица[2, 3] := A[1] + 1
Операторы
Арифметические
| Оператор | Описание |
|---|---|
+ |
Сложение |
- |
Вычитание |
* |
Умножение |
/ |
Деление (результат всегда вещ: 7 / 2 = 3.5) |
** |
Возведение в степень |
Для строк + означает склеивание: "при" + "вет" даёт "привет".
Примечание: Целочисленное деление и остаток от деления — это функции
div(a, b)иmod(a, b), а не операторы. См. раздел Встроенные функции.
Сравнения
| Оператор | Описание |
|---|---|
= |
Равно |
<> |
Не равно |
< |
Меньше |
<= |
Меньше или равно |
> |
Больше |
>= |
Больше или равно |
Логические
| Оператор | Описание |
|---|---|
и |
Логическое И |
или |
Логическое ИЛИ |
не |
Логическое НЕ |
Отличие от КуМир: В Qumir операторы
ииилиявляются ленивыми (short-circuit evaluation). Это означает, что второй операнд вычисляется только если это необходимо:
A и B— еслиAложно,Bне вычисляется (результат уже известен — ложь)A или B— еслиAистинно,Bне вычисляется (результат уже известен — истина)В оригинальном КуМире оба операнда всегда вычисляются.
Примеры, где это важно:
| Безопасная проверка деления — не будет ошибки деления на ноль
если y <> 0 и x / y > 10
то
вывод "Частное больше 10", нс
все
| Безопасная проверка индекса массива
цел таб A[1:10]
цел i
i := 15
если i >= 1 и i <= 10 и A[i] > 0
то
вывод "Элемент положительный", нс
все
| В КуМире была бы ошибка выхода за границы массива,
| в Qumir A[i] не вычисляется, т.к. i <= 10 уже ложно
Логические константы
да— истинанет— ложь
Присваивание
x := 10
y := x + 5
имя := "Вася"
готово := да
Ввод и вывод
Вывод
вывод "Текст"
вывод x, " + ", y, " = ", x + y, нс
нс— переход на новую строку
Ввод
ввод x
ввод a, b, c
Управляющие конструкции
Условный оператор (если)
если условие
то
| действия если истина
иначе
| действия если ложь
все
Без ветки иначе:
если x > 0
то
вывод "Положительное", нс
все
С веткой иначе:
если x > 0
то
вывод "Положительное", нс
иначе
вывод "Неположительное", нс
все
Короткие ветки можно писать в одну строку:
если x > 0 то вывод "Положительное", нс все
Вместо все можно писать всё.
Выбор (switch)
После каждого при записывается условие. Выполняется первая ветка, условие которой истинно; если ни одно не подошло — ветка иначе (её можно опустить).
выбор
при x = 1: вывод "Один", нс
при x = 2: вывод "Два", нс
при x > 2 и x < 10: вывод "Несколько", нс
иначе вывод "Другое", нс
все
Циклы
Цикл с условием (пока)
нц пока условие
| тело цикла
кц
Пример:
цел i
i := 1
нц пока i <= 10
вывод i, нс
i := i + 1
кц
Цикл со счётчиком (для)
нц для переменная от начало до конец
| тело цикла
кц
С шагом:
нц для переменная от начало до конец шаг значение
| тело цикла
кц
Примеры:
нц для i от 1 до 10
вывод i, нс
кц
нц для i от 10 до 1 шаг -1
вывод i, нс
кц
нц для i от 0 до 100 шаг 10
вывод i, нс
кц
Цикл N раз
нц 3 раз
вывод "Ура!", нс
кц
Цикл с постусловием
нц
| тело цикла
кц при условие_выхода
Вместо кц при можно писать кц_при.
Пример:
цел x
x := 0
нц
x := x + 1
вывод x, нс
кц при x >= 10
Выход из цикла и переход к следующему шагу
выход— досрочно завершает цикл; вне цикла завершает текущий алгоритмдалее— переходит к следующему шагу цикла (в классическом КуМире этой команды нет)
цел i
нц для i от 1 до 10
если mod(i, 2) = 0 то далее все
если i > 7 то выход все
вывод i, " "
кц
| выведет: 1 3 5 7
Строки и символы
Символы строки нумеруются с 1. Отдельный символ — s[i] (тип сим), подстрока — s[i:j]. Символ строки можно заменить присваиванием.
лит s = "привет"
вывод s[2], нс | р
вывод s[2:4], нс | рив
s[1] := 'П'
вывод s + "!", нс | Привет!
Функции для работы со строками (длин, позиция, вставить, удалить и др.) описаны на странице Стандартные функции.
Алгоритмы (функции)
Процедура (без возвращаемого значения)
алг приветствие
нач
вывод "Привет!", нс
кон
Функция с возвращаемым значением
алг цел квадрат(цел x)
нач
знач := x * x
кон
знач— специальная переменная для возвращаемого значения
Параметры
алг вещ площадь_прямоугольника(вещ a, вещ b)
нач
знач := a * b
кон
Результаты и изменяемые параметры
По умолчанию параметр — аргумент (арг): алгоритм получает его значение и не может его изменить. Чтобы алгоритм возвращал значения через параметры, используются:
рез— результат: алгоритм записывает значение в переменную вызывающегоаргрез(илиарг рез) — параметр и читается, и изменяется
алг делить(цел a, цел b, рез цел частное, рез цел остаток)
нач
частное := div(a, b)
остаток := mod(a, b)
кон
алг удвоить(аргрез цел x)
нач
x := x * 2
кон
Вызов алгоритмов
алг
нач
цел результат
результат := квадрат(5)
вывод "5² = ", результат, нс
кон
алг цел квадрат(цел x)
нач
знач := x * x
кон
Точка входа
Точка входа — это первый алгоритм в файле. При запуске программы выполняется именно он.
| Это точка входа — она будет выполнена
алг цел главная(цел n)
нач
знач := факториал(n)
кон
| Это вспомогательный алгоритм
алг цел факториал(цел x)
нач
если x <= 1
то
знач := 1
иначе
знач := x * факториал(x - 1)
все
кон
Если точка входа принимает аргументы:
- Онлайн (qumir.dev): введите значения в поле "Args" через запятую, например:
5или10, 20, да - Офлайн (
qumiri,qumirc): передача аргументов пока не поддерживается
Типы аргументов в поле Args:
- Целые числа:
42,-10 - Вещественные:
3.14,-2.5 - Логические:
да,нет - Строки:
"текст"или'текст'
Утверждения
утв условие— проверка в любом месте алгоритмадано условие— предусловие, записывается между заголовком алгоритма иначнадо условие— постусловие, проверяется при завершении алгоритма
Если условие ложно, программа останавливается с ошибкой.
алг цел корень(цел n)
дано n >= 0
надо знач * знач <= n
нач
знач := int(sqrt(n))
кон
Исполнители и модули
Исполнители и дополнительные модули подключаются командой использовать в начале программы:
использовать Черепаха
Доступны: Черепаха, Чертёжник, Рисователь, Робот, Клавиатура, Комплексные числа.
Комментарии
Комментарий начинается с символа | и продолжается до конца строки:
цел x | это комментарий
x := 10 | присваиваем значение
| вся строка — комментарий
Встроенные функции
Полный список встроенных функций (математика, случайные числа, строки, файлы, время) — на странице Стандартные функции.
Математическая семантика div и mod: В отличие от таких языков, как C и C++, операции
divиmodв Qumir имеют математическую семантику:divокругляет частное вниз (к минус бесконечности).
- При положительном делителе остаток
modвсегда неотрицательный (от 0 до b-1); при отрицательном — имеет знак делителя- Выполняется инвариант:
a = div(a, b) * b + mod(a, b)В C и C++ знак остатка зависит от знака делимого, что часто приводит к ошибкам.
Сравнение с C/C++:
| Выражение | Qumir | C и C++ |
|---|---|---|
div(-7, 3) |
-3 |
-2 |
mod(-7, 3) |
2 |
-1 |
div(7, -3) |
-3 |
-2 |
mod(7, -3) |
-2 |
1 |
Пример — определение чётности:
| В Qumir работает корректно для любых чисел
алг лог чётное(цел n)
нач
знач := mod(n, 2) = 0
кон
| mod(-4, 2) = 0 → чётное (верно)
| mod(-3, 2) = 1 → нечётное (верно)
Пример — циклический индекс:
| Получить индекс в кольцевом буфере размера N
алг цел циклический_индекс(цел i, цел N)
нач
знач := mod(i, N) | всегда от 0 до N-1
кон
| В Qumir: mod(-1, 5) = 4 (корректный индекс)
| В C/C++: (-1) % 5 = -1 (некорректный индекс!)
Пример программы
| Вычисление факториала
алг
нач
цел n, результат
вывод "Введите число: "
ввод n
результат := факториал(n)
вывод n, "! = ", результат, нс
кон
алг цел факториал(цел n)
нач
если n <= 1
то
знач := 1
иначе
знач := n * факториал(n - 1)
все
кон
5