Menu
Coddy logo textTech

בדיקה אם מפתחות וערכים קיימים

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 27 מתוך 65.

לפני שניגשים לנתונים בתוך Map, חשוב לוודא שהמפתח או הערך שאתם מחפשים אכן קיימים. Dart מספקת שתי שיטות לכך: containsKey() ו-containsValue().

המתודה containsKey() בודקת אם מפתח מסוים קיים במפה, ומחזירה true אם הוא נמצא ו-false אחרת. היא שימושית במיוחד לפני ניסיון לגשת לערך, ועוזרת לך להימנע משגיאות אפשריות.

Map<String, String> userPermissions = {
  'user123': 'admin',
  'user456': 'editor',
  'user789': 'viewer'
};

bool hasUser = userPermissions.containsKey('user123');
print(hasUser);  // true

bool hasUnknownUser = userPermissions.containsKey('user999');
print(hasUnknownUser);  // false

באופן דומה, containsValue() בודקת אם ערך מסוים קיים במקום כלשהו במפה. המתודה הזו מחפשת בכל הערכים ומחזירה true אם היא מוצאת התאמה.

bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin);  // true

השיטות האלה חיוניות לכתיבת קוד בטוח שמטפל היטב בנתונים חסרים ומונע שגיאות בזמן ריצה בעת עבודה עם תוכן דינמי של מפה.

challenge icon

אתגר

קל

צרו תוכנית שמנהלת מערכת לאימות משתמשים באמצעות אימות פרטי הכניסה של המשתמשים ובדיקת רמות ההרשאה. התוכנית שלכם צריכה:

  1. לקרוא קלט מסוג מחרוזת שמייצג את שם המערכת
  2. לקרוא כמה זוגות של קלטים שמייצגים שמות משתמשים ורמות הרשאה שלהם (הקלט יסתיים כשתקבלו "users_done")
  3. לקרוא קלט מסוג מחרוזת שמייצג את שם המשתמש לבדיקה
  4. לקרוא קלט מסוג מחרוזת שמייצג את רמת ההרשאה לאימות
  5. ליצור Map לאחסון שמות משתמשים כמפתחות ורמות ההרשאה שלהם כערכים
  6. להשתמש ב-containsKey() כדי לבדוק אם שם המשתמש קיים במערכת
  7. להשתמש ב-containsValue() כדי לבדוק אם רמת ההרשאה שצוינה קיימת במקום כלשהו במערכת
  8. להדפיס את ניתוח האימות בפורמט המדויק שמוצג למטה

לדוגמה, אם שם המערכת הוא "Corporate Network", המשתמשים כוללים את "alice" עם "admin", את "bob" עם "editor", את "charlie" עם "viewer", את "diana" עם "admin", שם המשתמש לבדיקה הוא "alice", ורמת ההרשאה לאימות היא "admin", התוכנית שלכם צריכה להפיק:

System: Corporate Network
User Database: {alice: admin, bob: editor, charlie: viewer, diana: admin}
Authentication Check:
Username 'alice' exists: true
Permission 'admin' exists in system: true
User 'alice' has permission 'admin': true
Access Status: GRANTED - User authenticated with valid permissions
Security Level: High (admin access detected)

אם שם המערכת הוא "School Portal", המשתמשים כוללים את "teacher1" עם "instructor", את "student1" עם "student", את "admin1" עם "administrator", שם המשתמש לבדיקה הוא "guest", ורמת ההרשאה לאימות היא "student", התוכנית שלכם צריכה להפיק:

System: School Portal
User Database: {teacher1: instructor, student1: student, admin1: administrator}
Authentication Check:
Username 'guest' exists: false
Permission 'student' exists in system: true
User 'guest' has permission 'student': false
Access Status: DENIED - Username not found in system
Security Level: Low (user not registered)

אם שם המערכת הוא "Library System", המשתמשים כוללים את "librarian" עם "staff", את "member1" עם "member", את "member2" עם "member", שם המשתמש לבדיקה הוא "librarian", ורמת ההרשאה לאימות היא "premium", התוכנית שלכם צריכה להפיק:

System: Library System
User Database: {librarian: staff, member1: member, member2: member}
Authentication Check:
Username 'librarian' exists: true
Permission 'premium' exists in system: false
User 'librarian' has permission 'premium': false
Access Status: DENIED - Permission level not available
Security Level: Medium (valid user, invalid permission)

התוכנית שלכם חייבת להשתמש ב-containsKey() כדי לוודא אם שם המשתמש קיים, וב-containsValue() כדי לבדוק אם רמת ההרשאה קיימת במקום כלשהו במערכת. כדי לבדוק אם למשתמש המסוים יש את ההרשאה המסוימת, השוו בין רמת ההרשאה בפועל של המשתמש לבין הרמה המבוקשת. קבעו את רמת האבטחה על סמך התוצאות: "High" אם הגישה אושרה עם הרשאות מסוג מנהל (admin, administrator, staff), "Medium" אם המשתמש קיים אך ההרשאות שלו שגויות, ו-"Low" אם המשתמש אינו קיים. פורמט הקלט יהיה: שם המערכת, לאחריו שמות משתמשים ורמות הרשאה לסירוגין, ובסוף "users_done", ולאחר מכן שם המשתמש לבדיקה ורמת ההרשאה לאימות.

נסו בעצמכם

import 'dart:io';

void main() {
  // קרא את שם המערכת
  String? systemName = stdin.readLineSync();
  
  // צור Map לאחסון שמות המשתמשים ורמות ההרשאה שלהם
  Map<String, String> userDatabase = {};
  
  // קרא את נתוני המשתמשים עד "users_done"
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "users_done") {
      break;
    }
    String username = input!;
    String? permission = stdin.readLineSync();
    userDatabase[username] = permission!;
  }
  
  // קרא את שם המשתמש לבדיקה ואת רמת ההרשאה לאימות
  String? usernameToCheck = stdin.readLineSync();
  String? permissionToVerify = stdin.readLineSync();
  
  // TODO: כתוב את הקוד שלך למטה
  // השתמש ב-containsKey() כדי לבדוק אם שם המשתמש קיים
  // השתמש ב-containsValue() כדי לבדוק אם רמת ההרשאה קיימת במערכת
  // בדוק אם למשתמש המסוים יש את ההרשאה המסוימת
  // קבע את מצב הגישה ואת רמת האבטחה:
  //   - "High (admin access detected)" אם הגישה אושרה AND ההרשאה היא admin, administrator, או staff
  //   - "Medium (standard access)" אם הגישה אושרה אך ההרשאה אינה מסוג admin
  //   - "Medium (valid user, invalid permission)" אם המשתמש קיים אך ההרשאה שלו שגויה
  //   - "Low (user not registered)" אם המשתמש אינו קיים
  
  // הדפס את ניתוח האימות
  print("System: $systemName");
  print("User Database: $userDatabase");
  print("Authentication Check:");
  // הוסף כאן את פקודות הפלט שלך
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Dart אונליין