Российские студенты выиграли международный чемпионат по программированию ICPC.
Ученики петербургского университета отправилась в Баку, чтобы принять участие в крупнейшей студенческой олимпиаде по программированию в мире — ICPC World Finals 2025. И победили!
В финал конкурса прошли команды из более чем 70 стран, представители 140 лучших университетов мира. Всего оказалось четыре золотых медали, а абсолютная победа досталась россиянам.
❤️ нашим ребятам!
Подпишись на Ленту.ру
Ученики петербургского университета отправилась в Баку, чтобы принять участие в крупнейшей студенческой олимпиаде по программированию в мире — ICPC World Finals 2025. И победили!
В финал конкурса прошли команды из более чем 70 стран, представители 140 лучших университетов мира. Всего оказалось четыре золотых медали, а абсолютная победа досталась россиянам.
❤️ нашим ребятам!
Подпишись на Ленту.ру
Иван Васильевич
Вопрос откуда Уникумы в России тогда?
Артем Голубченко
Лексей Иваныч
Лексей Иваныч
Артем Голубченко
Артем Голубченко
Себастьян Перейра
Лексей Иваныч
Делали тебя по пьяни, и это были крокодилы.
Маруся Д
Маруся Д
Игорь Романов
Лев Рахманов
Евгений Шевелев
```c
#include
#define MAX_EXPR_LEN 100
// Рекурсивные функции для разбора выражения
double parse_expression(char *expr, int [id78930|*index]);
double parse_term(char *expr, int [id78930|*index]);
double parse_factor(char *expr, int [id78930|*index]);
// Пропуск пробелов
void skip_spaces(char *expr, int [id78930|*index]) {
while (expr[*index] == ' ') {
([id78930|*index])++;
}
}
// Обработка числа
double parse_number(char *expr, int [id78930|*index]) {
double result = 0.0;
double fraction = 1.0;
int decimal = 0;
skip_spaces(expr, index);
while (expr[*index] != '\0' &&
(isdigit(expr[*index]) || expr[*index] == '.')) {
if (expr[*index] == '.') {
decimal = 1;
} else {
if (decimal) {
fraction /= 10.0;
result += (expr[*index] - '0') * fraction;
} else {
result = result * 10.0 + (expr[*index] - '0');
}
}
([id78930|*index])++;
}
return result;
}
// Обработка фактора (число или выражение в скобках)
double parse_factor(char *expr, int [id78930|*index]) {
double result;
skip_spaces(expr, index);
if (expr[*index] == '(') {
([id78930|*index])++;
result = parse_expression(expr, index);
skip_spaces(expr, index);
if (expr[*index] == ')') {
([id78930|*index])++;
} else {
printf("Ошибка: отсутствует закрывающая скобка\n");
exit(1);
}
} else if (expr[*index] == '-') {
([id78930|*index])++;
result = -parse_factor(expr, index);
} else {
result = parse_number(expr, index);
}
return result;
}
// Обработка терма (умножение и деление)
double parse_term(char *expr, int [id78930|*index]) {
double result = parse_factor(expr, index);
skip_spaces(expr, index);
while (expr[*index] == '*' || expr[*index] == '/') {
char op = expr[*index];
([id78930|*index])++;
double num = parse_factor(expr, index);
if (op == '*') {
result *= num;
} else {
if (num != 0.0) {
result /= num;
} else {
printf("Ошибка: деление на ноль\n");
exit(1);
}
}
skip_spaces(expr, index);
}
return result;
}
// Обработка выражения (сложение и вычитание)
double parse_expression(char *expr, int [id78930|*index]) {
double result = parse_term(expr, index);
skip_spaces(expr, index);
while (expr[*index] == '+' || expr[*index] == '-') {
char op = expr[*index];
([id78930|*index])++;
double num = parse_term(expr, index);
if (op == '+') {
result += num;
} else {
result -= num;
}
skip_spaces(expr, index);
}
return result;
}
int main() {
char expr[MAX_EXPR_LEN];
int index = 0;
printf("Введите арифметическое выражение: ");
fgets(expr, MAX_EXPR_LEN, stdin);
expr[strcspn(expr, "\n")] = '\0'; // Удаляем символ новой строки
double result = parse_expression(expr, &index);
printf("Результат: %.2f\n", result);
return 0;
}
```
Как это работает:
1. Рекурсивный спуск: Программа использует рекурсивные функции для разбора выражения с учетом приоритета операторов.
2. Обработка чисел: Поддерживаются как целые, так и дробные числа.
3. Приоритет операторов: Умножение и деление имеют приоритет над сложением и вычитанием.
4. Скобки: Рекурсивная обработка вложенных выражений в скобках.
5. Унарный минус: Поддерживается отрицательные числа.
6. Пробелы: Программа игнорирует пробелы в выражении.
Пример использования:
```
Введите арифметическое выражение: (2 + 3) * 4 - 10 / 2
Результат: 15.00
```
Этот калькулятор обрабатывает основные арифметические операции и корректно работает с вложенными выражениями. Для простоты опущена обработка ошибок ввода (кроме проверки деления на ноль и скобок), но добавлены..
Евгений Шевелев
Коля Николай