diff --git a/src/debug.rs b/src/debug.rs new file mode 100644 index 0000000..59ed1d8 --- /dev/null +++ b/src/debug.rs @@ -0,0 +1,41 @@ + +pub fn debugging(formule: &str) { + let mut numbers: Vec = vec![]; // Массив для хранения чисел + let mut chars = formule.chars().peekable(); // Создаем peekable-итератор + + if let Some(first_char) = chars.next() { + if first_char == '!' as char { + while let Some(c) = chars.next() { + if c >= 'a' as char { + continue; + } else if c == ' ' { + continue; + } else { + if String::from(c) == "+" || String::from(c) == "-" || String::from(c) == "" || String::from(c) == "+" { + + } + numbers.push(c as i32 - 48); // Заполняем массив числами + println!("symbol: {}", c); // Выводим символ + + // Выводим следующий символ, если он есть + if let Some(next_char) = chars.peek() { + println!("next symbol: {}", next_char); + } else { + println!("next symbol: None"); + } + + println!("size: {}", numbers.len()); // Выводим текущий размер массива + { + let a = c as i32; + // Здесь вы можете использовать переменную `a` + println!("a = {}", a - 48); + println!("-----"); + } + } + } + println!("DEBUG numbers: {:?}", numbers); // Выводим массив чисел + } else { + // па преколу + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..1c2f09a --- /dev/null +++ b/src/main.rs @@ -0,0 +1,168 @@ +use colored::Colorize; // Импортируем библиотеку для работы с цветами +use std::io::{self, Write}; // Импортируем библиотеки для работы с вводом и выводом + +//import +mod debug; // Импортируем модуль debug.rs +use crate::debug::debugging; + +fn main() { + println!( + "{}, ver: {}, by: {} ; print 'H' to see help ; to exit print 'Q'", + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_VERSION").bold().cyan(), + env!("CARGO_PKG_AUTHORS").bold().cyan() + ); + begin(); // запуск кода +} + +fn begin() { + let prefix = ">> "; // Префикс для ввода + print!("{}", prefix); // Выводим префикс + io::stdout().flush().unwrap(); // Принудительный вывод префикса (необходимо для корректного отображения префикса) + + let mut input = String::new(); // Строка для ввода + + io::stdin() // Ввод с клавиатуры + .read_line(&mut input) + .expect("Failed to read line"); + + if input.chars().nth(0).unwrap() == 'H' || input.chars().nth(0).unwrap() == 'h' { + // Выводим помощь + println!( + "{}\n{}\n{}\n{}\n{}\n{}", + "calc help".bold().red(), + "'!' = debug mode".italic(), + "'+' = addition".italic(), + "'-' = subtraction".italic(), + "'*' = multiplication".italic(), + "'/' = division".italic() + ); + begin() + } + + println!("You entered: {}", input.trim()); // Выводим введенное значение + + debugging(&input.trim()); // Вызываем функцию дебаг + calculate(formatting(&input.trim())); // Вызываем функцию вычисления + let_start_again() +} + +fn formatting(formule: &str) -> Vec { + if formule == "exit" || formule == "quit" || formule == "q" || formule == "Q" { + println!("{}", "Bye!".bold().on_green()); + std::process::exit(0); // Выход + } + + let mut stack: Vec = vec![String::from("")]; // Массив для хранения чисел в виде строк + let mut dot_count = 0; // Счетчик точек в текущем числе + + for c in formule.chars() { + if c.is_digit(10) { + // Если символ является цифрой + stack.last_mut().unwrap().push(c); + } else if c == '.' { + // Если символ является точкой + if dot_count > 0 { + // Если уже есть одна точка в текущем числе, это ошибка + println!( + "{}", + "Error: Invalid number format with multiple decimal points." + .bold() + .red() + ); + begin(); + } else { + stack.last_mut().unwrap().push(c); + dot_count += 1; // Увеличиваем счетчик точек + } + } else if c == '+' || c == '-' || c == '*' || c == '/' { + // Если символ является оператором + stack.push(String::from(c)); // Добавляем оператор в стек + stack.push(String::from("")); // Добавляем пустую строку в стек + dot_count = 0; // Сбрасываем счетчик точек при переходе к новому числу + } else if c == ' ' || c == '!' { + // Если символ является пробелом + continue; + } else { + println!("{}", "Error: Invalid characters entered!".bold().red()); + begin(); + } + } + + if formule.chars().nth(0).unwrap() == '!' { + println!("DEBUG: {:?}", formule); + println!("DEBUG len: {:?}", formule.len()); + } + + stack // спасибо чату жпт что подсказал что надо поставить эту хуйню :D +} + +fn calculate(formula: Vec) -> f32 { + let mut values: Vec = Vec::new(); + let mut operators: Vec = Vec::new(); + + let mut i = 0; + while i < formula.len() { + let token = &formula[i]; + if let Ok(num) = token.parse::() { + values.push(num); + } else if token == "*" || token == "/" { + // Проверяем, есть ли следующий токен и является ли он числом + if i + 1 >= formula.len() || formula[i + 1].parse::().is_err() { + println!( + "{}", + "Error: Invalid syntax, operator followed by another operator or end of input." + .bold() + .red() + ); + begin(); + } + + let op = token; + i += 1; + let next_value = formula[i].parse::().unwrap(); + let last_value = values.pop().unwrap(); + let result = if op == "*" { + last_value * next_value + } else { + last_value / next_value + }; + values.push(result); + } else if token == "+" || token == "-" { + // Проверяем, есть ли следующий токен и является ли он числом + if i + 1 >= formula.len() || formula[i + 1].parse::().is_err() { + println!( + "{}", + "Error: Invalid syntax, operator followed by another operator or end of input." + .bold() + .red() + ); + begin(); + } + + operators.push(token.clone()); + } + i += 1; + } + + let mut result = values[0]; + let mut value_index = 1; + + for operator in operators { + let next_value = values[value_index]; + if operator == "+" { + result += next_value; + } else { + result -= next_value; + } + value_index += 1; + } + + println!("Result: {}", result); + + result +} + +fn let_start_again() { + begin() +}