# Assignment 6 - 此次作業主題為Class & Object,請務必依題目提示使用作題,否則會扣分。 - The topic of this assignment is **Class & Object**. Please make sure to use **Class & Object** as instructed in the Quesiton Text. If not, points will be deducted. - 此次作業為***Console App***類型,請各位同學不要創建錯誤。 - This assignment is of the ***Console App*** type. Please make sure to create the correct project type. - 繳交方式同[Assignment 2 繳交教學](https://hackmd.io/@CCUPD2025/SJeWlJx31l),請將所有題目的`.cs` file命名完成後放在同個資料夾,最後壓縮上傳。 - The submission process follows the same steps as in Assignment 2 Submission Guide. Please name all `.cs` files correctly, place them in the same folder, and compress the folder before submission. - 務必詳閱題目,並且正確命名! - Make sure to read the instructions carefully and use the correct file names! ## Question 1 - ShirtDemo Create an program(also a class) named `ShirtDemo` and put your `Main()` inside it. Create a `Shirt` class with **auto-implemented** properties: - Material - Color - Size ***`Auto-implemented`*** code(inside `Shirt` class): ```csharp= public string Material { get; set; } public string Color { get; set; } public string Size { get; set; } ``` In `ShirtDemo` class: - Declare multiple shirts ```csharp= Shirt s1 = new Shirt { Material = "Cotton", Color = "Blue", Size = "M" }; Shirt s2 = new Shirt { Material = "Linen", Color = "White", Size = "L" }; Shirt s3 = new Shirt { Material = "Polyester", Color = "Black", Size = "S" }; ``` - Write a method(any name) that **takes several `Shirt` objects** & **displays their information**. ```csharp= DisplayShirt(s1, s2, s3); ``` > Remember to use `params` > and you can override `ToString()` to make it easier. #### Sample input 範例輸入: `none` #### Sample output 範例輸出: ``` Material: Cotton, Color: Blue, Size: M Material: Linen, Color: White, Size: L Material: Polyester, Color: Black, Size: S ``` ## Question 2 - ConferencesDemo Create a program(also a class) named `ConferencesDemo` Create a `Conference` class with: - GroupName (`string`) - StartDate (`string`) - Attendees (`int`) Implement `IComparable.CompareTo()` to sort by **`Attendees`** (from smallest to largest) In a `ConferencesDemo` class, accept and sort `5` conferences using the code below: ```csharp= static void Main() { Conference[] conferences = new Conference[] { new Conference("Tech Summit", "2025-06-10", 250), new Conference("AI Conference", "2025-07-05", 400), new Conference("Health Forum", "2025-05-20", 180), new Conference("Green Energy Expo", "2025-08-15", 300), new Conference("Finance Symposium", "2025-09-01", 220) }; Array.Sort(conferences); Console.WriteLine("Conferences sorted by number of attendees:"); Console.WriteLine(); foreach (Conference conf in conferences) { Console.WriteLine(conf); } } ``` #### Sample input 範例輸入: `none` #### Sample output 範例輸出: ``` Conferences sorted by number of attendees: Health Forum - 2025-05-20 - 180 attendees Finance Symposium - 2025-09-01 - 220 attendees Tech Summit - 2025-06-10 - 250 attendees Green Energy Expo - 2025-08-15 - 300 attendees AI Conference - 2025-07-05 - 400 attendees ``` ## Question 3 - RelativesBirthday Create a program named `RelativesBirthday` Create a `Relative` class with ***`auto-implemented`*** properties: - Name - Relationship (`string`) - Birthday - Month (`int`) - Day (`int`) - Year (`int`) Create the relative list using the code below: ```csharp= Relative[] relativeList = new Relative[] { new Relative { Name = "Alice", Relationship = "Friend", Month = 1, Day = 15, Year = 1995 }, new Relative { Name = "Bob", Relationship = "Brother", Month = 2, Day = 20, Year = 1990 }, new Relative { Name = "Cathy", Relationship = "Colleague", Month = 3, Day = 10, Year = 1988 }, new Relative { Name = "David", Relationship = "Father", Month = 4, Day = 5, Year = 1960 }, new Relative { Name = "Ella", Relationship = "Sister", Month = 5, Day = 25, Year = 1993 }, new Relative { Name = "Frank", Relationship = "Uncle", Month = 6, Day = 30, Year = 1970 }, new Relative { Name = "Grace", Relationship = "Aunt", Month = 7, Day = 12, Year = 1975 }, new Relative { Name = "Henry", Relationship = "Grandpa", Month = 8, Day = 3, Year = 1945 }, new Relative { Name = "Isabel", Relationship = "Grandma", Month = 9, Day = 8, Year = 1948 }, new Relative { Name = "Jack", Relationship = "Friend", Month = 10, Day = 21, Year = 1996 }, new Relative { Name = "Karen", Relationship = "Mom", Month = 11, Day = 18, Year = 1965 }, new Relative { Name = "Leo", Relationship = "Dad", Month = 12, Day = 2, Year = 1962 } }; ``` - - - Allow the user to **repeatedly** search for a relative by `name`. Display `birthday` and `relationship` or a “Not found” message if a relative name does not exist. Override `ToString()` code: ```csharp= public override string ToString() { return $"{Name} - {Relationship}, Birthday: {Month}/{Day}/{Year}"; } ``` > You can use any method you like to find the specific relative. (loop or library method etc) #### Sample input 範例輸入: ``` Frank Alice Kavic ``` #### Sample output 範例輸出: ``` Frank - Uncle, Birthday: 6/30/1970 Alice - Friend, Birthday: 1/15/1995 Not found ``` ## Question 4 - DemoJobs Write a demo program called `DemoJobs` Create a `Job` class that represents a home service task. | Field Name | Type | Description | | ----------- | -------- | --------------------------------------------- | | Description | `string` | Description of the job (e.g., "wash windows") | | Hours | `double` | Time to complete the job in hours (e.g., 3.5) | | Rate | `double` | Hourly rate charged (e.g., $25.00) | | TotalFee | `double` | Total fee, calculated as `Hours × Rate` (**read-only property**) | - `Description`, `Hours`, and `Rate`: Should have standard ***get*** and ***set*** accessors. **(auto-implemented)** - `TotalFee`: Should be a **read-only property** that automatically calculates the value whenever accessed. `TotalFee` code: ```csharp= public double TotalFee { get { return ...; } // no setter } ``` --- Implement the required fields and methods, and overload the `+` operator to allow combining two jobs. ### Rules for Combining Jobs: - `Description`: Concatenate the two job descriptions with **" and "** (e.g., "Wash windows **and** Clean garage") - `Hours`: **Sum** of both jobs’ hours - `Rate`: **Average** of the two hourly rates ```csharp (job1.Rate + job2.Rate) / 2; ``` - `TotalFee`: Automatically recalculated using the new hours and rate - - - Override `ToString()`: ```csharp= public override string ToString() { return $"Job: {Description}\n" + $"Hours: {Hours}\n" + $"Rate: ${Rate:F2} per hour\n" + $"Total Fee: ${TotalFee:F2}\n"; } ``` Then, demonstrate the functionality of the class `Job` in `DemoJobs`. ```csharp= static void Main() { Job job1 = new Job("Wash windows", 3.5, 25.00); Job job2 = new Job("Clean garage", 2.0, 30.00); Console.WriteLine("Job 1:"); Console.WriteLine(job1); Console.WriteLine("Job 2:"); Console.WriteLine(job2); Job combinedJob = job1 + job2; Console.WriteLine("Combined Job:"); Console.WriteLine(combinedJob); } ``` #### Sample input 範例輸入: `none` #### Sample output 範例輸出: ``` Job 1: Job: Wash windows Hours: 3.5 Rate: $25.00 per hour Total Fee: $87.50 Job 2: Job: Clean garage Hours: 2 Rate: $30.00 per hour Total Fee: $60.00 Combined Job: Job: Wash windows and Clean garage Hours: 5.5 Rate: $27.50 per hour Total Fee: $151.25 ```