Introducción a Arreglos y Listas en Programación
Introducción a Arreglos y Listas en Programación
Un arreglo es una estructura de datos que permite asignar una cantidad de memoria para
almacenar varios datos, la cual cumple con las siguientes características:
1. Todo el conjunto de datos se los puede acceder con un mismo nombre. Recuerde que el
nombre hace referencia a una dirección en la memoria.
2. Todos los datos que se van a almacenar en el arreglo deben ser del mismo tipo ( por lo
tanto, la misma cantidad de memoria para cada campo del arreglo).
3. Todos los campos referenciados por el mismo nombre deben ser contiguos. Este punto
junto con el anterior, garantizan la ubicación desde el primer elemento hasta el último.
4. La localización de una dirección de un campo específico utiliza el nombre (el cual hace
referencia al primer elemento del grupo), y la ubicación dentro del grupo. Con estos
elementos más el punto que deben ser del mismo tipo, permiten al administrador de la
memoria acceder al dato específico. Ej.
5Lo anterior indica que hay un grupo de 20 datos identificados con V1 que son de tipo entero
los cuales se van a ubicar a partir de la dirección 1000, donde el primer dato queda en la
posición 1000, el segundo en la dirección 1002, el tercero en la 1004, …..
Cabe anotar que la ubicación del campo se realiza internamente, el programador tan solo tiene
que definir el arreglo, es decir, el nombre, el tamaño y el tipo. Con esta información el
administrador de la memoria accede al campo específico aplicando una simple operación. Ej.
V1 + (2 * 9)
V1 está haciendo referencia a la dirección 1000
Tipo de campo entero 2 bytes
Ubicación 9
V1(9)
Ubicación 0 es válida
V1+(2*0)=1000
El tamaño del arreglo puede ser una variable lo cual permite definir en ejecución el tamaño
del arreglo de la siguiente forma:
V1(10)
Hace referencia a un único campo de memoria que forma parte de un arreglo con nombre
V1 y de éstos se refiere al campo que esta ubicado en la posición 10.
El arreglo como se lo está especificando hasta el momento y que lo trabajan muchos lenguajes
como C, C++, o java entre otros, son estructuras estáticas que definen la cantidad de campos y
el tipo de dato asociado antes de ser utilizados y permanecen con ese tamaño durante la
ejecución del programa. Python no da esta posibilidad pero trabaja la estructura de datos
dinámica denominada lista, la que permite almacenar elementos que son objetos
mediante un orden definido. Las listas son estructuras de datos mutables, lo que
significa que podemos añadir, eliminar o modificar sus elementos.
A diferencia de los arreglos tradicionales cuyos elementos son del mismo tipo y la
asignación de memoria es contigua, los objetos de las listas son heterogéneos,
donde sus elementos pueden ser de todos los tipos de datos que se manejan en
Python y en la memoria no son contiguos.
Ejemplo
data = [‘Tenerife’, {‘cielo’: ‘limpio’, ‘temp’: 24}, 3718, (28.2933947, -16.5226597)]
- Los 4 elementos son de diferentes tipos, string o cadena, diccionario, entero y tupla.
El que se pueda definir datos de diferentes tipos, brinda a la programación una
estructura de datos dinámica que puede apoyar mucho en la construcción de
soluciones computacionales.
- Los objetos no son contiguos pero si tienen un orden específico el cual va a permitir
acceder a cualquier objeto de la misma forma en que se lo realiza en los arreglos. El
orden para el ejemplo es
data
-4 -3 -2 -1
[‘Tenerife’, {‘cielo’: ‘limpio’, ‘temp’: 24}, 3718, (28.2933947, -16.5226597)]
0 1 2 3
data[ 2 ] o data[-2]
correspondiente al valor entero 3718
empty_list=[ ]
languages = [‘Python’, ‘Ruby’, ‘Javascript’]
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
la primera define una lista vacía, las otras dos listas se definen con objetos homogéneos,
con string y enteros respectivamente.
6. La ubicación de un campo específico dentro del arreglo o lista se lo realiza con índices,
los cuales se los puede trabajar de la siguiente forma:
El índice para las tres formas asociadas debe ser de tipo entero.
Nombre arreglo A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Nombre lista A.
A=['', '', '', '', '', '', '', '', '', '', '', '', '','']
A
['', '', '', '', '', '', '', '', '', '', '', '', '','']
0 1 2 3 4 5 6 7 8 9 10 11 13 14
A(10) hace referencia siempre a una variable que pertenece al arreglo de campos A ubicada
en la posición 11.
15 21
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
A(10)
El tratamiento con esta variable es el mismo que se ha trabajado normalmente con todas las
otras variables que no pertenecen a un arreglo; la diferencia radica en que la variable de un
arreglo debe involucrar los paréntesis y los índices.
El tratamiento de una variable perteneciente a un arreglo con las diferentes instrucciones es el
siguiente:
Asignación
A[10]=20;
A
['', '', '', '', '', '', '', '', '', '', 20, '', '','']
0 1 2 3 4 5 6 7 8 9 10 11 13 14
Variable Expresión
A(10) A(10) +1
A[10]= A[10] + 1;
A
['', '', '', '', '', '', '', '', '', '', 21, '', '','']
0 1 2 3 4 5 6 7 8 9 10 11 13 14
Lectura
Leer A(9)
A[9]=int(input(‘dato 9 =‘)
Esto se puede realizar en Python porque se definió A con 15 elementos de lo
contrario saca error
Escritura
Escribir A(10)
print(A[10])
Decisión
Si A(10) < 15 ….
if A[10]<15: …….
NombreVariableArreglo ( variable_indice )
NombreLista [ variable_indice ]
Ejemplo
Variable Indice I
Variable Arreglo A
Si se tiene A(I) o A[ I ], solo puede hacer referencia a un campo específico, el campo al que
se hace referencia depende del valor que se encuentre almacenado en la variable I.
Acceso al campo 6
Necesita que en el campo I se encuentre almacenado el valor 6. Esto se conoce como una
referencia indirecta.
I6
A
15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
I
A(I) hace referencia a la información almacenada en el campo 6
A(I)15
II+1
A(I)20
II+1
A(I)25
I6
A
15 20 25
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
I
Para lista A
A
['', '', '', '', '', '', 15, '', '', '', '', '', '','']
0 1 2 3 4 5 6 7 8 9 10 11 13 14
I=6
A[I]=15;
I=I+1;
A[I]=20;
I=I+1;
A[I]=25;
I=I-4;
A[I]=100
A
['', '', '', '', '', '', 15, '', '', '', '', '', '','']
0 1 2 3 4 5 6 7 8 9 10 11 13 14
II+1
II-1
El que el índice se lo pueda trabajar como variable, permite accesar en forma muy flexible los
campos del arreglo o los objetos de lista, tan solo se debe controlar la variable índice para
saber a que campo se puede acceder. Como los campos son contiguos la identificación de
cada uno de ellos se lo realiza en forma secuencial (0, 1, 2, 3, 4, ….) lo que permite
fácilmente llegar a cada uno de ello con una variable contador, que al introducirla dentro
de un ciclo se puede recorrer todos los campos del arreglo.
Leer CD
I0
Mientras (I<=CD-1) hacer
Leer A(I)
II+1
Fin mientras
En lenguaje python
En listas se tiene la function append() para adicionar datos a la lista. El dato se adiciona
siempre al final
Teniendo en cuenta que CD es la cantidad de campos del vector o de la lista, las acciones
anteriores van a permitir leer información en todos los campos de arreglo.
La posición del campo puede estar representada también por una expresión que entregue
como resultado un valor entero.
Ej: copiar el valor del campo ubicado en la posición 7, al campo ubicado en la posición 5.
I5
A( I ) A( I+2 ) donde I+2 = 7
I=5
A[ I ] = A[ I+2 ]
En muchos problemas relacionados con vectores se necesita trabajar, más de una posición de
un vector a la vez, si estas son las posiciones contiguas se las puede trabajar de la siguiente
forma:
Cuando un ejercicio necesita trabajar con datos de un vector en forma contigua, no hay
necesidad de crear otro índice.
Tipos de arreglos:
Los arreglos se clasifican de acuerdo al número de índices que se utilizan para determinar
una posición, estos pueden ser:
Arreglo Unidimensional. Conocidos también como vector. Necesita para ubicar un campo
del arreglo un índice y se los representa así:
Nombre_del_arreglo ( Indice )
Nombre_de_la_lista [ Indice ]
Ejemplo. Los arreglos a los que hemos hecho referencia en los puntos anteriores son
unidimensionales.
Ejemplo:
M (1,3) hace referencia al campo de una matriz de nombre M ubicado en la fila 1, columna
3.
Esquemáticamente una matriz se la representa de la siguiente forma. Esta forma debe servir
para trabajar un modelo mental.
M 3X4
M
0 1 2 3
1 **
Esta matriz M tiene 3 filas y cuatro columnas, y el campo marcado con ** hace referencia al
elemento M ( 1, 3) ubicado en la fila 1 columna 3
Los arreglos bidimensionales se trabajan con listas, en donde todos los elementos de la lista
son listas con la misma cantidad de elementos. El ejemplo que se viene trabajando se lo mira
de la siguiente forma:
Para entender mejor la definición se va a tener la matriz llena con ceros
0 1 2 -> filas
M=[[0, 0, 0, 0 ], [0, 0, 0, 0], [0, 0, 0, 0]]
0 1 2 3 0 1 2 3 0 1 2 3 -> columnas
M=[[0, 0, 0, 0 ],
[0, 0, 0, 0],
[0, 0, 0, 0] ]
M=[[0, 0, 0, 0 ],
[0, 0, 0, 0],
[0, 0, 0, 0] ]
Arreglos n-dimensionales
Necesitan para ubicar un campo del arreglo n índices (n>2) y se los representa de la siguiente
forma:
Nombre_del_arreglo ( Indice 1, Indice 2, … Indice n )
Nombre_del_arreglo [ Indice 1] [ Indice 2] … [Indice n ]
**
20
De los arreglos anteriores los más utilizados son los arreglos unidimensionales o vectores y
los arreglos bidimensionales o matrices, los n-dimensionales ya exigen aplicación específica,
dependiendo del problema que se quiera solucionar.
0 1
----------------------------------------- ----------------------------------------- -------------
0 1 2 0 1 2 0
M=[[[0, 0, 0, 0 ], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0 ], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0 ],
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
3 -> profundidad
----------------------------
1 2 ->columna
[0, 0, 0, 0], [0, 0, 0, 0]]]
0 1 2 3 0 1 2 3 ->fila
Para hacer referencia a un elemento específico se debe tener en cuenta que los índices se los
va a trabajar de la siguiente forma:
M[profundidad][fila][columna]
M[0][1][2] = 30
M[2][1][2] = 30
M=[[[0, 20, 0, 0 ], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0 ], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0 ],
Arreglos unidimensionales
Un arreglo unidimensional generalmente se lo llama vector.
Para recorrer un vector se utiliza un índice, el cual debe ser controlado por un contador
(implica utilizar el índice como variable) y por un ciclo.
Para poder recorrer un vector se debe conocer la cantidad de elementos que lo conforman,
para así poder establecer la variación del contador y por tanto la repetición del ciclo.
Leer CD
I0
Mientras (I<=CD-1) hacer
Leer A(I), Asignación o Escribir
II+1
Fin mientras
CD=int(input(‘cantidad de datos ‘)
I=0
while I<CD:
Leer,Asignación o Escribir
I=I+1
Ejemplos:
Modelo mental
Es importante tener las características generales del modelo mental, para así saber que es lo
que debemos buscar para la conformación del algoritmo.
Memoria
Variable simple
Definición de un arreglo
Para que sirve un arreglo
Definición de un índice
Manejo claro de los contadores
Manejo claro de los ciclos
Variable arreglada
Relación de la estructura lista con arreglo
0 1 2 3 4 5 6
A
0
1
2
3
4
5
6
Aquí hay dos ejemplos de arreglos unidimensionales los cuales mentalmente se los debe
asociar como un conjunto de estantes que deben ser llenados con información del mismo
tipo.
Estos estantes deben tener un nombre y cada celda debe tener una posición. Para trabajar con
el arreglo entonces, debe tener bien claro que se necesita un índice que le va a permitir
acceder a cualquier posición del arreglo.
Ejemplos:
Retomando el ejercicio
antes
cantidad de elementos del vector
7
A
1 1
0 1 2 3 4 5 6
I
A[0]=1;
A[1]=1;
Después
A
1 1 1 1 1 1 1
0 1 2 3 4 5 6
I I I
Agregar características computacionales
Nombre Arreglo A
Cantidad de elementos 7 (N)
0 1 2 3 4 5 6
I I I
Ej:
A(0) 1
A
1
0 1 2 3 4 5 6
El cual solo llenaría un valor, para llenar todos, se necesita realizar un ciclo para que una
variable contador pueda generar la secuencia del 0 al 6 y aprovechar cada variación para
llegar acceder a un campo. Para éste ejercicio se utiliza la variable contador I de la siguiente
forma
I0
Mientras ( I<= N-1) haga
A(I) 1
I I + 1
Fin mientras
El ciclo presenta iteraciones que van a estar controlados por el índice I, en cada iteración se
garantiza que el valor del índice I permita acceder un campo específico del arreglo y realizar
con el, la acción determinada, en este caso A(I) 1. Una vez terminado el ciclo se obtiene
como resultado lo siguiente:
A
1 1 1 1 1 1 1
0 1 2 3 4 5 6
I I I I I I I
Inicio
Leer N
I0
Mientras ( I<= N-1) haga
A( I ) 1
I I + 1
Fin mientras
Fin
Manejo en pseint
Algoritmo llenarunosvector
Dimension A(10)
Definir A,I,N como entero
Leer N
I0
Mientras ( I<= N-1) haga
A( I ) 1
I I + 1
Fin mientras
FinAlgoritmo
A=[1,1,1,1,1,1,1,1,1,1]
I<-0
Mientras I<= N-1 hacer
A(I)<-1
I<-I + 1
Fin mientras
I<-0
Mientras ( I<= N-1) hacer
Escribir A(I)
I<-I + 1
Fin mientras
FinAlgoritmo
Programa en python
#llenar unos en una lista cantidad dada de elementos
i=0
while i<n:
print('\ndato (',i, ')-> ',A[i])
Ejercicio arreglos 2
Se tiene un arreglo de N posiciones, llenar el campo de las posiciones pares con unos y
campo de las posiciones impares con ceros. Tomamos la posición 0 como par
antes
A
0 1 2 3 4 5 6
después
N=7
A
1 0 1 0 1 0 1
0 1 2 3 4 5 6
I
I es par?
Si
A(I) <- 1
No
A(I) <- 0
La esencia del ejercicio es evaluar la ubicación en el arreglo, lo que se hace con una variable
contador I, que dentro de un ciclo va a tomar valores entre 0 y 6. Cómo esta va variando, se
debe preguntar lo siguiente:
I es par?
Si o No, según su respuesta se hacen las acciones respectivas.
O sea,
I mod 2 = 0?
Si
A(I)<- 1
No
A(I) <- 0
El algoritmo queda:
Algoritmo llenarunoscerosvector
I <- 0
Mientras ( I<= N-1) hacer
Si ( I mod 2 = 0 ) Entonces
A(I) <- 1
Sino
A(I) <- 0
Fin si
I <- I + 1
Fin mientras
I <- 0
Mientras ( I<= N-1) hacer
Escribir A(I)
I <- I + 1
Fin mientras
FinAlgoritmo
Programa en python
Formato
Para VariableContador <- Inicio Hasta Límite con Paso Incremento o decremento
Acciones
Fin para
Ejemplo
for controlado por un contador en Python. Para esto se utiliza la función range() la cual va
establecer rangos de números de acuerdo a sus parámetros
Formato
range(start, stop,step):
• start: Es opcional y tiene valor por defecto 0.
• stop: es obligatorio (siempre se llega a 1 menos que este valor).
• step: es opcional y tiene valor por defecto 1.
range( La variable puede ser cualquier nombre)
Rango: [0, 1, 2]
Utilización de variable
c=3
for i in range(c): # No hace falta indicar el inicio si es 0
print(i)
Rango: [1, 3, 5]
Variación de -1
Rango: [2, 1, 0]
for i in range(2, -1, -1):
print(i)
Ejemplos
i=1;
while (i<=10){
i=i+1;
}
Ciclo para es de enfoque cuantitativo. Como indica el formato tiene una variable Contador, el
límite que debe alcanzar el contador y un incremento o decremento que debe tener el
contador, el cual va a garantizar que el límite se alcance. En este formato de Pseint el
incremento o decremento de la variable contador es implícito, esto significa que la variación
no se especifica, el paso indica que es lo que pasa en cada iteración con la variable contador.
En python
for i in range(n):
print('dato ',i, '=',A[i])
Variacion de 2 en 2
for i in range(n,2):
print('dato ',i, '=',A[i])
El incremento o decremento de la variable contador se da cada vez que se alcanza el Fin para
o cuando se terminan las instrucciones que se repiten.
Ejercicio anterior con ciclo para o for
Inicio
Leer N
Para I<- 0 hasta N-1 con Paso 1
A(I)<- 1
Fin Para
Fin
El ejercicio 2 queda
Inicio
Leer N
Para I<-0 Hasta N-1 con paso 1
Si ( I mod 2 = 0 ) Entonces
A(I) <- 1
Sino
A(I) <- 0
Fin si
Fin para
Fin
La información dentro de un vector va a ser llenada desde el teclado. Para poder llenar la
información se utiliza la instrucción de lectura. Ej.
Leer A( 0 )
>20
Esta instrucción permite llenar información en el campo 1 del arreglo A desde el teclado,
entonces al ejecutarse se llena únicamente un valor.
A
20 15
0 1 2 3 4 5 6
Leer A( 4 )
>15
Para poder llenar toda la información de un vector, se debe establecer un ciclo controlado con
una variable contador que me permita visitar todas las posiciones asi:
La variable contador va a ser la variable I
En Python como no se define desde un comienzo la lista con un tamaño fijo, los espacios se
van generando al tiempo que se va adicionando un elemento con la siguiente instrucción.
[Link](int(input(‘dato ‘,i,’->’)
Recuerde que append() adiciona cada dato al final, entonces la entrada de datos en una lista
queda:
Leer N
Para I<-0 hasta N-1
Leer A( I )
Fin para
En lenguaje python
Por cada iteración de las instrucciones dentro del ciclo, la variable I permite ubicarse en cada
posición del arreglo y se va a llenar la información en el respectivo campo.
Con el ciclo se garantiza que el índice I va a tomar valores desde el 0 hasta el 6 (N-1).
Una vez finalizado el ciclo el vector quedará con los datos totalmente lleno.
A
20 5 8 3 9 8 2
0 1 2 3 4 5 6
En Python por cada iteración del ciclo, la variable i va determinando la posición en que
se va a adicionar un dato con append().
I 0
Mientras ( I<=N-1 ) haga
Escribir A( I )
II+1
Fin mientras
En Python mostrar la lista se la puede realizar mostrar de diversas formas utilizando la
función print.
i=0;
while i<=n-1:
print('\nDato ',i, ') = ',A[i])
i=i+1;
print(A)
Lenguaje Python
for i in range(N):
print('\nDato ',i, ' ->',A[i])
Para los ejercicios de aplicación con arreglos se deben manejar conceptos claves y ejercicios
básicos. Los siguientes conceptos se deben manejar muy bien para trabajar con arreglos.
Recorrido de un vector
Sacar el mayor y el menor de un vector
Buscar un valor y su posición en un vector
Intercambiar datos de un vector
Ordenar un vector
Buscar un dato en un vector ordenado
Generar un vector a partir de otro
Insertar un dato en un vector ordenado
Eliminar un dato de un vector
Nota Importante: Cada ejercicio de aplicación tiene como elemento clave, manejar muy bien
los índices de los vectores o listas, recuerde que dependiendo del ejercicio se pueden
manejar varios índices sobre un mismo vector o una misma lista.
Ejercicio 1
Llenar un conjunto de datos numéricos en un vector y obtener la suma de los numéros.
0 1 2 3 4 5 6
El anterior vector está vacío y se está determinando que tiene en la cantidad de elementos 7.
Si se quiere llegar al vector lleno como el siguiente se debe realizar lo siguiente:
A
20 5 8 3 9 8 2
0 1 2 3 4 5 6
Ahora con la información en la memoria se va a realizer la suma, para lo cual se tiene que la
suma con un dato a la vez va a tener las siguientes variaciones
sum
20 25 33 36 45 53 55
Suma = 20+5+ 8 + 3 + 9 + 8 + 2 = 55
Pasos genéricos
Definir variables
Leer vector
Recorrer vector para sumar cada dato
Mostrar sum
Algoritmo promedioVector
FinAlgoritmo
print('Suma = ',sum)
Ejercicio 1
Llenar un conjunto de datos numéricos en un vector y obtener el promedio de los números
pares del vector.
Datos 20 5 8 3 9 8 2
Resultado
El análisis que se va a realizar para este ejercicio es el mismo que se tiene para todos los
ejercicios anteriores, con el concepto adicional de que ahora los datos van a estar en un
arreglo, por lo que se tiene lo siguiente:
Cantidad de datos 7
A
20 5 8 3 9 8 2
0 1 2 3 4 5 6
Una vez con los datos en la memoria se va a recorrer el vector A para hallar la información
esperada:
Regla de un dato a la vez.
Cantidad de datos 7
A
20 5 8 3 9 8 2
0 1 2 3 4 5 6
A[0]
20 es par? 5es par? 8 es par? 3 es par? 9 es par? 8 es par? 2 es par?
Si No Si no No Si Si
20 28 36 38
1 2 3 4
Pasos genéricos
Definir variables
Leer vector
Recorrer vector y por cada dato
Determinar si el dato es par
Si es par sumarlo y contarlo
Hallar promedio con la suma y el contador y mostrarlo
Algoritmo PromedioParesVector
Definir A,I,N,SUMP,CONP como entero
Definir PROMP Como Real
// Leer vector
FinAlgoritmo
Ejercicio
Llenar un conjunto de datos numéricos en un arreglo unidimensional o vector y obtener el
mayor y el menor de ese vector
Cantidad de datos 7
Datos 3 5 8 1 9 8 2
Mayor 9
Menor 1
Leer Vector
Cantidad de datos 7
A
3 5 8 1 9 8 2
0 1 2 3 4 5 6
Mayor 9
Menor 1
El modelo anterior es el resultado de mirar todos los datos, y como son pocos se puede llegar
a la conclusión establecida.
Criterio: Un dato a la vez, es decir solo se tiene posibilidad de mirar un dato del vector y
generalmente va desde el primero hasta el último
A
3 5 8 1 9 8 2
****
0 1 2 3 4 5 6
Mayor
3
Menor
3
Primer elemento del vector. Con el primer elemento del vector que es 3, mentalmente se
establece que el 3 es el mayor y el menor. Con esto se obtiene un elemento que puede ser
comparado con los demás elementos del vector.
Cantidad de elementos
7
A
3 5 8 1 9 8 2
0 1 2 3 4 5 6
Mayor 5>3? 8>5? 1>8? 9>8? 8>9? 2>9?
3 Si Si No Si No No
Menor Mayor Mayor 1<3? Mayor 8<1? 2<1?
3 5 8 Si 9 no no
Menor
1
Mayor 9
Menor 1
Pasos genéricos
Definir variables
Leer Vector A
Asignar mayor y menor con el valor de la posición 0 del vector
Recorrer vector A desde la posición 1 y por cada elemento del vector realizar
Comparar cada dato con mayor y menor y realizar los respectivos cambios
Mostrar mayor y menor
Algoritmo resultante
Con inicio desde 0
Algoritmo mayorMenorVector
// Leer Vector
Definir A,I,CN,Mayor,Menor como entero
I<-I+1
Fin mientras
// Muestra el resultado de la evaluación
Escribir "Mayor =",Mayor
Escribir "Menor =",Menor
FinAlgoritmo
Este programa en Python se puede mejorar, haciendo uso de funciones que actúan sobre listas
que manejan datos numéricos como elementos.
Las funciones son: min() para obtener el valor mínimo, max() para obtener el valor máximo y
sum para obtener la suma de los valores de la lista. Con estas funciones el programa queda:
Ejercicio básico 2
Esquema anterior
cd
7
Buscar el dato 9
3 5 8 1 9 8 2
3 5 8 1 9 8 2
*****
0 1 2 3 4 5 6
dato
Dato a buscar 9
Resultado
Dato a buscar 10
Segundo modelo
Este modelo aparece cuando se aplica el criterio de un dato a la vez
Si el dato a buscar es 9 lo que hace después de tener los datos en el vector es lo siguiente:
Dato
9
3 5 8 1 9 8 2
1 2 3 4 5 6 7
9=3? 9=5? 9=8? 9=1? 9=9?
No No No No Si
Siguiente Siguiente Siguiente Siguiente Lo
dato dato dato dato encontró
Posición
5
Se va a trabajar con una bandera denominada encontró que inicialmente, antes del ciclo va a
tomar el valor de 0 y cuando haya un valor igual tomará el valor de 1, al final del ciclo se
evalúa la bandera para determinar si se encontró o no, si la bandera es 0 no se encontró el dato
y si es 1 si está.
Como se entiende está condición, Si el dato se encuentra dentro del vector la bandera
Encontro cambiará al valor de 1 y por tanto la condición Encontro=0 se va a volver falsa y
toda la condición del ciclo se vuelve falsa y por tanto terminará el ciclo, pero si no está
Encontró nunca va a cambiar, entonces la que se vuelve falsa es la condición I<=CD-1, lo que
indica que los datos del vector se acabaron.
La condición compuesta obliga a evaluar cual condición simple se vuelve falsa, si Bandera=0
o I<=CD -1 después del ciclo. Generalmente cuando se trabaja con bandera se evalúa la
condición con bandera es decir.
Si Encontro=0
Definir variables
Leer Vector
Leer dato a buscar en el vector
Inicializar bandera encontró en 0
Recorrer el vector A y por cada dato
Comparar cada dato con el dato buscado
Si es igual cambiar bandera encontró a 1 y guardar posición
Evaluar bandera y Mostrar resultado de la búsqueda
Algoritmo
Inicio
// Leer Vector
Leer CD
Para I<-0 hasta CD-1 con paso 1
Leer A(I)
Fin Para
I<-0
// Recorre vector desde la posición 1 y evalúa cada dato con el dato a buscar
Mientras ( I<=CD-1 & Encontro=0 ) haga
Si (A(I)=Dato)
Entonces
Encontro<-1
Pos<-I
Sino
I<-I+1
Fin si
Fin mientras
// Muestra el resultado después de evaluar la bandera Encontró
Si Encontro=1
Entonces
Escribir “Dato “,dato, “Está en la posición “,Pos
Sino
Escribir “Dato “,dato, “no esta en el arreglo”
Fin si
Fin
b=0
i=1
while i<cd and b==0:
if a[i]==dato:
b=1;
pos=i
else
i=i+1
if b==0:
print('Dato ',dato, 'Está en la posición ',Pos)
else
print('Dato ',dato, 'No se encuentra en la lista')
Ejercicio
Leer una serie de N datos numéricos en un vector y encontrar el promedio de los números
múltiplos de 5 y el promedio de los múltiplos de 3.
cd
7 leer
A
3 5 8 10 9 8 30
0 1 2 3 4 5 6
I I=I+1 I I I I I
Promedio de multiplo de 5 = 15
Promedio de multiplo de 3 = 14
Pasos genéricos
Definir variables
Leer datos del vector
Recorrer vector y por cada dato hacer
Preguntar si es multiplo de 5
Si es multiplo de 5 sumarlo y contarlo
Preguntar si es multiplo de 3
Si es multiplo de 3 sumarlo y contarlo
Calcular y mostrar promedio de multiplo 5
Calcular y mostra promedio de multiplo de 3
if a[i] % 3==0:
sum3=sum3+v[i]
con3=con3+1
if cm5>0:
prm5=(float)sum5/com5;
print('\npromedio múltiplos de 5 = ',prm5)
else:
print('\nno hay múltiplos de 5 ')
if cm3>0:
prm3=(float)sum3/con5;
print('\npromedio múltiplos de 3 = ',prm3)
else:
print('\nno hay múltiplos de 3 ')
Ejercicio 2
Para esto se debe tener en cuenta que se va a buscar el dato menor y la posición que ocupa
para intercambiarlo con el dato que esta en la posición 0
Si se tiene el siguiente vector después de leer, se tiene que el dato menor es el 1 que está en la
posición 3 y se lo va a intercambiar por el dato que está en la posición 0
7
Leer vector
A
20 5 8 1 9 8 2
******
0 1 2 3 4 5 6
I I
8<5 1<menor
no
Pos 3
Menor
1
Menor I
1
Aux <- A(0)
A(0) <- A(3)
A(3) <-Aux
A
1 5 8 20 9 8 2
0 1 2 3 4 5 6
Menor
pos
Para intercambiar los datos se debe tener presente que no se puede hacer este intercambio
directamente, sino que se debe utilizar un auxiliar de la siguiente forma:
AuxA(0)
A(0) A(pos)
A(pos) Aux
Aux=A[0]
A[0] = A[pos]
A[pos] = Aux
Definir variables
Leer Vector A
Determinar el dato menor del vector A y su posición (menor, pos)
Intercambiar el dato de la posición 0 del vector con el dato de la posición del menor (pos)
Mostrar vector A
Algoritmo menorVectorPrimeraPos
Definir A,N,I,Menor,Pos,Aux como entero
Dimension A(20)
// Leer vector A
Leer N
I <- 0
Mientras (I <= N-1) hacer // Ciclo para leer datos en el vector A
Leer A(I)
I <- I +1
Fin mientras
Aux<-A(0)
A(0) <- A(pos)
A(pos) <- Aux
// Mostrar vector
I <- 0
Mientras (I <= N-1) haga // Ciclo para escribir datos del vector A
Escribir A(I)
I <- I +1
Fin mientras
FinAlgoritmo
Con el ejercicio anterior lo que se hace es ordenar ascendentemente el primer dato, hallando
el menor de los datos del vector e intercambiando con el de la posición 0. El siguiente
ejercicio va a realizar varias veces lo anterior disminuyendo el tamaño del vector en un
posición, para dejar totalmente ordenado el vector.
Ejercicio
El ejercicio anterior ordena solamente un dato, y va a servir para ordenarlos todos, lo que se
va a ser es volver dinámica la posición a ordenar que es 0, con una variable J que va a ir
desde la posición 0 hasta la cantidad de datos menos dos (N-2), o sea hasta el penúltimo, lo
cual determina otro ciclo, dejando el ciclo controlado por la I como un ciclo interno,
encargado de buscar el menor de los datos que faltan.
Estos dos ciclos tienen la siguiente connotación:
IJ+1
y va a ir hasta N, es el que va a buscar el menor de los datos restantes del vector y su posición,
para intercambiarse con el dato de la posición J .
Para ordenar el primer elemento se tiene: se busca en el ciclo controlados por el índice I
A
20 5 8 1 9 8 2
0 1 2 3 4 5 6
pos
J I I I I I I
Menor Menor
20 1
Pos Pos
0 3
0 1 2 3 4 5 6
AuxA(J)
A(J) A(pos)
A(pos) Aux
A
1 5 8 20 9 8 2
0 1 2 3 4 5 6
J I I I I I
Menor Menor
5 2
Pos Pos
1 6
0 1 2 3 4 5 6
Siempre para buscar el menor se inicia menor con el dato que está en J y su posición en J,
para tener un valor con quién comparar.
Según esto el menor de los restantes es 2 y queda en la posición 6, por los que el intercambio
se hace entre estas dos posiciones representadas por J y Pos, y queda así:
A
1 2 8 20 9 8 5
0 1 2 3 4 5 6
J I I I I
Menor Menor
8 5
Pos Pos
2 6
0 1 2 3 4 5 6
A
1 2 8 20 9 8 5
0 1 2 3 4 5 6
J I I I I
Menor Menor
8 5
Pos Pos
2 6
A
1 2 5 20 9 8 8
0 1 2 3 4 5 6
J I I I
Menor Menor Menor
20 9 8
Pos Pos Pos
3 4 5
0 1 2 3 4 5 6
J I I
Menor Menor
9 8
Pos Pos
4 6
A
1 2 5 8 8 20 9
0 1 2 3 4 5 6
J I
Menor Menor
20 9
Pos Pos
5 6
Al incrementarse la J queda lista para ordenar el elemento 4, de la misma forma que se hizo lo
anterior, y así con las demás hasta que J llega al valor de 5 (N-2) el cual tiene que compararse
con el último que es 6 y a su vez es I (IJ+1) es decir N-1. El vector por lo tanto queda así:
A
1 2 5 8 8 9 20
0 1 2 3 4 5 6
Que el ordenamiento de un vector de esta forma necesita dos índices y por lo tanto para este
caso dos ciclos
- Indice J para ubicar la posición del elemento que se va a ordenar
- Indice I para buscar el elemento menor de los elementos restantes del vector y su
posición (pos) para poder intercambiar con el elemento a ordenar.
El ciclo controlado por J va a ser externo, y el índice controlado por I va a ser interno, eso
significa que el ciclo de I va a terminarse primero.
El límite del ciclo externo controlado por J va hasta N-2 y el interno controlado por I va hasta
N-1
El ciclo interno inicia con I<-J+1.
Pasos genérios
Definir variables
Leer vector A
Recorrer vector A con índice J y por cada elemento realizar
Buscar el menor con el índice I de los datos que faltan(I=j+1) y su posición en Pos
Intercambiar el dato de la posición J con el dato menor ubicado en la posición pos
encontrada
Mostrar vector A
Algoritmo ordenarVector
Definir A,N,I,J,Menor,Pos,Aux como entero
// Definir variables
// Las siguientes instrucciones leen los datos en el vector A
Leer (N)
I0
Mientras (I <= N-1) haga // Ciclo para leer datos en el vector A
Leer ( A(I) )
I I +1
Fin mientras
J 0
Mientras J<=N-2 hacer // Recorrer el vector A con el Indice J
// inicia con el menor del vector que falta y la posición en J
Menor A(J)
Pos J
IJ+1 // I va a comenzar con el valor siguiente de J
Mientras ( I <= N-1 ) hacer // Ciclo para determinar el menor de los restantes del
//vector
Si A(I) < Menor
Entonces
Menor A(I)
Pos I
Fin si
II+1
Fin mientras
// finalizado este ciclo se obtiene el menor y su posición (Pos), se lo va a intercambia
// con elemento en la posición J
AuxA(J)
A(J) A(pos)
A(pos) Aux
JJ+1 // Se ubica en el siguiente elemento a ordenar
Fin mientras
Mientras (I <= N-1) haga // Ciclo para escribir datos en el vector A
Escribir A(I)
I I +1
Fin mientras
Fin
Con rojo se especifica el control del ciclo J y con azul que es interno las acciones que se
realizan con el ciclo controlado por I
Python ofrece funciones que permiten ordenar directamente una lista y mostrar la información
sin necesidad de un ciclo
Ejercicio
Ejercicio
Ordenar un vector ubicando el elemento menor en la posición a ordenar, intercambiando el
valor de este, con cada elemento que sea menor en el vector a medida que se lo vaya
recorriendo.
Es decir:
A
1 2 5 20 9 8 8
0 1 2 3 4 4 6
j i i i i
Pasos genéricos
Leer vector A
Recorrer vector A con J hasta el penúltimo y por cada dato en la posición realizar
Compararlo con los elementos restantes controlados por I
Si el elemento en la posición I es menor
Intercambiarlos
Mostrar vector A
El algoritmo queda
Inicio
Leer (N)
I <- 0
Mientras (I <= N-1) haga // Ciclo para leer datos en el vector A
Leer ( A(I) )
I <- I +1
Fin mientras
J<-0
Mientras J<= N-2 hacer
I0
Mientras (I <= N-1) haga // Ciclo para escribir datos del vector A
Escribir ( A(I) )
I I +1
Fin mientras
Fin
Programa en Python
while i<=cd-1:
print(‘Dato ( ',i, ' ) = ',a[i])
i=i+1
Ejercicio
Este ejercicio ya se analizó anteriormente, pero se lo hizo con una condición compuesta
controlando el ciclo mientras, para que apenas se lo encuentre finalice el ciclo, esta versión
recorre todo el vector y se queda con la posición del último que encuentra
Modelo mental
A
5 8 5 5 7 2 7
1 2 3 4 5 6 7
Dato a buscar
5=7? No
8=7? No
5=7? No
5=7? No
7=7? Si, en este momento se establece que el dato si se encuentra en el vector y se lo va
a realizar a través de la bandera encontró la cual se va a cambiar a uno.
Y la posición donde está es la 5
El modelo sigue preguntando
2=7? No
Si A(i) == Dato
Entonces
Encontro 1
Pos i
Fin si
Esta situación está mejorada en el ejercicio anterior se puede mejorar pero no en este
algoritmo.
Pasos genéricos
definir variables
leer vector a
leer dato a buscar
hacer bandera encontro en 0
Recorrer el vector a y por cada dato
preguntar si es igual al dato a buscar
Si es igual
hacer la bandera encontró en 1 y guardar posición
Si la bandera encontró es igual a 1
Si es uno, dato si está en el vector y en la posición encontrada
Si no es uno, dato no está en el vector
Algoritmo buscarDatoVector
// definicio de variables
// Leer vector a
i<-0
mientras i<= na-1 hacer
leer a(i)
i<-i+1
FinMientras
leer dato
pos <- x
encontro <-1
fin si
x<-x+1
FinMientras
// va a mostrar el resultado evaluando la bandera encontro
Si encontro ==1
Entonces
Escribir "Dato ",dato," si se encuentra en el vector en la posición ",pos
SiNo
Escribir "Dato ",dato," no se encuentra en el vector "
FinSi
FinAlgoritmo
if b==1:
print('dato ',dato, 'se encuentra en la posición ',pos)
else:
print('dato ',dato, 'no se encuentra en la lista ')
#segunda solución
Ejercicio
Se tiene un arreglo con n datos numéricos donde hay varios datos que se repiten, formar un
nuevo vector a partir de este, sin datos repetidos
Modelo mental
Recuerde que el modelo mental es el primer paso para alcanzar la solución ya que, si no es
capaz de modelar en la mente lo que va a realizar, menos lo va a poder programar
Entonces
na
7
A
5 8 5 5 7 2 7
0 1 2 3 4 5 6
I I I I I I I
nb
3
B
5 8 7 2
El segundo modelo mental es la especificación de cada uno de los pasos que se realizan para
llegar al segundo vector.
El vector B es el resultado del vector A, donde solo llega un dato de los diferentes del vector
A
Para controlar esto, cada dato del vector A se lo va a buscar en el vector B, utilizando el
algoritmo que se miró en el ejercicio pasado, sin tener en cuenta la posición, simplemente si
está o no en el arreglo B.
Si el dato el dato de A está en B, significa que no se debe llenar, ya que quedaría repetido, y si
no está significa que es la primera vez que aparece y debe llenarse en B.
na
7
nb
0
A
5 8 5 5 7 2 7
0 1 2 3 4 5 6
I I I
5 esta en 8 está en
B? B?
No No
Llenar Llenar 8 en
dato en B B
B
5
0 1 2 3
8 está en el vector B?
No, entonces se llena en el vector B
B
5 8
0 1 2 3
5 está en el vector B?
Si, entonces no se llena en B porque quedaría repetido.
Así ocurre con los demás datos de A, para obtener finalmente el siguiente vector de B
B
5 8 7 2
0 1 2 3
Para acceder cada dato del vector A se debe tener un índice contador i y la cantidad de datos
del vector (na), esto me genera las siguientes acciones.
i<-0
Mientras ( i<= na-1 ) Hacer // queda listo para recorrer vector A
Para el vector B se debe tener un índice que lo recorra x y la cantidad de datos nb. El ciclo
que lo recorre es:
x <- 0
Mientras (x<=nb-1 ) Hacer
Con ciclo para
la pregunta
5 está en el vector B?
Encontro<-0
x<-0
Mientras (x<=nb-1 & Encontro=0) hacer
Si A(i) = B(x)
Entonces
Encontró<-1
Fin si
x <- x+1
Fin mientras
Si (Encontro=0)
Este código busca un dato de A representado por A(i) y utiliza una bandera para determinar si
esta o no está
Si Encontro = 0
Entonces
Se debe llenar el dato en B
Para poder llenar un dato en B se debe tener un índice que indique donde se va a llenar, de lo
contrario no se llenaría ningún dato.
Para este ejercicio se va a utilizar la variable nb que es la que indica la cantidad de valores
que va llenando en B, cada vez que se llena un dato en B esta variable se incrementa en 1, e
indica la cantidad de elementos que tiene B
B(nb) A(i)
nbnb+1
nb<-nb+1 indica que hay un nuevo dato en B por lo tanto la cantidad de datos debe
incrementarse, y a su vez se lo utiliza como índice para ingresar datos.
Con estos elementos computacionales que explican un modelo mental, las siguientes acciones
genéricas tienen sentido
Definir variables
1. Leer Vector A
2. Recorrer vector A y por cada dato de este vector
Buscar dato de A en el vector B
si no está
llenarlo en el vector B
3. Mostrar vector B
Se incluye como paso genérico Definir Variables, esto significa que toda variable que aparece
dentro del algoritmo se la debe definir. En el programa PseInt se utiliza la siguiente
instrucción para hacerlo
Algoritmo vectorSinRepetidos
definir na,A,B como entero;
definir i,x,nb,b1,Encontro como entero
Escribir “Cantidad de datos del vector : “
Leer na
Dimension A(na),B(na)
// na cantidad de datos en A
// i para recorrer vector A
// x para recorre vector B
// Encontro bandera para buscar dato del vector A en el vector B
// nb cantidad de datos del vector B
// leer vector A
i<-0
mientras i<= na-1 hacer
leer A(i)
i<-i+1
FinMientras
mientras ( i<= na-1) hacer // Ciclo para recorrer vector a y por cada dato a(i)
mientras (x<= nb-1 & Encontro = 0) hacer // este ciclo recorre el vector b con
el indice x
// busca a(i) en el vector b comparando asi:
si (A(i) == B(x))
Entonces
Encontro<-1
fin si
x<-x+1
FinMientras
// En este momento se averigua que paso en el ciclo, si el dato se encuentra la
//bandera b1 va a cambiar a 1 sino esta la bandera va a quedar en 0. La primera
// vez no entra al ciclo porque no hay datos en b, por tanto el b1 queda en 0
Si Encontro=0
Entonces
// Si el dato no está en b entonces se llena de la siguiente forma
x<-0
Mientras x<=nb-1 hacer
escribir B(x)
x<-x+1
FinMientras
FinAlgoritmo
Ejercicio
Se tienen dos vectores con datos numéricos y con datos repetidos, formar un tercer vector con
los elementos comunes de estos dos vectores sin repetidos.
A
9 5 8 1 5 8 2
0 1 2 3 4 5 6
i
B
10 5 2 1 4 8 2
0 1 2 3 4 5 6
j
C
5 8 1 2
0 1 2 3
X
Pasos genéricos
[Link] variables
[Link] vector A
[Link] vector B
[Link] el vector A y por cada dato
Buscar el dato de A en el vector B
Si el dato se encuentra en el vector B
Buscar el dato en el vector C
Si no se encuentra llenar dato en C
[Link] vector C
0 1 2 3 4 5 6
Esto es lo que se obtiene mirando todos los datos de los arreglos, y es a donde se tiene que
llegar o sea el vector C es el objetivo.
NA
7
A
9 5 8 1 5 8 2
0 1 2 3 4 5 6
I I
I
NB
7
B
10 5 2 1 4 8 2
0 1 2 3 4 5 6
J
NC
0
C
5
0 1 2 3
1 2 3 4
X
Como se llena este vector siguiendo el concepto de que solo se puede ver un dato de los
vectores a la vez?
C
5
0 1 2 3
X
C
5 8
0 1 2 3
X
De igual forma con el siguiente elemento de A que es 1 (I=4), esta en B y no está en C por lo
tanto se llena
C
5 8 1
0 1 2 3
X
C
5 8 1 2
0 1 2 3
X
Pasos Generales
Definr variables
1. Leer vector A
2. Leer Vector B
3. Recorrer Vector A y por cada dato del vector realizar
Buscar el dato del vector A en el Vector B
Si el dato se encuentra en B
Buscar el dato del vector A en el vector C
Si el dato no se encuentra
Llenar dato en vector C
4. Mostrar vector C
Nota: Son importantes estos pasos genéricos para la programación y son el resultado del
modelo mental, siguiendo la regla de un dato a la vez.
Algoritmo sin_titulo
// Definir variables
// NA cantidad de datos en A
// I para recorrer vector A
// J para recorrer vector B
// X para recorrer vector C
// Encontro1 bandera para buscar en B
// Encontro2 bandera para buscar en C
// NB cantidad de datos del vector B
// NC cantidad de datos del vector C
// leer vector a
// leer vector b
Escribir “Datos del Vector B “
J<-0
mientras J<= NB-1 hacer
leer B(J)
J<-J+1
FinMientras
mientras I<= NA-1 hacer // Ciclo para recorrer vector A y por cada dato A(I)
Encontro1<-0 // bandera para buscar un dato de A en B
J<-0 // va a recorrer vector B
mientras (J<= NB-1 & Encontro1=0) hacer // este ciclo recorre el vector b con
el indice J
// busca A(I) en el vector b comparando asi:
Si (A(I) = B(J))
Entonces
// si son iguales significa que son comunes y por lo tanto la
// bandera se coloca en 1
Encontro1<-1
fin si
J<-J+1
FinMientras
// En este momento se averigua que paso en el ciclo, si el dato de A esta en B
// la bandera Encontro1 vale 1 sino está la bandera es igual a 0
Si (Encontro1=1)
Entonces
// Con la variable X se va a recorrer el vector C para buscar el elemento
// A(I)
X<-0
Encontro2<-0
mientras (X<= NC-1 & Encontro2=0) hacer // Ciclo que recorre el
vector C con X
// busca A(I) en el vector C comparando asi:
Si A(I) == C(X)
Entonces
// si son iguales significa que el dato ya se ha llenado y
// coloca la bandera Encontro2 en 1
Encontro2<-1
fin si
X<-X+1
FinMientras
Si (Encontro2 = 0)
Entonces
// El dato no está en C entonces se llena en el vector C
C(NC)<-A(I)
NC<-NC+1
// NC contiene la cantidad de datos en C
FinSi
FinSi
I<-I+1
FinMientras
// Después de este ciclo en C quedan los datos comunes de A y B sin repetidos
// y tiene NC elementos y se los va a mostrar asi:
X<-0
Mientras X<=NC-1 hacer
escribir C(X)
X<-X+1
FinMientras
// Información a tener en cuenta: todo vector para poder ser recorrido debe tener
// una cantidad de datos, en este caso para el vector c es nc y se debe utilizar un
// índice para recorrerlo en este caso l
FinAlgoritmo
i=0
nc=0
while i<na:
#buscar dato a[i] en b
j=0
encontro1=0
while j<nb and encontro1==0:
if a[i]==b[j]:
encontro1=1
x=x+1
if encontro1==1:
x=0
encontro2=0
while x<nc and encontro2==0:
if a[i]==c[x]:
encontro2=1
x=x+1
if encontro2==0
[Link](a[i])
nc=nc+1
i=i+1
for i in range(len(c)):
print('Dato (',i, ') =',c[i]
i=0
nc=0
while i<na:
#buscar dato a[i] en b
encontro1=a[i] in b
if encontro1==True:
encontro2=a[i] in c
if encontro2=False:
[Link](a[i])
i=i+1
for i in range(len(c)):
print('Dato (',i, ') =',c[i]
Ejercicio
Leer una serie de datos numéricos en un vector, determinar el promedio de los primos y de los
Fibonacci en el vector.
Leer vector
CD
7
A
9 5 8 7 5 13 2
0 1 2 3 4 5 6
I
SUMP CP PROMP
Promedio primos = (5+7+5+13+2)/ 5 =32/5= 6,4
SUMF CF PROMF
Promedio Fibonacci = (5+8+5+13+2)/ 5 = 33/5 = 6,6
Conceptos
Arreglos – Recorrido
Primo
Fibonacci
Suma
Contador
Promedio
Leer Vector
NDA
Cantidad de datos 7
A
9 5 8 7 5 13 2
0 1 2 3 4 5 6
I I I I
A(I) A(I) A(I) A(I)
9 es 5 es 8 es pri? 7 es
primo? primo? No primo?
no Si Si
5 12
9es fibo? 1 2
No
5 es fib? 8 es fibo? 7 es fib?
Si Si No
5 13
1 2
Sump / Cp
Promp=32 / 5
Sumf/ Cf
Promf = 33 / 5
Conceptos que se deben tener claros. Como se determina si es primo y como se determina si
es Fibonacci
A(I) es primo?
// Determinar si es primo
C<-1
CD <- 0
Mientras ( C<=A(I) ) Hacer
Si ( A(I) mod C = 0) Entonces
CD <- CD+1
Fin si
C <- C+1
Fin mientras
Si ( CD = 2 ) Entonces // A(I) es primo
A(i) es Fibonacci?
P<-0
B<-1
T<-0
Mientras (T<A(I)) hacer
T<-P+B
P<-B
B<-T
Fin mientras
Si (T=A(I) ) Entonces // A(I) es Fibonacci
Pasos genéricos
Definir variables
1. Leer Vector A
2. Recorrer vector A y por cada dato hacer lo siguiente
Determinar si el dato de A es primo
Si es primo Sumarlo y Contarlo
Determinar si el dato de A es Fibonacci
Si es Fibonacci Sumarlo y Contarlo
3. Calcular promedio primo y mostrarlo
4. Calcular promedio Fibonacci y mostrarlo
Algoritmo PromPriFib
// Definir variables
// Leer Vector A
SUMP<-0
CP<-0
SUMF<-0
CF<-0
Para I <- 0 Hasta NDA-1 con paso 1
// Determinar si es primo
C<-1
CD <- 0
Mientras ( C<=A(I) ) Hacer
Si ( A(I) mod C = 0) Entonces
CD <- CD+1
Fin si
C <- C+1
Fin mientras
Si ( CD = 2 ) Entonces // el numero A(I) si es primo
SUMP<- SUMP+A(I)
CP<- CP+1
Fin si
// Determinar Si A(I) es Fibonacci
P<-0
B<-1
T<-0
Mientras ( T < A(I) ) Hacer
T<- P+B
P<-B
B<-T
Fin mientras
Si ( T= A(I) ) Entonces // el numéro A(I) es Fibonacci
SUMF <- SUMF + A(I)
CF <- CF + 1
Fin si
Fin para
Si ( CP > 0 ) Entonces
PROMP <- SUMP/CP
Escribir “ PROMEDIO DE PRIMOS = “, PROMP
Sino
Escribir “No hay números primos “
Fin si
Si ( CF > 0 ) Entonces
PROMF <- SUMF/CF
Escribir “ PROMEDIO DE FIBONACCI = “, PROMF
Sino
Escribir “No hay números fibonacci “
Fin si
Fin algoritmo
a=[]
nda=int(input('Cantidad de elementos de la lista '))
# leer lista uno
for i in range(nda):
[Link](int(input(f' Digitar valor ( {i} ) = ')))
sump=0
cp=0
sumf=0
cf=0
for i in range(nda):
c=1
cd=0
while c<=a[i]:
if a[i]%c==0:
cd=cd+1
else:
c=c+1
if cd==2:
sump=sump+a[i]
cp=cp+1
a=0
b=1
t=0
while t<a[i]:
t=a+b
a=b
b=t
if t==a[i]:
sumf=sumf+a[i]
cf=cf+1
if cp>0:
promp=sump/cp
print('Promedio primos -> ',promp)
else:
print('No hay primos en la lista')
if cf>0:
promf=sumf/cf
print('Promedio fibonacci -> ',promf)
else:
print('No hay fibonacci en la lista')
Ejercicio
Leer una serie de N datos numéricos en un vector, varios de ellos repetidos y determinar las
veces que se repite cada uno de estos.
Este ejercicio se lo va a realizar de dos formas para demostrar que puede haber varias
soluciones para un problema.
El método 1 va a utilizar un vector auxiliar para mantener los datos que ya han sido contados
El método 2 va a utilizar dos vectores uno para guardar los datos que ya han sido contados y
otro para llevar la cuenta
Método 1
Modelo mental
4 7 2 5 7 6 4 2 7 5 4 6
4 está 3 veces
7 está 3 veces
2 está 2 veces
5 está 2 veces
6 está 2 veces
Los modelos mentales deben ir incorporando más características de acuerdo a las del
problema.
A
4 7 2 5 7 6 4 2 7 5 4 6
0 1 2 3 4 5 6 7 8 9 10 11
I
4 está 3 veces
7 está 3 veces
2 está 2 veces
5 está 2 veces
6 está 2 veces
Cuando se plantea este modelo su mente debe ir asociando los elementos computacionales
que se relacionan directamente con el concepto de arreglo.
El siguiente modelo mental debe permitir establecer el proceso para llegar al resultado, para lo
cual se debe ajustar el modelo mental inicial a un modelo que se asemeje al funcionamiento
computacional, con el propósito de ir identificando en éste, elementos básicos de
instrucciones computacionales.
El funcionamiento computacional va a realizar operaciones con cada uno de los datos del
arreglo y no con todos a la vez, como aparentemente lo plantea el modelo mental, esto obliga
a tener claridad en lo que se debe realizar en cada tiempo.
4 7 4 5 7 6 2 2 7 5 4 6
0 1 2 3 4 5 6 7 8 9 10 11
4 se cuenta?
si
1 2 3
7 se cuenta?
si
1 2 3
No se cuenta
1 2
no se cuenta
1 2
1 2
No se cuenta
No se cuenta
No se cuenta
No se cuenta
No se cuenta
El anterior ejercicio mental le permite identificar los elementos que se necesitan evaluar para
cada elemento del arreglo.
De lo anterior se puede apreciar que para el número cuatro se inicia un contador ya que es la
primera vez que se cuenta y se recorre posición por posición preguntando si es igual, en cuyo
caso se incrementa el contador. De igual forma para el número 7, para el 4 no se debe contar
porque ya se lo contó. Entonces cada vez que aparezca un dato que ya se contó, no se lo
cuenta. Solo se cuenta los que aparecen por primera vez
De lo anterior se concluye que se debe controlar si el dato se ha contado o no, lo que implica
un subproceso que permita llevar una historia de los datos que se han contado, con los cuales
se pueda determinar en forma precisa estos puntos.
4 7 4 5 7 6 2 2 7 5 4 6
0 1 2 3 4 5 6 7 8 9 10 11
I J J J
I
4 ya se A(I)=A(J
conto? A(I)=A(J) A(I)=A(J ) 4=7? 4=6? 4=2? 4=2? 4=7? 4=5? 4=4 4=6
No 4=7? ) 4=5? No No No No No No Si No
No 4=4? No 3
1 Si
2 7=7? 7=6? 7=2? 7=2? 7=7? 7=5? 7=4? 7=6?
7 ya se 7=5? Si No No No Si no no No
contó? 7=4? No
No No
2 3
1
4 ya se
contó? 5=7? 5=6? 5=2? 5=2? 5=7? 5=5? 5=4? 5=6?
Si 5 ya se no no no no no No Si no
conto?
no
2
1
El ejemplo para cuatro datos del vector, determina que por cada dato se realizo:
Dato ya se conto?
Si se indica que No se lo cuenta recorriendo el vector a partir de la posición del dato, y luego
se debe marcar que ya se contó.
En el modelo que se lleva hasta el momento, se tendría que los contados son:
4 7 5
Estos se debe ir manteniendo en la memoria como contados, de tal forma que cada vez que se
tenga otro dato del vector para contar, se los debe comparar con los que ya se contaron, por lo
que deben estar almacenados en un espacio de memoria.
Con los conocimientos que tenemos, los datos que no se han contado se los debe almacenar en
un arreglo, asimilando el ejercicio al que se había realizado anteriormente, cuando se creó el
arreglo con los datos no repetidos.
CONTADOS
4 7 5
0 1 2
Ahora cada que se tome un dato del vector se preguntará si ya se contó, buscándolo en el
vector CONTADOS, si no está se lo debe contar, y luego de esto se debe almacenar el dato
contado en el vector contados, para que no se vuelva a contar.
Cuando se termine de recorrer todos los datos del vector A, el vector contados va a quedar asi:
CONTADOS
4 7 5 6 2
0 1 2 3 4
NA
12
A
4 7 4 5 7 6 2 2 7 5 4 6
0 1 2 3 4 5 6 7 8 9 10 11
I j j j J J J J J J
j 1 2
J=I+1
X
0
CONTADOS
4
0 1 2 3 4
X X
Z
La pregunta ¿ya se contó?, del modelo mental, entonces implica realizar una búsqueda en
CONTADOS
B0
Z0
Mientras (Z <= X-1 and B=0) haga
Si ( A(I) = CONTADOS(Z))
Entonces
B 1
Sino
Z Z+ 1
Fin si
Fin mientras
Si (B=0)
Entonces
Entonces, si B=0, Significa que el dato no se encuentra en contado y hay que contarlo
recorriendo el vector A con otro índice diferente a I en este caso J, y se lo realiza después del
dato indicado por I o sea J <- I+1 y el contador iniciaría en 1
J I+1
Con 1
Mientras ( J<= N-1) haga
Si (A(I) = A(J))
Entonces
Con Con + 1
Fin si
J<-J+1
Fin mientras
CONTADOS(X) A(I)
X X+ 1
Escribir (‘dato ‘, A(I),” “, Con, ‘ Veces’)
Algoritmo RepetidosVectorMetodo1
definir A,I,J,CONTADOS,Z,X,B,Con Como Entero
// Definir variables
// Leer vector
Leer N
Dimension A(N)
Dimension CONTADOS(N)
I<- 0
X<-0
Mientras (I<=N-1) hacer // Recorrer el vector A para contar elementos
// Busca el dato A(I) en el vector contados
B<-0
Z<-0
Mientras (Z <= X-1 & B=0) hacer
Si ( A(I) = CONTADOS(Z) )
Entonces
B<- 1
Sino
Z<- Z+ 1
Fin si
Fin mientras
Si (B=0)
Entonces // El dato A(I) no se ha contado
J<- I+1
Con <- 1
Mientras ( J<= N-1) hacer // Ciclo para contar A(I)
Si (A(I) = A(J))
Entonces
Con<- Con + 1
Fin si
J<-J+1
Fin mientras
CONTADOS(X) <- A(I) // Identifica que A(I) ya se contó
X<- X+ 1
Escribir "dato ", A(I), " ", Con, " Veces"
Fin si
I<-I+1
Fin mientras
FinAlgoritmo
x=0
i=0
nc=0
while i<n:
#buscar dato a[i] en contados
b=0
z=0
Ejercicio planteado
Con este método determinar cual es el dato que más se repite y las veces que lo hace.
Metodo 2
En conclusión por cada dato indicado por I se tiene que recorrer el vector con J a partir de I,
haciendo varios recorridos sobre el vector.
Este proceso se lo puede optimizar, realizando un solo recorrido del vector A de la siguiente
forma:
Aquí se va a utilizar un vector contador, es decir, cada uno de los campos del vector va a
ser un contador
Para este ejercicio se van a tener dos vectores, uno que va a cumplir la misma función del
vector CONTADOS del ejercicio anterior es decir, va a llenar el dato que aparece para ser
contado llamado DNR (Datos No Repetidos)
El segundo vector va a llevar un contador de los datos, que van apareciendo llamado CON.
A
4 7 4 5 7 6 2 2 7 5 4 6
0 1 2 3 4 5 6 7 8 9 10 11
I I I I I I I I I I I
Si los datos son los anteriores, los arreglos DNR y CON van a quedar de la siguiente forma:
X
0
DNR
4 7 5 6 2
0 1 2 3 4
J J j
CON
3 3 2 2 2
0 1 2 3 4
X X X X X
J J
CON(J)<-CON(J)+1
Definir variables
1. Leer Vector A
2. Recorrer el vector A y por cada dato realizar lo siguiente
Buscar el dato de A en el vector DNR
Si no esta
Llenar el dato en el vector DNR
Colocar 1 en el vector CON en la posición correspondiente
SI está
Incrementar el elemento de CON en 1 correspondiente con el
del vector DNR ( en la posición donde se encontró)
3. Mostrar vectores DNR y CON
A
4 7 4 5 7 6 2 2 7 5 4 6
0 1 2 3 4 5 6 7 8 9 10 11
I I I I I I I
DNR
4 7 5 6 2
0 1 2 3 4
CON
2 2 1 1 1
0 1 2 3 4
CON(J) CON(J) + 1
Donde el índice J permite recorrer el vector DNR para buscar el dato del vector A, como
DNR y CON son correspondientes, y J apunta al contador correspondiente del dato en DNR,
el cual se incrementa en 1, por lo el vector queda con la siguiente información.
CON
2 1
0 1 2 3 4
A
4 7 4 5 7 6 2 2 7 5 4 6
0 1 2 3 4 5 6 7 8 9 10 11
I I I I I I I I I I I I
DNR
4 7 5 6 2
0 1 2 3 4
X X X X X
J
CON
3 3 2 2 2
0 1 2 3 4
X X X X X
El algoritmo es el siguiente
Algoritmo datosRepetidosMetodo2
// Definicion de variables
Definir A,DNR,CON,I,J,B,X,N como entero
Leer N
Dimension A(N),DNR(N),CON(N)
I <- 0
X<-0
Mientras (I<=N-1) hacer // Recorre es vector A para contar
// Busca el dato A(I) en el vector DNR
B<-0
J<-0
Mientras (J <= X-1 & B=0) hacer
Si ( A(I) = DNR(J) )
Entonces
B<- 1
Sino
J<- J+ 1
Fin si
Fin mientras
Si (B=0)
Entonces // Si no se encuentra lo llenar en DNR y coloca 1 en CON
DNR(X) <- A(I)
CON(X) <- 1
X<- X+ 1
Sino // Incrementa CON en 1 en la posición correspondiente J
CON(J) <- CON(J) + 1
Fin si
I<-I+1
Fin mientras
// Muestra los datos contados
Para I<- 0 hasta X-1
Escribir "dato ", DNR(I)," ", CON(I) , "Veces"
Fin para
FinAlgoritmo
x=0
i=0
nc=0
while i<n:
#buscar dato a[i] en dnr
b=0
j=0
if b==0:
[Link](a[i])
x=x+1
[Link](1)
else:
con[j]=con[j]+1
i=i+1
for i in range(len(con))
print('dato ',dnr[i], ' veces ',con[i])
Ejercicio planteado
Utilizar el método anterior para encontrar el dato que más se repite y las veces que lo hace
El ejercicio anterior obtiene dos vectores con y dnr, para lo cual se va a sacar el dato mayor
almacenado en con y su posición, con la posición, que es correspondiente se obtiene el dato
que más se repite:
mayor=con[0]
pos=0
for i in range(1,len(con)):
if con[i]>mayor:
mayor=con[i]
pos=i
print('dato más repetido',dnr[pos],'veces ',con[pos])
en pos se encuentra el dato mayor por lo que se sabe que dnr[pos] está el dato que más se
repite y en con[pos] las veces que lo hace.
x=0
i=0
nc=0
while i<n:
#buscar dato a[i] en dnr
b=0
j=0
if b==0:
[Link](a[i])
x=x+1
[Link](1)
else:
con[j]=con[j]+1
i=i+1
for i in range(len(con))
print('dato ',dnr[i], ' veces ',con[i])
mayor=con[0]
pos=0
for i in range(1,len(con)):
if con[i]>mayor:
mayor=con[i]
pos=i
print('dato más repetido',dnr[pos],'veces ',con[pos])
El ejercicio anterior saca el primer mayor que se encuentre, porque si hay varios datos que se
repiten igualmente, no lo tiene en cuenta.
Ejercicio 3.
Leer una serie de N datos numéricos en un vector, varios de ellos repetidos y determinar las
veces que se repiten cada uno de estos y mostrarlos en forma descendente por la cantidad
de veces que se repiten.
El ejercicio anterior permitió obtener las veces que se repiten cada uno y estableció con el
ejemplo planteado el siguiente resultado mental
Modelo mental
1 4 7 2 5 7 6 4 2 7 6 7 6
1 está 1 vez
4 está 2 veces
7 está 4 veces
2 está 2 veces
5 está 1 veces
6 está 3 veces
1 7 está 4 veces
4 6 está 3 veces
7 4 está 2 veces
2 2 está 2 veces
5 1 está 1 veces
6 5 está 1 veces
Es decir, está organizado en forma descendente por el número de veces que se repite cada
dato.
Esto determina que la información para poderse organizar debe estar en memoria, por lo que
el algoritmo anterior sirve, ya que la información quedaría almacenada en los vectores DNR y
CON de la siguiente forma
A
1 4 7 2 5 7 6 4 2 7 6 7 6
0 1 2 3 4 5 6 7 8 9 10 11 12
I I I I I I I I I I I I I
DNR
1 4 7 2 5 6
0 1 2 3 4 6
X X X X X X
CON
1 2 4 2 1 3
0 1 2 3 4 6
X X X X X X
Para que la información salga como se solicita se debe ordenar el vector CON y hacer los
cambios correspondientes en el vector DNR ya que los dos están relacionados, de lo contrario
la correspondencia se dañaría. Por lo que este ordenamiento implicaría realizar lo siguiente:
I<- 0
Mientras (I<=X-2) haga
J<- I+1
May <- CON(I)
POS <- I
Mientras (J<= X-1) haga
Si (CON(J)>May)
Entonces
May<- CON(J)
Pos <- J
Fin si
J<-J+1
Fin mientras
Aux<-CON(Pos)
CON(Pos)<-CON(I)
CON(I)<-Aux
// Intercambia también las posiciones de DNR por correspondencia
Aux<-DNR(Pos)
DNR(Pos)<-DNR(I)
DNR(I)<-Aux
I<- I+1
Fin mientras
DNR
7 6 2 4 5 1
0 1 2 3 4 6
CON
4 3 2 2 1 1
0 1 2 3 4 6
Con el vector CON ordenado y DNR con la información correspondiente se puede mostrar la
información con el siguiente código:
I 0
Mientras ( I <= X) haga
Escribir(DNR(I),” “,CON(I), “ Veces”)
I I+1
Fin mientras
Algoritmo datosRepetidosMetodo2
// Definicion de variables
Definir A,DNR,CON,I,J,B,X,N como entero
// Leer Vector
Leer N
Para I<- 0 hasta N-1
Leer A(I)
Fin para
X<- 0
I<- 0
Mientras (I<=N-1) hacer
B<- 0
J<- 0
Mientras (J <= X-1 & B=0) hacer
Si ( A(I) = CON (J) )
Entonces
B<- 1
Sino
J<- J+ 1
Fin si
Fin mientras
Si (B=0)
Entonces
DNR(X) <- A(I)
CON (X) <- 1
X<- X+ 1
Sino
CON(J) <- CON(J) + 1
Fin si
I<-I+1
Fin mientras
I<- 0
Mientras (I<=X-2) hacer
J<- I+1
May <- CON(I)
POS <- I
Mientras (J<= X-1) hacer
Si (CON(J)>May)
Entonces
May<- CON(J)
Pos <- J
Fin si
J<-J+1
Fin mientras
Aux<-CON(Pos)
CON(Pos)<-CON(I)
CON(I)<-Aux
Aux<-DNR(Pos)
DNR(Pos)<-DNR(I)
DNR(I)<-Aux
I<- I+1
Fin mientras
I<- 0
Mientras ( I <= X-1) haga
Escribir(DNR(I),’ ‘,CON(I), ‘ Veces’)
I <- I+1
Fin mientras
Fin
El ejercicio anterior hace el ordenamiento en forma descendente del vector CON, de tal forma
que los mayores van a quedar en las primeras posiciones y los menores en las últimas, los
valores de los contadores deben corresponder a los valores de los números en el vector DNR
x=0
i=0
nc=0
while i<n:
#buscar dato a[i] en dnr
b=0
j=0
if b==0:
[Link](a[i])
x=x+1
[Link](1)
else:
con[j]=con[j]+1
i=i+1
i=0
while i<=len(con)-2:
j=i+1
may=a[i]
pos=i
while j<= len(con)-1:
if con[j]>may:
may=con[i]
pos=i
j=j+1
aux=a[i]
con[i]=con[pos]
con[pos]=aux
#para mantener relación
aux=dnr[i]
dnr[i]= dnr[pos]
dnr[pos]=aux
i=i+1
for i in range(len(con))
print('dato ',dnr[i], ' veces ',con[i])
Ahora si se quiere sacar los datos que más se repiten, se hace un rompimiento de control con
el dato en la posición 0. Al ejercicio anterior se le agrega al final las siguientes instrucciones:
i=0;
while con[0]==con[i]:
print(‘\n\ndato mas repetido =’, dnr[i], ‘ Veces ‘,con[i])
i=i+1
}
Ejercicio
Se tiene un vector con datos numérico ordenados, insertar un nuevo dato en la posición que
le corresponde de manera tal que siga ordenado.
Antes
A
2 7 15 20 30 40 45 50
0 1 2 3 4 6 7 8
I I I I I pos
A
2 7 15 20 30 40 40 45 50
0 1 2 3 4 6 7 8 9
I I I I I posj J
J=N-1;
Mientras j>=pos
A[j+1]=A[j]
J=j-1
Fin mientras
A[pos]=dato
N=N+1
Dato a insertar
Dato
35
Después
A
2 7 15 20 30 35 40 45 50
0 1 2 3 4 5 6 7 8
Pos
Se aprovecha de que está ordenado. Como está ordenado se mueve en el vector comparando
el dato con cada posición, mientras el dato sea mayor que el dato del vector, seguirá
avanzando hasta que haya uno que sea mayor o igual y deje de buscar. Se debe guardar la
posición del que fue mayor o igual, porque en esta posición es donde va a insertarse el dato.
Como se hace:
Forma 1
De lo anterior se concluye que si B=0 se adiciona el dato al final del vector, no se inserta, si
B=1 entonces hay que abrir espacio para llenar el dato.
A
2 7 15 20 30 40 40 45 50
0 1 2 3 4 5 6 7 8
J J+1
J
Pos
A(J+1)<-A(J)
A
2 7 15 20 30 4040 40 45 50
0 1 2 3 4 5 6 7 8
Pos
J<-N-1
Mientras (J>=pos) hacer
A(J+1) <- A(J)
J<-J-1
Fin mientras
Esto comienza dejando el último dato en una posición mayor, el penúltimo en la última y asi
sucesivamente, hasta llegar a pos
A
2 7 15 20 30 40 40 45 50
0 1 2 3 4 5 6 7 8
pos
0 1 2 3 4 5 6 7 8
pos
Una vez abierto el espacio con el ciclo decreciente, se inserta el dato y se modifica el tamaño
del vector en 1 asi:
Definir variables
Leer vector A
Leer dato a insertar
Buscar posición del dato en el vector A
Abrir espacio en la posición encontrada
Insertar dato en la posición encontrada e incrementar en 1 la cantidad de datos de A
Mostrar vector
Algoritmo insertarDatoVectorOrdenado
Definir A,I,Dato,B,Pos como entero
Dimension A(20)
// Leer vector
Leer N
Para I<-0 Hasta N-1 con paso 1
Leer A(I)
Fin para
// Leer dato a insertar
Leer Dato
// Buscar posición donde debe quedar
I<-0
B<-0
Mientras (I <=N-1 & B=0) Hacer
Si (A(I) >= dato) Entonces
Pos<-I
B<-1
Sino
I<-I+1
Fin si
Fin Mientras
Si ( B = 1) Entonces
Para J<-N-1 Hasta Pos con Paso -1
A(J+1) <- A(J)
Fin para
Sino
Pos <-N
Fin si
// Insertar dato en la posición pos
A(pos) <- Dato
N<-N+1
// Mostras vector
Para I<-0 Hasta N-1 con paso 1
Escribir A(I)
Fin para
Fin
En python, las listas son dinámicas, por lo que no se debe abrir espacio, solo se hace uso de la
función insert() que tiene el siguiente formato
insert(pos,objeto insertar)
I<-0
Mientras (dato > A(I) & I<=N-1) Hacer
I<-I+1
Fin Mientras
Esta forma se elimina la variable pos y la bandera, todo se lo maneja con la variable I. I,
abarca las tres situaciones, si va al inicio, no entra al ciclo (I=0), si va al final (I=N), y si va
en el medio, I determina el campo donde se debe insertar. En todos los casos I queda ubicada
en el campo donde debe llenarse.
Algoritmo insertadatoVector2
// Mostras vector
Para I<-0 Hasta N-1 con paso 1
Escribir A(I)
Fin para
FinAlgoritmo
Ejercicios
Insertar un dato en un vector no ordenado y ordenado
Borrar un dato de un vector
Buscar un dato en un vector con búsqueda binaria
Formar un vector ordenado a partir de dos vectores ordenados con mezcla
N
Ejercicio
Se tiene un vector con datos numéricos, buscar un dato y eliminarlo.
Antes
A
2 7 15 20 40 45 50 50
0 1 2 3 4 5 6 7
Dato a eliminar
40
Después
A
2 7 15 20 40 45 50
0 1 2 3 4 5 6
A
2 7 15 20 40 45 50 50
0 1 2 3 4 5 6 7
J J+1
Pos
Una vez determinada la posición del dato a borra y realizar los movimientos respectivos el
vector queda con la siguiente información.
A
2 7 15 20 40 45 50
0 1 2 3 4 5 6
Esto significó que los datos que están con verde, se corren todos una posición y el vector
queda con una posición menos.
Esto es lo que se hace mentalmente, computacionalmente los pasos genéricos son los
siguiente:
Definir Variables
Leer Vector A
Leer Dato a eliminar
Buscar dato en el vector y su posición.
Si el dato se encuentra, mover los datos desde la posición encontrada hasta el final una
posición.
Decrementar la cantidad de datos en 1
Mostrar Vector A
De los anteriores pasos, necesita claridad el movimiento de los datos lo cual se realiza de la
siguiente forma
A
2 7 15 20 30 40 45 50
0 1 2 3 4 5 6 7
Pos J
J
Se necesita un índice que inicie en la posición Pos , índice J o también puede iniciar en la
siguiente posición Pos+1. Veamos con las dos posibilidades como queda:
Iniciando J en pos, según el ejemplo se van a mover tres datos y se los representa con el
siguiente codigo
J<-Pos
Mientras ( J <= N-2) hacer
A(J) <- A(J+1)
J<- J+1
Fin mientras
Esto también permite establecer que J vaya hasta N-2, porque si va hasta N-1, con el J+1 se
desbordaría el vector.
A
2 7 15 20 30 40 45 50
0 1 2 3 4 5 6 7
Pos
J J+1
A(J)<-A(J+1)
A
2 7 15 20 40 40 45 50
0 1 2 3 4 5 6 7
Pos
J J+1
A
2 7 15 20 40 45 50 50
0 1 2 3 4 5 6 7
Pos
J J+1
Hasta aquí se tiene toda la información movida una posición, donde al final queda repetido el
50 y se lo ignora con la siguiente instrucción.
N<-N-1 y queda:
A
2 7 15 20 40 45 50
0 1 2 3 4 5 6
Algoritmo:
Algoritmo eliminarDatoVector
// Definición de variables
Definir A, I, J, Pos, N,dato como entero
// Leer Vector
Para I <- 0 Hasta N-1
Leer A(I)
Fin para
// Buscar posición
B<-0
I <- 0
Mientras ( I<=N-1 & B=0 ) hacer
Si (A(I ) = dato) Entonces
B<- 1
Pos <-I
Sino
I<-I+1
Fin si
Fin mientras
// Corres posiciones del vector en pos
Si B=1 Entonces
Para J<- Pos hasta N-2 con paso 1
A(J) <- A(J+1)
Fin Para
// Disminuir tamaño
N<-N-1
Sino
Escribir “El dato no existe en el vector “
FinSi
// Mostrar vector
Para I<- Pos hasta N-1 con paso 1
Escribir A(I)
Fin Para
Fin Algoritmo
[Link](dato)
Esta función exige que el dato se encuentre para poderlo remover, de lo contrario saca error,
por lo que primero se debe determinar si existe para poderlo remover asi:
if (dato in a)==True:
[Link](dato)
else:
print(‘dato no existe en la lista’)
for i in range(len(a))
print('dato ',i, '= ',a[i])
Ejercicio de ordenamiento
La búsqueda binaria
Se presenta únicamente para los datos que están ordenados:
Se inicia con dos valores que indican los límites (índices ), un límite inicial y un límite final
de los datos.
Con estos límites se halla la media ((limiteInicial+LímiteFinal)/2) para obtener el dato que
está en esta posición y se compara el dato buscado con el dato que está en esta en la posición
media. Si es igual termina y muestra su posición.
Si no es igual al buscado, como los datos están ordenados, se determina en cúal de las mitades
está, comparando el dato buscado, si es mayor que el de la mitad, se elimina la mitad inferior
modificando el límite inferior, si es menor se modifica el límite superior. Al modificar los
límites, se elimina la mitad de los datos.
El proceso se repite hasta encontrar el dato o hasta que, al variar los límites, el límite inferior
es mayor que el limite superior, esto indica que el dato no se encuentra.
Ejemplo
Dato a buscar
82
A
10 15 20 22 35 47 56 74 82 87 96 107 116
0 1 2 3 4 5 6 7 8 9 10 11 12
Limite me Límite
Inferior Superior
Me=(LimiteInferior+LimiteSuperior)/2
Me = (0+12)/2 = 6
82 = 56 ?
No
A
74 82 87 96 107 116
7 8 9 10 11 12
Límite Límite
Inferior Superior
me = (limiteInferior+LímiteSuperior)/2 = 9
El dato en la posición 9 es 87
82=87?
No
82<87?
Si // varía el límite superior
LimiteSuperior = me-1 = 8
A
74 82
7 8
Límite Limite
Inferior Superior
Me=(7+8)/2 = 15/2=7,5
82=74?
No
82<74?
No
limiteInferior=me+1=8
me=(8+8)/2=8
A
82
82=82?
Si
82=81?
No
82<81?
No
LimiteSuperior = me -1=8-1=7
Para el dato 81 se concluye, que el dato no se encuentra en el vector porque los el
limiteInferior es mayor que el límiteSuperior
Pasos genéricos
Definir variables
Leer vector ordenado
Leer dato a buscar
Definir limite inicial y limite final
Recorrer el vector A mientras no se encuentra el dato o hasta que el limiteFinal sea menor que
el LimiteInicial. Por cada Iteración realizar:
Calcular índice medio
Comparar dato a buscar con dato en índice medio
Si es igual cambiar bandera
Si no es igual, modificar limites (comparando)
Mostrar resultado
Para mostrar los resultados se utiliza una bandera, para indicar si está o no en el vector
Elemento computacional para determinar el índice medio (me)
me <- (limiteInferior+LimiteSuperior)/2
Aquí hay una división, por lo que me debería ser real, pero interesa que sea entero, por lo que
se utiliza en PseInt una función denominada TRUNC( ), la cual devuelve la parte entera de la
división y se la utiliza asi:
me=(limiteInferior+limiteSuperior)/2;
Variables
A :Vector
N : Cantidad de datos
LimiteInferior : LímiteInferior
LimiteSuperior : Limite Superior
Me : Indice medio
B : Bandera para búsqueda
Algoritmo
Algoritmo busquedaBinaria
Definir A,me,LimiteInferior,LimiteSuperior,B como entero
// Leer datos
Para I<-0 hasta N-1 con paso 1
Leer A(I)
Fin para
LimiteInferior <- 0
LimiteSuperior <- N-1
B<-0
Mientras (LimiteInferior<=LimiteSuperior & B=0 ) hacer
me <- TRUNC((LimiteInferior+LimiteSuperior)/2)
Si (A(me)=dato) Entonces
B <- 1 // El dato está en el vector y sale del ciclo
Sino
Si (dato <A(me))
Entonces
LimiteSuperior<-me-1 // Modifica el índice superior
Sino
LimiteInferior<-me+1 // Modifica el índice inferior
Fin di
Fin si
Fin mientras
Si ( b=1 ) Entonces
Escribir “Dato “, dato, “ está en posición “, me
Sino
Escribir “Dato no está en el vector “
Fin si
Fin
a=[]
n=int(input('Cantidad de elementos de la lista uno '))
# leer lista uno
for i in range(n):
[Link](int(input(f' Digitar valor ( {i} ) = ')))
Ejercicio
Se tienen dos vectores ordenados, formar un tercer vector de tal forma que este quede
ordenado teniendo en cuenta el ordenamiento de los dos anteriores, esto indica que en el
vector tres no debe ser ordenado con un algoritmo de ordenamiento.
Este ordenamiento se denomina ordenamiento por mezcla.
Ejemplo
A
2 7 15 20 30 60 75
0 1 2 3 4 5 6
I I I I I I
B
5 15 25 28 38 55
0 1 2 3 4 5
J J J J J J
C
2 5 7 15 15 20 25 28 30 38 55 60 75
0 1 2 3 4 5 6 7 8 9 10 11 12
NC
El vector C es el resultado de A y de B, y se llena asi:
Se deben recorrer los dos vectores a la vez e ir comparando dato a dato para determinar cual
dato se debe llenar
2<5?
Si
Dato 2 del vector A, va al vector C y pasa al siguiente dato de A
Ahora compara
7<5?
No
Dato 5 del vector B va al vector C y pasa al siguiente dato de B
Ahora compara
7<15?
Si
Dato 7 del vector A, va al vector C y pasa al siguiente dato de A
Esto indica que los vectores A y B, deben avanzar de acuerdo a como se va presentando la
comparación, por lo que los índices se deben mover alternadamente, como se indica en los
tres datos que hasta el momento se han llenado.
A
2 7 15 20 30 60 75
0 1 2 3 4 5 6
I I I
B
5 15 25 28 38 55
0 1 2 3 4 5
J J J
C
2 5 7 15
0 1 2 3 4 5 6 7 8 9 10 11 12
NC NC NC NC
De esta forma se sigue comparando los datos y se llenan en el vector C, en el orden en que lo
especifica la comparación y esto se lleva hasta que uno de los dos vectores llega a su fin.
En el ejmplo el vector que llega a su fin es el vector B, por lo que aún faltan llenar los datos
del vector A 60 y 75.
Los datos que faltan se los llena directamente en C
De igual forma pueden faltar elementos del vector B, los cuales se llenarían directamente.
A
2 7 15 20 30 60 75
0 1 2 3 4 5 6
I I I I I I
B
5 15 25 28 38 55
0 1 2 3 4 5
J J J J J J
C
2 5 7 15 15 20 25 28 30 38 55
0 1 2 3 4 5 6 7 8 9 10 11 12
NC
Los datos del vector C se han llenado, hasta que uno de los dos vectores A o B se acaba, en
este caso fue el vector B, por lo que faltarían llenar dos datos del vector A, los cuales se llenan
directamente, sin comparar.
Los datos que faltan de A que son 60 y 75, se los llena directamente en C
De igual forma pueden faltar elementos del vector B, los cuales se llenarían también
directamente.
NC<-0
I<-0
J<-0
Mientras (I<=NA-1 & J<=NB-1) hacer
El resto de los elementos se llenan después del ciclo mientras, el cual se termina si uno de las
condiciones simples de la condición compuesta se vuelve falsa. Se debe preguntar por una de
ellas y asi se conoce que vector se acabó. Esto es:
Pasos genéricos
Definición de variables
[Link] vector A
2. Leer Vector B
3. Recorrer vector A y Vector B para llenar vector C
Comparar dato de A con Dato de B
Llenar el dato menor e incrementar el índice correspondiente
4. Determinar vector de datos faltantes y llenar datos del vector a C
5. Mostrar vector C
Algoritmo ordenamientoPorMezcla
// Definir variables
Definir A,B,C,I,J,NA,NB,NC,X como entero
// Leer vector A
Para I<-0 hasta NA-1
Leer A(I)
Fin para
// Leer vector B
Para J<-0 hasta NB-1
Leer B(J)
Fin para
a=[]
b=[]
c=[]
na=int(input('Cantidad de elementos de la lista uno '))
# leer lista uno
for i in range(na):
[Link](int(input(f' Digitar valor ( {i} ) = ')))
for i in range(nb):
[Link](int(input(f' Digitar valor ( {i} ) = ')))
#recorrer los vectores
nc=0
i=0
j=0
while i<=na-1 and j<=nb-1:
if a[i]<b[j]:
[Link](a[i])
i=i+1
else:
[Link](b[j])
j=j+1
if i=na:
while j<=nb-1:
[Link](b[j])
j=j+1
else:
while i<=na-1:
[Link](b[i])
i=i+1
print('Vector ordenado por mezcla ')
for i in range(len(c)):
print('dato (',i, ') ->',c[i])
Ejercicio propuesto
Se tienen dos vectores ordenados ascendentemente, formar un tercer vector por mezcla con
los datos pares
Con los primos
Con los fibonacci
A
2 7 15 20 30 60 75
0 1 2 3 4 5 6
I I I I I I
B
5 15 25 28 38 55
0 1 2 3 4 5
J J J J J J
C
2 20 28 30 38 60
0 1 2 3 4 5
Ejercicio.
Se tienen dos vectores con datos numéricos, el primer vector tiene información de como
recorrer el segundo vector en rangos de datos asi:
VectorRango
Sus elementos contienen la cantidad de datos que se van a recorrer en el segundo vector datos
RANGOS
3 6 4
0 1 2
I I
DATOS
10 20 15 22 10 47 22 74 30 87 15 80 11
0 1 2 3 4 5 6 7 8 9 10 11 12
J J J J J
MAY
20 74 87
0 1 2
Este ejercicio es interesante porque permite recorrer en forma dinámica el vector datos
dependiendo del vector rango.
Formar con esto un vector con el mayor de cada rango. Lo importante es manejar los rangos
como se hace esto
Con estos valores se encuentra los valores 2, 8 y 12 en forma dinámica de tal forma que
funciones para los tres valores
J + Rango(I)-1
2 =0+3-1
J + Rango(I)-1
8 =3 +6-1
J + Rango(I)-1
12 = 9 + 4 – 1
Como se recorre los rangos del vector. J va a recorrer todas las posiciones del vector, lo que
se debe controlar es hasta donde va cada rango, para lo cual se calcula Lf, que es el limite
final de cada rango, según el ejemplo la primera vez es 2, la segunda 8 y la tercera 12.
La llenada del vector MAY se hace como se llenaron los vectores anteriores
CM. Cantidad de datos en MAY
Pasos genéricos
Definir variables
1. Leer Vector Rango
2. Leer Vector Datos
3. Recorrer el vector Rango y con cada dato realizar
Recorrer el vector Datos, de acuerdo al vector Rango para obtener el mayor
Llenar el mayor en el vector MAY
4. Mostrar el vector MAY
Algoritmo
Algoritmo rangosVector
Definir Datos,Rango,R,CD,CR,I,J,MAY,CM como entero
// Escribir Cantidad de datos del vector RANGO”
Leer CR
// Escribir Cantidad de datos del vector DATOS”
Leer CD
Dimension RANGO(CR),DATOS(CD),MAY(CR)
Escribir “Datos del vector RANGO”
Para I<-0 hasta CR-1 con paso 1
Leer RANGO(I)
Fin para
Escribir “Datos del vector DATOS”
Para I<-0 hasta CR-1 con paso 1
Leer DATOS(I)
Fin para
J<-0
I<-0
DM<-0
Mientras (I<=CR-1) Hacer
Lf=J+Rango(I)-1;
Mayor <- Datos(J)
Mientras ( J<=Lf) Hacer
Si (DATOS(J)>Mayor) Entonces
Mayor <- DATOS(J)
Fin si
J<-J+1
Fin mientras
MAY(I)<-Mayor
I<-I+1
Fin mientras
// Escribir vector MAY
Para I<=0 Hasta CR-1 con paso 1
Escribir MAY(I)
Fin para
Fin
datos=[]
rango=[]
may=[]
cr=int(input('Cantidad de datos de la lista rango '))
cd=int(input('Cantidad de elementos de la lista datos '))
for i in range(cr):
[Link](int(input(f' Digitar valor rango( {i} ) = ')))
for i in range(nb):
[Link](int(input(f' Digitar valor dato( {i} ) = ')))
i=0
j=0
while i<=cr-1:
lf=j+rango[i]-1
mayor=datos[j]
while j<=lf:
if datos[j]>mayor:
mayor=datos[j]
j=j+1
[Link](mayor)
i=i+1
Ejercicio propuesto
RANGOS
3 6 4 5 2
0 1 2
I I
DATOS
10 20 15 22 10 47 22 74 87 15
0 1 2 3 4 5 6 7 9 10
J J J J J
MAY
20 74 87
0 1 2
CR
MEN
20 74 87
0 1 2
PROM
20 74 87
0 1 2
Ejercicio de aplicación
Listado de los estudiantes con sus Calificaciones y su nota final, ordenado de mayor a menor
según la nota final.
Promedio de calificaciones
Cantidad de estudiantes que aprobaron la materia
Cantidad de estudiantes que perdieron la materia
Ejemplo
CE
8
Cod Est N1 N2 N3 Nf
0 1 3 3,5 4 3,5 = 3*,3+3,5*,3+4*,4
1 2 4 4,5 4,5 4,3
2 3 2,5 3,5 3 3
3 4 5 4 5 4,6
4 5 2,5 3 3 2,8
5 6 3 3 2 2,6
6 7 5 4 5 4,6
7 8 3 3 2 2,6
Ordenar
Cod Est N1 N2 N3 Nf
4 5 4 5 4,6
7 5 4 5 4,6
2 4 4,5 4,5 4,3
1 3 3,5 4 3,5
3 2,5 3,5 3 3
5 2,5 3 3 2,8
6 3 3 2 2,6
8 3 3 2 2,6
Mostrar lista
Promedio (SNf/CE)
Pasos genéricos
Definir variables
Leer Datos de los estudiantes
Calcular nota definitiva
Ordenar definitiva y realizar cambios correspondientes
Obtener listado de notas
Obtener estadísticas
Algoritmo calilficacionesCurso
// Definicion de variables
// garantizar correspondencia
calaux<- N1(i)
N1(i)<-N1(j)
N1(j)<-calaux
calaux<- N2(i)
N2(i)<-N2(j)
N2(j)<-calaux
calaux<- N3(i)
N3(i)<-N3(j)
N3(j)<-calaux
codaux<- CodEst(i)
CodEst(i)<- CodEst(j)
CodEst(j)<-calaux
Fin para
Fin para
//Mostrar resultados
Escribir “Informe final Estudiantes “
Para i<-0 hasta CE-1
Escribir “Cod Estudiante “,CodEst(i), “ N1 “,N1(i), “ N2 “,N2(i), “ N3 “,N3(i), “
Nota final “,NF(i)
Fin para
ceg<-0
cep<-0
sum<-0
Para i<-0 hasta CE-1
Si NF(i) >= 3 Entonces
ceg<-ceg+1
Sino
cep<-cep+1
Fin si
sum<-sum+NF(i)
Fin para
prom<-sum/CE
Escribir “Cantidad de estudiantes que ganaron “,ceg
Escribir “Cantidad de estudiantes que perdieron “,cep
Escribir “promedio calificaciones “,prom
Escribir “Estudiantes con nota mayor “
i<-0
j<-0
Mientras NF(0)=NF(j) hacer
Escribir “Estudiante “,CodEst(i), “Calificacion “,NF(i)
j<-j+1
Fin Mientras
j<-CE-1
Mientras NF(CE-1)=NF(j) hacer
Escribir “Estudiante “,CodEst(i), “Calificacion “,NF(i)
j<-j-1
Fin Mientras
Fin
codest=[]
n1=[]
n2=[]
n3=[]
nf=[]
for i in range(ce-2):
for j in range(i+1,ce-1)
if nf[j]>nf[i]:
calaux=nf[i]
nf[i]=nf[j]
nf[i]= calaux
#guardar correspondencia
calaux =n1[i]
n1[i]=n1[j]
n1[i]= calaux
calaux =n2[i]
n2[i]=n2[j]
n2[i]= calaux
calaux =n3[i]
n3[i]=n3[j]
n3[i]= calaux
codaux =codest[i]
codest[i]= codest[j]
codest[i]= codaux
#mostrar resultados
print('INFORME ESTUDIANTES ')
for i in range(ce):
Print('Codigo estudiante ',codest[i],' N1 ',n1[i], ' N2 ',n2[i],
'N3 ',n3[i], ' Final ',nf[i])
#Elaborar estadísticas
ceg=0
cep=0
sum=0
for i in range(ce):
if nf[i]>=3:
ceg=ceg+1
else:
cep=cep+1
sum=sum+nf[i]
prom=sum/ce;
print('Resultados finales')
print('Cantidad de estudiantes que ganaron ->',ceg)
print('Cantidad de estudiantes que perdieron -> ',cep)
print('Promedio de calificaciones ->',prom)
print('Estudiantes con nota mayor ',nf[0])
j=0
while nf[0]==nf[j]:
print('Estudiante ',codest[j])
j=j+1