📖 Документация Qumir

← Вернуться в Playground

Синтаксис языка

Типы данных

Тип Описание Пример
цел Целое число (64-bit) цел x
вещ Вещественное число (double) вещ pi
лог Логический (булев) лог флаг
лит Строка лит имя
сим Символ сим буква

Объявление переменных

цел a, b, c
вещ x, y
лог готово
лит сообщение

Объявление переменных с инициализацией

цел МАКС = 100
вещ ПИ = 3.14159

Массивы (таблицы)

Одномерные массивы

цел таб A[1:10]        | массив из 10 элементов (индексы 1-10)
вещ таб B[0:99]        | массив из 100 элементов (индексы 0-99)

Двумерные массивы

цел таб матрица[1:3, 1:3]
вещ таб поле[0:7, 0:7]

Доступ к элементам

A[1] := 42
матрица[2, 3] := A[1] + 1

Операторы

Арифметические

Оператор Описание
+ Сложение
- Вычитание
* Умножение
/ Деление
** Возведение в степень

Примечание: Целочисленное деление и остаток от деления — это функции 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
то
    вывод "Положительное", нс
иначе
    вывод "Неположительное", нс
все

Выбор (switch)

выбор x
    при 1: вывод "Один", нс
    при 2: вывод "Два", нс
    при 3: вывод "Три", нс
    иначе: вывод "Другое", нс
все

Циклы

Цикл с условием (пока)

нц пока условие
    | тело цикла
кц

Пример:

цел i
i := 1
нц пока i <= 10
    вывод i, нс
    i := i + 1
кц

Цикл со счётчиком (для)

нц для переменная от начало до конец
    | тело цикла
кц

С шагом:

нц для переменная от начало до конец шаг значение
    | тело цикла
кц

Примеры:

нц для i от 1 до 10
    вывод i, нс
кц

нц для i от 10 до 1 шаг -1
    вывод i, нс
кц

нц для i от 0 до 100 шаг 10
    вывод i, нс
кц

Цикл с постусловием

нц
    | тело цикла
кц при условие_выхода

Пример:

цел x
x := 0
нц
    x := x + 1
    вывод x, нс
кц при x >= 10

Алгоритмы (функции)

Процедура (без возвращаемого значения)

алг приветствие
нач
    вывод "Привет!", нс
кон

Функция с возвращаемым значением

алг цел квадрат(цел x)
нач
    знач := x * x
кон

Параметры

алг вещ площадь_прямоугольника(вещ a, вещ b)
нач
    знач := a * b
кон

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

алг
нач
    цел результат
    результат := квадрат(5)
    вывод "5² = ", результат, нс
кон

алг цел квадрат(цел x)
нач
    знач := x * x
кон

Точка входа

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

| Это точка входа — она будет выполнена
алг цел главная(цел n)
нач
    знач := факториал(n)
кон

| Это вспомогательный алгоритм
алг цел факториал(цел x)
нач
    если x <= 1
    то
        знач := 1
    иначе
        знач := x * факториал(x - 1)
    все
кон

Если точка входа принимает аргументы:

Типы аргументов в поле Args:


Комментарии

Комментарий начинается с символа | и продолжается до конца строки:

цел x  | это комментарий
x := 10  | присваиваем значение
| вся строка — комментарий

Встроенные функции

Математические

Функция Описание
abs(x) Модуль числа
sqrt(x) Квадратный корень
sin(x) Синус
cos(x) Косинус
tg(x) Тангенс
ln(x) Натуральный логарифм
lg(x) Десятичный логарифм
exp(x) Экспонента
min(a, b) Минимум
max(a, b) Максимум
div(a, b) Целая часть от деления
mod(a, b) Остаток от деления
int(x) Целая часть числа
rnd(x) Случайное число от 0 до x

Математическая семантика div и mod: В отличие от таких ящыков как C и C++, операции div и mod в Qumir имеют математическую семантику:

  • Остаток mod всегда неотрицательный (от 0 до b-1)
  • Выполняется инвариант: a = (a div b) * b + (a mod 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 (некорректный индекс!)

Строковые

Функция Описание
длин(s) Длина строки
лит_в_цел(s) Преобразование строки в целое
лит_в_вещ(s) Преобразование строки в вещественное
цел_в_лит(n) Преобразование целого в строку
вещ_в_лит(x) Преобразование вещественного в строку

Пример программы

| Вычисление факториала

алг
нач
    цел n, результат
    вывод "Введите число: "
    ввод n
    результат := факториал(n)
    вывод n, "! = ", результат, нс
кон

алг цел факториал(цел n)
нач
    если n <= 1
    то
        знач := 1
    иначе
        знач := n * факториал(n - 1)
    все
кон