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

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

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

Типы данных

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

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

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

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

цел МАКС = 100
вещ ПИ = 3.14159
лит имя = "Вася"
сим буква = 'я'

В объявлении начальное значение задаётся знаком =. Запись цел x := 0 — ошибка: := используется только в присваивании.

Литералы


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

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

цел таб 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)
    все
кон

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

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


Утверждения

Если условие ложно, программа останавливается с ошибкой.

алг цел корень(цел 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