Cuentas del hogar Curso de Programación Java

Lección:

Matrices, Estructuras y Cadenas


Ejercicio:

Cuentas del hogar 6


Objetivo:

Cree un programa en java que pueda almacenar hasta 10000 costos e ingresos, para crear un pequeño sistema de contabilidad nacional. Para cada gasto (o ingreso), se debe permitir guardar la siguiente información:

• Fecha (8 caracteres: formato AAAAMMDD)
• Descripción de los gastos o ingresos
• Categoría
• Monto (si es un ingreso positivo, negativo si es un gasto)

El programa debe permitir al usuario realizar las siguientes operaciones:

1 - Añadir un nuevo gasto (la fecha debe "verse bien": día 01 a 31 meses de 01 a 12 años entre 1000 y 3000). La descripción no debe estar vacía. No hace falta validar los otros datos.

2 - Mostrar todos los gastos de una determinada categoría (por ejemplo, "estudios") entre dos fechas determinadas (por ejemplo, entre "20110101" y "20111231"). Se muestra el número, la fecha (formato DD / MM / AAAA), la descripción, la categoría entre paréntesis y la cantidad a dos decimales, todo en la misma línea, separados por guiones. Al final de todos los datos, muestre la cantidad total de datos mostrados.

3 - Costos de búsqueda que contienen un determinado texto (en la descripción o categoría sin distinguir entre mayúsculas y minúsculas). Se muestra el número, la fecha y la descripción (la descripción se muestra en el sexto espacio en blanco truncado, si hay espacios seis o más).

4 - Modificar una pestaña (el número de pestaña lo pedirá al usuario, mostrará el valor anterior de cada campo y pulsará Intro para no poder modificar ninguno de los datos). Se debe avisar (pero no volver a ordenar) si el usuario introduce un número de tarjeta incorrecto. No hace falta validar ningún dato.

5 - Elimina algunos datos, del número que introduzcas. Se debe avisar (pero no volver a ordenar) si ingresa un número incorrecto. Debe mostrar que la tarjeta es clara y rápida antes de la eliminación.

6 - Ordenar los datos alfabéticamente, por fecha y (si coinciden) descripción.

7 - Normalizar descripciones: eliminar espacios finales, espacios y sitios espejo. Si una descripción es toda mayúscula, se convertirá a minúscula (excepto la primera letra, mantenida en mayúsculas).

T-End el uso de la aplicación (a medida que almacenamos la información, los datos se perderán).


Código:

import java.util.*;
public class Main
{
	private final static class accountData
	{
		public String date;
		public String description;
		public String category;
		public double amount;

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

			varCopy.date = this.date;
			varCopy.description = this.description;
			varCopy.category = this.category;
			varCopy.amount = this.amount;

