Cuentas Del Hogar - Ejercicio De Programacion C# Sharp

Este ejercicio en C# consiste en crear un programa que pueda almacenar hasta 10000 costos e ingresos, para crear un pequeño sistema de contabilidad doméstica. Para cada gasto (o ingreso), se debe permitir guardar la siguiente información: • Fecha (8 caracteres: formato YYYYMMDD).
• Descripción del gasto o ingreso.
Categoría.
• Importe (si es positivo es ingreso, negativo si es un gasto).
El programa debe permitir al usuario realizar las siguientes operaciones:

1 - Agregar un nuevo gasto (la fecha debe "parecer correcta": días de 01 a 31, meses de 01 a 12, año entre 1000 y 3000). La descripción no puede estar vacía. No es necesario validar los otros datos.
2 - Mostrar todos los gastos de una categoría determinada (por ejemplo, "estudios") entre dos fechas determinadas (por ejemplo, entre "20110101" y "20111231"). Se debe mostrar el número, la fecha (formato DD/MM/YYYY), la descripción, la categoría entre paréntesis y el importe con dos decimales, todo en la misma línea, separado por guiones. Al final de todos los datos, se debe mostrar el importe total de los datos mostrados.
3 - Buscar gastos que contengan un cierto texto (en la descripción o en la categoría, sin distinguir mayúsculas y minúsculas). Se debe mostrar el número, la fecha y la descripción (mostrando la descripción truncada a 6 espacios si hay más).
4 - Modificar un registro (se pedirá el número de registro, se mostrarán los valores anteriores de cada campo y el usuario podrá presionar Enter para no modificar ningún dato). El usuario debe ser advertido (pero no preguntado nuevamente) si ingresa un número de registro incorrecto. No es necesario validar los datos.
5 - Eliminar algunos datos, desde el número indicado por el usuario. El usuario debe ser advertido (pero no preguntado nuevamente) si ingresa un número de registro incorrecto. Se debe mostrar el registro antes de eliminarlo y se debe pedir confirmación antes de la eliminación.
6 - Ordenar los datos alfabéticamente por fecha y (si las fechas coinciden) por descripción.
7 - Normalizar las descripciones: eliminar los espacios finales, los espacios y las coincidencias espejo. Si una descripción está completamente en mayúsculas, se debe convertir a minúsculas (excepto la primera letra, que debe permanecer en mayúsculas).
T - Finalizar el uso de la aplicación (ya que almacenamos los datos, estos se perderán).

 Categoría

Matrices, Estructuras y Cadenas

 Ejercicio

Cuentas Del Hogar

 Objectivo

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).

 Ejemplo Ejercicio C#

 Copiar Código C#
using System;
using System.Collections.Generic;
using System.Linq;

namespace HouseholdAccounts
{
    class Program
    {
        // Create a structure to store cost/revenue information
        struct AccountEntry
        {
            public string Date;         // Date in YYYYMMDD format
            public string Description;  // Description of the expense or income
            public string Category;     // Category of the expense or income
            public decimal Amount;      // Amount (positive for income, negative for expense)
        }

        static List accountEntries = new List(); // List to store all account entries

