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 de punteros para modificar los datos originales de la tarea, demostrando cómo los punteros te permiten actualizar los campos de una estructura de forma permanente.

Nota importante: Dado que los nombres de las tareas pueden contener espacios (como "Buy groceries"), deberás usar bufio.Scanner para leer líneas completas de entrada. La función fmt.Scanf deja de leer en el primer espacio, lo que rompería los nombres de las tareas con 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 la tarea en 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 a completar (por ejemplo, "2" para la tercera tarea, utilizando indexación basada en 0)

Tu tarea es:

  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 tome un puntero a un slice de estructuras Task y un índice (int) como parámetros
  3. Dentro de la función completeTask, modifica el campo Completed de la tarea en el índice dado a true
  4. Usa bufio.Scanner para leer las líneas de entrada correctamente:
    • Crea un escáner: scanner := bufio.NewScanner(os.Stdin)
    • Para cada línea de entrada: llama a scanner.Scan() y luego a scanner.Text()
    • Esto asegura que los nombres de las tareas con espacios se lean correctamente
  5. Analiza los datos de la tarea de la segunda entrada para crear tu slice de tareas:
    • Divide la entrada por comas para obtener las entradas de tareas individuales
    • Para cada entrada, divídela por dos puntos para separar el nombre y el estado
    • Convierte la cadena de estado a un booleano ("true" se convierte en true, "false" se convierte en false)
  6. Convierte la tercera cadena de entrada a un entero para obtener el índice de la tarea
  7. Llama a tu función completeTask con un puntero a tu slice y el índice
  8. Después de completar la tarea, muestra todas las tareas usando el mismo formato que el desafío anterior:
    • Para tareas completadas: "[x] [task_name]"
    • Para tareas incompletas: "[ ] [task_name]"
  9. Imprime un mensaje de confirmación: "Task '[task_name]' marked as completed!"
  10. Imprime 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 de punteros te 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