Function Tasks Database Java Exercise

Lesson

Functions

Exercise

Function Tasks Database

Objetive

Create an improved version of the "tasks database", splitting it into functions.

Example Code

import java.util.*;
public class Main
{
	private final static class DateType
	{
		public short year;
		public byte month;
		public byte day;

		public DateType clone()
		{
			DateType varCopy = new DateType();

			varCopy.year = this.year;
			varCopy.month = this.month;
			varCopy.day = this.day;

			return varCopy;
		}
	}

	private final static class TaskType
	{
		public DateType date = new DateType();
		public String description;
		public byte level;
		public String category;

		public TaskType clone()
		{
			TaskType varCopy = new TaskType();

			varCopy.date = this.date.clone();
			varCopy.description = this.description;
			varCopy.level = this.level;
			varCopy.category = this.category;

			return varCopy;
		}
	}

	private static int counter = 0;
	private static int capacity = 2000;
	private static TaskType[] tasks = new TaskType[capacity];

	public static void Add()
	{
		if (counter < capacity)
		{
			System.out.print("Enter the Description of the task: ");
			tasks[counter].description = new Scanner(System.in).nextLine();

			System.out.print("Enter the Level of the task (1-10): ");
			tasks[counter].level = Byte.parseByte(new Scanner(System.in).nextLine());

			System.out.print("Enter the Category of the task: ");
			tasks[counter].category = new Scanner(System.in).nextLine();

			do
			{
				System.out.print("Enter the Day of the task (1 to 31): ");
				tasks[counter].date.day = Byte.parseByte(new Scanner(System.in).nextLine());
				if (tasks[counter].date.day < 1 || tasks[counter].date.day > 31)
				{
					System.out.println("Not a valid day!");
				}
			} while (tasks[counter].date.day < 1 || tasks[counter].date.day > 31);

			do
			{
				System.out.print("Enter the Month of the task (1 to 12): ");
				tasks[counter].date.month = Byte.parseByte(new Scanner(System.in).nextLine());
				if (tasks[counter].date.month < 1 || tasks[counter].date.month > 12)
				{
					System.out.println("Not a valid month!");
				}
			} while (tasks[counter].date.month < 1 || tasks[counter].date.month > 12);

			do
			{
				System.out.print("Enter the Year of the task: ");
				tasks[counter].date.year = Short.parseShort(new Scanner(System.in).nextLine());
				if (tasks[counter].date.year < 1000 || tasks[counter].date.year > 3000)
				{
					System.out.println("Not a valid year!");
				}
			} while (tasks[counter].date.year < 1000 || tasks[counter].date.year > 3000);
			counter++;
		}
		else
		{
			System.out.println("Database full.");
		}
	}

