Cuentas del hogar Curso de Programación C# Sharp

Lección:

Matrices, Estructuras y Cadenas


Ejercicio:

Cuentas del hogar 33


Objetivo:

Cree un programa en C# 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:

using System;
public class exercise96
{
    struct accountData
    {
        public string date;
        public string description;
        public string category;
        public double amount;
    }

    public static void Main()
    {
        int capacity = 10000;
        accountData[] data = new accountData[capacity];
        bool repeat = true;
        string option;
        int amountOfData = 0;

        do
        {
            Console.WriteLine();
            Console.WriteLine("Household accounts");
            Console.WriteLine();
            Console.WriteLine("1.- Add data.");
            Console.WriteLine("2.- View all data.");
            Console.WriteLine("3.- Search data.");
            Console.WriteLine("4.- Modify data.");
            Console.WriteLine("5.- Delete data.");
            Console.WriteLine("6.- Sort alphabetically");
            Console.WriteLine("7.- Fix spaces");
            Console.WriteLine("Q,T.-Quit.");
            Console.Write("Option: ");
            option = Console.ReadLine();

            switch (option)
            {
                case "1": //add
                    if (amountOfData > capacity - 1)
                        Console.WriteLine("Database full!");
                    else
                    {
                        do
                        {
                            Console.Write("Enter date (YYYYMMDD): ");
                            data[amountOfData].date = Console.ReadLine();
                            // TODO: Individual validation for the date
                        } while (data[amountOfData].date.Length == 0);

                        do
                        {
                            Console.Write("Enter Description: ");
                            data[amountOfData].description = Console.ReadLine();
                            if (data[amountOfData].description.Length == 0)
                                Console.Write("Cannot be empty");
                        } while (data[amountOfData].description.Length == 0);

                        Console.Write("Enter category: ");
                        data[amountOfData].category = Console.ReadLine();

                        Console.Write("Enter the amount: ");
                        data[amountOfData].amount = Convert.ToDouble(Console.ReadLine());

                        amountOfData++;
                    }
                    break;

                case "2": //view
                    if (amountOfData == 0)
                        Console.WriteLine("No data!");
                    else
                    {
                        Console.Write("Enter the category: ");
                        string categ = Console.ReadLine();
                        Console.Write("Enter the start date (YYYYMMDD): ");
                        string startDate = Console.ReadLine();
                        Console.Write("Enter the end date (YYYYMMDD): ");
                        string endDate = Console.ReadLine();

                        for (int i = 0; i < amountOfData; i++)
                        {
                            if ((data[i].category == categ) &&
                                (data[i].date.CompareTo(startDate) >= 0) &&
                                (data[i].date.CompareTo(endDate) <= 0))
                            {
                                Console.WriteLine("{0} - {1}/{2}/{3} - {4} -({5}) - {6}",
                                    i + 1,
                                    data[i].date.Substring(6, 2), // Day
                                    data[i].date.Substring(4, 2), // Month
                                    data[i].date.Substring(0, 4), // Year
                                    data[i].description,
                                    data[i].category,
                                    data[i].amount.ToString("N2"));
                            }
                        }
                    }
                    break;

                case "3": //search
                    Console.Write("Enter part of the description or category: ");
                    string search = Console.ReadLine().ToUpper();
                    bool found = false;
                    for (int i = 0; i < amountOfData; i++)
                    {
                        if (data[i].description.ToUpper().Contains(search)
                                || data[i].category.ToUpper().Contains(search))
                        {
                            Console.WriteLine("{0}: {1} - {2}",
                                i + 1,
                                data[i].date,
                                data[i].description);
                            // TODO: Split in sixth space
                            found = true;
                        }
                    }
                    if (!found)
                        Console.WriteLine("Not found!");
                    break;

                case "4":  // modify
                    Console.Write("Enter the record number: ");
                    int recNumber = Convert.ToInt32(Console.ReadLine()) - 1;

                    if ((recNumber > amountOfData) || (recNumber < 0))
                        Console.Write("Out of range!");
                    else
                    {
                        Console.Write("Date (was {0}; hit ENTER to leave as is): ",
                            data[recNumber].date);
                        string newText = Console.ReadLine();
                        if (newText != "")
                            data[recNumber].date = newText;

                        Console.Write("Description (was {0}; hit ENTER to leave as is): ",
                            data[recNumber].description);
                        newText = Console.ReadLine();
                        if (newText != "")
                            data[recNumber].description = newText;

                        Console.Write("Category (was {0}; hit ENTER to leave as is): ",
                            data[recNumber].category);
                        newText = Console.ReadLine();
                        if (newText != "")
                            data[recNumber].category = newText;

                        Console.Write("Amount (was {0}; hit ENTER to leave as is): ",
                            data[recNumber].amount);
                        newText = Console.ReadLine();
                        if (newText != "")
                            data[recNumber].amount = Convert.ToDouble(newText);
                    }
                    break;

                case "5": //delete
                    int position = 0;
                    Console.Write("Enter the position number to delete: ");
                    position = Convert.ToInt32(Console.ReadLine()) - 1;
                    if (position > amountOfData)
                        Console.WriteLine("Error: out of range");
                    else
                    {
                        // TODO: Ask for confirmation
                        for (int i = position; i < amountOfData; i++)
                            data[i] = data[i + 1];
                        amountOfData--;
                    }
                    break;

                case "6": // Sort
                    accountData aux;
                    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];
                                data[i] = data[j];
                                data[j] = aux;
                            }
                        }
                    }
                    Console.WriteLine("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 == data[i].description.ToUpper())
                            data[i].description = data[i].description.Substring(0, 1).ToUpper()
                                + data[i].description.Substring(1).ToLower();
                    }
                    break;

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

                default:
                    Console.WriteLine("Wrong option!");
                    break;
            }
        } while (repeat != false);
        Console.WriteLine("Bye!");
    }
}