تجميع كل الأجزاء
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 53 من 66.
التحدي
سهلستتلقى ستة مدخلات. المدخل الأول هو أمر يمكن أن يكون إما add أو check أو sell. المدخل الثاني هو اسم العنصر. المدخل الثالث هو رقم يمثل إما الكمية المراد بيعها (لأمر sell) أو السعر الأولي (لأمر add). المدخل الرابع هو قائمة بأسماء العناصر في المخزون مفصولة بفاصلة. المدخل الخامس هو قائمة بالأسعار المقابلة لكل عنصر مفصولة بفاصلة. المدخل السادس هو قائمة بالكميات المقابلة لكل عنصر مفصولة بفاصلة.
قم ببناء نظام كامل لإدارة المخزون يتعامل مع العمليات الثلاث: إضافة العناصر، والتحقق من المخزون، وبيع العناصر. استخدم HashMap لتخزين بيانات المخزون حيث يكون المفتاح هو اسم العنصر والقيمة هي "tuple" تحتوي على السعر والكمية (f64, i32).
المتطلبات:
- استورد
HashMapمنstd::collections - اقرأ المدخل الأول (الأمر) وقم بإزالة المسافات البيضاء (trim)
- اقرأ المدخل الثاني (اسم العنصر) وقم بإزالة المسافات البيضاء
- اقرأ المدخل الثالث (قيمة الكمية/السعر) وقم بإزالة المسافات البيضاء
- قم بتحويل المدخل الثالث إلى
f64 - اقرأ المدخل الرابع (أسماء العناصر المفصولة بفاصلة) وقم بإزالة المسافات البيضاء
- اقرأ المدخل الخامس (الأسعار المفصولة بفاصلة) وقم بإزالة المسافات البيضاء
- اقرأ المدخل السادس (الكميات المفصولة بفاصلة) وقم بإزالة المسافات البيضاء
- أنشئ
HashMap<String, (f64, i32)>قابلة للتعديل (mutable) للمخزون - قم بتقسيم أسماء العناصر بواسطة الفواصل
- قم بتقسيم الأسعار بواسطة الفواصل وتحويل كل منها إلى
f64 - قم بتقسيم الكميات بواسطة الفواصل وتحويل كل منها إلى
i32 - أدخل كل عنصر في المخزون مع السعر والكمية المقابلين له كـ "tuple"
- استخدم تعبير
matchعلى الأمر لتحديد العملية التي سيتم تنفيذها - لأمر
add:- استخدم
.entry()و.or_insert()لإضافة العنصر إذا لم يكن موجوداً، باستخدام المدخل الثالث كالسعر و0ككمية أولية - اطبع:
Added [item_name] to inventory - اطبع:
Price: $[price] - اطبع:
Quantity: 0
- استخدم
- لأمر
check:- استخدم
.get()للتحقق مما إذا كان العنصر موجوداً - استخدم تعبير
matchللتعامل معOption - إذا كان
Some، اطبع:[item_name] is in stockPrice: $[price]Quantity: [quantity]
- إذا كان
None، اطبع:[item_name] is not in stock
- استخدم
- لأمر
sell:- قم بتحويل المدخل الثالث إلى
i32ككمية مراد بيعها - استخدم
.get()للتحقق مما إذا كان العنصر موجوداً - استخدم تعبير
matchللتعامل معOption - إذا كان
Some:- تحقق مما إذا كانت الكمية الحالية كافية
- إذا كانت نعم، قم بتحديث المخزون بالكمية الجديدة واطبع:
Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- إذا كانت لا، اطبع:
Insufficient stock for [item_name]Available: [current_quantity]
- إذا كان
None، اطبع:[item_name] is not in stock
- قم بتحويل المدخل الثالث إلى
- لأي أمر آخر، اطبع:
Invalid command
المدخلات:
- السطر الأول: الأمر (
add،check، أوsell) - السطر الثاني: اسم العنصر (مثلاً،
Tablet) - السطر الثالث: رقم (السعر لأمر
add، الكمية لأمرsell، ويتم تجاهله لأمرcheck) - السطر الرابع: أسماء العناصر مفصولة بفاصلة (مثلاً،
Laptop,Mouse,Keyboard) - السطر الخامس: الأسعار مفصولة بفاصلة (مثلاً،
999.99,25.50,75.00) - السطر السادس: الكميات مفصولة بفاصلة (مثلاً،
15,50,30)
المخرجات:
- لأمر
add:Added [item_name] to inventoryPrice: $[price]Quantity: 0
- لأمر
check(العنصر موجود):[item_name] is in stockPrice: $[price]Quantity: [quantity]
- لأمر
check(العنصر غير موجود):[item_name] is not in stock - لأمر
sell(مخزون كافٍ):Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- لأمر
sell(مخزون غير كافٍ):Insufficient stock for [item_name]Available: [current_quantity]
- لأمر
sell(العنصر غير موجود):[item_name] is not in stock - لأمر غير صالح:
Invalid command
جرّب بنفسك
use std::collections::HashMap;
use std::io;
fn main() {
// قراءة المدخلات
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();
// إنشاء HashMap للمخزون
let mut inventory: HashMap<String, (f64, i32)> = HashMap::new();
// TODO: اكتب الكود الخاص بك أدناه
// قم بتحليل المدخلات المفصولة بفاصلة وتعبئة المخزون
// استخدم تعبير match على command للتعامل مع عمليات الإضافة (add)، والتحقق (check)، والبيع (sell)
// تذكر إخراج الرسائل المناسبة بناءً على الأمر
}جميع دروس Logic & Flow
1تدفق التحكم المتقدم
تعبير 'match'مطابقة قيم متعددةمطابقة النطاقاتتعبير 'if let'الحلقات التكرارية كتعبيراتمراجعة - محلل أوامر بسيط4تجميع البيانات باستخدام Structs
ما هو الـ Struct؟نظرة عامة على الـ Structsالوصول إلى حقول الـ Structالـ Structs القابلة للتعديلالـ Structs كمعاملات للدوالالـ Tuple Structsمراجعة - إنشاء Book Struct7معالجة الأخطاء باستخدام 'Result'
ما هو 'Result'؟استخدام 'match' مع 'Result'is_ok() و is_err()اختصارات: unwrap و expectعامل علامة الاستفهام '?'تحويل السلاسل النصية إلى أرقامملخص - دالة القسمة الآمنة10الـ Closures والدوال المجهولة
ما هو الـ Closure؟تعريف Closure بسيطالـ Closures مع المعاملاتالتقاط البيئة المحيطةملخص - Closure الجامع البسيط2مقدمة في الـ Vectors
ما هو الـ Vector؟إنشاء Vectorإضافة عناصر باستخدام pushالوصول إلى عناصر الـ Vectorالتكرار عبر الـ Vectorالتكرار القابل للتعديل (Mutable Iteration)إزالة العناصرمراجعة - متتبع نقاط بسيط5أزواج (المفتاح والقيمة) مع Hash Maps
ما هو Hash Map؟إنشاء Hash Mapإدراج أزواج (المفتاح والقيمة)الوصول إلى القيمالتكرار عبر Hash Mapتحديث قيمةإزالة زوجملخص - عداد الكلمات6التعامل مع غياب القيم باستخدام 'Option'
ما هو الـ 'Option'؟استخدام 'match' مع 'Option''is_some()' و 'is_none()'فك تغليف الـ 'Option'الدالة 'expect'توفير قيمة افتراضية: 'unwrap_or'مراجعة - البحث عن عنصر9شرائح الـ String والمزيد
String مقابل &strإنشاء شرائح الـ Stringالشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى