0a1.1 בתרגיל זה, עליכם לממש מחלקה בשם Car
מחלקה זו מייצגת רכב וצריכה להיות מוגדרת בקובץ שניתן יהיה להשתמש בו על ידי מחלקות אחרות כמו Employee
.
למחלקה צריכים להיות השדות הפרטיים הבאים:
- string carNumber
- bool isLocked
- int temperature
- double radioStation
- int fuelLevel
- Employee user (הניחו שמחלקת Employee קיימת וכוללת לפחות בנאי המקבל string name ו-int id, ומתודת GetId()).
עליה לכלול את החברים הציבוריים הבאים:
בנאים:
public Car(string carNumber, bool isLocked, int temperature, double radioStation, int fuelLevel)
:
- בנאי המאתחל את כל התכונות עם הערכים הנתונים.
- מגדיר את user ל-null.
public Car(string carNumber)
:
- בנאי המקבל רק את מספר הרכב.
- עליו לאתחל את הרכב עם ערכי ברירת מחדל:
- isLocked = true
- temperature = 22
- radioStation = 100.0
- fuelLevel = 50
- user = null
public Car(Car other)
:
- בנאי העתקה היוצר אובייקט Car חדש על ידי העתקת הערכים של carNumber, isLocked, temperature, radioStation, ו-fuelLevel מאובייקט Car אחר.
- השדה user צריך להיות מאותחל ל-null.
פעולות (מתודות):
-
public void Lock(Employee user)
:אם ה-user של הרכב הוא null כרגע, פעולה זו צריכה להקצות את ה-user שסופק לרכב ולהגדיר את isLocked ל-true.
-
public void Unlock(Employee user)
:אם ה-user שסופק זהה ל-user הנוכחי של הרכב (כלומר, user.GetId() == this.user.GetId()), פעולה זו צריכה להגדיר את ה-user של הרכב ל-null ולהגדיר את isLocked ל-false.
-
public bool IsLocked()
:מחזירה את הערך של השדה isLocked.
-
public void SetTemperature(int temp)
:מגדירה את טמפרטורת הרכב, אך ורק אם הערך temp שסופק הוא בין 16 ל-30 (כולל).
-
public void SetRadioStation(double station)
:מגדירה את תחנת הרדיו של הרכב, אך ורק אם הערך station שסופק הוא בין 88.0 ל-108.0 (כולל).
public void AddFuel(int fuel)
:
- מוסיפה את כמות ה-fuel הנתונה ל-fuelLevel.
- סך ה-fuelLevel לא יעלה על 100. אם הוספת הדלק תגרום לרמה לעלות על 100, הגדירו את fuelLevel ל-100.
public string GetCarNumber()
:
- מחזירה את מספר הרכב.
public int GetTemperature()
:
- מחזירה את טמפרטורת הרכב.
public double GetRadioStation()
:
- מחזירה את תחנת הרדיו של הרכב.
public int GetFuelLevel()
:
- מחזירה את מפלס הדלק של הרכב.
public Employee GetUser()
:
- מחזירה את ה-Employee הנוכחי המשתמש ברכב.
public override string ToString()
:
- דורסת את פעולת ToString ברירת המחדל כדי להחזיר מחרוזת מעוצבת עם פרטי הרכב, כמו:
- “Car {carNumber} [{(isLocked ? “Locked” : “Unlocked”)}, Temp: {temperature}, Radio: {radioStation}, Fuel: {fuelLevel}%]”
הערה: עליכם ליצור גם מחלקת Employee
בסיסית בקובץ Employee.cs
שתכלול לפחות בנאי המקבל string name
ו-int id
, ומתודת GetId()
כדי לאפשר את בדיקת הפונקציונליות הקשורה ל-Employee
במחלקת Car
.
את המחלקה Employee
עליכם להעתיק לתוך הפתרון
public class Employee
{
private string name;
private int id;
public Employee(string name, int id)
{
this.name = name;
this.id = id;
}
public string GetName() => name;
public int GetId() => id;
}
0a1.2 תרגיל – מימוש מחלקת Employee
בתרגיל זה עליכם לממש מחלקה בשם Employee
בשפת C#, אשר מייצגת עובד המשתמש ברכב חברה משותף. המחלקה תאפשר לעובד לבצע פעולות שונות על הרכב שהוקצה לו.
יש להניח שקיימת מחלקה בשם Car, הכוללת את הפעולות הבאות:
- getUser()
- lock(this)
- unlock(this)
- isLocked()
- setTemperature(temp)
- setRadioStation(station)
- addFuel(fuel)
- getCarNumber()
- ToString()
🧱 שדות (Fields)
יש להגדיר את השדות הבאים במחלקה:
- מזהה סטטי nextEmployeeId – מספר שלם סטטי שמתחיל ב־1000, וישמש להקצאת מזהים ייחודיים לעובדים.
- שם העובד – מחרוזת המייצגת את שם העובד.
- מזהה עובד – מספר שלם ייחודי לכל עובד.
- רכב משותף – אובייקט מסוג Car שמייצג את הרכב שהוקצה לעובד.
🏗️ בנאי (Constructor)
יש לממש בנאי אחד שמקבל את שם העובד ואת הרכב שהוקצה לו. הבנאי יבצע את הפעולות הבאות:
- יאחסן את שם העובד.
- יאחסן את הרכב שהוקצה.
- יקצה לעובד מזהה ייחודי על ידי שימוש בערך הנוכחי של nextEmployeeId.
- יגדיל את nextEmployeeId ב־1 עבור העובד הבא.
⚙️ פעולות (Methods)
יש לממש את הפעולות הבאות:
- נעילת רכב:
- הפעולה מנסה לנעול את הרכב שהוקצה לעובד.
- אם הרכב כבר בשימוש על ידי עובד אחר (כלומר getUser() מחזיר ערך שאינו null), יש להדפיס: Car is already locked by other ולהחזיר false.
- אחרת, יש לקרוא לפעולה lock(this), להדפיס: Car locked ולהחזיר true.
- שחרור רכב:
- הפעולה מנסה לשחרר את נעילת הרכב.
- אם העובד הנוכחי אינו המשתמש ברכב (כלומר getUser() שונה מ־this), יש להדפיס: Car is not locked ולהחזיר false.
- אחרת, יש לקרוא לפעולה unlock(this), להדפיס: Car unlocked ולהחזיר true.
- שינוי טמפרטורה:
- אם העובד הנוכחי אינו המשתמש ברכב, אין לבצע פעולה.
- אם הרכב נעול (isLocked() מחזיר true), יש להדפיס: Car is locked!
- אחרת, יש לקרוא לפעולה setTemperature(temp) ולהדפיס: Temperature set to כאשר
- שינוי תחנת רדיו:
- אם העובד הנוכחי אינו המשתמש ברכב, אין לבצע פעולה.
- אם הרכב אינו נעול, יש לקרוא לפעולה setRadioStation(station) ולהדפיס: Radio station set to כאשר
- הוספת דלק:
- אם העובד הנוכחי הוא המשתמש ברכב, יש לקרוא לפעולה addFuel(fuel) ולהדפיס: car fuel: כאשר
- בדיקת מצב הרכב:
- יש להדפיס את שם העובד ואת מצב הרכב.
- הפורמט יהיה: Employee ולאחר מכן הפלט של הפעולה ToString() של הרכב.
📥 פעולות גישה (Getters)
יש לממש את הפעולות הבאות:
- פעולה שמחזירה את שם העובד.
- פעולה שמחזירה את מזהה העובד.
- פעולה שמחזירה את הרכב שהוקצה לעובד.
🖨️ תצוגת מצב (ToString)
יש לדרוס את הפעולה ToString כך שתחזיר מחרוזת בפורמט הבא:
Employee לדוגמה:
Employee 1001: Alice (Car: 123-45-678) 📌 הנחיות נוספות:
- אין לממש את מחלקת Car – הניחו שהיא קיימת עם כל הפעולות הנדרשות.
- יש להשתמש בשמות משתנים ומתודות באנגלית בלבד.
- יש להקפיד על הדפסת הודעות בדיוק כפי שמופיע במפרט.
- אין צורך לטפל במקרים שבהם sharedCar הוא null. 5.
0a1.3 ניהול חברה עם עובדים ורכבים
בתרגיל זה, עליכם לממש מחלקת C# בשם Company
. המחלקה תלויה במחלקות Car
ו-Employee
(שיתקבלו מוכנות).
שדות המחלקה
private string name;
private Employee[] employees;
private int numEmployees;
private Car[] cars;
private static Random random = new Random();
בנאי
public Company(string name, Car[] cars)
- מאתחל את החברה עם שם ומערך של רכבים זמינים.
- מאתחל את מערך העובדים (
employees
) עם קיבולת של 100. - מגדיר את
numEmployees
ל-0.
פעולות (מתודות)
public void AddEmployee(string name)
- מוסיפה עובד חדש לחברה.
- אם החברה לא מלאה (פחות מ-100 עובדים), נוצרת ישות
Employee
חדשה. - אם יש רכבים זמינים, אחד מהם מוקצה לעובד החדש (באופן אקראי).
- העובד מתווסף למערך
employees
. numEmployees
גדל ב-1.- הודעת הצלחה מודפסת:
Employee added successfully: {employee_name}
. - אם החברה מלאה: הודעה מודפסת –
Cannot add employee - company is full.
.
public void RemoveEmployee(int employeeId)
- מחפשת עובד לפי מזהה (
employeeId
). - אם נמצא, העובד מוסר מהמערך.
- כל העובדים שאחריו מוזזים מקום אחד שמאלה.
numEmployees
קטן ב-1.- הודעת הצלחה מודפסת:
Employee with ID {employeeId} removed successfully.
. - אם העובד לא נמצא – הודעה מתאימה מודפסת.
public void PrintAllEmployeesSortedByName()
- מדפיסה את כל העובדים לפי סדר אלפביתי עולה של השם.
- יש להניח שלמחלקת
Employee
קיימת מתודהToString()
להדפסה.
משימה
דמיינו שאתם מפתחי תוכנה בחברת הייטק גדולה, האחראית לייעל את ניהול צי הרכבים והעובדים שלה. עליכם לכתוב מערכת שתאפשר:
- הוספת עובדים לחברה.
- הקצאת רכבים לעובדים בצורה חכמה.
- הסרה וניהול יעיל של רשימת העובדים.
- הדפסת מצב העובדים ממוינת.
מערכת כזו מאפשרת לחסוך בעלויות, לייעל תהליכים ולשפר שביעות רצון עובדים. כל רכב יכול לשמש כמה עובדים.
מחלקה ראשית (Main)
במחלקה הראשית:
-
צרו מערך רכבים התחלתי, לדוגמה:
Car[] cars = { new Car("1112233", "Toyota"), new Car("4445566", "Honda") };
- צרו אובייקט
Company
חדש עם שם ומערך רכבים. - הוסיפו עובדים באמצעות מתודה סטטית (למשל
addRandomEmployeesToCompany
). -
הפעילו בדיקות:
- הוספת עובדים עד למילוי המערך.
- הסרת עובדים קיימים ולא קיימים.
- הדפסת רשימת עובדים לפני ואחרי הסרה.
קלט
- הקלט מגיע מקוד המקור בלבד (מערכי רכבים ושמות מוגדרים מראש).
פלט
-
הפלט מודפס ל-console וכולל:
- הודעות הוספה/הסרה.
- רשימת עובדים ממוינת לפי שם.
דוגמאות לפלט:
Employee added successfully: Sarah Cohen
Employee with ID 3 removed successfully.
- רשימת עובדים ממוינת לפי שם.