Ejercicio
Cuentas del hogar
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 de Ejemplo
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!");
}
}