הפרש קבוצות
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 24 מתוך 65.
לפעמים צריך למצוא איברים שקיימים ב־Set אחד אך לא באחר. המתודה difference() פותרת זאת על ידי יצירת קבוצה חדשה שמכילה רק את האיברים מהקבוצה הראשונה שאינם קיימים בקבוצה השנייה.
חשוב על זה כחיסור בין קבוצות — מסירים את כל האיברים של הקבוצה השנייה מהראשונה. המתודה difference() מחזירה קבוצה חדשה עם האיברים שנותרו, ומשאירה את שתי הקבוצות המקוריות ללא שינוי.
Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};
Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks); // {meeting, report}הפעולה הזאת שימושית במיוחד למציאת מה שחסר, מה שנותר לעשות או מה ייחודי לאוסף אחד בהשוואה לאחר. בניגוד לחיתוך, שמוצא את המשותף, ההפרש מדגיש מה מייחד קבוצה אחת בהשוואה לאחרת.
אתגר
קלצרו תוכנית שמנהלת מערכת לניהול פרויקטים באמצעות זיהוי משימות שתוכננו אך טרם הושלמו. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם הפרויקט
- לקרוא כמה קלטים מסוג מחרוזת שמייצגים משימות מתוכננות (הקלט יסתיים כשתקבלו
"planned_done") - לקרוא כמה קלטים מסוג מחרוזת שמייצגים משימות שהושלמו (הקלט יסתיים כשתקבלו
"completed_done") - ליצור שתי קבוצות נפרדות לאחסון המשימות המתוכננות והמשימות שהושלמו
- להשתמש בשיטה
difference()כדי למצוא משימות שתוכננו אך טרם הושלמו - להדפיס ניתוח של מצב הפרויקט בדיוק בפורמט שמוצג בהמשך
לדוגמה, אם שם הפרויקט הוא "Website Launch", המשימות המתוכננות הן "Design mockups", "Write content", "Setup database", "Test functionality", "Deploy site", והמשימות שהושלמו הן "Design mockups", "Setup database", התוכנית שלכם צריכה להפיק:
Project: Website Launch
Planned tasks: {Design mockups, Write content, Setup database, Test functionality, Deploy site}
Completed tasks: {Design mockups, Setup database}
Remaining tasks: {Write content, Test functionality, Deploy site}
Tasks completed: 2
Tasks remaining: 3
Progress: 40.0% complete
Status: Project in progress - 3 task(s) remainingאם שם הפרויקט הוא "Mobile App Development", המשימות המתוכננות הן "Create wireframes", "Develop UI", "Implement features", והמשימות שהושלמו הן "Create wireframes", "Develop UI", "Implement features", התוכנית שלכם צריכה להפיק:
Project: Mobile App Development
Planned tasks: {Create wireframes, Develop UI, Implement features}
Completed tasks: {Create wireframes, Develop UI, Implement features}
Remaining tasks: {}
Tasks completed: 3
Tasks remaining: 0
Progress: 100.0% complete
Status: Project completed successfullyאם שם הפרויקט הוא "Marketing Campaign", המשימות המתוכננות הן "Research target audience", "Create content", "Design graphics", "Launch campaign", "Analyze results", והמשימות שהושלמו הן "Research target audience", התוכנית שלכם צריכה להפיק:
Project: Marketing Campaign
Planned tasks: {Research target audience, Create content, Design graphics, Launch campaign, Analyze results}
Completed tasks: {Research target audience}
Remaining tasks: {Create content, Design graphics, Launch campaign, Analyze results}
Tasks completed: 1
Tasks remaining: 4
Progress: 20.0% complete
Status: Project in progress - 4 task(s) remainingעל התוכנית שלכם להשתמש בשיטה difference() כדי למצוא משימות שקיימות בקבוצת המשימות המתוכננות אך לא בקבוצת המשימות שהושלמו. חשבו את אחוז ההתקדמות על ידי חלוקת מספר המשימות שהושלמו במספר הכולל של המשימות המתוכננות והכפלה ב־100, ועגלו למקום עשרוני אחד. אם כל המשימות הושלמו, הציגו את "Project completed successfully" כמצב; אחרת, הציגו את "Project in progress - X task(s) remaining", כאשר X הוא מספר המשימות שנותרו.
נסו בעצמכם
import 'dart:io';
void main() {
// קרא את שם הפרויקט
String? projectName = stdin.readLineSync();
// קרא את המשימות המתוכננות עד "planned_done"
Set<String> plannedTasks = <String>{};
String? task;
while ((task = stdin.readLineSync()) != "planned_done") {
if (task != null) {
plannedTasks.add(task);
}
}
// קרא את המשימות שהושלמו עד "completed_done"
Set<String> completedTasks = <String>{};
while ((task = stdin.readLineSync()) != "completed_done") {
if (task != null) {
completedTasks.add(task);
}
}
// TODO: כתוב את הקוד שלך למטה
// השתמש במתודה difference() כדי למצוא את המשימות שנותרו
// חשב את אחוז ההתקדמות
// קבע את מצב הפרויקט
// הצג את התוצאות
print("Project: $projectName");
print("Planned tasks: $plannedTasks");
print("Completed tasks: $completedTasks");
// הוסף כאן את פקודות הפלט הנותרות
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1מניפולציות מתקדמות ברשימות
מאפייני רשימה: ראשון ואחרוןמצב הרשימה: isEmpty ו-isNotEmpהיפוך רשימההוספה לרשימה: insertהסרת פריטים מרשימה: removeWhereחיפוש ברשימה: indexOfמיון רשימהערבוב רשימהסיכום – מארגן רשימות4מניפולציה מתקדמת של Map
מעבר על Mapבדיקה אם מפתחות וערכים קיימיםמאפייני Map: מפתחות וערכיםהוספה מותנית: putIfAbsentהסרת רשומות מ־MapMaps מקונניםסיכום – עדכון מלאי2פעולות פונקציונליות על רשימות
טרנספורמציה באמצעות 'map'סינון באמצעות 'where'שימוש ב-'.toList()'בדיקת תנאים באמצעות 'any'תנאים באמצעות 'every'איתור באמצעות 'firstWhere'סיכום – סינון נתונים5פרויקט: חישוב עגלת קניות
הגדרת הפרויקטהוספת פריטים לעגלה3קבוצות
מהי קבוצה?יצירת קבוצההוספה והסרה מקבוצותבדיקת נוכחות של איברים בקבוצההמרת רשימה לקבוצהאיחוד קבוצותחיתוך קבוצותהפרש קבוצותסיכום – רשימת אורחים ייחודית6טיפול בסיסי בשגיאות
מהן חריגות?בלוק ה-try-catchתפיסת חריגות באמצעות onבלוק ה-finallyהשלכת חריגהסיכום – חלוקה בטוחה9טיפוסי מנייה (Enums)
מה הם Enums?הגדרת Enum פשוטשימוש ב-Enums במשתניםEnums במשפטי 'switch'סיכום – רמזורתרגלו בעצמכם: קומפיילר Dart אונליין