From cfe0e450d632084a0bf370fe3232ade5124514ec Mon Sep 17 00:00:00 2001 From: Alexander Baranov Date: Mon, 12 Jan 2026 21:13:17 +0300 Subject: [PATCH] quizzes --- practice/.gitignore | 1 + practice/Cargo.lock | 7 +++ practice/Cargo.toml | 6 +++ practice/src/bin/a_compare.rs | 21 +++++++++ practice/src/bin/b_pair.rs | 35 +++++++++++++++ practice/src/bin/c_area.rs | 64 ++++++++++++++++++++++++++++ practice/src/bin/d_wrapper.rs | 37 ++++++++++++++++ practice/src/bin/e_summary.rs | 53 +++++++++++++++++++++++ practice/src/bin/f_largest_by_key.rs | 30 +++++++++++++ practice/src/main.rs | 3 ++ 10 files changed, 257 insertions(+) create mode 100644 practice/.gitignore create mode 100644 practice/Cargo.lock create mode 100644 practice/Cargo.toml create mode 100644 practice/src/bin/a_compare.rs create mode 100644 practice/src/bin/b_pair.rs create mode 100644 practice/src/bin/c_area.rs create mode 100644 practice/src/bin/d_wrapper.rs create mode 100644 practice/src/bin/e_summary.rs create mode 100644 practice/src/bin/f_largest_by_key.rs create mode 100644 practice/src/main.rs diff --git a/practice/.gitignore b/practice/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/practice/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/practice/Cargo.lock b/practice/Cargo.lock new file mode 100644 index 0000000..3b045b0 --- /dev/null +++ b/practice/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "practice" +version = "0.0.0" diff --git a/practice/Cargo.toml b/practice/Cargo.toml new file mode 100644 index 0000000..d0dfc98 --- /dev/null +++ b/practice/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "practice" +version = "0.0.0" +edition = "2024" + +[dependencies] diff --git a/practice/src/bin/a_compare.rs b/practice/src/bin/a_compare.rs new file mode 100644 index 0000000..8df4cd1 --- /dev/null +++ b/practice/src/bin/a_compare.rs @@ -0,0 +1,21 @@ +// Напиúите функøиĀ compare(a: T, b: T) -> T, котораā: +// ● Возвраûает наиболþúий из двух аргументов (a или b). +// ● Исполþзуйте трейт PartialOrd длā сравнениā. + +#![allow(clippy::approx_constant)] + +fn compare(a: T, b: T) -> T +where + T: PartialOrd, +{ + if a >= b { a } else { b } +} + +fn main() { + println!("{}", compare(5, 10)); // 10 + println!("{}", compare('a', 'z')); // z + + // Также работает с другими типами, реализующими PartialOrd + println!("{}", compare(3.14, 2.71)); // 3.14 + println!("{}", compare("apple", "banana")); // "banana" +} diff --git a/practice/src/bin/b_pair.rs b/practice/src/bin/b_pair.rs new file mode 100644 index 0000000..ceb98be --- /dev/null +++ b/practice/src/bin/b_pair.rs @@ -0,0 +1,35 @@ +// Создайте структуру Pair с двумā полāми разнýх типов: +// ● Реализуйте метод new(first: T, second: U) -> Self. +// ● Добавþте метод swap(self) -> Pair, которýй менāет местами знаùениā полей. + +#![allow(clippy::approx_constant)] + +#[derive(Debug)] +struct Pair { + first: T, + second: U, +} + +impl Pair { + // Создаем новую пару + fn new(first: T, second: U) -> Self { + Self { first, second } + } + + // Меняем местами значения + fn swap(self) -> Pair { + Pair::new(self.second, self.first) + } +} + +fn main() { + let pair = Pair::new(42, "hello"); + let swapped = pair.swap(); + + println!("{:?}", swapped); // Pair("hello", 42) + + // Дополнительный пример с другими типами + let float_str_pair = Pair::new(3.14, "pi"); + let swapped_pair = float_str_pair.swap(); + println!("{:?}", swapped_pair); // Pair("pi", 3.14) +} diff --git a/practice/src/bin/c_area.rs b/practice/src/bin/c_area.rs new file mode 100644 index 0000000..1e724ae --- /dev/null +++ b/practice/src/bin/c_area.rs @@ -0,0 +1,64 @@ +// 1. Определите типаж Area с методом area(&self) -> f64. +// 2. Реализуйте его длā структур Circle (с полем radius: f64) и Square (с полем side: f64). +// 3. Напишите обобщенную функцию print_area(shape: T), которая печатает площадь фигуру. + +// Определяем типаж Area +trait Area { + fn area(&self) -> f64; +} + +// Структура Circle +struct Circle { + radius: f64, +} + +// Реализация Area для Circle +impl Area for Circle { + fn area(&self) -> f64 { + std::f64::consts::PI * self.radius * self.radius + } +} + +// Структура Square +struct Square { + side: f64, +} + +// Реализация Area для Square +impl Area for Square { + fn area(&self) -> f64 { + self.side * self.side + } +} + +// Обобщённая функция для вывода площади +fn print_area(area: impl Area) { + println!("Area: {}", area.area()) +} + +fn main() { + let circle = Circle { radius: 5.0 }; + let square = Square { side: 10.0 }; + + print_area(circle); // Area: 78.53981633974483 + print_area(square); // Area: 100 + + // Можно добавить больше фигур, реализующих Area + let rectangle = Rectangle { + width: 4.0, + height: 6.0, + }; + print_area(rectangle); // Area: 24 +} + +// Дополнительная структура для демонстрации расширяемости +struct Rectangle { + width: f64, + height: f64, +} + +impl Area for Rectangle { + fn area(&self) -> f64 { + self.width * self.height + } +} diff --git a/practice/src/bin/d_wrapper.rs b/practice/src/bin/d_wrapper.rs new file mode 100644 index 0000000..be281fe --- /dev/null +++ b/practice/src/bin/d_wrapper.rs @@ -0,0 +1,37 @@ +// Создайте структуру Wrapper с одним полем value: T: +// ● Реализуйте метод map(self, f: F) -> Wrapper, где F: FnOnce(T) -> U. +// ● Метод должен применāтþ функøиĀ f к value и возвраûатþ новýй Wrapper с резулþтатом. + +#![allow(clippy::approx_constant)] + +struct Wrapper { + value: T, +} + +impl Wrapper { + // Создаем новый Wrapper + fn new(value: T) -> Self { + Self { value } + } + + // Применяем функцию к значению и возвращаем новый Wrapper + fn map(self, f: impl FnOnce(T) -> U) -> Wrapper { + Wrapper::new(f(self.value)) + } +} + +fn main() { + // Пример из задания + let w = Wrapper { value: 42 }; + let w2 = w.map(|x| x.to_string()); + println!("{}", w2.value); // "42" + + // Дополнительные примеры + let w3 = Wrapper::::new(3.14); + let w4 = w3.map(|x| x.floor() as i32); + println!("{}", w4.value); // 3 + + let w5 = Wrapper::new("hello"); + let w6 = w5.map(|s| s.len()); + println!("{}", w6.value); // 5 +} diff --git a/practice/src/bin/e_summary.rs b/practice/src/bin/e_summary.rs new file mode 100644 index 0000000..75f4cf2 --- /dev/null +++ b/practice/src/bin/e_summary.rs @@ -0,0 +1,53 @@ +// 1. Создайте типаж Summary с методом summarize(&self) -> String. +// 2. Реализуйте его длā: +// ○ Vec (где T: ToString), метод должен соединāтþ ÿлементý ùерез запāтуĀ. +// ○ HashMap (где K: ToString, V: ToString), метод должен вýводитþ парý key:value. +// 3. Напиúите функøиĀ print_summary(item: T), котораā пеùатает резулþтат summarize(). + +use std::collections::HashMap; + +// Определяем типаж Summary +trait Summary { + fn summarize(&self) -> String; +} + + +// Реализация для Vec где T: ToString + + + +// Реализация для HashMap где K: ToString, V: ToString +impl Summary for HashMap { + fn summarize(&self) -> String { + self.iter() + .map(|(k, v)| format!("{}:{}", k.to_string(), v.to_string())) + .collect::>() + .join(", ") + } +} + +// Обобщённая функция для вывода сводки + + + + +fn main() { + // Пример с вектором + let vec = vec![1, 2, 3]; + print_summary(vec); // "1, 2, 3" + + // Пример с HashMap + let mut map = HashMap::new(); + map.insert("name", "Alice"); + map.insert("age", "30"); + print_summary(map); // "name:Alice, age:30" (порядок может отличаться) + + // Дополнительный пример с разными типами + let words = vec!["hello", "world"]; + print_summary(words); // "hello, world" + + let mut scores = HashMap::new(); + scores.insert("math", 95); + scores.insert("science", 90); + print_summary(scores); // "math:95, science:90" +} diff --git a/practice/src/bin/f_largest_by_key.rs b/practice/src/bin/f_largest_by_key.rs new file mode 100644 index 0000000..cc38d49 --- /dev/null +++ b/practice/src/bin/f_largest_by_key.rs @@ -0,0 +1,30 @@ +// Напиúите обобûённуĀ функøиĀ largest_by_key(list: &[T], key: F) -> Option<&T>, где: +// ● F: Fn(&T) -> K, +// ● K: PartialOrd. +// Функøиā должна возвраûатþ ÿлемент с максималþнýм знаùением key(item). + +//fn largest_by_key + + + + +fn main() { + // Пример из задания + let words = ["apple", "banana", "cherry"]; + let longest = largest_by_key(&words, |s| s.len()); + println!("{:?}", longest); // Some("banana") + + // Дополнительные примеры + let numbers = [1, 42, 3, 100, 5]; + let largest_num = largest_by_key(&numbers, |&n| n); + println!("{:?}", largest_num); // Some(100) + + struct Person { name: String, age: u32 } + let people = [ + Person { name: "Alice".to_string(), age: 30 }, + Person { name: "Bob".to_string(), age: 25 }, + Person { name: "Charlie".to_string(), age: 35 }, + ]; + let oldest = largest_by_key(&people, |p| p.age); + println!("Oldest: {:?}", oldest.map(|p| &p.name)); // Some("Charlie") +} diff --git a/practice/src/main.rs b/practice/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/practice/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +}