domingo, 24 de octubre de 2021

Ejercicios resueltos de programación.

 No se como ni lo que estaba buscando, pero llegué a esta página web de temática Python, aunque lleva sin actualizar unos cuantos años. El caso es que el autor resuelve mediante Python 2 una serie de ejercicios que encontró en un libro que menciona en esta entrada. ¿Cuan de difícil sería convertir ese código de Python 2 a Gambas? Pues a priori la cosa fue fácil, ya que los ejercicios son sencillitos. Y visto lo visto, con Gambas escribes unas pocas líneas más que con Python, pero desde mi punto de vista, Gambas es mas legible que Python, pero esto es sólo una opinión mía.


 

Ejercicio 1. 
Escribir un algoritmo que, para cualquier número de segundos inferior a un millón, calcule su equivalente en días, horas, minutos y segundos.
 
Dim entrada As String
Dim dato, ndias, aux, nhoras, nmin, nseg As Integer
  
  'Pedimos los datos
  Print "Número de segundos: ";
  Flush
  Input entrada
  
  'Convertimos el número introducido en un Integer
  dato = CInt(entrada)
  
  'Comprobamos si el número introducido es menor de a un millón
  If dato >= 1000000 Then
    Print "El número debe ser menor a 1000000"
  Else
    'Días
    ndias = dato \ 86400
    aux = dato % 86400
    'Horas
    nhoras = aux \ 3600
    aux = aux % 3600
    'Minutos y segundos
    nmin = aux \ 60
    nseg = aux % 60
    'Mostramos el resultado
    Print Subst("&1 dias, &2 horas, &3 minutos, &4 segundos", ndias, nhoras, nmin, nseg)
  Endif
 
 
Ejercicio 2.
Escribir un algoritmo que imprima el mínimo, el máximo y la media de tres números.
 
'Escribir un algoritmo que imprima el mínimo, el máximo y la media de tres números.
  Dim ev As String[] = ["primer", "segundo", "tercer"]
  Dim numeros As New Float[3]
  Dim texto As String
  Dim minimo, maximo, media As Float
  
  'Obtenemos los números
  For i As Integer = 0 To 2
    Print Subst("Introduce el &1 numero:", ev[i]);
    Flush
    Input texto
    numeros[i] = CFloat(texto)
  Next
  
  'Ordenamos el array
  numeros = numeros.Sort()
  'Obtenemos el máximo y el mínimo
  minimo = numeros[0]
  maximo = numeros[2]
  'Obtenemos la media aritmética
  media = Round(((numeros[0] + numeros[1] + numeros[2]) / 3), -2)
  'Mostramos los resultados
  Print Subst("Mínimo: &1, Máximo: &2, Media: &3", minimo, maximo, media) 
 

 

Ejercicio 3.
Escribir un algoritmo que, dado el infinitivo de un verbo regular de la primera conjugación, obtenga la conjugación en singular y plural de presente de indicativo. Por ejemplo, para el verbo cantar el resultado es yo canto, tu cantas, el canta, nosotros cantamos, vosotros cantáis, ellos cantan.

 

  Dim pronombre As String[] = ["yo", "tu", "el", "nosotros", "vosotros", "ellos"]
  Dim terminaciones As Collection = ["yo": "o", "tu": "as", "el": "a", "nosotros": "amos", "vosotros": "áis", "ellos": "an"]
  Dim palabra As String
  
  'Pedimos la palabra
  Print "Verbo regular de la primera conjugación:";
  Flush
  Input palabra
  'Recorremos el diccionario y construmimos la conjugación
  For Each i As String In pronombre
    Print i & ": " & Left(palabra, -2) & terminaciones[i]
  Next

 

Ejercicio 4.
Escribir un algoritmo que, para un número binario de 4 cifras, imprima su valor en base 10. Se estudiarán dos formas del problema según la representación de los datos:
    -forma 1: los datos son cuatro enteros (0 ó 1). Por ejemplo: 1,1,0,1.
    -forma 2: el dato es un entero cuya representación decimal con cuatro
              cifras no contenga más que 0 ó 1: Por ejemplo: 1101. 

  En este ejercicio lo he variado un poco para no complicarme mucho la vida. Se tiene que introducir el número binario seguido, sin separadores y se puede introducir más de cuatro cifras. 

 
  Dim binar As String
  Dim nbinario As New String[]
  Dim decimal, potencia As Integer 'Contadores
  
  'Obtenemos datos.
  Print "Número binario (4 cifras): ";
  Flush
  Input binar
  
  If CInt(binar) = 0 Then 
    Print "Su representación decimal es de 0."
    Quit
  Endif
  
  'Obtenemos los dígitos.
  For j As Integer = 1 To binar.Len
    nbinario.add(Mid(binar, j, 1))
  Next
  
  'Le damos la vuelta al número binario.
  nbinario.Reverse()
  
  For Each i As String In nbinario
    decimal += CInt(i) * 2 ^ potencia
    Inc potencia
    
  Next
  'Visualizamos el resultado
  Print Subst("Su representación decimal es de: &1", decimal)
 

Ejercicio 5.
Escribir un algoritmo que decodifique fechas del siglo XXI. El dato es un entero comprendido entre 10100 y 311299. El resultado es una secuencia de caracteres: número del día dentro del mes, del mes dentro del año y del año dentro del siglo. Por ejemplo, para el dato 30485, el resultado es el texto 3-4-2085.

 

  Dim dato As String
  Dim anyo, mes, dia As Integer
  
  'Obtenemos el dato
  Print "Introduce dato: ";
  Flush
  Input dato

  'Descodificamos el año dentro del siglo XXI
  anyo = 2000 + CInt(Right(dato, 2))
  
  'Descodificamos el mes
  mes = CInt(dato[dato.Len - 4, 2])
  
  'Descodificamos el día.
  dia = CInt(dato[0, dato.Len - 4])
  
  'Imprimimos el resultado
  Print Subst("&1-&2-&3", dia, mes, anyo)

 

