Синтаксис языка
Типы данных
| Тип | Описание | Пример |
|---|---|---|
цел |
Целое число (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)
все
кон
Если точка входа принимает аргументы:
- Онлайн (qumir.dev): введите значения в поле "Args" через запятую, например:
5или10, 20, истина - Офлайн (
qumiri,qumirc): передача аргументов пока не поддерживается
Типы аргументов в поле Args:
- Целые числа:
42,-10 - Вещественные:
3.14,-2.5 - Логические:
да,нет - Строки:
"текст"или'текст'
Комментарии
Комментарий начинается с символа | и продолжается до конца строки:
цел 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)
все
кон