Menu
Coddy logo textTech

Completar una tarea

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

challenge icon

Desafío

Fácil

En esta parte de tu sistema de gestión de tareas, implementarás la capacidad de marcar tareas como completadas. Este desafío se centra en el uso de receptores puntero para modificar los datos originales de la tarea, demostrando cómo los punteros permiten actualizar permanentemente los campos de una estructura.

Nota importante: Como los nombres de las tareas pueden contener espacios (como "Buy groceries"), tendrás que usar bufio.Scanner para leer líneas de entrada completas. La función fmt.Scanf deja de leer en el primer espacio, lo que afectaría a los nombres de tareas que contienen espacios. Usa bufio.NewScanner(os.Stdin) y llama a scanner.Scan() seguido de scanner.Text() para leer líneas completas.

Recibirás tres entradas:

  • Una cadena que representa el número de tareas (por ejemplo, "4")
  • Una cadena que contiene los datos de las tareas con el formato: "name1:status1,name2:status2,name3:status3", donde el estado es "true" o "false" (por ejemplo, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Una cadena que representa el índice de la tarea que se completará (por ejemplo, "2" para la tercera tarea, usando indexación basada en 0)

Tu tarea consiste en:

  1. Definir la misma estructura Task de desafíos anteriores, con los campos Name (string) y Completed (bool)
  2. Crear una función llamada completeTask que reciba como parámetros un puntero a un slice de estructuras Task y un índice (int)
  3. Dentro de la función completeTask, modificar el campo Completed de la tarea que se encuentra en el índice indicado para que tenga el valor true
  4. Usar bufio.Scanner para leer correctamente las líneas de entrada:
    • Crear un scanner: scanner := bufio.NewScanner(os.Stdin)
    • Para cada línea de entrada: llamar a scanner.Scan() y después a scanner.Text()
    • Esto garantiza que los nombres de tareas con espacios se lean correctamente
  5. Analizar los datos de las tareas de la segunda entrada para crear tu slice de tareas:
    • Dividir la entrada por comas para obtener las entradas individuales de las tareas
    • Para cada entrada, dividir por dos puntos para separar el nombre y el estado
    • Convertir la cadena del estado en un booleano ("true" se convierte en true, "false" se convierte en false)
  6. Convertir la cadena de la tercera entrada en un entero para obtener el índice de la tarea
  7. Llamar a tu función completeTask con un puntero a tu slice y el índice
  8. Después de completar la tarea, mostrar todas las tareas usando el mismo formato del desafío anterior:
    • Para las tareas completadas: "[x] [task_name]"
    • Para las tareas incompletas: "[ ] [task_name]"
  9. Imprimir un mensaje de confirmación: "Task '[task_name]' marked as completed!"
  10. Imprimir el resumen actualizado: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Usa el paquete strconv para convertir la cadena del índice en un entero. Este desafío demuestra cómo los receptores puntero permiten modificar la estructura de datos original, realizando cambios permanentes en tu lista de tareas que persisten después de que la función retorna.

Pruébalo tú mismo

package main

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

type Task struct {
	Name      string
	Completed bool
}

func viewAllTasks(tasks []Task) {
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
}

func main() {
	var numTasksStr string
	fmt.Scanln(&numTasksStr)
	numTasks, _ := strconv.Atoi(numTasksStr)

	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	taskData := scanner.Text()

	var tasks []Task
	taskEntries := strings.Split(taskData, ",")

	for _, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			completed, _ := strconv.ParseBool(parts[1])
			task := Task{
				Name:      name,
				Completed: completed,
			}
			tasks = append(tasks, task)
		}
	}

	viewAllTasks(tasks)

	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			completedCount++
		}
	}

	incompleteCount := numTasks - completedCount
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, completedCount, incompleteCount)
}

Todas las lecciones de Lógica y Flujo

Practica por tu cuenta: Compilador de Go online