Ejercicio 6.
Escribir un algoritmo que, para una suma de dinero dada, indique cómo descomponerla en billetes y monedas corrientes. Se desea utilizar el mínimo de billetes y monedas. No hay ninguna limitación respecto al número de billetes y monedas disponibles.

'Se declara los datos básicos
  Dim billetesYmonedas As Float[] = [500, 200, 100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.005, 0.002, 0.001]
  Dim monedero As New Integer[15] 'Cantidad de billetes o monedas que habrá. La cantidad de una determinada billete o moneda se determina por la posición
  Dim entrada As String
  Dim entero As Integer
  Dim decimal, unidades As Float
  
  Print "Introduce el importe en Euro: ";
  Flush
  Input entrada
  
  'Parte decimal del número
  decimal = Round(Frac(CFloat(entrada)), -3)
  'Parte entera del número
  entero = Int(CFloat(entrada))
  
  For i As Integer = 0 To 8
    unidades = entero / billetesYmonedas[i]
    If Frac(unidades) = 0 Then
      monedero[i] = unidades
      entero -= unidades * billetesYmonedas[i]
    Endif
    If entero = 0 Then Break
  Next
  
  If decimal > 0 Then
    For i As Integer = 9 To billetesYmonedas.Max
      unidades = decimal / billetesYmonedas[i]
      If Frac(unidades) = 0 Then
        monedero[i] = unidades
        decimal -= unidades * billetesYmonedas[i]
      Endif
      If decimal = 0 Then Break
    Next
  Endif
  
  For a As Integer = 0 To monedero.Max
    If monedero[a] > 0 Then
      Print Subst("&1 de &2", monedero[a], billetesYmonedas[a])
    Endif
  Next
 

Ejercicio 7.
Escribir un algoritmo que simule el funcionamiento de una calculadora. El dato es una serie de tres caracteres: una cifra, un símbolo de operación y otra cifra. El resultado es el valor de la expresión dada.

Aquí he hecho algo de trampa, ya que uso la función Eval, con lo cual se simplifica mucho el código :)
 
Dim entrada As String
  
Print "Introduce la operación: ";
Flush
Line Input entrada
  
Print Eval(entrada)
 

Ejercicio 8.
Consideremos una hora expresada en forma de tripleta . Escribir un algoritmo que imprima la hora correspondiente al siguiente segundo. Por ejemplo, para la entrada 13,43,24 tiene que devolver 13,43,25.

 

  Dim entrada, salida As String
  Dim trocea As New String[]
  Dim horas, minutos, segundos As Integer
  
  Print "Introduce el tiempo: ";
  Flush
  Input entrada
  
  'Obtenemos los datos
  trocea = Split(entrada, ",")
  horas = CInt(trocea[0])
  minutos = CInt(trocea[1])
  segundos = CInt(trocea[2])
  
  'Aumentamos un segundo
  Inc segundos
  
  'Según proceda
  If segundos = 60 Then
    salida = horas & ":" & minutos & ":" & segundos
  Else If minutos = 59 And horas = 23 Then
      salida = 0 & ":" & 0 & ":" & 0
  Else If minutos = 59 Then
      salida = (horas + 1) & ":" & 0 & ":" & 0
  Else
      salida = horas & ":" & (minutos + 1) & ":" & 0
  Endif
  Print salida
 

Ejercicio 9.
Escribir una función que determine si una letra dada es consonante.

 

Private Function esConsonante(letra As String) As Boolean
  
  'Escribir una función que determine si una letra dada es consonante.
  Dim letras As String[] = ["a", "e", "i", "o", "u", "á", "é", "í", "ó", "ú", "ï", "ü"]
  Dim le As String
  
  le = String.LCase$(letra)
  If letras.Exist(le) Then
    Return True
  Else
    Return False
  Endif
  
End

 

Ejercicio 10.
Escribir una función que calcule el factorial de un número. Por ejemplo, 5! = 5*4*3*2*1 = 120.

 

Private Function Factorial(numero As Integer) As Integer
  
  If numero = 0 Then
    Return 1
  Else
    Return numero * Factorial(numero - 1)
  Endif
  
End
 

 

2 comentarios:

  1. Siento decirlo pero python es un lenguaje puntero tan sencillo como un Basic mientras que nadie usa gambas (ni saben lo que es).

    ResponderEliminar
    Respuestas
    1. Hola.
      A veces no solo se busca la sencillez, es cuestión de gustos. Me gusta más Gambas que Phyton, y si Gambas me sirve para lo que lo uso, eso quiere decir que es un lenguaje tan válido como otro cualquera. Por no decir que alguien ya lo conoce, yo mismo, bueno y el desarrollador del lenguaje. No se que clase de argumento es ese de que nadie lo conoce para no utilizarlo, de verdad, usa algo más elavorado. Gambas desde mi punto de vista tiene un par de ventajas sobre Python y esas ventajas hacen que me decante por este. La primera es que en Gambas hay que declarar las variables, los métodos y funciones están diferenciados, y los parámetros que reciben o devuelven están declarados, eso quiere decir que de un vistazo ya sabes que un método o función que tipo de parámetro recibe o devuelve, cosa que en Python no lo sabes (aunque creo que en la última versión si se puede indicar), Y la otra ventaja es al crear una interfaz gráfica, mientras en Python es más farragoso en Gambas se vuelve tremendamente sencillo. Por no decir que el IDE de Gambas es muy bueno y cómodo.
      Un saludo.

      Eliminar