        static void Main(string[] args)
        {
            bool running = true; // Variable to control the main loop

            while (running) // Main loop to keep the program running
            {
                Console.WriteLine("\nChoose an option:"); // Display menu options
                Console.WriteLine("1 - Add new expense");
                Console.WriteLine("2 - Show expenses by category");
                Console.WriteLine("3 - Search costs by text");
                Console.WriteLine("4 - Modify record");
                Console.WriteLine("5 - Delete data");
                Console.WriteLine("6 - Sort data");
                Console.WriteLine("7 - Normalize descriptions");
                Console.WriteLine("T - End application");

                string choice = Console.ReadLine().ToUpper(); // Read user input and convert it to uppercase

                switch (choice) // Switch based on user choice
                {
                    case "1": // Add a new entry
                        // Ask user for date, description, category, and amount
                        Console.WriteLine("Enter the date (YYYYMMDD):");
                        string date = Console.ReadLine();

                        // Validate the date format (it should be YYYYMMDD, a valid date)
                        DateTime validDate;
                        while (!DateTime.TryParseExact(date, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out validDate))
                        {
                            Console.WriteLine("Invalid date. Please enter in the format YYYYMMDD:");
                            date = Console.ReadLine();
                        }

                        // Ask for description
                        Console.WriteLine("Enter description:");
                        string description = Console.ReadLine();
                        while (string.IsNullOrEmpty(description))
                        {
                            Console.WriteLine("Description cannot be empty. Please enter a description:");
                            description = Console.ReadLine();
                        }

                        // Ask for category
                        Console.WriteLine("Enter category:");
                        string category = Console.ReadLine();

                        // Ask for amount
                        Console.WriteLine("Enter amount (positive for income, negative for expense):");
                        decimal amount = Convert.ToDecimal(Console.ReadLine());

                        // Create a new account entry and add it to the list
                        AccountEntry entry = new AccountEntry
                        {
                            Date = date,
                            Description = description,
                            Category = category,
                            Amount = amount
                        };
                        accountEntries.Add(entry); // Add the entry to the list
                        break;

                    case "2": // Show expenses by category
                        Console.WriteLine("Enter start date (YYYYMMDD):");
                        string startDate = Console.ReadLine();

                        Console.WriteLine("Enter end date (YYYYMMDD):");
                        string endDate = Console.ReadLine();

                        // Filter the list by date range
                        var filteredEntries = accountEntries.Where(e =>
                            string.Compare(e.Date, startDate) >= 0 && string.Compare(e.Date, endDate) <= 0).ToList();

                        Console.WriteLine("Enter category:");
                        string categoryFilter = Console.ReadLine();

                        // Filter by category
                        filteredEntries = filteredEntries.Where(e => e.Category.Equals(categoryFilter, StringComparison.OrdinalIgnoreCase)).ToList();

                        // Display the filtered records
                        decimal totalAmount = 0;
                        int count = 1;
                        foreach (var entryInList in filteredEntries) // Changed variable name to avoid conflict
                        {
                            // Format and display each entry
                            Console.WriteLine($"{count} - {entryInList.Date.Substring(6, 2)}/{entryInList.Date.Substring(4, 2)}/{entryInList.Date.Substring(0, 4)} - {entryInList.Description} - ({entryInList.Category}) - {entryInList.Amount:F2}");
                            totalAmount += entryInList.Amount;
                            count++;
                        }
                        Console.WriteLine($"Total amount: {totalAmount:F2}");
                        break;

                    case "3": // Search costs by text
                        Console.WriteLine("Enter text to search:");
                        string searchText = Console.ReadLine().ToLower();

                        // Find entries that match the search text in either description or category (case insensitive)
                        var searchResults = accountEntries.Where(e =>
                            e.Description.ToLower().Contains(searchText) || e.Category.ToLower().Contains(searchText)).ToList();

                        if (searchResults.Count == 0)
                        {
                            Console.WriteLine("No records found.");
                        }
                        else
                        {
                            int searchCount = 1;
                            foreach (var entryInList in searchResults) // Changed variable name to avoid conflict
                            {
                                // Display the result with description truncated if necessary
                                string descriptionSearch = entryInList.Description.Length > 50 ? entryInList.Description.Substring(0, 50) + "..." : entryInList.Description;
                                Console.WriteLine($"{searchCount} - {entryInList.Date.Substring(6, 2)}/{entryInList.Date.Substring(4, 2)}/{entryInList.Date.Substring(0, 4)} - {descriptionSearch}");
                                searchCount++;
                            }
                        }
                        break;

                    case "4": // Modify a record
                        Console.WriteLine("Enter the record number to modify:");
                        int recordNumber = Convert.ToInt32(Console.ReadLine()) - 1;

                        if (recordNumber < 0 || recordNumber >= accountEntries.Count)
                        {
                            Console.WriteLine("Invalid record number.");
                            break;
                        }

                        // Show current values for modification
                        AccountEntry modifyEntry = accountEntries[recordNumber];
                        Console.WriteLine($"Current values: Date: {modifyEntry.Date}, Description: {modifyEntry.Description}, Category: {modifyEntry.Category}, Amount: {modifyEntry.Amount}");

                        // Modify each field
                        Console.WriteLine("Enter new date (or press Enter to keep current):");
                        string newDate = Console.ReadLine();
                        if (!string.IsNullOrEmpty(newDate)) modifyEntry.Date = newDate;

                        Console.WriteLine("Enter new description (or press Enter to keep current):");
                        string newDescription = Console.ReadLine();
                        if (!string.IsNullOrEmpty(newDescription)) modifyEntry.Description = newDescription;

                        Console.WriteLine("Enter new category (or press Enter to keep current):");
                        string newCategory = Console.ReadLine();
                        if (!string.IsNullOrEmpty(newCategory)) modifyEntry.Category = newCategory;

                        Console.WriteLine("Enter new amount (or press Enter to keep current):");
                        string newAmount = Console.ReadLine();
                        if (!string.IsNullOrEmpty(newAmount)) modifyEntry.Amount = Convert.ToDecimal(newAmount);

                        // Save the modified entry
                        accountEntries[recordNumber] = modifyEntry;
                        break;

                    case "5": // Delete data
                        Console.WriteLine("Enter start record number to delete:");
                        int startRecord = Convert.ToInt32(Console.ReadLine()) - 1;

                        Console.WriteLine("Enter end record number to delete:");
                        int endRecord = Convert.ToInt32(Console.ReadLine()) - 1;

                        if (startRecord < 0 || endRecord >= accountEntries.Count || startRecord > endRecord)
                        {
                            Console.WriteLine("Invalid record numbers.");
                            break;
                        }

                        // Confirm deletion of records
                        for (int i = startRecord; i <= endRecord; i++)
                        {
                            Console.WriteLine($"Are you sure you want to delete record {i + 1}? (Y/N)");
                            string confirmation = Console.ReadLine().ToUpper();
                            if (confirmation == "Y")
                            {
                                accountEntries.RemoveAt(i);
                                i--; // Adjust for removed entry
                            }
                        }
                        break;

                    case "6": // Sort data
                        var sortedEntries = accountEntries.OrderBy(e => e.Date).ThenBy(e => e.Description).ToList();

                        // Display sorted entries
                        int sortedCount = 1;
                        foreach (var entryInList in sortedEntries) // Changed variable name to avoid conflict
                        {
                            Console.WriteLine($"{sortedCount} - {entryInList.Date.Substring(6, 2)}/{entryInList.Date.Substring(4, 2)}/{entryInList.Date.Substring(0, 4)} - {entryInList.Description} - ({entryInList.Category}) - {entryInList.Amount:F2}");
                            sortedCount++;
                        }
                        break;

                    case "7": // Normalize descriptions
                        for (int i = 0; i < accountEntries.Count; i++) // Use a for loop to modify the list directly
                        {
                            var entryInList = accountEntries[i]; // Get the entry at index i

                            string normalizedDescription = entryInList.Description.Trim();
                            if (normalizedDescription.ToUpper() == normalizedDescription)  // If the description is all uppercase
                            {
                                normalizedDescription = char.ToUpper(normalizedDescription[0]) + normalizedDescription.Substring(1).ToLower();
                            }

                            // Update the description in the entry
                            accountEntries[i] = new AccountEntry
                            {
                                Date = entryInList.Date,
                                Description = normalizedDescription,
                                Category = entryInList.Category,
                                Amount = entryInList.Amount
                            };
                        }
                        break;

                    case "T": // End application
                        running = false;
                        break;

                    default:
                        Console.WriteLine("Invalid option."); // Handle invalid input
                        break;
                }
            }
        }
    }
}

 Salida

