Łączenie wszystkiego w całość
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 53 z 66.
Wyzwanie
ŁatwyOtrzymasz sześć danych wejściowych. Pierwsza dana to polecenie, którym może być add, check lub sell. Druga dana to nazwa elementu. Trzecia dana to liczba reprezentująca ilość do sprzedaży (dla polecenia sell) albo początkową ilość (dla polecenia add). Czwarta dana to rozdzielona przecinkami lista nazw elementów w magazynie. Piąta dana to rozdzielona przecinkami lista cen odpowiadających poszczególnym elementom. Szósta dana to rozdzielona przecinkami lista ilości odpowiadających poszczególnym elementom.
Zbuduj kompletny system zarządzania magazynem, który obsługuje wszystkie trzy operacje: dodawanie elementów, sprawdzanie stanu magazynowego i sprzedaż elementów. Użyj HashMap do przechowywania danych magazynu, gdzie kluczem jest nazwa elementu, a wartością krotka zawierająca cenę i ilość (f64, i32).
Wymagania:
- Zaimportuj
HashMapzstd::collections - Odczytaj pierwszą daną wejściową (polecenie) i usuń białe znaki z początku i końca
- Odczytaj drugą daną wejściową (nazwę elementu) i usuń białe znaki z początku i końca
- Odczytaj trzecią daną wejściową (wartość ilości/ceny) i usuń białe znaki z początku i końca
- Przekonwertuj trzecią daną wejściową na
f64 - Odczytaj czwartą daną wejściową (rozdzielone przecinkami nazwy elementów) i usuń białe znaki z początku i końca
- Odczytaj piątą daną wejściową (rozdzielone przecinkami ceny) i usuń białe znaki z początku i końca
- Odczytaj szóstą daną wejściową (rozdzielone przecinkami ilości) i usuń białe znaki z początku i końca
- Utwórz mutowalny obiekt
HashMap<String, (f64, i32)>na potrzeby magazynu - Podziel nazwy elementów po przecinkach
- Podziel ceny po przecinkach i przekonwertuj każdą na
f64 - Podziel ilości po przecinkach i przekonwertuj każdą na
i32 - Wstaw każdy element do magazynu wraz z odpowiadającą mu ceną i ilością jako krotką
- Użyj wyrażenia
matchdla polecenia, aby określić, którą operację wykonać - Dla polecenia
add:- Użyj
.entry()i.or_insert(), aby dodać element, jeśli jeszcze nie istnieje, używając trzeciej danej wejściowej jako ceny i0jako początkowej ilości - Wyświetl:
Added [item_name] to inventory - Wyświetl:
Price: $[price] - Wyświetl:
Quantity: 0
- Użyj
- Dla polecenia
check:- Użyj
.get(), aby sprawdzić, czy element istnieje - Użyj wyrażenia
match, aby obsłużyćOption - Jeśli wynikiem jest
Some, wyświetl:[item_name] is in stockPrice: $[price]Quantity: [quantity]
- Jeśli wynikiem jest
None, wyświetl:[item_name] is not in stock
- Użyj
- Dla polecenia
sell:- Przekonwertuj trzecią daną wejściową na
i32, aby uzyskać ilość do sprzedaży - Użyj
.get(), aby sprawdzić, czy element istnieje - Użyj wyrażenia
match, aby obsłużyćOption - Jeśli wynikiem jest
Some:- Sprawdź, czy bieżąca ilość jest wystarczająca
- Jeśli tak, zaktualizuj magazyn, podając nową ilość, i wyświetl:
Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- Jeśli nie, wyświetl:
Insufficient stock for [item_name]Available: [current_quantity]
- Jeśli wynikiem jest
None, wyświetl:[item_name] is not in stock
- Przekonwertuj trzecią daną wejściową na
- Dla każdego innego polecenia wyświetl:
Invalid command
Dane wejściowe:
- Pierwszy wiersz: polecenie (
add,checklubsell) - Drugi wiersz: nazwa elementu (np.
Tablet) - Trzeci wiersz: liczba (cena dla
add, ilość dlasell, ignorowana dlacheck) - Czwarty wiersz: rozdzielone przecinkami nazwy elementów (np.
Laptop,Mouse,Keyboard) - Piąty wiersz: rozdzielone przecinkami ceny (np.
999.99,25.50,75.00) - Szósty wiersz: rozdzielone przecinkami ilości (np.
15,50,30)
Dane wyjściowe:
- Dla polecenia
add:Added [item_name] to inventoryPrice: $[price]Quantity: 0
- Dla polecenia
check(element istnieje):[item_name] is in stockPrice: $[price]Quantity: [quantity]
- Dla polecenia
check(element nie istnieje):[item_name] is not in stock - Dla polecenia
sell(wystarczający stan magazynowy):Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- Dla polecenia
sell(niewystarczający stan magazynowy):Insufficient stock for [item_name]Available: [current_quantity]
- Dla polecenia
sell(element nie istnieje):[item_name] is not in stock - Dla nieprawidłowego polecenia:
Invalid command
Spróbuj swoich sił
use std::collections::HashMap;
use std::io;
fn main() {
// Odczytaj dane wejściowe
let mut command = String::new();
io::stdin().read_line(&mut command).expect("Failed to read line");
let command = command.trim();
let mut item_name = String::new();
io::stdin().read_line(&mut item_name).expect("Failed to read line");
let item_name = item_name.trim();
let mut value_input = String::new();
io::stdin().read_line(&mut value_input).expect("Failed to read line");
let value_input = value_input.trim();
let mut items_input = String::new();
io::stdin().read_line(&mut items_input).expect("Failed to read line");
let items_input = items_input.trim();
let mut prices_input = String::new();
io::stdin().read_line(&mut prices_input).expect("Failed to read line");
let prices_input = prices_input.trim();
let mut quantities_input = String::new();
io::stdin().read_line(&mut quantities_input).expect("Failed to read line");
let quantities_input = quantities_input.trim();
// Utwórz HashMap dla magazynu
let mut inventory: HashMap<String, (f64, i32)> = HashMap::new();
// TODO: Napisz swój kod poniżej
// Przeanalizuj dane wejściowe rozdzielone przecinkami i wypełnij magazyn
// Użyj wyrażenia match na command, aby obsłużyć operacje add, check i sell
// Pamiętaj, aby wyświetlać odpowiednie komunikaty zależnie od command
}Wszystkie lekcje w sekcji Logika i przepływ programu
1Zaawansowane sterowanie przepływem
Wyrażenie „match”Dopasowywanie wielu wartościDopasowywanie zakresówWyrażenie „if let”Pętle jako wyrażeniaPodsumowanie — prosty parser poleceń4Grupowanie danych za pomocą struktur
Czym jest struktura?Przegląd strukturDostęp do pól strukturyModyfikowalne strukturyStruktury jako parametry funkcjiStruktury krotkowePodsumowanie — utwórz strukturę Book2Wprowadzenie do wektorów
Czym jest wektor?Tworzenie wektoraDodawanie elementów za pomocą pushDostęp do elementów wektoraIterowanie po wektorzeIterowanie z możliwością modyfikacjiUsuwanie elementówPodsumowanie — prosty licznik punktów5Pary klucz–wartość z mapami hashującymi
Czym jest mapa haszująca?Tworzenie mapy haszującejWstawianie par klucz–wartośćDostęp do wartościIterowanie po mapie haszującejAktualizowanie wartościUsuwanie paryPodsumowanie – licznik słów8Projekt: Prosty system inwentaryzacji
Konfiguracja projektuDodawanie produktuSprawdzanie stanu magazynowegoSprzedaż produktuŁączenie wszystkiego w całość3Lista zadań w wierszu poleceń
Konfiguracja projektuDodawanie zadaniaWyświetlanie wszystkich zadańUsuwanie zadaniaKońcowy kodPoćwicz samodzielnie: Kompilator Rust online