Menu
Coddy logo textTech

Poniéndolo todo junto

Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 25 de 68.

challenge icon

Desafío

Fácil

Es hora de terminar tu aplicación de lista de tareas. En este último paso reúnes todo lo de las lecciones anteriores: la estructura Task, addTask, viewAllTasks, completeTask y removeTask, controlados mediante una sesión de acciones de menú.

Recibirás tres entradas:

  • Una cadena con el nombre de la aplicación y el nombre del usuario separados por una coma (por ejemplo, "MyTasks,Alice")
  • Una cadena con las tareas con las que comienza la lista, en el formato "name1:status1,name2:status2", donde el estado es "true" o "false" (por ejemplo, "Write report:false,Call dentist:true"). Esta línea está vacía cuando la lista comienza vacía.
  • Una cadena con las acciones de la sesión, separadas por comas. Una acción es su nombre por sí solo, o su nombre y un parámetro unidos por | (por ejemplo, "add|Buy groceries,view,complete|2,remove|0,exit"). La lista de acciones siempre termina con "exit".

Los nombres de las tareas contienen espacios, así que lee las tres líneas con bufio.Scanner, como en las lecciones anteriores.

Tu tarea consiste en:

  1. Definir la misma estructura Task con los campos Name (string) y Completed (bool)
  2. Recuperar las cuatro funciones que ya escribiste, con las mismas firmas:
    • addTask(tasks []Task, taskName string) []Task
    • viewAllTasks(tasks []Task), que imprime "[x] [task_name]" para una tarea completada y "[ ] [task_name]" para una que todavía está abierta
    • completeTask(tasks *[]Task, index int)
    • removeTask(tasks []Task, index int) []Task
  3. Construir la lista inicial a partir de la segunda entrada, recordando que una línea vacía significa una lista vacía
  4. Imprimir el mensaje de bienvenida y el menú, exactamente como en el primer paso del proyecto:
    • "Welcome to [app_name], [user_name]!"
    • "1. Add Task"
    • "2. View Tasks"
    • "3. Complete Task"
    • "4. Remove Task"
    • "5. Exit"
    • "Current tasks: [count]"
  5. Ejecutar las acciones en orden. Cada acción imprime primero su encabezado:
    • "add": imprimir "--- ADD TASK ---", añadir la tarea indicada por el parámetro y después imprimir "Task '[task_name]' added!"
    • "view": imprimir "--- VIEW TASKS ---", listar cada tarea con viewAllTasks y después imprimir la línea de resumen
    • "complete": imprimir "--- COMPLETE TASK ---", marcar la tarea en ese índice y después imprimir "Task '[task_name]' marked as completed!"
    • "remove": imprimir "--- REMOVE TASK ---", eliminar la tarea en ese índice y después imprimir "Task '[task_name]' removed successfully!"
    • "exit": imprimir "--- EXIT ---", después "Final list:", luego la lista completa, después la línea de resumen y, finalmente, "Goodbye, [user_name]!". No se ejecuta nada después de exit.
  6. Los índices comienzan en 0, como en las lecciones anteriores. Cuando un índice de "complete" o "remove" está fuera de la lista, imprime "Invalid task number" en su lugar y deja la lista sin cambios.
  7. La línea de resumen es la que ya conoces: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Usa el paquete strings para dividir las líneas de entrada y el paquete strconv para convertir un índice en un número. Este paso final muestra cómo las pequeñas funciones que escribiste una a una se combinan para formar un programa funcional.

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Task struct {
	Name      string
	Completed bool
}

// TODO: Bring back addTask, viewAllTasks, completeTask and removeTask
// de las lecciones anteriores de este proyecto

func main() {
	// Crear scanner para leer líneas de entrada
	scanner := bufio.NewScanner(os.Stdin)

	// Leer el nombre de la aplicación y el nombre del usuario
	scanner.Scan()
	names := scanner.Text()

	// Leer las tareas con las que comienza la lista
	scanner.Scan()
	taskData := scanner.Text()

	// Leer las acciones de la sesión
	scanner.Scan()
	actionData := scanner.Text()

	// TODO: Completar la implementación
	// 1. Dividir names en "," para obtener el nombre de la app y el nombre del usuario
	// 2. Construir el slice inicial de tareas a partir de taskData
	// 3. Imprimir el mensaje de bienvenida, el menú y el conteo actual de tareas
	// 4. Ejecutar cada acción en actionData en orden, imprimiendo su encabezado primero
}

Todas las lecciones de Lógica y Flujo

Practica por tu cuenta: Compilador de Go online