🦀 Rust

Ввод и вывод данных в Rust 1.75: подробное руководство

Ввод и вывод данных в Rust

Представь, что ты создаешь программу, которая общается с пользователем. Чтобы программа могла понять, что хочет человек, ей нужно ввести данные (например, имя или число). А чтобы пользователь увидел результат работы программы, она должна вывести ответ на экран. В Rust для этого есть специальные команды: println! для вывода и std::io::stdin для ввода.

Как выводить текст на экран

Самая простая команда для вывода — println!. Она печатает текст и автоматически переходит на новую строку.

fn main() {
    println!("Привет, мир!");
    println!("Я учу Rust!");
}

Если ты хочешь вывести число или переменную, используй фигурные скобки {} — это плейсхолдер, куда подставляется значение:

fn main() {
    let имя = "Аня";
    let возраст = 12;
    println!("Меня зовут {}, мне {} лет.", имя, возраст);
}

Можно выводить результат вычислений прямо в println!:

fn main() {
    println!("5 + 3 = {}", 5 + 3);
    println!("10 / 2 = {}", 10 / 2);
}

Как вводить данные от пользователя

Ввод данных в Rust немного сложнее, чем в других языках, но ничего страшного! Сначала нужно подключить библиотеку ввода-вывода:

use std::io;

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

use std::io;

fn main() {
    let mut ввод = String::new(); // создаем пустую строку
    io::stdin()
        .read_line(&mut ввод)     // читаем то, что написал пользователь
        .expect("Ошибка чтения"); // если что-то пошло не так — программа завершится
    
    println!("Вы ввели: {}", ввод);
}

Обрати внимание: let mut — это изменяемая переменная, потому что мы будем менять ее содержимое. &mut — это ссылка на переменную, чтобы функция read_line могла записать в нее данные.

Ввод чисел

Когда пользователь вводит число, Rust воспринимает его как текст. Чтобы работать с числом, нужно преобразовать строку в число с помощью .trim().parse():

use std::io;

fn main() {
    let mut ввод = String::new();
    println!("Введите ваш возраст:");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    
    let возраст: u32 = ввод
        .trim()           // убираем лишние пробелы и перевод строки
        .parse()          // превращаем строку в число
        .expect("Введите число!"); // если не число — ошибка
    
    println!("Через год вам будет {} лет.", возраст + 1);
}

.trim() нужен, чтобы удалить символ перевода строки, который добавляется при нажатии Enter. .parse() пытается превратить текст в число. Тип u32 — это целое положительное число.

Разбор типичных задач

Давай разберем, как решать задачи из твоего списка.

Пример: Площадь прямоугольника

Программа должна запросить длину и ширину, а потом вывести площадь. Нужно два раза считать числа и перемножить их:

use std::io;

fn main() {
    let mut ввод = String::new();
    
    println!("Введите длину прямоугольника:");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    let длина: f64 = ввод.trim().parse().expect("Введите число");
    
    ввод.clear(); // очищаем переменную для нового ввода!
    
    println!("Введите ширину прямоугольника:");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    let ширина: f64 = ввод.trim().parse().expect("Введите число");
    
    let площадь = длина * ширина;
    println!("Площадь прямоугольника: {}", площадь);
}

Обрати внимание на ввод.clear() — это очень важно! Если не очистить строку, новый ввод добавится к старому.

Пример: Определение возраста

Запрашиваем год рождения и текущий год, вычитаем из текущего год рождения:

use std::io;

fn main() {
    let mut ввод = String::new();
    
    println!("Введите год рождения:");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    let год_рождения: u32 = ввод.trim().parse().expect("Введите число");
    
    ввод.clear();
    
    println!("Введите текущий год:");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    let текущий_год: u32 = ввод.trim().parse().expect("Введите число");
    
    let возраст = текущий_год - год_рождения;
    println!("Вам {} лет (или будет в этом году).", возраст);
}

Частые ошибки новичков

  • Забыл очистить строку перед новым вводом. Используй переменная.clear(); перед каждым read_line, если считываешь несколько значений.
  • Забыл .trim() при преобразовании в число. Без .trim() строка содержит символ новой строки, и .parse() может не сработать.
  • Попытался ввести текст как число. Если пользователь введет "привет" вместо числа, программа упадет с ошибкой. В следующих уроках ты узнаешь, как обрабатывать такие ситуации.
  • Забыл use std::io;. Без этой строчки компилятор не поймет, что такое io::stdin().
  • Использовал let вместо let mut. Переменная для ввода должна быть изменяемой, иначе ты не сможешь записать в нее данные.

Итоговый пример: "Уютное кафе"

Давай напишем программу, которая принимает заказ в кафе. Пользователь вводит имя, напиток и размер порции, а программа выводит итоговый заказ.

use std::io;

fn main() {
    let mut ввод = String::new();
    
    // Вводим имя
    println!("Добро пожаловать в 'Уютное кафе'!");
    println!("Как вас зовут?");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    let имя = ввод.trim().to_string(); // сохраняем имя
    ввод.clear();
    
    // Вводим напиток
    println!("Какой напиток желаете? (кофе, чай, какао)");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    let напиток = ввод.trim().to_string();
    ввод.clear();
    
    // Вводим размер
    println!("Какой размер? (маленький, средний, большой)");
    io::stdin().read_line(&mut ввод).expect("Ошибка");
    let размер = ввод.trim().to_string();
    
    // Выводим заказ
    println!("
--- ВАШ ЗАКАЗ ---
Имя: {}
Напиток: {}
Размер: {}
------------------", имя, напиток, размер);
    println!("Спасибо, {}, ждите ваш {} {}!", имя, размер, напиток);
}

Эта программа использует все, что мы изучили: вывод с println!, ввод с read_line, очистку строки и подстановку переменных в текст.

Теперь ты знаешь основы ввода и вывода в Rust. Практикуйся: попробуй изменить примеры, добавить новые вопросы или вычисления. С каждым новым кодом ты будешь чувствовать себя увереннее!