			return varCopy;
		}
	}

	public static void main()
	{
		int capacity = 10000;
		accountData[] data = new accountData[capacity];
		boolean repeat = true;
		String option;
		int amountOfData = 0;

		do
		{
			System.out.println();
			System.out.println("Household accounts");
			System.out.println();
			System.out.println("1.- Add data.");
			System.out.println("2.- View all data.");
			System.out.println("3.- Search data.");
			System.out.println("4.- Modify data.");
			System.out.println("5.- Delete data.");
			System.out.println("6.- Sort alphabetically");
			System.out.println("7.- Fix spaces");
			System.out.println("Q,T.-Quit.");
			System.out.print("Option: ");
			option = new Scanner(System.in).nextLine();

			switch (option)
			{
				case "1": //add
					if (amountOfData > capacity - 1)
					{
						System.out.println("Database full!");
					}
					else
					{
						do
						{
							System.out.print("Enter date (YYYYMMDD): ");
							data[amountOfData].date = new Scanner(System.in).nextLine();
							// TODO: Individual validation for the date
						} while (data[amountOfData].date.length() == 0);

						do
						{
							System.out.print("Enter Description: ");
							data[amountOfData].description = new Scanner(System.in).nextLine();
							if (data[amountOfData].description.length() == 0)
							{
								System.out.print("Cannot be empty");
							}
						} while (data[amountOfData].description.length() == 0);

						System.out.print("Enter category: ");
						data[amountOfData].category = new Scanner(System.in).nextLine();

						System.out.print("Enter the amount: ");
						data[amountOfData].amount = Double.parseDouble(new Scanner(System.in).nextLine());

						amountOfData++;
					}
					break;

				case "2": //view
					if (amountOfData == 0)
					{
						System.out.println("No data!");
					}
					else
					{
						System.out.print("Enter the category: ");
						String categ = new Scanner(System.in).nextLine();
						System.out.print("Enter the start date (YYYYMMDD): ");
						String startDate = new Scanner(System.in).nextLine();
						System.out.print("Enter the end date (YYYYMMDD): ");
						String endDate = new Scanner(System.in).nextLine();

						for (int i = 0; i < amountOfData; i++)
						{
							if ((data[i].category.equals(categ)) && (data[i].date.compareTo(startDate) >= 0) && (data[i].date.compareTo(endDate) <= 0))
							{
								System.out.printf("%1$s - %2$s/%3$s/%4$s - %5$s -(%6$s) - %7$s" + "\r\n", i + 1, data[i].date.substring(6, 8), data[i].date.substring(4, 6), data[i].date.substring(0, 4), data[i].description, data[i].category, (new Double(data[i].amount)).toString("N2")); // Year -  Month -  Day
							}
						}
					}
					break;

				case "3": //search
					System.out.print("Enter part of the description or category: ");
					String search = new Scanner(System.in).nextLine().toUpperCase();
					boolean found = false;
					for (int i = 0; i < amountOfData; i++)
					{
						if (data[i].description.toUpperCase().contains(search) || data[i].category.toUpperCase().contains(search))
						{
							System.out.printf("%1$s: %2$s - %3$s" + "\r\n", i + 1, data[i].date, data[i].description);
							// TODO: Split in sixth space
							found = true;
						}
					}
					if (!found)
					{
						System.out.println("Not found!");
					}
					break;

				case "4": // modify
					System.out.print("Enter the record number: ");
					int recNumber = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;

					if ((recNumber > amountOfData) || (recNumber < 0))
					{
						System.out.print("Out of range!");
					}
					else
					{
						System.out.printf("Date (was %1$s; hit ENTER to leave as is): ", data[recNumber].date);
						String newText = new Scanner(System.in).nextLine();
						if (!newText.equals(""))
						{
							data[recNumber].date = newText;
						}

						System.out.printf("Description (was %1$s; hit ENTER to leave as is): ", data[recNumber].description);
						newText = new Scanner(System.in).nextLine();
						if (!newText.equals(""))
						{
							data[recNumber].description = newText;
						}

						System.out.printf("Category (was %1$s; hit ENTER to leave as is): ", data[recNumber].category);
						newText = new Scanner(System.in).nextLine();
						if (!newText.equals(""))
						{
							data[recNumber].category = newText;
						}

						System.out.printf("Amount (was %1$s; hit ENTER to leave as is): ", data[recNumber].amount);
						newText = new Scanner(System.in).nextLine();
						if (!newText.equals(""))
						{
							data[recNumber].amount = Double.parseDouble(newText);
						}
					}
					break;

				case "5": //delete
					int position = 0;
					System.out.print("Enter the position number to delete: ");
					position = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;
					if (position > amountOfData)
					{
						System.out.println("Error: out of range");
					}
					else
					{
						// TODO: Ask for confirmation
						for (int i = position; i < amountOfData; i++)
						{
							data[i] = data[i + 1].clone();
						}
						amountOfData--;
					}
					break;

				case "6": // Sort
					accountData aux = new accountData();
					for (int i = 0; i < amountOfData - 1; i++)
					{
						for (int j = i + 1; j < amountOfData; j++)
						{
							String data1 = data[i].date + data[i].description;
							String data2 = data[j].date + data[j].description;
							if (data1.compareTo(data2) > 0)
							{
								aux = data[i].clone();
								data[i] = data[j].clone();
								data[j] = aux.clone();
							}
						}
					}
					System.out.println("Sorted.");
					break;

				case "7": //replace "  " x " "
					for (int i = 0; i < amountOfData; i++)
					{
						data[i].description = data[i].description.trim();
						while (data[i].description.contains("  "))
						{
							data[i].description = data[i].description.replace("  ", " ");
						}
						if (data[i].description.toUpperCase().equals(data[i].description))
						{
							data[i].description = data[i].description.substring(0, 1).toUpperCase() + data[i].description.substring(1).toLowerCase();
						}
					}
					break;

				case "T":
				case "t":
				case "Q":
				case "q":
					repeat = false;
					break;

				default:
					System.out.println("Wrong option!");
					break;
			}
		} while (repeat != false);
		System.out.println("Bye!");
	}
}