5. Простой калькулятор (полностью)
use std::io;
fn main() {
println!("=== Простой калькулятор на Rust ===");
println!("Для выхода введите 'q' или оставьте строку пустой\n");
loop {
// Читаем первое число
let num1 = match read_number("Введите первое число (или q для выхода):") {
Some(n) => n,
None => break,
};
// Читаем оператор
let operator = read_operator();
// Читаем второе число
let num2 = match read_number("Введите второе число:") {
Some(n) => n,
None => continue,
};
// Выполняем вычисление
match calculate(num1, &operator, num2) {
Ok(result) => {
println!("Результат: {} {} {} = {:.4}", num1, operator, num2, result);
}
Err(msg) => println!("Ошибка: {}", msg),
}
// Исправленная строка-разделитель
println!("{}", "─".repeat(40));
}
println!("До свидания! 👋");
}
// ====================== ФУНКЦИИ ======================
fn read_number(prompt: &str) -> Option<f64> {
loop {
println!("{}", prompt);
let mut input = String::new();
if io::stdin().read_line(&mut input).is_err() {
println!("Ошибка чтения ввода!");
continue;
}
let input = input.trim();
if input.eq_ignore_ascii_case("q") || input.is_empty() {
return None;
}
match input.parse::<f64>() {
Ok(num) => return Some(num),
Err(_) => println!("Ошибка: введите корректное число!"),
}
}
}
fn read_operator() -> String {
loop {
println!("Введите оператор (+, -, *, /):");
let mut input = String::new();
if io::stdin().read_line(&mut input).is_err() {
continue;
}
let op = input.trim();
if matches!(op, "+" | "-" | "*" | "/") {
return op.to_string();
} else {
println!("Ошибка: допустимы только +, -, *, /");
}
}
}
fn calculate(a: f64, op: &str, b: f64) -> Result<f64, String> {
match op {
"+" => Ok(a + b),
"-" => Ok(a - b),
"*" => Ok(a * b),
"/" => {
if b == 0.0 {
Err("Деление на ноль!".to_string())
} else {
Ok(a / b)
}
}
_ => Err("Неизвестный оператор".to_string()),
}
}