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;
}
public static void Main()
{
int capacity = 2000;
TaskType[] tasks = new TaskType[capacity];
char option;
int counter = 0;
string search, newValue;
bool found;
do
{
Console.WriteLine();
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 a new task
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.");
break;
case '2': //Show the tasks between two certain dates
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.");
break;
case '3': //Find tasks that contain a certain text
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.");
break;
case '4': //Update a record
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].date.day = Convert.ToByte(newValue);
}
else
Console.WriteLine("Wrong number entered.");
}
else
Console.WriteLine("Database empty.");
break;
case '5': //Delete some data, between two positions indicated by the user
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 = delete; i < counter; i++)
tasks[i] = tasks[i + 1];
counter--;
}
}
else
Console.WriteLine("Database empty.");
break;
case '6': //Sort the data alphabetically on date + description
for (int i = 0; i < counter - 1; i++)
{
string 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;
}
}
}
break;
case '7': //Find Duplicates
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);
}
}
}
break;
case 'Q': //Quit
Console.WriteLine("Quitting...");
break;
default:
Console.WriteLine("You entered a wrong option. Please re-enter it.");
break;
}
}
while (option != 'Q');
}
}