|
CarlosPes.com
> Artículos
> Programación
> ¿Cómo se Diseña un
Algoritmo? |
|
¿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 (siete en este caso) 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:
* Exiten 5 instrucciones
de salida para
mostrar por pantalla:
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
* Exiten 2 instruccciones
de entrada. Una para
recoger un dato
númerico entero después de mostrar por pantalla:
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 pseudocó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 ¿Cuándo
usar un bucle u otro? del
Curso de Diseño de
Algoritmos:
* ¿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".
Si le ha gustado este artículo y desea incluirlo en su sitio
web, puede hacerlo sin ningún problema, siempre y cuando
cite como fuente del mismo a www.carlospes.com |
|
|
|
Acerca del
Artículo
|
|
· Autor: Carlos Pes |
·
Sitio Web: www.carlospes.com |
· Artículo
añadido: 15
de marzo de 2008 |
|