Choose an option:
1 - Add new expense
2 - Show expenses by category
3 - Search costs by text
4 - Modify record
5 - Delete data
6 - Sort data
7 - Normalize descriptions
T - End application
1
Enter the date (YYYYMMDD):
1999/01/01
Invalid date. Please enter in the format YYYYMMDD:
19990101
Enter description:
Yogurt
Enter category:
lact
Enter amount (positive for income, negative for expense):
10

Choose an option:
1 - Add new expense
2 - Show expenses by category
3 - Search costs by text
4 - Modify record
5 - Delete data
6 - Sort data
7 - Normalize descriptions
T - End application
2
Enter start date (YYYYMMDD):
19990101
Enter end date (YYYYMMDD):
19990101
Enter category:
lact
1 - 01/01/1999 - Yogurt - (lact) - 10.00
Total amount: 10.00

Choose an option:
1 - Add new expense
2 - Show expenses by category
3 - Search costs by text
4 - Modify record
5 - Delete data
6 - Sort data
7 - Normalize descriptions
T - End application
[ConsoleInputLine_10]

 Comparte este Ejercicio C# Sharp

 Más Ejercicios de Programacion C# Sharp de Matrices, Estructuras y Cadenas

¡Explora nuestro conjunto de ejercicios de programación C# Sharp! Estos ejercicios, diseñados específicamente para principiantes, te ayudarán a desarrollar una sólida comprensión de los conceptos básicos de C#. Desde variables y tipos de datos hasta estructuras de control y funciones simples, cada ejercicio está diseñado para desafiarte de manera gradual a medida que adquieres confianza en la codificación en C#.

  •  Matriz inversa

    En este ejercicio en C#, se te pide escribir un programa que pida al usuario 5 números, los almacene en un arreglo y los muestre en orden inverso.

  •  Buscar en matriz

    En este ejercicio en C#, se te solicita escribir un programa que determine si un dato pertenece a una lista que fue previamente creada. Los pasos a segui...

  •  Matriz de números pares

    En este ejercicio en C#, se te pide escribir un programa que solicite al usuario 10 números enteros e imprima aquellos que sean pares. Este...

  •  Matriz de números positivos y negativos

    En este ejercicio en C#, se te solicita escribir un programa que pida al usuario ingresar 10 números reales y luego muestre el promedio de los números positivo...

  •  Muchos números y suma

    En este ejercicio en C#, se te solicita escribir un programa que pida al usuario ingresar varios números (hasta que ingrese la palabra "end") y luego muestre l...

  •  Matriz bidimensional

    En este ejercicio en C#, se te pide escribir un programa que solicite las calificaciones de 20 alumnos (2 grupos de 10, utilizando un arreglo bidimensional) y ...