Vous êtes sur la page 1sur 7

lOMoARcPSD|1413116

Ejercicios resueltos, prof Mara Rodriguez Daminan

Informtica para a Enxeara (Universidad de Vigo)

Distributing prohibited | Downloaded by Axel Heitz (amzeehftw@gmail.com)


lOMoARcPSD|1413116

Problemas de programacin resueltos

Se plantean unos problemas sencillos de programacin y una posible solucin comentada en


Visual Basic. Se incluyen los siguientes conceptos:
Instrucciones condiciones
Instrucciones de repeticin

Cmo deberan usarse?

1. Leer el enunciado cuidadosamente.


2. Bosquejar una solucin en Pseudocdigo (descripcin de un algoritmo que resulta
independiente del lenguaje y que ser comprensible para el programador pero no para la
mquina).
3. Codificar el pseudocdigo en Visual Basic.
4. Comparar la solucin alcanzada con la propuesta.
5. Leer los comentarios que incluye el programa.

Problema 1.

Solicitar al usuario un valor entero N y mostrar la suma todos sus divisores excepto el uno y l
mismo. Por ejemplo, si N=36, la suma de todos sus divisores es 54 (2+3+4+6+9+12+18). El
programa deber:
Comprobar que el nmero dado por el usuario es mayor 0. En caso contrario, marcar
error y volver a pedir el nmero hasta que cumpla dicha condicin.
Imprimir los nmeros que hacen divisible a N.
Sumar los nmeros que imprime y mostrar en pantalla el total en pantalla.
NOTA: para ver si un entero es divisible por otro entero, debe usarse el operador Mod.
Option Explicit On
Option Strict On
Module Divisor
Sub Main()
Dim numero, suma, inicio As Integer ' Se declaran las variables y el tipo de datos
' se inicializa la variable suma a cero, que es nico valor que no altera la primera suma
' suma es un acumulador
suma = 0
Do
Console.Write("Dame un numero entero ") ' imprime un mensaje para el usuario
numero = CInt(Console.ReadLine()) ' Lee un dato de teclado y lo convierte a Entero
'Se hace el ciclo for desde 2 hasta el nmero que ha dado el usario -1.
'Si el usario da 16, el valor de la variable inicio va 2 hasta 15
'Si el usuario ha dado un nmero negativo, cero o 1. Este ciclo no se ejecuta.
For inicio = 2 To numero - 1 Step 1
If numero Mod inicio = 0 Then ' Se comprueba si el resto de dividir el nmero del
usario entre el valor de inicio es 0.
suma = suma + inicio ' Si la condicin se cumple se acumula el valor de inicio
en la variable suma.
Console.WriteLine(inicio) ' Imprime todos los nmeros que dividen al nmero del
usuario.
End If
Next
If numero <= 0 Then ' Pregunta si el usuario ha dado un nmero menor o igual a 0.
Console.WriteLine("ERROR el nmero debe ser mayor a cero") ' Si la condicin del if
se cumple, se imprime mensaje de error.
End If
Loop Until numero > 0 'El ciclo se repite hasta el usuario no haya dado un nmero mayor a
cero.

Distributing prohibited | Downloaded by Axel Heitz (amzeehftw@gmail.com)


lOMoARcPSD|1413116

Console.WriteLine("la suma es " & suma) ' Se imprime el acumulado de los nmeros que han
dividido al nmero del usuario.
Console.ReadLine()
End Sub
End Module

Problema 2

El programa debe solicitar al usuario dos valores: inicio y fin. Una vez dados dichos valores, el
programa calcular:

+1
=

Los clculos se harn independientemente de que el valor de inicio sea mayor que al de fin o
viceversa. El programa mandar un mensaje de error en el caso de que alguno de los dos datos
tenga un valor menor o igual a cero y volver a pedirlos.

