¿Cómo
se diseña un algoritmo?
En programación, un algoritmo
establece, de manera genérica e informal, la secuencia de
pasos o acciones que resuelve un determinado problema y, para
representarlo, se utiliza, fundamentalmente, dos tipos de
notación: pseudocódigo
y diagramas
de flujo.
Así pues, en este artículo, voy a explicar, con
un ejemplo, los pasos que "mentalmente"
se pueden seguir para diseñar el algoritmo, en Pseudocódigo
CEE (C En Español)
y ordinograma,
de un programa
que dé solución a un problema de
programación.
En concreto, vamos a ver, desmenuzadamente, cómo se
puede diseñar el algoritmo para resolver el ejercicio 1, "Media
aritmética de números introducidos",
de la sección Repetitiva hacer...mientras
del listado
de ejercicios de programación resueltos en diferentes
lenguajes.
De forma que, los pasos a seguir son los siguientes:
(Paso
1)
Comprender qué es lo que se nos está pidiendo. En
este caso, el enunciado del ejercicio es:
"Diseñe
el algoritmo de un
programa que:
1º)
Pida por teclado un número (dato entero).
2º) Muestre por pantalla los mensajes:
- Ha
introducido
<cantidad_de_números> número(s)
- La suma es
<suma>
3º) Pregunte
al usuario
si desea introducir otro o no.
4º) Repita
los
pasos 1º, 2º y 3º, mientras que, el usuario
no responda 'n' de (no).
5º) Muestre
por
pantalla la media aritmética (dato real) de los
números introducidos.
Nota:
Utilice un bucle hacer...mientras."
|
En
pantalla:
Introduzca
un número entero: 3
Ha introducido 1 número(s)
La suma es 3
¿Desea introducir otro (s/n)?: s
Introduzca
un número entero: 7
Ha
introducido 2 número(s)
La suma es 10
¿Desea introducir otro (s/n)?: s
Introduzca
un número entero: 6
Ha
introducido 3 número(s)
La suma es 16
¿Desea
introducir otro (s/n)?: s
Introduzca
un número entero: 13
Ha
introducido 4 número(s)
La suma es 29
¿Desea
introducir otro (s/n)?: n
La media aritmética es 7.25
|
Introduzca
un número entero: 8
Ha
introducido 1 número(s)
La suma es 8
¿Desea
introducir otro (s/n)?: n
La
media aritmética es 8.000000
|
Simplemente,
al leer el
enunciado del problema, ya podemos hacernos una idea de algunas
características importantes del algoritmo que vamos
a diseñar:
Introduzca
un número entero:
Ha introducido X
número(s)
La suma es Y
¿Desea introducir otro
(s/n)?:
La media aritmética es
Z
Introduzca
un número entero:
y,
otra, para recoger un dato de tipo carácter
después de mostrar por pantalla:
¿Desea introducir otro
(s/n)?:
- En
algún momento, se deberá calcular:
la
cantidad de números introducidos,
la suma de los mismos y
la media
aritmética de dichos números,
por tanto, seguramente,
emplearemos 2 ó 3 instrucciones
de asignación.
- Tendremos que
utilizar varias variables
para:
recoger
el o los números que introduzca el usuario por teclado (numero),
contar los
números introducidos (contador),
almacenar la suma de dichos
números (acumulador),
preguntar al usuario si
desea introducir otro número o no (seguir),
¿calcular la
media aritmética (media_aritmetica)?
- Necesitaremos un
bucle
para que el usuario pueda introducir los números que desee
(solamente uno o más), de hecho, ya se nos especifica, en la
"Nota" del
enunciado, que debemos
hacer uso de un bucle hacer...mientras.
En los pasos siguientes,
vamos a ver cómo combinar los elementos detectados
e integrarlos en la estructura
de un algoritmo. No obstante, lo vamos a hacer, poco a poco,
a medida que vayamos construyendo dicho algoritmo.
(Paso 2)
Escribir la estructura básica
del algoritmo en pseodocódigo:
algoritmo Media_aritmetica_de_numeros_introducidos
inicio
...
fin |
Obsérvese que, ya podemos nombrar al algoritmo mediante un identificador,
en este caso, podemos escribir:
Media_aritmetica_de_numeros_introducidos
En
ordinograma, comenzaremos escribiendo el inicio y fin del cuerpo:
(Paso 3)
Según se nos indica en el primer punto del ejercicio, el
algoritmo debe:
1º)
Pedir por teclado un número (dato entero).
Mostrándose por pantalla:
Introduzca
un número entero: <número>
Por consiguiente, en el algoritmo hay que escribir una
instrucción de salida y otra de entrada. En
pseudocódigo:
algoritmo Media_aritmetica_de_numeros_introducidos
inicio
escribir( "Introduzca
un número entero: " )
leer( numero
)
...
fin |
Se tiene que declarar la variable numero,
así escribimos:
algoritmo Media_aritmetica_de_numeros_introducidos
variables
entero numero
inicio
escribir( "Introduzca
un número entero: " )
leer( numero
)
...
fin |
En ordinograma:

Recordemos que, en los ordinogramas no se representa la
declaración de variables.
(Paso 4)
A continuación, en el segundo punto del ejercicio se nos
indica que:
2º)
El programa debe mostrar por pantalla los mensajes:
- Ha
introducido
<cantidad_de_números> número(s)
- La suma es
<suma>
De modo que, incorporamos
dos nuevas instrucciones de salida al algoritmo, en las que vamos a
mostrar el valor de una variable contador
para mostrar la cantidad de números introducidos por el
usuario y, por otra parte, el valor de una variable acumulador,
para mostrar la suma de dichos números. En
pseudocódigo:
algoritmo Media_aritmetica_de_numeros_introducidos
variables
entero numero
inicio
escribir( "Introduzca
un número entero: " )
leer( numero
)
...
escribir(
"Ha introducido ",
contador, "
número(s)" )
escribir(
"La suma es ", acumulador )
...
fin |
Y declaramos las nuevas variables: contador
y acumulador.
algoritmo Media_aritmetica_de_numeros_introducidos
variables
entero acumulador, contador,
numero
inicio
escribir( "Introduzca
un número entero: " )
leer( numero
)
...
escribir(
"Ha
introducido ",
contador, "
número(s)" )
escribir(
"La suma es ", acumulador )
...
fin |
En ordinograma:
Pero, ¿qué valores tienen las variables contador
y acumulador?
Inicialmente, almacenarán un cero (0) cada una de ellas
y, después de leer un número, habrá
que incrementar el valor de contador
en uno (1) y
sumar el valor de dicho número a acumulador.
algoritmo Media_aritmetica_de_numeros_introducidos
variables
entero acumulador, contador,
numero
inicio
acumulador ←
0
contador ←
0
escribir( "Introduzca
un número entero: " )
leer( numero
)
acumulador ←
acumulador +
numero
contador ← contador + 1
escribir(
"Ha
introducido ",
contador, "
número(s)" )
escribir(
"La suma es ", acumulador )
...
fin |
En ordinograma:
(Paso 5)
Atendiendo al tercer punto del ejercicio:
3º) Preguntar
al usuario
si desea introducir otro número o no.
al algoritmo
le añadimos una
nueva instrucción de salida, otra de entrada y declaramos
una nueva variable (seguir).
En
pseudocódigo:
algoritmo Media_aritmetica_de_numeros_introducidos
variables
caracter
seguir
entero acumulador, contador,
numero
inicio
acumulador ←
0
contador ←
0
escribir( "Introduzca
un número entero: " )
leer( numero
)
acumulador ←
acumulador +
numero
contador ← contador + 1
escribir(
"Ha
introducido ",
contador, "
número(s)" )
escribir(
"La suma es ", acumulador )
escribir(
"¿Desea
introducir otro número (s/n)?: " )
leer(
seguir )
...
fin |
En ordinograma:
(Paso 6)
Teniendo en cuenta el cuarto punto del ejercicio:
4º)
Repetir
los
pasos 1º, 2º y 3º, mientras que, el usuario
no responda 'n' de (no).
es necesario
hacer uso de una instrucción
de control repetitiva que, como se especifica en la "Nota" del
ejercicio, será un bucle hacer...mientras.
En cualquier caso, también podríamos habernos
hecho las preguntas del apartado 10.3
Repetitiva para
del Curso de
Diseño de Algoritmos acerca
de cuándo usar un bucle u otro:
- ¿Se
conoce, de antemano, el número de veces (iteraciones)
que tiene que ejecutarse un determinado bloque de instrucciones? No,
por tanto, descartamos el bucle para.
- ¿El
bloque de instrucciones debe ejecutarse al menos una vez? Sí,
de forma que, optamos por hacer uso de un bucle hacer...mientras.
En
pseudocódigo:
algoritmo Media_aritmetica_de_numeros_introducidos
variables
caracter
seguir
entero acumulador, contador,
numero
inicio
acumulador ←
0
contador ←
0
hacer
escribir( "Introduzca
un número entero: " )
leer( numero
)
acumulador ←
acumulador +
numero
contador ← contador + 1
escribir(
"Ha
introducido ",
contador, "
número(s)" )
escribir(
"La suma es ", acumulador )
escribir(
"¿Desea
introducir otro número (s/n)?: " )
leer(
seguir )
mientras
( seguir <>
'n' )
...
fin |
Fíjese que, la inicialización de las
variables contador
y acumulador no
están dentro del bloque de instrucciones del bucle, ya que,
ello provocaría un error de
lógica.
En ordinograma:
(Paso 7)
Y, finalmente, para el quinto punto:
5º)
Mostrar
por
pantalla la media aritmética (dato real) de los
números introducidos.
añadimos
una última instrucción.
En
pseudocódigo:
algoritmo Media_aritmetica_de_numeros_introducidos
variables
caracter
seguir
entero acumulador, contador,
numero
inicio
acumulador ←
0
contador ←
0
hacer
escribir( "Introduzca
un número entero: " )
leer( numero
)
acumulador ←
acumulador +
numero
contador ← contador + 1
escribir(
"Ha
introducido ",
contador, "
número(s)" )
escribir(
"La suma es ", acumulador )
escribir(
"¿Desea
introducir otro número (s/n)?: " )
leer(
seguir )
mientras
( seguir <>
'n' )
escribir(
"La
media aritmética es ",
acumulador /
contador )
fin |
Nótese que, para mostrar la media aritmética no
hemos
utilizado una nueva variable y, de esta forma, también nos
ahorramos escribir una nueva instrucción de
asignación:
media_aritmética ←
acumulador / contador
En
ordinograma, la solución final será:
Puede consultar la codificación
de este algoritmo en lenguaje
C y en Pascal.
No obstante, téngase en cuenta que en Pascal se hace uso del
bucle repetir...hasta
en vez de repetir...mientras.
Para más información, puede consultar el Artículo
2 - Bucle Hacer...mientras
versus Bucle Repetir...hasta.
Para
cualquier sugerencia, comentario o error detectado, puede contactar con el autor.
|