בדיקה אם מפתחות קיימים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 26 מתוך 56.
אף שאופרטור הסוגריים המרובעים נוח לגישה לערכים במפה, יש בעיה אפשרית: מה קורה אם מנסים לגשת למפתח שאינו קיים? כפי שלמדת בשיעור הקודם, שימוש ב-[] עם מפתח שאינו קיים יוצר את המפתח הזה באופן אוטומטי עם ערך ברירת מחדל.
לפעמים רוצים לבדוק אם מפתח קיים לפני שניגשים אליו, בלי ליצור בטעות רשומות חדשות. כאן המתודה .count() שימושית. היא אומרת לך אם מפתח מסוים נמצא במפה.
המתודה .count() מחזירה 1 אם המפתח קיים ו-0 אם הוא לא קיים:
std::map<std::string, int> scores;
scores["Alice"] = 95;
if (scores.count("Alice")) {
std::cout << "Alice's score: " << scores["Alice"] << std::endl;
} else {
std::cout << "Alice not found" << std::endl;
}הגישה הזו מאפשרת לך לבדוק בבטחה אם מפתח קיים ולטפל בשני המקרים כראוי, וכך למנוע יצירה של רשומות לא רצויות במפה שלך.
אתגר
קלצרו תוכנית שמנהלת מערכת השאלת ספרים בספרייה באמצעות std::map. התוכנית תעקוב אחר הספרים הזמינים ותשתמש בשיטה .count() כדי לבדוק בבטחה אם ספרים קיימים לפני ניסיון לגשת למידע שלהם.
הקלטים הבאים יסופקו:
- מספר שלם
nהמייצג את מספר הספרים בספרייה - לאחר מכן
nזוגות של קלטים:- מחרוזת המייצגת את שם הספר
- מספר שלם המייצג את מספר העותקים הזמינים
- מספר שלם
mהמייצג את מספר בקשות הספרים לבדיקה - לאחר מכן
mמחרוזות המייצגות את שמות הספרים לחיפוש
התוכנית שלכם צריכה:
- ליצור
std::map<std::string, int>בשםlibrary - לקרוא את מספר הספרים ולאכלס את המפה בשמות הספרים ובמספר העותקים הזמינים שלהם
- לקרוא את מספר בקשות הספרים
- עבור כל בקשת ספר, להשתמש בשיטה
.count()כדי לבדוק אם הספר קיים בספרייה - להדפיס את ההודעה המתאימה בהתאם לשאלה אם הספר נמצא או לא
השתמשו בפורמט הפלט המדויק הבא:
עבור כל בקשת ספר:
- אם הספר קיים:
Book "[book title]" is available with [number] copies - אם הספר אינו קיים:
Book "[book title]" is not available in the library
השתמשו בשיטה .count() בתוך פקודת if כדי לבדוק אם הספר קיים לפני גישה לערך שלו. אם library.count(bookTitle) מחזיר 1, הספר קיים ואפשר לגשת בבטחה אל library[bookTitle] כדי לקבל את מספר העותקים. אם הוא מחזיר 0, הספר אינו קיים בספרייה.
נסו בעצמכם
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// קראו את מספר הספרים
int n;
cin >> n;
// צרו את מפת הספרייה
map<string, int> library;
// קראו את פרטי הספרים ומלאו את המפה
for (int i = 0; i < n; i++) {
string title;
int copies;
cin >> title >> copies;
library[title] = copies;
}
// קראו את מספר הבקשות לספרים
int m;
cin >> m;
// TODO: כתבו את הקוד שלכם למטה
// טפלו בכל בקשה לספר באמצעות המתודה .count()
// בדקו אם הספר קיים והדפיסו הודעה מתאימה
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים4מפות (זוגות מפתח-ערך)
היכרות עם std::mapיצירת מפהגישה לערכים ושינויםבדיקה אם מפתחות קיימיםהסרת זוגותמעבר על מפהסיכום – שכיחות מילים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין