ejercicios

Ejercicios de programación para Android

Resumen: en este post te muestro y recopilo algunos ejercicios para programar el desarrollo de aplicaciones móviles con Android y Java.

Estos ejercicios propuestos son para practicar y mejorar las habilidades de programación en Java para Android.

Problemas y ejercicios de programación para Android usando Java

Estos ejercicios prácticos están resueltos, pero no te preocupes, si quieres puedes intentar resolverlos y ver la solución más tarde.

Continue reading…

Cómo saber si un número es narcisista en Python

Introducción

Hoy veremos cómo implementar un algoritmo para saber si un entero es narcisista usando el lenguaje de programación Python.

Número narcisista en Python

Número narcisista en Python

Si no sabes cómo funciona este algoritmo o qué cosa es un número narcisista, te recomiendo leer esto.

Por cierto, recuerda que debes tener instalado el intérprete de Python. Si no sabes cómo, mira cómo instalar Python 3 y ponerlo en la PATH.

Continue reading…

Solución a algoritmo para determinar número narcisista en muchos lenguajes

Introducción

Función esNarcisista en CPP

Función esNarcisista en CPP

Un número narcisista es aquel que es igual a la suma de cada uno de sus dígitos elevados a la “n” potencia (donde “n” es el número de cifras del número). La metáfora de su nombre alude a lo mucho que parecen “quererse a sí mismos” estas cifras. Por ejemplo, el 153 es un número narcisista puesto que 13 + 53 + 33 = 1 + 125 + 27 = 153. Los primeros números narcisistas son: 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474 y 54748.

Fuente: Muy interesante

Solución al algoritmo para determinar si tenemos un número narcisista

Pero bueno, no vamos a ver la definición de un número narcisista porque si vienes buscando el algoritmo significa que ya sabes lo que es. Pues bien, aquí pondré la solución al algoritmo (que al final de cuentas es muy simple) en múltiples lenguajes de programación.

Si quieres que resuelva el algoritmo en otro lenguaje de programación eres libre de dejar un comentario 🙂

Algoritmo

Sin importar el lenguaje de programación, lo que tenemos que hacer es tomar la longitud del número. Esa longitud será a la que elevaremos cada cifra.

Luego recorremos todo el número, tomamos una cifra, la elevamos a la potencia mencionada anteriormente y el resultado lo vamos sumando a otra variable.

Al final comprobamos si la suma y el número que recibimos son iguales; en caso de que sí entonces el número es narcisista.

Soluciones

Por cierto, he puesto mi mayor esfuerzo para solucionar este ejercicio. Sin embargo no prometo que sean los métodos más rápidos (hablando de rendimiento en milisegundos y esas cosas); puede haber mejores. Lo que sí prometo es que:

  • Los algoritmos funcionan perfectamente y resuelven el problema
  • Siguen las mejores prácticas para que sean entendibles por seres humanos

Dicho esto, aquí está la lista.

  1. Número narcisista en JavaScript
  2. Número narcisista en C#
  3. Algoritmo programado en el lenguaje de programación C++
  4. Ejercicio resuelto en PHP
  5. Solución en Java
  6. Determinarlo con Go & Golang
  7. Algoritmo en Python
  8. Número narcisista en Rust

Recuerda que puedes pedir la implementación en otro lenguaje usando los comentarios.

Tablas de multiplicar en Go

Introducción

Recordando mis primeros ejercicios de programación, en alguna ocasión tuve que imprimir las tablas de multiplicar de diferentes maneras.

Una de ellas era pedir cuál tabla quería ver, y entonces se imprimía. Por ejemplo, si el usuario decía que quería la tabla del 5, entonces se imprimía 5 x 1 = 5…. hasta 5 x 10.

En otro ejercicio, se pedía hasta cuál tabla se quería ver. Por ejemplo, si el usuario quería hasta la tabla del 3, entonces imprimíamos la tabla del 1, luego la del 2 y finalmente la del 3.

Hoy veremos cómo hacer esos dos sencillos pero reconfortantes y nunca olvidados ejercicios.

Tabla de multiplicar en donde el usuario elige cuál desea ver

Comencemos con este problema, en donde el usuario elige y nosotros imprimimos la tabla. Quedaría así:

Hacemos un for que va desde 1 hasta 10. Ya que la condición dice que el ciclo se ejecute siempre y cuando el número sea menor o igual que 10. Cuando sea 11, ya no valdrá, así que sólo llega al 10.

Dentro del ciclo, asignamos el resultado de multiplicar el número en el que vamos (1, 2, 3… hasta 10) por la tabla (lo que introduce el usuario). Finalmente lo imprimimos y listo.

Ejecución del programa

Así se ve, por ejemplo, la tabla del 7:

Tablas de multiplicar hasta donde el usuario elija

Ahora vamos a imprimir muchas tablas, el límite lo pondrá el usuario. Es decir, primero será la tabla del 1, luego la del 2 y así hasta donde el usuario quiera. Queda así:

Ahora el usuario nos da el límite, y la tabla es parte del ciclo. Tenemos un ciclo dentro de otro. El primero se encarga de ir tabla por tabla, y el segundo imprime del 1 al 10 multiplicados por la tabla.

Ejecución

Así se ve al ejecutarse:

Más ejercicios resueltos de MySQL: Combinando funciones

Introducción

Esta es la tercera parte de unos posts que vengo escribiendo sobre ejercicios propuestos de MySQL. Ahora veremos cómo combinar algunas funciones que vimos en los otros tutoriales. Son pocos, pero al principio son difíciles.

Ejercicios con solución

Tabla

Recordemos que vamos a estar utilizando esta tabla para todos los ejercicios:

Nota: no es la misma tabla que antes, ya que a ésta la hemos modificado de tal manera que a algunos usuarios se les asignó un segundo nombre, mismo que será de utilidad para los ejercicios.

Una vez dicho eso, vamos allá.

Listar el primer nombre de todos los usuarios

Seleccionar el primer nombre de los usuarios. En caso de que tengan sólo un nombre lo seleccionamos. En caso de que tengan dos, seleccionamos el primero. Casos de uso:

JOSE RAÚL => JOSE

OSCAR => OSCAR

Solución

Utilizamos INSTR, que devuelve la posición que tiene una subcadena dentro de una cadena. Recordemos que si dicha subcadena no se encuentra, el resultado al llamar la función es 0. Sabiendo esto, utilizamos IF para ver si la posición es 0.

Si la posición es 0, significa que no había espacios; es decir, que la persona sólo tiene un nombre. En caso de que no sea 0, cortamos la cadena con LEFT.

Listar el segundo nombre de los usuarios, y listar el primero en caso de que no lo tengan

Ahora hagamos lo contrario si así se le puede llamar. Listar el segundo nombre del usuario en caso de que éste tenga, y si no, pues listamos sólo el primero. Los casos de uso:

JOSE RAÚL => RAÚL

OSCAR => OSCAR

PD: ya sé que JOSÉ lleva acento pero así estaba en la base de datos y me dio pereza arreglarlo; además, no afecta.

Rápidamente nuestra mente nos traicionará y dirá: cambia sólo LEFT por RIGHT en la consulta anterior, y listo.

Pero no, no es así. Esto requiere un poco más de concentración. Si sólo cortamos con RIGHT desde donde está el espacio, cortará la cadena “invertida” y nos dará un nombre como “E RAÚL” (suponiendo que es JOSE RAÚL).

Recordemos que LEFT funcionó porque comienza a contar caracteres al igual que INSTR. Es decir, ambos cuentan desde la izquierda. Así que si usamos el mismo índice para ambos todo irá bien. En cambio, RIGHT comienza a contar desde la derecha.

La solución es simple, utilizamos RIGHT pero lo combinamos con CHAR_LENGTH para que reste la posición del índice.

Queda así:

Otra solución

La solución que utiliza RIGHT con CHAR_LENGTH fue la que se me ocurrió a mí, pero siempre hay muchas formas de hacer las cosas. Un amigo lo hizo con MID y a mi parecer quedó más elegante. Aquí dejo la consulta:

Listar los nombres de los usuarios que comiencen con una letra vocal

Para esto utilizamos LIKE y el comodín %, dicho comodín quiere decir “cualquier cosa” así que con que comiencen con A, E, I, O, U y terminen con lo que sea estarán bien.

Listar los nombres de los usuarios que finalicen con una letra vocal

Utilizamos de nuevo el comodín % pero ahora al revés, de manera que al principio tengan cualquier cosa pero que siempre terminen con alguna vocal.

Listar los nombres de los usuarios que tengan la letra A u O intermedias

Ahora utilizamos el comodín pero 2 veces, así: %%. De esta forma indicamos que pueden tener lo que sea a la izquierda así como a la derecha, mientras tengan la letra mencionada en alguna parte del centro.

Listar los nombres de los usuarios que no utilicen correo electrónico de Microsoft (Outlook, Hotmail, live)

Para terminar, usamos un NOT combinado con LIKE.  Los utilizamos 3 veces para descartar opciones de outlook, hotmail  y live.

Conclusión

Con esos ejercicios terminamos hoy.

Aquí hay más:

Ejercicios resueltos de consultas con MySQL

Ejercicios resueltos con MySQL: Funciones de cadena, UPDATE y DELETE

Ejercicios resueltos de consultas con MySQL

Introducción

Este es otro post en donde simplemente me dedico a resolver ejercicios, nada de tutoriales. Sólo explico el problema y resuelvo todo lo que se tenga que hacer.

En este caso resolveremos ejercicios de consultas SQL usando el SGBD más popular y más querido: MySQL. Son consultas básicas, pues no haremos uniones ni otra cosa más que proyecciones o “selects”, repasando también un poco las expresiones regulares usando LIKE, agrupando con GROUP BY y utilizando algunas funciones de agregación como SUM, AVG, MIN, etcétera.

Nota: estas son soluciones propuestas por mí; algunas pueden ser erróneas o puede que existan mejores formas de resolver dichas consultas.

Tabla SQL

Para trabajar con estos ejercicios utilizaremos la siguiente tabla. Si quieres, puedes copiar todo el script en la CLI de MySQL para que  la base de datos y la tabla sean creadas automáticamente.

Si quieres trabajar en una base de datos existente, entonces sólo copia la definición de la tabla y los datos. De todas maneras, dejaré un sqlfiddle al final para que se pueda probar en línea.

Consultas propuestas

Bloque 1

Consultas
  1. Listar los nombres de los usuarios
  2. Calcular el saldo máximo de los usuarios de sexo “Mujer”
  3. Listar nombre y teléfono de los usuarios con teléfono NOKIA, BLACKBERRY o SONY
  4. Contar los usuarios sin saldo o inactivos
  5. Listar el login de los usuarios con nivel 1, 2 o 3
  6. Listar los números de teléfono con saldo menor o igual a 300
  7. Calcular la suma de los saldos de los usuarios de la compañia telefónica NEXTEL
  8. Contar el número de usuarios por compañía telefónica
  9. Contar el número de usuarios por nivel
  10. Listar el login de los usuarios con nivel 2
  11. Mostrar el email de los usuarios que usan gmail
  12. Listar nombre y teléfono de los usuarios con teléfono LG, SAMSUNG o MOTOROLA

Soluciones

Bloque 2

Consultas

  1. Listar nombre y teléfono de los usuarios con teléfono que no sea de la marca LG o SAMSUNG
  2. Listar el login y teléfono de los usuarios con compañia telefónica IUSACELL
  3. Listar el login y teléfono de los usuarios con compañia telefónica que no sea TELCEL
  4. Calcular el saldo promedio de los usuarios que tienen teléfono marca NOKIA
  5. Listar el login y teléfono de los usuarios con compañia telefónica IUSACELL o AXEL
  6. Mostrar el email de los usuarios que no usan yahoo
  7. Listar el login y teléfono de los usuarios con compañia telefónica que no sea TELCEL o IUSACELL
  8. Listar el login y teléfono de los usuarios con compañia telefónica UNEFON
  9. Listar las diferentes marcas de celular en orden alfabético descendentemente
  10. Listar las diferentes compañias en orden alfabético aleatorio
  11. Listar el login de los usuarios con nivel 0 o 2
  12. Calcular el saldo promedio de los usuarios que tienen teléfono marca LG

Soluciones

Bloque 3

Consultas

  1. Listar el login de los usuarios con nivel 1 o 3
  2. Listar nombre y teléfono de los usuarios con teléfono que no sea de la marca BLACKBERRY
  3. Listar el login de los usuarios con nivel 3
  4. Listar el login de los usuarios con nivel 0
  5. Listar el login de los usuarios con nivel 1
  6. Contar el número de usuarios por sexo
  7. Listar el login y teléfono de los usuarios con compañia telefónica AT&T
  8. Listar las diferentes compañias en orden alfabético descendentemente
  9. Listar el logn de los usuarios inactivos
  10. Listar los números de teléfono sin saldo
  11. Calcular el saldo mínimo de los usuarios de sexo “Hombre”
  12. Listar los números de teléfono con saldo mayor a 300

Soluciones

Bloque 4

Consultas

  1. Contar el número de usuarios por marca de teléfono
  2. Listar nombre y teléfono de los usuarios con teléfono que no sea de la marca LG
  3. Listar las diferentes compañias en orden alfabético ascendentemente
  4. Calcular la suma de los saldos de los usuarios de la compañia telefónica UNEFON
  5. Mostrar el email de los usuarios que usan hotmail
  6. Listar los nombres de los usuarios sin saldo o inactivos
  7. Listar el login y teléfono de los usuarios con compañia telefónicaIUSACELL o TELCEL
  8. Listar las diferentes marcas de celular en orden alfabético ascendentemente
  9. Listar las diferentes marcas de celular en orden alfabético aleatorio
  10. Listar el login y teléfono de los usuarios con compañia telefónica IUSACELL o UNEFON
  11. Listar nombre y teléfono de los usuarios con teléfono que no sea de la marca MOTOROLA o NOKIA
  12. Calcular la suma de los saldos de los usuarios de la compañia telefónica TELCEL

Soluciones

Conclusión

Eso fue todo por hoy, son muchos ejercicios que, aunque repetitivos, ayudan a que aprendamos los comandos y sintaxis. Espero tener tiempo de publicar más ejercicios resueltos cuya complejidad sea mayor en cada ocasión.

Por cierto, aquí está el SQL Fiddle que prometí.

Promedio de arreglos en Go

Introducción

Para sacar el promedio de valores de un arreglo, sólo tenemos que recorrer el mismo y sumar cada valor a una variable (la sumatoria). Finalmente dividir la sumatoria entre la longitud del arreglo, que en este caso la podemos obtener usando la función len.

Promedio de un arreglo con datos definidos por nosotros

En este caso el promedio es para un arreglo definido por nosotros mismos.

package main

import "fmt"

func main() {
	calificaciones := [10] int {78, 20, 55, 90, 99, 78, 96, 50, 80, 100};
	sumatoria := 0 //Aquí iremos sumando cada valor

	/*
		Recorrer el arreglo
	*/
	for _, calificacion := range calificaciones{
		sumatoria += calificacion
	}

	//El promedio es dividir la sumatoria entre el número de calificaciones
	promedio := sumatoria / len(calificaciones)


	fmt.Println("El promedio es", promedio)
}

Al ejecutarlo obtenemos lo siguiente:

Promedio de un arreglo con datos definidos por el usuario

Ahora vamos a pedir que el usuario nos dé diez calificaciones y dependiendo de ellas vamos a calcular el promedio. Para pedir datos por teclado usamos fmt.Scanf y le pasamos la cadena de formato que en este caso es un entero y un salto de línea.

Hacemos un ciclo del 1 al 10 y preguntamos por cada calificación. Asignamos cada valor al arreglo, y finalmente calculamos la sumatoria y la dividimos entre la longitud del array.

package main

import "fmt"

func main() {
	var calificacionIntroducida int // Para escanear cada calificacion introducida por el usuario
	var calificaciones[10] int //Aquí guardaremos los valores

	/*
		Preguntar cada valor...
	*/
	for i:= 0; i < 10; i++{
		fmt.Printf("\nIntroduce la calificación %d: ", i + 1)
		fmt.Scanf("%d\n", &calificacionIntroducida)
		calificaciones[i] = calificacionIntroducida // y asignarlo
	}

	/*
		Calcular promedio
	*/

	sumatoria := 0
	for _,calificacion := range calificaciones{
		sumatoria += calificacion
	}

	promedio := sumatoria / len(calificaciones)
	fmt.Printf("El promedio es %d", promedio)
}

Al ejecutarlo e ingresar los datos podemos ver esto:

Promedio de arreglo con longitud y datos definidos por el usuario

Para terminar este post; ahora no preguntaremos 10 calificaciones, sino las que el usuario desee. Inicialmente preguntaremos de cuántas calificaciones desea sacar el promedio y dependiendo de ello asignaremos el arreglo. Después haremos lo mismo que en el ejercicio de arriba.

En este caso las cosas cambian un poco, ya que la definición de nuestro arreglo será un poco diferente. Esto es debido a que no podemos declarar la longitud de un arreglo en tiempo de ejecución, por lo que mejor usaremos un slice. Un slice es un arreglo de longitud variable.

package main

import "fmt"

func main() {
	var calificacionIntroducida int // Para escanear cada calificacion introducida por el usuario
	var longitudArreglo int //La longitud

	/*
		Preguntar la longitud...
	*/
	fmt.Print("¿Cuántas calificaciones desea promediar? ")
	fmt.Scanf("%d\n", &longitudArreglo)

	/*
		En calificaciones guardaremos los valores
		Como no podemos asignar una longitud a un array en tiempo de ejecución, usamos
		un slice. Para crearlo llamamos a make y pasamos como primer argumento
		el tipo de dato que sería int, y como segundo la longitud que
		fue previamente escaneada
	*/
	calificaciones := make([] int, longitudArreglo) //Aquí guardaremos los valores.

	/*
		Preguntar cada valor...
	*/
	for i:= 0; i < longitudArreglo; i++{
		fmt.Printf("\nIntroduce la calificación %d: ", i + 1)
		fmt.Scanf("%d\n", &calificacionIntroducida)
		calificaciones[i] = calificacionIntroducida // y asignarlo
	}

	/*
		Calcular promedio
	*/

	sumatoria := 0
	for _,calificacion := range calificaciones{
		sumatoria += calificacion
	}

	promedio := sumatoria / len(calificaciones)
	fmt.Printf("El promedio es %d", promedio)
}

Lo ejecuté dos veces para probar con diferentes longitudes:

Y con esto terminamos por hoy.