Documentos de Académico
Documentos de Profesional
Documentos de Cultura
A mi hija.
Tabla de Contenidos
PRÓLOGO
INTRODUCCIÓN
¿Qué es un problema?
Algoritmos
Decisiones
Repeticiones o iteraciones
Pseudocódigo
Entrada de datos
Asignación
Ejemplos de instrucciones de asignación:
Salida
Ejemplos de bloques de salida
Decisiones
Ejemplos de decisiones
Otro ejemplo de decisiones: Ordenando cartas
Ciclos o Iteraciones
Requisitos de un ciclo
Ejemplos del uso de ciclos
Variables indizadas
Ejemplo del uso de vectores
¿Eso es todo?
Ordenar una lista de N números
Intersección de conjutos
CAPÍTULO 3: PROGRAMACIÓN
Entrada de datos
Ejemplos
Salida de datos
Ejemplos
Asignación
Ejemplos
Decisiones
Ejemplos
Ciclos
Ejemplos
Variables indizadas
Resumen del capítulo 3
EPÍLOGO
Prólogo
Por el Dr. Javier Trenti
Solución B:
Abrir la canilla
Tomar el jabón
Frotar las manos con el jabón debajo del chorro de agua
Dejar el jabón
Frotar las manos debajo del agua hasta que no quede jabón
Cerrar la canilla
Secarme las manos
Ah, bien diferentes, ¿Pero el resultado es el mismo? Digamos que sí. ¿El
proceso es el mismo? Digamos que ¡sí también! ¿Entonces que cambió? ¡La
descripción del proceso! Porque tiene que ser adecuada para el sujeto que la
ejecuta.
Quizá si ese sujeto fuera un robot, tendría que mostrar el proceso de abrir la
canilla con más detalle, ¡mucho más detalle!
Lo mismo sucede con las recetas de cocina, tan usadas como ejemplos de
solución de problemas. En una receta puedo encontrar términos como
"gratinar", "cortar en juliana", "blanquear", que no son familiares a todas las
personas y constituyen pequeños mini problemas dentro de un gran problema.
Algoritmos
Hasta aquí deliberadamente estuve evitando usar la palabra "algoritmo", que
me gusta definirla de la siguiente manera:
Para que eso suceda el algoritmo tiene que tener ciertas propiedades:
- No debe ser ambiguo
- Debe ser perfectamente comprensible por el sujeto
- Debe terminar en algún momento
Hasta aquí esta breve presentación que se podría considerar informal, sobre
todo en la descripción de algunas tareas elementales. En las próximas
secciones seremos mucho más precisos en la creación de soluciones a
problemas determinados que iremos resolviendo. Paso a paso iremos
develando distintas técnicas hasta llegar a la construcción de nuestros
primeros programas de computadora.
Del problema a la solución
Posiblemente el algoritmo que usted creó no le sirva al monito. ¿Por qué pasó
eso? Porque usted desconocía qué sujeto debía resolver el problema, por lo
tanto, también desconocía sus tareas elementales. En pocas palabras: usted no
tenía una caja de herramientas adecuada para construir el algoritmo adecuado
al sujeto.
Sabiendo esto, ahora si puede construir el algoritmo.
¿Ya lo tiene?
¡Hagámoslo juntos!
Primero deberíamos pedir los datos, que son los números X e Y que
determinamos como insumos. El monito no puede pedir dos números, solo
puede pedir uno y anotarlo en un papel, como dice la tarea elemental que
identificamos como A.
Luego debemos pedir otro número, pero sería conveniente que antes
memoricemos el que acabamos de ingresar que está anotado en el papel. Esta
actividad corresponde con la tarea que llamamos B
6. Probar la solución:
A 3
B 3 3
F 3
A 5 3
E 5 8
F 8
C 8 8
D 8 8 8
Si no obtuvo el mismo resultado no hay que desanimarse. Pudieron pasar dos
cosas: o el algoritmo es incorrecto, cosa que puede verificarse al hacer la
prueba, o usted encontró una solución diferente, que es absolutamente
posible.
T=(X+Y)+Z
A 3
B 3 3
F 3
A 5 3
E 5 8
F 8
A 7 8
E 7 15
F 15
C 15 15
D 15 15 15
R=(((X1+X2)+X3)+X4)+X5
Y el algoritmo correspondiente quedaría de la siguiente forma
A, B, F, A, E, F, A, E, F, A, E, F, A, E, F, C, D
¿Ve lo mismo que yo? Hay una cadena que se repite: AEF
Esa cadena la vemos 4 veces en este algoritmo que suma 5 números, 2 veces
en el algoritmo que suma 3 números, y una vez en el que suma 2 elementos.
Por lo tanto se repite N-1 veces, donde N representa la cantidad de números a
sumar.
Digresión:
Las tareas encerradas entre corchetes son las que deben repetirse N-1 veces. El único problema es que nuestro
monito no sabe repetir actividades una determinada cantidad de veces, porque no sabe contarlas. Deberíamos
enseñarle y de este modo este algoritmo podría ser posible y correcto.
A, B, A, B, A, B, A, B
A, B, A, B, A, B, A, B (primer cuadrado)
A (Avanza sobre el primer lado del cuadrado sobre escribiendo)
A, B, A, B, A (dibuja los 3 lados que le faltan al segundo cuadrado)
Sugiero que el lector pruebe creando nuevas figuras, o incluso agregar nuevas
tareas elementales al robot, para permitirle resolver problemas más
complejos.
Por ejemplo podríamos agregarle las tareas elementales:
C. Subir lápiz
D. Bajar lápiz
De este modo podemos hacer que el robot avance sobre el papel sin dibujar,
permitiendo por ejemplo realizar cierto tipo de escritura con la tipografía
adecuada.
A. Bajar lápiz
B. Subir lápiz
C. Avanzar X milímetros
D. Girar Y grados
A
C 100
D 30
C 100
D 30
C 100
D 30
C 100
D 30
C 100
D 30
C 100
D 30
B
Son tan solo dos operaciones nuevas y una mejora de las dos que ya
teníamos, pero la diferencia es enorme. Ahora podemos dibujar hexágonos
como el del ejemplo, o polígonos de cualquier cantidad de lados, avanzar sin
escribir lo que nos permitiría crear letreros por ejemplo. Una enorme
diferencia.
Hemos agregado nuevas herramientas a nuestra caja, y con eso podemos
resolver nuevos problemas, o quizás, problemas que antes podíamos resolver
de una manera, ahora podemos resolverlos de otra más eficiente.
Si quisiéramos construir un rectángulo de 10 cm de altura por 20 de base,
podríamos hacerlo con cualquiera de los dos robots. Veamos los resultados:
Robot 1.0
A, A, B, A, A, A, A, B, A, A, B, A, A, A, A, B
Robot 2.0
A, C 100, D 90, C 200, D 90, C 100, D 90, C 200, D 90, B
Digresión:
Con el segundo robot también puedo emular el comportamiento del primero y resolver el mismo
problema sin aprovechar sus ventajas. El algoritmo quedaría expresado de la siguiente manera
A, C50, C50, D90, C50, C50, C50, C50, D90, C50, C50, D90, C50, C50, C50, C50, D90, B
Este sujeto sabe sumar, algo sorprendente para un monito, pero no sabe
efectuar comparaciones y tomar decisiones. Lo que debemos hacer es
enseñarle algo nuevo; una vez que aprenda, podrá resolver problemas
diferentes.
Imagino que mucho habrá costado enseñarle a sumar y escribir números, ni
me imagino lo que costó enseñarle a hablar, por eso no lo exijamos mucho
más y tratemos de enseñarle una única tarea elemental G, que nos permita
construir un algoritmo para determinar qué número es mayor entre dos
diferentes.
Le doy unos minutos para que haga una pausa en la lectura y escriba la tarea
elemental G.
Una que podría funcionar sería así:
¿Se parece a la tarea que usted diseñó? Posiblemente otras funcionen, pero
veamos cómo trabaja esta.
Si 5 es mayor que 8
memorizar 5
Una vez hecho esto, bastará con cambiar el papel, anotar el número
memorizado y decirlo en voz alta. Problema resuelto.
A, B, F, A, G, F, C, D
Digresión:
Como se puede observar en el algoritmo, no usamos la tarea elemental E. Es que en realidad no hace
falta usar todas las tareas elementales de un sujeto para resolver un problema dado. En este caso no hizo
falta sumar. No siempre es necesario usar todas nuestras habilidades para resolver un problema. Lo que
debemos intentar es usar las habilidades requeridas de la manera más eficiente posible.
Si todo salió bien, ahora usted tiene las cartas ordenadas delante suyo y
aunque parezca magia no lo es. Si a este relato lo hubiera presentado como un
truco de magia alguien podría creer que aquí ocurrió algo sobrenatural, pero
no es así. En realidad se ejecutó de manera correcta un algoritmo que,
cualquiera sea el orden inicial de las cartas, al final quedan inevitablemente
ordenadas.
Este es el poder de las decisiones dentro de los algoritmos, permiten evaluar
las condiciones o estados en un determinado momento, y en base a dicho
estado, ejecutar las acciones correctas que nos lleven a un resultado deseado.
Repeticiones o iteraciones
Para dar otro ejemplo, consideremos el caso de un albañil que levanta una
pared. El sujeto repite la tarea de colocar un ladrillo a continuación de otro
mientras no haya completado la línea, y una vez completada, inicia otra línea
sobre la anterior. Esta última tarea la realiza hasta que haya llegado a la altura
correcta. De este modo tenemos una tarea repetitiva dentro de otra tarea
repetitiva. Cada fila de ladrillos incluye la tarea de colocar un ladrillo a
continuación de otro, y como se deben hacer varias filas, tenemos lo que
llamamos "ciclos anidados".
Poniendo todo junto
Pudimos observar tres tipos de actividades dentro de los algoritmos que
estuvimos construyendo hasta ahora, y son las siguientes:
Dada una lista de N números, determinar la suma de aquellos que sean pares.
Para que quede claro que el problema está comprendido, consideremos que la
lista de números es 45, 32, 94, 15.
En esta lista podemos ver que los números pares son 32 y 94. Sumados estos
números, el resultado es 126, por lo tanto, es el resultado esperado.
Continuemos con los siguientes pasos de resolución del problema.
Identificar los datos de entrada: En este caso lo obvio es que los datos son los
números de la lista, pero también hay un dato que no es tan obvio, y es el
hecho que la lista tiene tamaño N, o sea que el valor de N también es un dato.
En el caso del ejemplo N es 4, porque la lista tiene 4 números.
Veamos cómo haría esta máquina para ejecutar este algoritmo, paso a paso,
con el mismo ejemplo que usamos anteriormente para comprender el
problema.
- Primera repetición
Pedir un número y almacenarlo en A (ahora A=45, el primer número de la lista)
Dividir A por B y poner el resto en C (el resto de dividir 45 por 2 es 1, entonces C=1)
Si C=0 [Sumar A a D con resultado en D (como C=1 no hace nada y D sigue en 0)
- Segunda repetición
Pedir un número y almacenarlo en A (ahora A=32, el segundo número de la lista)
Dividir A por B y poner el resto en C (el resto de dividir 32 por 2 es 0, entonces C=0)
Si C=0 [Sumar A a D con resultado en D (como C=0 realiza la suma y D=32)
- Tercera repetición
Pedir un número y almacenarlo en A (ahora A=94, el tercer número de la lista)
Dividir A por B y poner el resto en C (el resto de dividir 94 por 2 es 0, entonces C=0)
Si C=0 [Sumar A a D con resultado en D (como C=0 realiza la suma y D=126)
- Cuarta repetición
Pedir un número y almacenarlo en A (ahora A=15, el cuarto número de la lista)
Dividir A por B y poner el resto en C (el resto de dividir 15 por 2 es 1, entonces C=1)
Si C=0 [Sumar A a D con resultado en D (como C=1 no hace nada y D sigue en 126)
¿Pero por qué si todos tienen las mismas herramientas y el mismo problema a
resolver los resultados no son iguales? La respuesta es: talento, método,
conocimiento, arte y práctica.
Esto significa que abriremos otra caja de herramientas diferente, con las
cuales podremos representar nuestros algoritmos.
Lo que tiene que quedar claro en este punto, es que presentaremos nuevas
herramientas y daremos algunos ejemplos de cómo usarlas, sin pretender
proponer una enciclopedia de problemas resueltos, que para ello existen otros
libros, como por ejemplo “Construyendo algoritmos numéricos”, que
escribiera dos años después que este.
Reforzando más las ideas, si este fuera un libro que enseñe a realizar pinturas
sobre tela, mostraría las distintas herramientas y su forma adecuada de
usarlas, aconsejando sobre distintos tipos de pinturas y texturas, el
aprovechamiento de sus cualidades y como darle una buena terminación a las
piezas creadas. En medio de este camino se propondrán ejemplos, pero eso
no significa que se pretenda enseñar cómo hacer una pintura que proponga un
torso humano, un rostro, un caballo, o cualquier otro objeto imaginable, pero
sí se pretende enseñar el uso correcto de las herramientas para que el lector
pueda comenzar a realizar sus propias piezas, mejorando los resultados
obtenidos a lo largo del tiempo con la práctica.
Sigamos este camino: los algoritmos que crearemos serán ejecutados por una
computadora, para ello debemos expresarlo de alguna manera que la
computadora lo comprenda, que es a través de un lenguaje de programación,
pero necesitamos un paso intermedio para conseguirlo. Nuestro algoritmo,
que está en nuestra mente, debe ser interpretado por algún sujeto que lo
traduzca a un lenguaje de programación. Para ello nos valdremos de
herramientas que cumplan el rol de traductores de nuestras ideas a futuros
programas.
Si deseamos construir una casa bonita y útil, podemos imaginarla, pero para
hacerla realidad, necesitamos primero contar con planos que representen
nuestras ideas para que alguien la construya según nuestros gustos. Lo que
veremos en este capítulo será algo así como la elaboración de los planos de
nuestras ideas.
Reforzando la idea, el lenguaje natural puede ser una buena herramienta para
representar recetas de cocina, pero no lo es para especificar programas de
computadora.
Por ejemplo:
ingresar A
ingresar A, B, X
<variable> = <expresión>
+ Suma
- Resta
* Multiplicación
/ División
\ División entera
** Potencia
Instrucción Operación
Instrucción Operación
ingresar A
ingresar B
S=A+B
mostrar S
ingresar A,B
S= A+B
mostrar S
¿Y así?
ingresar A,B
mostrar A+B
¿Cuál es mejor? Depende. Las dos primeras son más expresivas. La tercera
versión es más corta y pareciera más eficiente, pero no es muy clara. Es
mejor en estas instancias iniciales, sacrificar un poco de eficiencia en
beneficio de la claridad de los algoritmos.
ingresar A,B,C
D = A+B+C
mostrar D
¿Y si fueran 4?
ingresar A,B,C,D
S = A+B+C+D
mostrar S
¿Y si fueran N números?
Todavía no tenemos los elementos necesarios para sumar una lista larga de
números, o una lista de un número variable de elementos, pero pronto
podremos hacerlo.
Decisiones
Siguiendo el mismo camino recorrido en la primera parte del libro, es el
momento de incorporar de alguna forma el concepto de decisión a nuestro
pseudocódigo. Sabemos a esta altura que las decisiones son importantes
dentro de muchos de nuestros algoritmos, es por eso que debemos contar con
una instrucción que las represente de una manera adecuada. Para ello
usaremos las palabras “si” y “sino”. La palabra “si” siempre irá seguida de
una condición, que tendrá un resultado verdadero o falso. Si resulta la
condición verdadera, entonces se ejecutarán las tareas o instrucciones que
debemos realizar en dicho caso. Al contrario, si la condición resulta falsa, se
ejecutará otro grupo de tareas elementales o instrucciones diferentes.
si <condición> entonces
<instrucciones si la condición es verdadera>
sino
<instrucciones si la condición es falsa>
Operador Descripción
= Igual
> Mayor
< Menor
<> Distinto
Ejemplos de decisiones
ingresar A y B
si A > B
M=A
sino
M=B
mostrar M
ingresar A y B
si B>A
A=B
mostrar A
Los datos son los mismos, pero el resultado esperado es diferente, porque
puede aparecer un mensaje diciendo que los números son iguales.
ingresar A, B
si A=B
mostrar "son iguales"
si A>B
mostrar A
si B>A
mostrar B
Aquí tratamos con un problema muy simple, pero lo interesante del análisis
de las soluciones propuestas, podría llevarnos a las raíces de la inteligencia
artificial. ¿Es para tanto? Bueno, a la semilla, más que a las raíces. Sin entrar
en muchos detalles, aquí tenemos dos números que son nuestros datos, a
medida que preguntamos cosas sobre ellos vamos "aprendiendo"
características, hechos. En la solución inicial, primero preguntamos si A es
igual a B, si esto no ocurre, solamente preguntamos cómo es A con respecto a
B, ya que sabemos que no son iguales y existe un mayor. En el segundo caso,
no aprovechamos el conocimiento adquirido sobre los datos, y cuando
llegamos a preguntar si A es mayor que B, el algoritmo no usa el resultado de
la pregunta anterior, como si se "olvidara" instantáneamente de algo que
debería saber. Utilizando esa idea, podemos hacer algoritmos más eficientes,
y más “inteligentes".
De todos modos, insistimos que en esta instancia no pretendemos construir
los algoritmos más eficientes, sino simplemente correctos. Sin embargo, daré
mi opinión sobre las distintas soluciones a fin de justificar un criterio de
“solución eficiente”.
Ingresar A,B,C,D
si A>B
X=A
A=B
B=X
si A>C
X=A
A=C
C=X
si A>D
X=A
A=D
D=X
si B>C
X=B
B=C
C=X
si B>D
X=B
B=D
D=X
si C>D
X=C
C=D
D=X
Mostrar A,B,C,D
Algoritmo para ordenar cuatro números
¿Un poco tedioso? Tuvimos que hacer 6 preguntas y 6 intercambios. Eso sólo
con 4 números. Estimo que con 5 números serían 10, con 6 números 15, y
con 10 números 45. Eso provocaría algoritmos extremadamente largos, sólo
para pocos números. La razón es que esta forma de resolver el problema
utiliza más la “fuerza bruta” que la inteligencia.
Requisitos de un ciclo
Los requisitos que debemos encontrar al momento de realizar operaciones
repetitivas, cíclicas o iterativas, son los siguientes:
Veamos todo esto dentro de un ejemplo ya estudiado, como puede ser batir
claras de huevo a punto nieve.
Algoritmo:
3. Batir, por ejemplo, podría ser una vuelta del batidor sobre las claras.
Quizás con otro ejemplo quede más claro. Supongamos que queremos comer
todos los caramelos de una bolsa. ¿Estará claro cuál es la operación
repetitiva? Tomar un caramelo de la bolsa y comerlo. ¿Cuándo termino?
Cuando ya no queden más caramelos en la bolsa.
Algoritmo:
- Poner caramelos en una bolsa
- Mientras haya caramelos en la bolsa repetir lo siguiente: tomar un caramelo
y comerlo.
1. Debemos tener una bolsa con caramelos, que establece las condiciones
previas
Los datos del problema están representados por los límites del intervalo de
números naturales que debemos mostrar. En este caso 1 y 10
V=1
repetir mientras V<10
mostrar V
V=V+1
Algoritmo que muestra los números naturales del 1 al 10
Para ello deberíamos tomar una variable, asignarle el valor 1 (primer número
natural, como en el ejemplo anterior), mostrar su valor y luego incrementarla,
mientras no se pase del valor de N. Otra vez, las tareas repetitivas son mostrar
e incrementar.
ingresar N
V=1
repetir mientras V<N
mostrar V
V=V+1
Con esta nueva herramienta podemos también realizar actividades que antes
no podíamos. Sumar dos números fue simple, sumar 3 números también,
¿pero, cómo será sumar N números?
La formulación correcta del problema podría ser: Dados N números, obtener
el resultado de su suma.
Para el punto 2 necesitaremos una variable que cuente cada número que
ingrese y la llamaremos C, que deberá comenzar en cero. Esta variable
actuará como un “contador” de eventos. ¿Porqué comienza en cero? Porque
vamos a contar cuantos elementos hemos sumado hasta un momento dado, y
resulta que antes de comenzar no hemos sumado ninguno, por lo tanto el
contador C vale cero. El nombre de la variable C es arbitrario totalmente,
podríamos haberlo llamado CONTADOR.
Para el punto 3 necesitaremos una variable que sume cada número ingresado
y la llamaremos S, que también deberá comenzar en cero. Esta variable
actuará como “acumulador” de los números de la lista. Obviamente comienza
en cero por la misma razón que hace que C comience en cero.
ingresar N
C=0
S=0
repetir mientras C<N
ingresar X
S=S+X
C=C+1
mostrar S
Para comprender mejor como funciona este algoritmo, vamos a realizar una
“prueba de escritorio”, que consiste en crear una tabla, donde cada columna
representa una variable del algoritmo, a la que agregaremos una columna más
para representar la salida, o sea, los resultados que muestran. En cada fila
colocaremos los valores de las variables que resultan en cada iteración.
N C S X Salida Comentarios
4 0 0 Valores iniciales
1 12 12 Primera iteración
2 17 5 Segunda iteración
3 20 3 Tercera iteración
ingresar N
C=1
S=0
repetir mientras C<=N
ingresar X
S=S+X
C=C+1
mostrar S
Pasando en limpio:
Entonces si hacemos esto mientras el número sea mayor que cero, contando
la cantidad de veces que repetimos la tarea, resolveremos el problema.
ingresar N
C=0
repetir mientras N>0
N=N\10
C=C+1
mostrar C
N C Salida Comentarios
Siguiendo la metodología:
Paso 1: Problema comprendido
Paso 2: Igual que el problema anterior, un número natural
Paso 3: La suma de los dígitos del número natural
Paso 4: Se parece mucho al problema anterior, pero en lugar de contar los
dígitos, debemos sumarlos. Para eso no es suficiente con “sacarlo”, porque
perderíamos su valor. Entonces primero deberíamos obtener su valor,
sumarlo y después sí lo descartamos. Algo más o menos así:
Ingresar un número,
Obtener el último dígito,
Sumarlo a alguna variable (esa variable debería comenzar en cero),
Sacarle el último dígito al número,
Repetir hasta que no queden más dígitos
El elemento nuevo aquí es “obtener el último dígito”. Para eso tenemos otra
operación matemática conocida que habíamos llamado “mod”, que determina
el valor del resto de la división entera.
Si dividimos 7524 por 10, resulta 752 como cociente y 4 como resto.
Justamente “mod” es el resto de la división, o sea, el último dígito del
número, si usamos como divisor al número 10.
ingresar N
S=0
repetir mientras N>0
D=D mod 10
S=S+D
N=N\10
mostrar S
N S D Salida Comentarios
Tanto <valor inicial> como <incremento> y <valor final> pueden ser valores
constantes, el valor de una variable, o expresiones en general
Su funcionamiento es el siguiente:
Ejemplos
V=1
repetir mientras V<10
mostrar V
V=V+1
Este es un caso típico de ciclo controlado por una variable. Con nuestra
nueva instrucción quedaría de la siguiente forma:
Hasta ahora hemos resuelto algunos ejercicios en los que participan listas de
números, pero en ningún caso fue necesario “memorizar” la lista completa.
Para resolver problemas tales como sumar los números de una lista, o contar
cuantos cumplen con una condición u obtener el valor del promedio, no es
necesario recordar cada elemento de la lista. Basta con almacenar cada
elemento en la misma variable que va cambiando de valor sucesivamente.
Sin embargo, existen problemas donde sí es necesario conservar todos los
elementos de la lista, y esta situación se observa al menos en dos ocasiones:
ingresar A, B, C
mostrar C, B, A
Eso estuvo fácil, pero sólo sirve para una lista de 3 números. ¿Y si la lista
tuviera 5 números? Tampoco resulta complicado
ingresar A, B, C, D, E
mostrar E, D, C, B, A
¿Qué pasaría si la lista tuviera 329 números? ¿O 75? ¿Y si los elementos que
participan en cada caso varían en cantidad?
Para ello existen las variables indizadas, que no son más que variables que se
identifican a través de un nombre, y un número que actúa como subíndice.
Si la variable tiene un solo subíndice, recibe el nombre de vector, y sirve para
operar con listas.
Si la variable tiene dos subíndices, recibe el nombre de matriz, y sirve para
operar con tablas.
Las variables pueden tener más índices, pero a efectos de este libro,
trabajaremos con variables de un subíndice, porque resulta suficiente para
ilustrar el concepto, sin entrar en complejidades algorítmicas innecesarias.
<variable>[<subíndice>]
Haciendo la analogía con las cajitas que representan las variables, podemos
decir que tenemos entonces cinco cajitas, que todas se llaman V, pero cada
una de ellas se identifica con un número.
Ese número puede estar dado por una expresión, por ejemplo:
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[I]
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[I]
repetir para I=N incremento -1 hasta 1
mostrar L[I]
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[I]
repetir para J=N incremento -1 hasta 1
mostrar L[J]
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[I]
repetir para I=1 incremento 1 hasta N
mostrar L[N-I+1]
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[i]
Hasta aquí tenemos la lista ingresada en el vector L, ahora vamos a sumar sus
elementos, en la variable S
S=0
repetir para I=1 incremento 1 hasta N
S=S+L[i]
P=S/N
C=0
repetir para I=1 incremento 1 hasta N
si L[i] = P entonces
C=C+1
mostrar C
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[i]
S=0
repetir para I=1 incremento 1 hasta N
S=S+L[i]
P=S/N
C=0
repetir para I=1 incremento 1 hasta N
si L[i] = P entonces
C=C+1
mostrar C
Podemos intentar una solución un poquito más eficiente si unimos los dos
primeros ciclos en uno solo, ya que podemos sumar los elementos de la lista a
medida que ingresan.
ingresar N
S=0
repetir para I=1 incremento 1 hasta N
ingresar L[i]
S=S+L[i]
P=S/N
C=0
repetir para I=1 incremento 1 hasta N
si L[i] = P entonces
C=C+1
mostrar C
¿Eso es todo?
Ya están dadas todas las herramientas de interés de este libro en lo que
respecta a representación de algoritmos, sin embargo vamos a ver algunos
problemas típicos más, sólo a modo de ilustración.
Lo que hicimos casi sin querer al ordenar los 4 números, fue hacer un
recorrido completo de la lista al ubicar en el primer lugar el menor de todos, a
continuación hicimos lo mismo con los 3 números restantes, y luego con los
dos últimos, quedando así ordenada la lista.
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[I]
repetir para I=1 incremento 1 hasta N-1
repetir para J=I+1 incremento 1 hasta N
si L[J]<L[I] entonces
X=L[J]
L[J]=L[I]
L[I]=X
repetir para I=1 incremento 1 hasta N
mostrarL[I]
Intersección de conjutos
Supongamos que tenemos dos listas de M y N elementos respectivamente que
representan los conjuntos A y B. Dado que suponemos que son conjuntos, no
tendrán elementos repetidos, pero tampoco estarán ordenados.Debemos
obtener un conjunto C, que sea el resultado de la intersección de A y B, o sea
que cada elemento de C debe estar en A y en B.
¿Cómo resolvemos este problema?
Representaremos cada conjunto con un vector. Esta forma de hacerlo es una
licencia que nos tomamos, porque en rigor matemático son cosas totalmente
diferentes.
Tratándose de la intersección, podemos por ejemplo tomar cada elemento de
A, y si se encuentra en B lo agregamos a C.
ingresar M
repetir para I=1 incremento 1 hasta M
ingresar A[I]
ingresar N
repetir para J=1 incremento 1 hasta N
ingresar B[J]
K=0
repetir para I=1 incremento 1 hasta M
J=1
repetir mientras (J<=N) ^(A[I]<>B[J])
J=J+1
si A[I]=B[J]
K=K+1
C[J]
repetir para I=1 incremento 1 hasta K
mostrar C[I]
Resumen del capítulo 2
Algunas aclaraciones:
- No usaremos la instrucción“ingresar” con una lista de variables para
facilitar la compatibilidad entre versiones de Python. Ingresaremos una
variable a la vez
- Si ingresamos un número entero usaremos la función“int”
- Si ingresamos un número en punto flotante usaremos la función“float”
- Se puede introducir un texto en la sentencia“input”, de manera que se pueda
mostrar un mensaje que indique que dato estamos pidiendo.
Ejemplos
Ejemplos
+ + Suma
- - Resta
* * Multiplicación
/ / División
** ** Potenciación
\ // División entera
Ejemplos
Pseudocódigo Python
A=5 A=5
C = B +1 C=B+1
P = (N \ S) mod 10 P = (N // S) % 10
ingresar A
ingresar B
S=A+B
mostrar S
Algoritmo para sumar dos números en pseudocódigo
A=int(input())
B=int(input())
S=A+B
Print S
También podríamos aprovechar las ventajas del lenguaje para ser más claros:
= == Igualdad lógica
<> != Distinto
v or Disyunción lógica
~ not Negación
Ejemplos
ingresar A y B
si A > B
M=A
sino
M=B
mostrar M
Las mismas formas de iterar que vimos en nuestro pseudocódigo son posibles
de usar con Python. Veremos sus equivalencias en la siguiente tabla
Ejemplos
ingresar N
C=1
repetir mientras C<=N
mostrar C
C=C+1
N=int(input())
C=1
while C<=N:
print(C)
C=C+1
Nótese el parecido. Prácticamente una traducción directa. Ya puede probarlo
en su dispositivo y ver cómo funciona.
ingresar N
repetir para C=1 incremento 1 hasta N
mostrar C
N=int(input())
for C in range (1, N+1,1):
print (C)
ingresar N
S=0
repetir mientras N>0
D=D mod 10
S=S+D
N=N\10
mostrar S
N=int(input())
S=0
while N>0:
D = D % 10
S=S+D
N=N//10
print (S)
Variables indizadas
Lo único que nos queda para poder traducir nuestros algoritmos a Python, es
ver la forma de representación y uso de los vectores. Los vectores y las
variables indizadas en general son muy poderosas en Python y se pueden usar
de muchas maneras. Aquí mostraremos la más parecida al pseudocódigo que
ya conocemos, a fin de poder probar de forma simple nuestros programas.
<variable>=[None]*<tamaño>
V=[None]*10
V=[None]*11
Así tendremos las variables desde V[1] hasta V[10] como queremos.
También tendremos la V[0] pero no la usaremos.
Veremos ahora el primer problema que resolvimos usando vectores que fue el
de mostrar una lista invertida:
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar V(I)
repetir para I=N incremento -1 hasta 1
mostrar V(I)
Algoritmo para mostrar una lista de tamaño N invertida
N=int(input())
V=[None]*(N+1)
for I in range (1,N+1, 1):
V[I]=int(input())
for I in range (N, 0, -1)
print (V[I])
ingresar N
repetir para I=1 incremento 1 hasta N
ingresar L[I]
repetir para I=1 incremento 1 hasta N-1
repetir para J=I+1 incremento 1 hasta N
si L[J]<L[I] entonces
X=L[J]
L[J]=L[I]
L[I]=X
repetir para I=1 incremento 1 hasta N
mostrarL[I]