	public static void Show()
	{
		if (counter >= 1)
		{
			byte startDay, startMonth;
			short startYear;
			byte endDay, endMonth;
			short endYear;

			System.out.println("Starting day: ");
			String number = new Scanner(System.in).nextLine();

			if (number.equals(""))
			{
				startDay = (byte)java.time.LocalDateTime.now().getDayOfMonth();
			}
			else
			{
				startDay = Byte.parseByte(number);
			}

			System.out.println("Starting month: ");
			number = new Scanner(System.in).nextLine();
			if (number.equals(""))
			{
				startMonth = (byte)java.time.LocalDateTime.now().getMonthValue();
			}
			else
			{
				startMonth = Byte.parseByte(number);
			}

			System.out.println("Starting year: ");
			number = new Scanner(System.in).nextLine();
			if (number.equals(""))
			{
				startYear = (short)java.time.LocalDateTime.now().getYear();
			}
			else
			{
				startYear = Short.parseShort(number);
			}

			System.out.println("Final day: ");
			number = new Scanner(System.in).nextLine();
			if (number.equals(""))
			{
				endDay = (byte)java.time.LocalDateTime.now().getDayOfMonth();
			}
			else
			{
				endDay = Byte.parseByte(number);
			}

			System.out.println("Final month: ");
			number = new Scanner(System.in).nextLine();
			if (number.equals(""))
			{
				endMonth = (byte)java.time.LocalDateTime.now().getMonthValue();
			}
			else
			{
				endMonth = Byte.parseByte(number);
			}

			System.out.println("Final year: ");
			number = new Scanner(System.in).nextLine();
			if (number.equals(""))
			{
				endYear = (short)java.time.LocalDateTime.now().getYear();
			}
			else
			{
				endYear = Short.parseShort(number);
			}


			String startDate = "" + startYear + (new Byte(startMonth)).toString("00") + (new Byte(startDay)).toString("00");
			String endDate = "" + endYear + (new Byte(endMonth)).toString("00") + (new Byte(endDay)).toString("00");

			for (int i = 0; i < counter; i++)
			{

				String currentDate = "" + tasks[i].date.year + 
                (new Byte(tasks[i].date.month)).toString("00") + 
                (new Byte(tasks[i].date.day)).toString("00");
				if (currentDate.compareTo(startDate) >= 0 && currentDate.compareTo(endDate) <= 0)
				{
					System.out.printf("The number is %1$s: %2$s/%3$s/" + "%4$s - %5$s - %6$s - %7$s." + 
                    "\r\n", i + 1, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year, 
                    tasks[i].description, tasks[i].category, tasks[i].level);
				}
			}
		}
		else
		{
			System.out.println("Database empty.");
		}
	}

