Café y Código

13. Proyecto - Agenda de Contactos 📱

Objetivo del proyecto

Vamos a crear una agenda de contactos en consola que aplique todo lo aprendido: data classes, colecciones mutables, bucles, when, funciones y null safety.

Paso 1: Modelo de datos

Creamos la data class que representa un contacto:

modelos.kt
KOTLIN
1 data class Contacto(
2 val id: Int,
3 val nombre: String,
4 val telefono: String,
5 val email: String?
6 )

Paso 2: Lista de contactos

Usamos mutableListOf para almacenar contactos:

operaciones.kt
KOTLIN
1 val contactos = mutableListOf<Contacto>()
2 var nextId = 1
3
4 fun agregarContacto(nombre: String, telefono: String, email: String?) {
5 contactos.add(Contacto(nextId++, nombre, telefono, email))
6 }
7
8 fun eliminarContacto(id: Int) {
9 val eliminado = contactos.removeAll { it.id == id }
10 if (eliminado) println("Contacto eliminado")
11 else println("No se encontró el contacto")
12 }
13
14 fun buscarContacto(nombre: String): List<Contacto> {
15 return contactos.filter {
16 it.nombre.contains(nombre, ignoreCase = true)
17 }
18 }

Paso 3: Menú interactivo

Un bucle while con when para el menú:

agenda.kt
KOTLIN
1 fun mostrarMenu() {
2 println("\n=== AGENDA DE CONTACTOS ===")
3 println("1. Agregar contacto")
4 println("2. Listar contactos")
5 println("3. Buscar contacto")
6 println("4. Eliminar contacto")
7 println("0. Salir")
8 print("Elige una opción: ")
9 }
10
11 fun main() {
12 val contactos = mutableListOf<Contacto>()
13 var nextId = 1
14
15 do {
16 mostrarMenu()
17 val opcion = readLine() ?: "0"
18
19 when (opcion) {
20 "1" -> {
21 print("Nombre: ")
22 val nombre = readLine() ?: ""
23 print("Teléfono: ")
24 val tel = readLine() ?: ""
25 print("Email (opcional): ")
26 val email = readLine()?.ifEmpty { null }
27 contactos.add(Contacto(nextId++, nombre, tel, email))
28 println("Contacto agregado!")
29 }
30 "2" -> {
31 if (contactos.isEmpty()) {
32 println("No hay contactos")
33 } else {
34 contactos.forEach { c ->
35 println("${c.id}. ${c.nombre} | ${c.telefono} | ${c.email ?: "sin email"}")
36 }
37 }
38 }
39 "3" -> {
40 print("Buscar nombre: ")
41 val busqueda = readLine() ?: ""
42 val encontrados = contactos.filter {
43 it.nombre.contains(busqueda, ignoreCase = true)
44 }
45 encontrados.forEach { println(it) }
46 if (encontrados.isEmpty()) println("No se encontraron contactos")
47 }
48 "4" -> {
49 print("ID a eliminar: ")
50 val id = readLine()?.toIntOrNull()
51 if (id != null) {
52 val eliminado = contactos.removeAll { it.id == id }
53 if (eliminado) println("Eliminado") else println("No encontrado")
54 } else {
55 println("ID inválido")
56 }
57 }
58 "0" -> println("¡Hasta luego!")
59 else -> println("Opción inválida")
60 }
61 } while (opcion != "0")
62 }

🟣 Reto extra

Agrega una opción "5. Exportar contactos" que imprima todos los contactos en formato CSV (nombre,telefono,email).

Pon a prueba tu proyecto

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.