Proposed exercise
Create an improved version of the "tasks database" (November 22nd), splitting it into functions.
Output
Solution
using System; public class TasksDatabase { struct DateType { public ushort year; public byte month; public byte day; } struct TaskType { public DateType date; public string description; public byte level; public string category; } static int counter = 0; static int capacity = 2000; static TaskType[] tasks = new TaskType[capacity]; public static void Add() { if (counter < capacity) { Console.Write("Enter the Description of the task: "); tasks[counter].description = Console.ReadLine(); Console.Write("Enter the Level of the task (1-10): "); tasks[counter].level = Convert.ToByte(Console.ReadLine()); Console.Write("Enter the Category of the task: "); tasks[counter].category = Console.ReadLine(); do { Console.Write("Enter the Day of the task (1 to 31): "); tasks[counter].date.day = Convert.ToByte(Console.ReadLine()); if (tasks[counter].date.day < 1 || tasks[counter].date.day > 31) Console.WriteLine("Not a valid day!"); } while (tasks[counter].date.day < 1 || tasks[counter].date.day > 31); do { Console.Write("Enter the Month of the task (1 to 12): "); tasks[counter].date.month = Convert.ToByte(Console.ReadLine()); if (tasks[counter].date.month < 1 || tasks[counter].date.month > 12) Console.WriteLine("Not a valid month!"); } while (tasks[counter].date.month < 1 || tasks[counter].date.month > 12); do { Console.Write("Enter the Year of the task: "); tasks[counter].date.year = Convert.ToUInt16(Console.ReadLine()); if (tasks[counter].date.year < 1000 || tasks[counter].date.year > 3000) Console.WriteLine("Not a valid year!"); } while (tasks[counter].date.year < 1000 || tasks[counter].date.year > 3000); counter++; } else Console.WriteLine("Database full."); } public static void Show() { if (counter >= 1) { byte startDay, startMonth; ushort startYear; byte endDay, endMonth; ushort endYear; Console.WriteLine("Starting day: "); string number = Console.ReadLine(); if (number == "") startDay = Convert.ToByte(DateTime.Now.Day); else startDay = Convert.ToByte(number); Console.WriteLine("Starting month: "); number = Console.ReadLine(); if (number == "") startMonth = Convert.ToByte(DateTime.Now.Month); else startMonth = Convert.ToByte(number); Console.WriteLine("Starting year: "); number = Console.ReadLine(); if (number == "") startYear = Convert.ToUInt16(DateTime.Now.Year); else startYear = Convert.ToUInt16(number); Console.WriteLine("Final day: "); number = Console.ReadLine(); if (number == "") endDay = Convert.ToByte(DateTime.Now.Day); else endDay = Convert.ToByte(number); Console.WriteLine("Final month: "); number = Console.ReadLine(); if (number == "") endMonth = Convert.ToByte(DateTime.Now.Month); else endMonth = Convert.ToByte(number); Console.WriteLine("Final year: "); number = Console.ReadLine(); if (number == "") endYear = Convert.ToUInt16(DateTime.Now.Year); else endYear = Convert.ToUInt16(number); string startDate = "" + startYear + startMonth.ToString("00") + startDay.ToString("00"); string endDate = "" + endYear + endMonth.ToString("00") + endDay.ToString("00"); for (int i = 0; i < counter; i++) { string currentDate = "" + tasks[i].date.year + tasks[i].date.month.ToString("00") + tasks[i].date.day.ToString("00"); if (currentDate.CompareTo(startDate) >= 0 && currentDate.CompareTo(endDate) <= 0) { Console.WriteLine("The number is {0}: {1}/{2}/" + "{3} - {4} - {5} - {6}.", i + 1, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year, tasks[i].description, tasks[i].category, tasks[i].level); } } } else Console.WriteLine("Database empty."); } public static void Find() { string search; bool found; if (counter >= 1) { Console.Write("Enter the text to search: "); search = Console.ReadLine(); found = false; string newValue5; for (int i = 0; i < counter; i++) { if (tasks[i].description.IndexOf(search) >= 0 || tasks[i].category.IndexOf(search) >= 0) { if (tasks[i].description.Length > 50) newValue5 = tasks[i].description.Substring(0, 50); else newValue5 = tasks[i].description; found = true; Console.WriteLine("{0}: {1}/{2}/{3} - {4}", i + 1, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year, newValue5); } } if (!found) Console.WriteLine("Not found."); } else Console.WriteLine("Database empty."); } public static void Update() { string newValue; if (counter >= 1) { Console.Write("Enter the number of the task to update: "); int update = Convert.ToInt32(Console.ReadLine()) - 1; if ((update >= 0) && (update < counter)) { Console.Write("Description ({0}): ", tasks[update].description); newValue = Console.ReadLine(); if (newValue != "") tasks[update].description = newValue; Console.WriteLine("Level ({0}): ", tasks[update].level); newValue = Console.ReadLine(); if (newValue != "") tasks[update].level = Convert.ToByte(newValue); Console.WriteLine("Category ({0}): ", tasks[update].category); newValue = Console.ReadLine(); if (newValue != "") tasks[update].category = newValue; Console.WriteLine("Year ({0}): ", tasks[update].date.year); newValue = Console.ReadLine(); if (newValue != "") tasks[update].date.year = Convert.ToUInt16(newValue); Console.WriteLine("Month ({0}): ", tasks[update].date.month); newValue = Console.ReadLine(); if (newValue != "") tasks[update].date.month = Convert.ToByte(newValue); Console.WriteLine("Day ({0}): ", tasks[update].date.day); newValue = Console.ReadLine(); if (newValue != "") tasks[update - 1].date.day = Convert.ToByte(newValue); } else Console.WriteLine("Wrong number entered."); } else Console.WriteLine("Database empty."); } public static void Delete() { if (counter >= 1) { Console.Write("Enter the first number of data to delete: "); int delete = Convert.ToInt32(Console.ReadLine()) - 1; Console.Write("Enter the second number of data to delete: "); int delete2 = Convert.ToInt32(Console.ReadLine()) - 1; for (int pos = delete; pos <= delete2; pos++) { for (int i = delete2; i < counter; i++) tasks[i] = tasks[i + 1]; counter--; } } else Console.WriteLine("Database empty."); } public static void Sort() { for (int i = 0; i < counter - 1; i++) { string firstDate; firstDate = tasks[i].date.year + tasks[i].date.month.ToString("00") + tasks[i].date.day.ToString("00") + tasks[i].description; for (int j = i + 1; j < counter; j++) { string secondDate = "" + tasks[j].date.year + tasks[j].date.month.ToString("00") + tasks[j].date.day.ToString("00") + tasks[j].description; if (firstDate.CompareTo(secondDate) > 0) { TaskType aux = tasks[i]; tasks[i] = tasks[j]; tasks[j] = aux; } } } } public static void FindDuplicates() { for (int i = 0; i < counter - 1; i++) { for (int j = i + 1; j < counter; j++) { if (tasks[i].description == tasks[j].description) { Console.WriteLine("{0} - {1}/{2}/{3}", tasks[i].description, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year); Console.WriteLine("{0} - {1}/{2}/{3}", tasks[j].description, tasks[j].date.day, tasks[j].date.month, tasks[j].date.year); } } } } public static void Main() { char option; do { Console.WriteLine("Tasks database"); Console.WriteLine(); Console.WriteLine("1- Add a new task."); Console.WriteLine("2- Show the tasks between two certain dates."); Console.WriteLine("3- Find tasks that contain a certain text."); Console.WriteLine("4- Update a record."); Console.WriteLine("5- Delete some data, between two positions indicated."); Console.WriteLine("6- Sort the data alphabetically by date."); Console.WriteLine("7- Find Duplicates."); Console.WriteLine("Q- Quit."); Console.WriteLine("Enter an option:"); option = Convert.ToChar( Console.ReadLine().ToUpper() ); switch (option) { case '1': Add(); break; case '2': Show(); break; case '3': Find(); break; case '4': Update(); break; case '5': Delete(); break; case '6': Sort(); break; case '7': FindDuplicates(); break; case 'Q': Console.WriteLine("Exit"); break; default: Console.WriteLine("Wrong option"); break; } } while (option != 'Q'); } }