	public static void Find()
	{
		String search;
		boolean found;
		if (counter >= 1)
		{
			System.out.print("Enter the text to search: ");
			search = new Scanner(System.in).nextLine();
			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;
					System.out.printf("%1$s: %2$s/%3$s/%4$s - %5$s" + "\r\n", i + 1, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year, newValue5);
				}
			}
			if (!found)
			{
				System.out.println("Not found.");
			}
		}
		else
		{
			System.out.println("Database empty.");
		}
	}

	public static void Update()
	{
		String newValue;
		if (counter >= 1)
		{
			System.out.print("Enter the number of the task to update: ");
			int update = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;
			if ((update >= 0) && (update < counter))
			{
				System.out.printf("Description (%1$s): ", tasks[update].description);
				newValue = new Scanner(System.in).nextLine();
				if (!newValue.equals(""))
				{
					tasks[update].description = newValue;
				}

				System.out.printf("Level (%1$s): " + "\r\n", tasks[update].level);
				newValue = new Scanner(System.in).nextLine();
				if (!newValue.equals(""))
				{
					tasks[update].level = Byte.parseByte(newValue);
				}

				System.out.printf("Category (%1$s): " + "\r\n", tasks[update].category);
				newValue = new Scanner(System.in).nextLine();
				if (!newValue.equals(""))
				{
					tasks[update].category = newValue;
				}

				System.out.printf("Year (%1$s): " + "\r\n", tasks[update].date.year);
				newValue = new Scanner(System.in).nextLine();
				if (!newValue.equals(""))
				{
					tasks[update].date.year = Short.parseShort(newValue);
				}

				System.out.printf("Month (%1$s): " + "\r\n", tasks[update].date.month);
				newValue = new Scanner(System.in).nextLine();
				if (!newValue.equals(""))
				{

					tasks[update].date.month = Byte.parseByte(newValue);
				}

				System.out.printf("Day (%1$s): " + "\r\n", tasks[update].date.day);
				newValue = new Scanner(System.in).nextLine();
				if (!newValue.equals(""))
				{
					tasks[update - 1].date.day = Byte.parseByte(newValue);
				}
			}
			else
			{
				System.out.println("Wrong number entered.");
			}
		}
		else
		{
			System.out.println("Database empty.");
		}
	}

	public static void Delete()
	{
		if (counter >= 1)
		{
			System.out.print("Enter the first number of data to delete: ");
			int delete = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;
			System.out.print("Enter the second number of data to delete: ");
			int delete2 = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;

			for (int pos = delete; pos <= delete2; pos++)
			{
				for (int i = delete2; i < counter; i++)
				{
					tasks[i] = tasks[i + 1];
				}
				counter--;
			}
		}
		else
		{
			System.out.println("Database empty.");
		}
	}

	public static void Sort()
	{
		for (int i = 0; i < counter - 1; i++)
		{
			String firstDate = "" + tasks[i].date.year + (new Byte(tasks[i].date.month)).toString("00") + (new Byte(tasks[i].date.day)).toString("00") + tasks[i].description;
			for (int j = i + 1; j < counter; j++)
			{
				String secondDate = "" + tasks[j].date.year + (new Byte(tasks[j].date.month)).toString("00") + (new Byte(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.clone();
				}
			}
		}
	}

	public static void FindDuplicates()
	{
		for (int i = 0; i < counter - 1; i++)
		{
			for (int j = i + 1; j < counter; j++)
			{
				if (tasks[i].description.equals(tasks[j].description))
				{
					System.out.printf("%1$s - %2$s/%3$s/%4$s" + "\r\n", tasks[i].description, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year);
					System.out.printf("%1$s - %2$s/%3$s/%4$s" + "\r\n", tasks[j].description, tasks[j].date.day, tasks[j].date.month, tasks[j].date.year);
				}
			}
		}
	}

	public static void main()
	{
		char option;

		do
		{
			System.out.println();
			System.out.println("Tasks database");
			System.out.println();
			System.out.println("1- Add a new task.");
			System.out.println("2- Show the tasks between two certain dates.");
			System.out.println("3- Find tasks that contain a certain text.");
			System.out.println("4- Update a record.");
			System.out.println("5- Delete some data, between two positions indicated.");
			System.out.println("6- Sort the data alphabetically by date.");
			System.out.println("7- Find Duplicates.");
			System.out.println("Q- Quit.");
			System.out.println("Enter an option:");
			option = (char)(new Scanner(System.in).nextLine().toUpperCase());

			switch (option)
			{
				case '1': //Add a new task
					Add();
					break;

				case '2': //Show the tasks between two certain dates
					Show();
					break;

				case '3': //Find tasks that contain a certain text
					Find();
					break;

				case '4': //Update a record
					Update();
					break;

				case '5': //Delete some data, between two positions indicated by the user
					Delete();
					break;

				case '6': //Sort the data alphabetically on date + description
					Sort();
					break;

				case '7': //Find Duplicates
					FindDuplicates();
					break;

				case 'Q': //Quit
					System.out.println("Quitting...");
					break;

				default:
					System.out.println("You entered a wrong option. Please re-enter it.");
					break;
			}
		} while (option != 'Q');
	}
}

More Java Exercises of Functions