Option Explicit On
Option Strict On
Module Producto
Sub Main()
Dim inicio, fin, temporal As Integer 'Declaracin de las variables de tipo entero
Dim multiplica As Long ' La variable multiplica se declara como un entero largo por el valor
que puede tomar la multiplicacin
inicio = CInt(InputBox("valor inicio")) ' Se pide el valor de inicio al usuario
Do While inicio <= 0 ' En caso de que se cumpla que valor que ha dado sea menor o igual a
cero
MsgBox("inicio debe ser mayor a cero", MsgBoxStyle.Information, "ERROR ENTRADA DE
DATOS") ' Se muestra mensaje de eror
inicio = CInt(InputBox("valor inicio")) ' se vuelve a pedir el dato
Loop

fin = CInt(InputBox("valor fin")) ' Se pide el valor de fin al usuario


Do Until fin > 0 'El dato de fin se vuelve a pedir hasta que sea mayor a cero
MsgBox("fin debe ser mayor a cero", MsgBoxStyle.Information, "ERROR ENTRADA DE DATOS") '
Se muestra mensaje de error
fin = CInt(InputBox("valor fin")) ' se vuelve a pedir el dato
Loop
If inicio > fin Then ' Se pregunta si el valor de inicio es mayor al valor de variable fin
'En caso de que se cumpla se utiliza una variable temperal para almacenar
' valor de la variable inicio
temporal = inicio
' se copia en la variable inicio en la variable fin
inicio = fin
'se copia en la variable fin la variable temporal que guarda el valor original de inicio
fin = temporal
End If
' Se inicializa multiplica con el valor de 1 para realizar el calculo de las
multiplicaciones
multiplica = 1
' se hace el ciclo desde el valor de inicio hasta el de fin. La variable inicio tomar todos
'valores hasta alcanzar a la variable fin
For inicio = inicio To fin Step 1
multiplica = multiplica * (inicio + 1) ' se realiza la operacion y se acumula en
multiplica
Next
MsgBox(" Resultado " & multiplica) ' Se muestra el resultado

Distributing prohibited | Downloaded by Axel Heitz (amzeehftw@gmail.com)


lOMoARcPSD|1413116

End Sub
End Module

Problema 3

Se programar un juego en el que el usuario debe adivinar un nmero generado aleatoriamente,


con una cantidad de intentos limitada. Para ello se escribir un programa en Visual Basic que haga
lo siguiente:

1. Generar un entero aleatorio entre 1 y LIMITE (constante con valor 100).


2. Invitar de forma repetida al usuario a adivinar el nmero aleatorio.
3. Tras cada intento, mostrar al usuario un mensaje que indique si el valor buscado es mayor,
menor o igual al intentado.
4. El programa finalizar cuando se adivine el nmero o se llegue al nmero mximo de
intentos (constante MAX_INTENTOS de valor 10).
5. Tras finalizar el programa, se mostrar un mensaje con el nmero de intentos utilizados,
as como la suma de todos los nmeros introducidos por el usuario.
6. Usando la sentencia SELECT sacar el mensaje correspondiente en funcin del porcentaje
de intentos utilizados, independientemente del valor de la constante MAX_INTENTOS. La
correspondencia entre mensajes y porcentajes ser la siguiente:
a. Muy bien < 25%
b. Bien (25%, 50%)
c. Regular (50%, 75%)
d. Mal >75% o no acertado
7. El programa debe funcionar aunque se cambien los valores de MAX_INTENTOS y LIMITE.

NOTA: La funcin Rnd() devuelve un valor aleatorio real en el intervalo (0, 1]. Para generar un
valor entero aleatorio entero entre a y b (ambos incluidos), se debe usar la expresin N = Int((b - a
+ 1) * Rnd + a).

Option Explicit On
Option Strict On
Module Juego
Sub Main()
' Se declaran como constantes los valores que no van a cambiar durante la ejecucin
Const MAXIMO As Integer = 9 ' Valor mximo a adivinar
Const MINIMO As Integer = 3 ' Valor mnimo
Const MAX_INTENTOS As Byte = 5 'Nmero de intentos permitidos
Dim numRepeticiones As Integer = 0 ' Se inicializa en 0 el nmero de veces que el usuario ha
intentado adivinar la variable
Dim numero, aleatorio As Integer ' almacenan el numero introducido por el usario, y el
nmero generado aleatoriamente por el sistema
Dim suma As Long = 0 ' almacenar la suma de todos los nmeros introducidos por el usario.
Se inicializa a 0
Dim porcentaje As Double = 0D ' Calcular el procentaje de aciertos
Randomize() ' inicializar la semilla
aleatorio = CInt(Int((MAXIMO - MINIMO + 1) * Rnd() + MINIMO)) 'Generar nmero aleatorio en
un rango
Do ' inicio ciclo
Console.Write("Adivina el nmero ==> ") 'Pregunta el nmero
numero = CInt(Console.ReadLine()) 'Almacena el nmero en nmero
suma = suma + numero 'Se acumula el nmero del usuario en la variable suma

Distributing prohibited | Downloaded by Axel Heitz (amzeehftw@gmail.com)


lOMoARcPSD|1413116

numRepeticiones = numRepeticiones + 1 ' Se incrementa el nmero de repeticiones en 1


If numero = aleatorio Then ' Se pregunta si el nmero del usario y el nmero generado
son iguales
Console.WriteLine("Has adivinado") ' Si se cumple se imprime el mesaje
ElseIf numero < aleatorio Then ' Sino son iguales se cumprueba si el nmero del usario
es mayor
Console.WriteLine("El nmero propuesto es menor") 'Si se cumple se imprime el
mesaje
Else ' En caso de que no solo queda una posibilidad
Console.WriteLine("El nmero propuesto es mayor") 'Si se cumple se imprime el
mesaje
End If
'El ciclo se repite hasta que se cumplan una de las dos condiciones
'Se ha alcanzado el nmero de repeticiones
'Se ha adivinado el nmero
Loop Until numRepeticiones = MAX_INTENTOS Or numero = aleatorio

Console.WriteLine("numero rep " & numRepeticiones) ' Se imprime el nmero de repeticiones


porcentaje = numRepeticiones / MAX_INTENTOS * 100 ' Se calcula el porcentaje en funcin de
MAX_INTENTOS
Select Case porcentaje ' En funcin del valor del porcentaje se realiza el select case
Case Is < 25 ' Si es menor a 25
Console.WriteLine("Muy Bien <25") ' si est en el rango indicado
Case 25 To 50
Console.WriteLine("Bien 25,50")
Case 50 To 75
Console.WriteLine("Bien 50,75") ' si est en el rango indicado
Case Is > 75
Console.WriteLine("Mal 75") ' si es mayor a 75
End Select
Console.ReadLine()
End Sub
End Module

Distributing prohibited | Downloaded by Axel Heitz (amzeehftw@gmail.com)


lOMoARcPSD|1413116

Problemas de programacin resueltos II

Problemas sencillos de programacin y solucin comentada en Visual Basic. Se incluyen los


siguientes conceptos:
Instrucciones condiciones
Instrucciones de repeticin
Vectores

Cmo deberan usarse?

1. Leer el enunciado.
2. Bosquejar una solucin en Pseudocdigo (descripcin de un algoritmo que resulta
independiente del lenguaje y que ser comprensible para el programador).
3. Codificar en Visual Basic.
4. Comparar soluciones
5. Leer los comentarios que incluye el programa.

Problema 1.

Se crear un vector que almacenar los caracteres que introduce el usuario. Solicitar al usuario
el nmero total de caracteres que contendr el vector, este nmero debe ser mayor a cero o
se volver a pedir al usuario tantas veces sea necesario. Pedir cada uno de los caracteres y
guardarlo en el vector. Mostrar todos los elementos del vector en un string.
El programa deber:
Comprobar que el nmero dado por el usuario es mayor 0. En caso contrario, marcar
error y volver a pedir el nmero hasta que cumpla dicha condicin.
Pedir los valores para el vector y almacenarlos.
Imprimir el contenido del vector.

Sub main()
Dim num_Elementos As Integer ' Variable que almacena el nmero de elementos
Dim vectorElementos(-1) As Char 'Declaracin de un vector tipo char
Dim respuesta As String 'almacena todos los elementos del vector
Do
num_Elementos = InputBox("Indica el nmero de elementos del vector")
Loop Until num_Elementos > 0 ' Se lee el nmero hasta que este sea mayor a 0
ReDim vectorElementos(num_Elementos - 1) ' Se redimensiona el vector
For i = 0 To UBound(vectorElementos, 1) Step 1 'Ciclo que recorre desde la posicin 0
hasta la del ndice mayor
' Utiliza la funcin Ubound para obtener el indice mayor
vectorElementos(i) = InputBox("Dame una letra " & i + 1) ' se suma 1 a la 1, para
que la secuencia vaya desde 1 hasta num_Elementos
Next
respuesta = "" ' Inicializar la variable que concatenar los elementos
For i = 0 To vectorElementos.Length - 1 Step 1 'Ciclo que recorre desde la posicin 0
hasta la del ndice mayor
' Utiliza la funcin Length para obtener el nmero de elementos y le resta 1, para
detenerse en el ndice mayor
respuesta = respuesta & vectorElementos(i) 'Concatena cada caracter y lo guarda en
la variable
Next
MsgBox(respuesta)
End Sub

Problema 2.

Se crear un vector que almacenar nmeros aleatorios en el rango 1 a 50. El nmero de


elementos de este vector tambin estar en este rango y se le preguntar al usuario, se
repetir la pregunta hasta el valor est en rango. El programa imprimir los elementos del

Distributing prohibited | Downloaded by Axel Heitz (amzeehftw@gmail.com)


lOMoARcPSD|1413116

vector que sean mayor a un nmero que introduce el usuario, y que tambin estar en el
rango de 1 -50.
El programa deber:
Comprobar que todos los nmeros estn en rango. Volver a pedir el nmero hasta que
cumpla dicha condicin.
Almacenar los valores aleatorios.
Imprimir los mayores a un valor solicitado.
Const MAXIMO As Integer = 50 ' Valor mximo
Const MINIMO As Integer = 1 ' Valor mnimo
Dim num_Elementos As Integer ' Variable que almacena el nmero de elementos
Dim mayorA As Integer
Dim vectorNumeros(-1) As Integer 'Declaracin de un vector tipo char
Dim respuesta As String 'almacena los elementos del vector que son mayores a un nmero
indicado por el usuario
Dim respuestaTotal As String 'almacena todos los elementos del vector
Do
num_Elementos = InputBox("Indica el nmero de elementos del vector")
Loop Until num_Elementos >= MINIMO And num_Elementos <= MAXIMO ' Se lee el nmero hasta
que este sea mayor a 0 y menor al MAXIMO
Do
mayorA = InputBox("Nmero mayor A")
Loop While mayorA < MINIMO Or mayorA > MAXIMO ' Se lee el nmero mientras que este sea
menor a 0 y mayor al MAXIMO

ReDim vectorNumeros(num_Elementos - 1) ' Se redimensiona el vector


Randomize() ' inicializar la semilla

For i = 0 To UBound(vectorNumeros, 1) Step 1 'Ciclo que recorre desde la posicin 0


hasta la del ndice mayor
' Utiliza la funcin Ubound para obtener el indice mayor
vectorNumeros(i) = CInt(Int((MAXIMO - MINIMO + 1) * Rnd() + MINIMO)) 'Generar nmero
aleatorio en un rango
Next
respuesta = "" ' Inicializar la variable que concatenar los elementos
respuestaTotal = "" ' Inicializar la variable que concatenar los elementos
For i = 0 To num_Elementos - 1 Step 1 'Ciclo que recorre desde la posicin 0 hasta el
nmero de elementos -1. ' detenerse en el ndice mayor
respuestaTotal = respuestaTotal & vectorNumeros(i) & " "
If vectorNumeros(i) > mayorA Then ' Comprueba el contenido de cada celda
respuesta = respuesta & vectorNumeros(i) & " " 'Concatena cada caracter y lo
guarda en la variable
End If
Next
MsgBox(" Los elementos del vector son " & vbNewLine & respuestaTotal & vbNewLine &
"Mayores a " & mayorA & vbNewLine & respuesta)
End Sub

Distributing prohibited | Downloaded by Axel Heitz (amzeehftw@gmail.com)

Vous aimerez peut-être aussi