Functions: Greeting + Farewell
Create a program whose Main must be like this: public static void Main() { SayHello(); SayGoodbye(); } SayHello and SayGoodbye are functions...
Function With Parameters
Create a program whose Main must be like this: public static void Main() { SayHello("John"); SayGoodbye(); } SayHello and SayGoodbye are fun...
Function Returning A Value
Create a program whose Main must be like this: public static void Main() { int x= 3; int y = 5; Console.WriteLine( Sum(x,y) ); } "Sum" is a...
Function Returning A Value V2
Create a program whose Main must be like this: public static void Main() { __Console.WriteLine("\"Hello, how are you\" contains {0} spaces", ____...
Function Write Centered
Create a function to write centered on screen the text that is indicated as a parameter (supposing a screen width of 80 characters): WriteCentered(...
Function Write Underlined
Create a function able to write centered on screen the text that is indicated as a parameter (supposing a screen width of 80 characters) and then unde...
Function Sum Of Array
Create a Java program to calculate the sum of the elements in an array. "Main" should be like this: public static void Main() { int[] example = {2...
Function Double
Create a function named "Double" to calculate and return an integer number doubled. For example. Double(7) should return 14....
Function Double Reference Parameter
Create a function named "Double" to calculate the double of an integer number, and modify the data passed as an argument. It must be a "void" function...
Function Swap Reference Parameters
Create a function named "Swap" to swap the values of two integer numbers, which are passed by reference. An example of use might be: int x=5, y=...
Function Power Local Variables
Create a function named "Power" to calculate the result of raising an integer number to another (positive integer) number. It must return another inte...
Function Recursive Power
Create a function that calculates the result of raising an integer to another integer (eg 5 raised to 3 = 53 = 5 × 5 × 5 = 125). This function must be...
Function Fibonacci
Create a Java program that uses recursion to calculate a number in the Fibonacci series (in which the first two items are 1, and for the other element...
Function Modify A Letter In A String
Create a function named "ChangeChar" to modify a letter in a certain position (0 based) of a string, replacing it with a different letter: string s...
Function Isprimetarea
Create a function named "IsPrime", which receives an integer number and retuns true if it is prime, or false if it is not: if (isPrime(127)) ......
Parameters Of Main, Sum
Create a program named "sum", which receives two integer numbers in the command line and displays their sum, as in this example: sum 5 3 8...
Function Sumdigits
Create a function SumDigits that receives a number and returns any results in the sum of its digits. For example, if the number is 123, the sum would ...
Function Factorial
The factorial of a number is expressed as follows: n! = n · (n-1) · (n-2) · (n-3) · ... · 3 · 2 · 1 For example, 6! = 6·5·4·3·2·1 Create a r...
Parameters Of Main, Reverse
Create a program named "reverse", which receives several words in the command line and displays them in reverse order, as in this example: reverse ...
Function Getint
Create a function named "GetInt", which displays on screen the text received as a parameter, asks the user for an integer number, repeats if the numbe...
Greatest Value In A Array
Create a function which returns the greatest value stored in an array of real numbers which is specified as parameter: float[] data={1.5f, 0.7f, 8....
Function Factorial (Iterative)
Create an iterative (non-recursive) function to calculate the factorial of the number specified as parameter: Console.Write ( Factorial (6) ); w...
Function Writetitle
Create a function named "WriteTitle" to write a text centered on screen, uppercase, with extra spaces and with a line over it and another line under i...
Function Return Value For Main
Create a Java program in which you write a title (using the previous WriteTitle function) which the user will specify in command line. If no text is s...
Function Countdv
Create a function that calculates the amount of numeric digits and vowels that a text string contains. It will accept three parameters: the string tha...
Function Isalphabetic
Create a function that tells if a character is alphabetic (A through Z) or not. It should be used like this: if (IsAlphabetic ("a")) System.Consol...
Function Isnumber
Create a function that tells if a string is an intenger number. It should be used like this: if (IsNumber ("1234")) System.Console.WriteLine ("It ...
Function Calculator, Params Of Main
Create a Java program to calculate a sum, subtraction, product or division, analyzing the command line parameters: calc 5 + 379 (Parameters must...
Function Calculator, Params And Return Value Of Main
Create a Java program to calculate a sum, subtraction, product or division, analyzing the command line parameters: calc 5 + 379 (Parameters must...
Function Minmaxarray
Create a function named MinMaxArray, to return the minimum and maximum values stored in an array, using reference parameters: float[] data={1.5f, 0...
Reverse, Recursive
Create a program that uses recursion to reverse a string of characters (for example, from "Hello" it would return "olleH")....
Function Writerectangle
Create a function WriteRectangle to display a (filled) rectangle on the screen, with the width and height indicated as parameters, using asterisks. Co...
Function Palindrome, Iterative
Create an iterative function to say whether a string is symmetric (a palindrome). For example, "RADAR" is a palindrome....
Palindrome, Recursive
Create a recursive function to say whether a string is symmetric (a palindrome). For example, "RADAR" is a palindrome....
Function Getminmax
Create a function named "GetMinMax", which will ask the user for a minimum value (a number) and a maximum value (another number). It should be called ...
Function Multiply & Multiplyr
Create two functions, Multiply and MultiplyR, to calculate the product of two numbers using sums. T he first version must be iterative, and the second...