Facultad Politécnica - Dpto. de Informática Algoritmo (Ing. en Electrónica / Ing. en Electricidad ) Prof. Cristian Cappo 4/05/2012 – Introducción a vectores o arreglos unidimensionales
Arreglos unidimensionales: unidimensionales: sintaxis, uso, acceso a componentes Declaración vector [ ] vec vector tor [ * ] > //Ve /Vector ctor abie abier rto
Ejemplo: declarar un vector de 10 componentes numéricos numéricos v : vector [10] numerico
Acceso a componentes v[]
Arreglos estáticos y arreglos dinámicos (que crecen programáticamente) Funciones asociadas dim() : dimensiona un vector declarado abierto. Ejemplo: var v : vector [*] numerico inicio dim(v, 10) v[1] ..
alen()
: determina el tamaño del vector que se le pasa como parámetro.
Leer los componentes de un vector de tamaño N e imprimirlos. imprimirlos. N se lee al principio (ejemplo de uso de arreglo dinámico) Ejemplos sencillos sencillos para desarrollar en clase: clase: •
Dado un vector de 20 elementos imprimir la suma, el promedio, el mayor y el menor valor de sus elementos. Ahora hacer una subrutina que reciba un arreglo de tamaño desconocido y devuelva todos los cálculos en un registro (suma, (suma, promedio, mayor, mayor, menor). menor).
•
Leer 100 valores y colocarlos en un vector, luego imprimir los valores leídos en el orden inverso del que fueron introducidos.
•
Leer una serie de números enteros no negativos mayores a cero. Luego imprimir la cantidad de números leídos múltiplos de 2, 3, 5, 7, 11,.., 97 (fíjese que son números primos). primos). Leer como máximo 1000 números. números. Ejemplo:
Dado 30, 23, 21, 29, 19, 20, 39
Debe imprimirse
2 : 2 números múltiplos 3 : ..
•
Leer 10 palabras y colocarlas en un vector. Luego imprimir las mismas palabras pero convertidas a mayúsculas.
•
Inicializar un vector X de 13 elementos elementos de la siguiente manera: En la posición menor menor cargar un 1, en en la posición mayor cargar cargar un 2, en la posición menor no ocupada cargar cargar un 3, en la posición mayor no ocupada cargar un 4 y así sucesivamente hasta que no haya posición donde poner ningún número. Imprimir el vector. El vector quedaría así: X = {1, 3, 5, 7, 9, 11, 13, 12, 10, 8, 6, 4, 2}
•
Leer una serie de palabras hasta introducir la palabra “FIN” (que no forma parte). Imprimir Imprimir la frecuencia de aparición de los caracteres alfabéticos alfabétic os (a..z) sin importar que este en mayúsculas o minúsculas. No imprimir el caracter si tiene frecuencia cero. Ejemplo: algo parece bien a : 2 b : 1 c : 1 …
•
Leer una serie de números en forma consecutiva mientras que el número no sea negativo. Cargar los elementos elemento s leídos en un vector. Luego imprimir imprimir los números en orden ascendente indicando el número de orden en que fueron leídos (que no coincide precisamente precisamente con el orden ascendente). Como máximo deben leerse 100 números. Ejemplo: se leen 10,4,3,2,3,5,2,7,-1
Se imprimiría = 2(4),2(7),3(3),3(5),4(2),5(6),7( 2(4),2(7),3(3),3(5),4(2),5(6),7(8),10(1) 8),10(1)
Ejemplos desarrollados en clase: // Leer un vector de 100 elementos e imprimir el mayor, menor, suma y promedio var A : vector[100] numerico suma, prom, menor, mayor : numerico k : numerico inicio
//lectura del vector desde k=1 hasta alen(A) { leer(A[k]) } menor = A[1] mayor = A[1] suma = A[1] desde k=2 hasta alen(A) { suma = suma + A[k] si ( A[k] < menor ) { menor = A[k] } si ( A[k] > mayor ) { mayor = A[k] } } prom = suma / n imprimir(suma, prom, menor, mayor) fin // Ordenar un vector por burbuja y por selección var A : vector[100] numerico k,j : numerico menor: numerico inicio leer(A) // Ordenamos por burbuja desde k=1 hasta alen(A) desde j=k+1 hasta alen(A) si ( A[k] > A[j] ) { intercambiar(A[k],A[j]) } } } imprimir(A) fin
var A : vector[100] numerico k,j : numerico menor: numerico inicio leer(A) // Ordenamos por seleccion desde k=1 hasta alen(A) menor = k desde j=k+1 hasta alen(A) si ( A[j] < A[menor] ) { menor = j } } intercambiar (A[k], A[menor]) } imprimir(A) fin
// Leer una serie de números y ver cuantos son múltiplos de primos entre 2 y 97. // Aquí se muestra el programa Completo ya funcionando. En clase faltaban implementar algunas // cosas. programa _verCntPrimos var vPrimo : vector[100] numerico vNros : vector[1000] numerico maxPrimos, cntNros, k, j, n : numerico cntPrimo : numerico inicio maxPrimos = generarPrimos() cntNros = alen(vNros) desde k=1 hasta alen(vNros) { leer(n) si ( n > 0 ) { vNros[k] = n sino cntNros = k-1 salir } } cls() desde k=1 hasta maxPrimos { cntPrimo = 0 desde j=1 hasta cntNros { si ( vNros[j] % vPrimo[k] == 0 ) { inc(cntPrimo) } } si ( cntPrimo > 0 ) { imprimir(vPrimo[k], ":", cntPrimo, "\n") } } fin sub generarPrimos() retorna numerico var k,c : numerico n : numerico inicio c = 0 desde k=2 hasta 97 { si ( esPrimo(k) ) { inc(c) vPrimo[c] = k } } retorna c fin sub esPrimo( n : numerico ) retorna logico var f : numerico primo = SI inicio desde f=2 hasta sqrt(n) { si ( n % f == 0 ) { primo = NO salir } } retorna primo fin
// Hacer una subrutina que reciba un vector numérico y retorna la desviación
// estándar de los números. La fórmula es
= var A : vector [*] numerico inicio A = { 10,20,30,40,20} imprimir(A, “\n La ds=”, desv_standard(A)) fin
n
∑ x − x
2
i
i =1
n
sub desv_standard ( ref A : vector [*] numerico ) retorna numerico var suma, media, k, n : numerico ds : numerico inicio n = alen(A) desde k=1 hasta n { suma = suma + A[k] } media = suma / n suma = 0 desde k=1 hasta n { suma = suma + (A[k] – media )^2 } ds = sqrt ( suma / n ) retorna ds fin
Dpto. de Informática - Algoritmos ( Ing. en Electrónica / Ing en Electricidad ) Año 2012 – Tarea #5 – Ejercicios con vectores. ( A entregar por EDUCA: miércoles 16-mayo-2012 23:55 )
1) Encontrar los cinco elementos de mayor valor de un vector de 100 elementos diferentes. Cada elemento debe leerse desde el teclado debiéndose controlar que no se introduzca un elemento cuyo valor ya exista dentro del arreglo. Además debe imprimir en que posición fueron leídos estos cinco elementos. 2) Dado dos vectores A y B numéricos producir un tercer vector C que contenga en la posición 1 el resultado de sumar el ultimo elemento de A con el primer elemento de B, en la posición 2 el penúltimo elemento de A sumado con el 2do elemento de B y así sucesivamente. A y B son de tamaño 20. 3) Leer una serie de números enteros positivos mayores a cero. Se lee un máximo de N números o hasta que el mismo no sea un número positivo. N se lee al principio del proceso. Imprimir la secuencia de números pares más larga en orden de mayor suma de sus elementos (ver ejemplo para la forma). Si existen varias imprimir todas. Ejemplo: Dada la siguiente secuencia { 4, 6, 8, 5, 2, 4, 8 , 7, 11, 9, 2, 6, 12} , se imprimiría (entre paréntesis la suma, fijarse que se encuentra ordenado en forma decreciente por la suma de sus elementos ) 2, 6, 12 4, 6, 8 2, 4, 8
(20) (18) (16)
4) Leer los elementos de un vector V de elementos numéricos de tamaño 50 como máximo. Eliminar todos los elementos de V que son cero o negativos dejando siempre el resto de los elementos en el orden en que fueron leídos inicialmente. Ejemplo se lee: 10, 0, -1, 3, 3, 5, -2, 0, 0, -1, 10 el vector debe quedar con 10, 3, 3, 5, 10 OBS:La lectura de los elementos es hasta llegar el límite (50) o hasta que el usuario introduzca el nro. 99999 que NO deberá formar parte del vector. 6) Leer los elementos para un vector A de tamaño N. Hacer que los elementos de A queden ordenados de la siguiente manera: El menor elemento colocarlo en la posición 1 del vector, el menor de los restantes N-1 elementos colocarlo en la posición N, el menor de los restantes N-2 elementos colocarlo en la posición 2, el menor de los restantes N-3 elementos colocarlo en la posición N-1 y así sucesivamente. En el momento de la lectura validar que los elementos leídos sean siempre diferentes (igual que el ejercicio 2) Ejemplo: A = {12, 3, 4, 5, -1, 20 } Debe quedar A =
{ -1, 4, 12, 20, 5, 3 }
OBS: NO puede usarse ningún vector auxiliar. 8) Dado dos vectores POS y NEG numéricos, ambos con tamaño MAXTAM; colocar en el vector POS los elementos positivos y en NEG todos los elementos negativos. La comparación es posicional, es decir el elemento 1 del vector POS se compara con el elemento 1 del vector NEG. OBS: Si en POS existe un negativo y en NEG un positivo, se intercambian. Si en POS existe un positivo y en NEG un positivo, se coloca 0(cero) en NEG y POS mantiene su valor. Si en POS existe un negativo y en NEG un negativo, se coloca 0(cero) en POS y NEG mantiene su valor. Al final imprimir POS y NEG • • • •
Ejemplo: Resultado final
POS[5] = NEG[5]= POS[5] = NEG[5] =
{ 9,3,-1,-4,5} {-9,3,-2, 8,6} { 9,3, 0, 8,5} {-9,0,-1,-4,0}
10)Hacer una subrutina que reciba un vector de N elementos y dos números. La subrutina debe retornar la suma de los elementos que se encuentran entre las dos posiciones que se reciben como parámetro. Ejemplo: dado = {10, 20, 30, 40 , 40 , 40 , 60 , 70 }, pos_1 = 2 se debe retornar 20+30+40+40.
y pos_2 = 5
OBS: los números que se reciben como posición son siempre positivos mayores a cero. Si no indican posiciones reales dentro del vector retornar -1. Para saber el tamaño de un vector puede usar la funcion alen() de SL.
11)Leer un vector de N componentes numéricos positivos y negativos. Luego imprimir la mayor suma de elementos contiguos que se puede t ener con los elementos del vector. Ejemplo: dado = { 10 , 5, 6, -7 } Se debe probar 10+5 = 15 10+5+6 = 21 – Se debe imprimir 21 10+5+6-7 = 14 5+6 = 11 5+6-7 = 4 6-7 = -1 OBS: N puede ser como máximo 100. Se debe leer N antes del proceso.
13)Dado dos vectores numéricos A y B ambos de tamaño M imprimir: a) los elementos comunes de A y B. b) los elementos que están en A y no en B c) los elementos que están en B y no en A d) los elementos de A y B en forma ordenada, sin repetirse. Observaciones: • No debe usarse ningún vector auxiliar. • M debe leerse al principio y como máximo es 100. • Deben leerse los componentes de A y B. 14)Dado un vector V de tamaño 50 imprimir los elementos ordenados de forma ascendente y luego de forma descendente. a. Primero solucione leyendo los valores para los elementos del vector. b. Luego use la función random() para generar valores en forma aleatoria. Ejemplo de uso: random(100) genera valores entre 0 y 100. Lea la ayuda de SL para más información. c. Haga que su programa de ordenación se convierta en una función de ordenación que recibe como parámetro el vector desordenado y una constante "A" o "D" para indicar si se quiere en forma ascendente o descendente. d. Haga uso de la función alen() para determinar el tamaño del vector. e. Encuentre al menos dos formas de hacer la ordenación. 15) Hacer una función que reciba como parámetro un vector A números enteros (incluyendo los negativos) y dos variables ini y fin por referencia. Debe retornar la mayor suma que puede obtenerse con alguna subsecuencia de elementos contiguos del vector. En ini y fin debe quedar el índice inicial y final de l a subsecuencia. Ejemplo: Dado { 10 , -20 , 5, -6, 9 } 10 = 10 10+-20 = -10 10+-20+5 = -5 10+-20+5+-6 = -11 10+-20+5+-6+9 = -2 -20 = -20 -20+5 = -15 -20+5+–6 = -21 -20+5+–6+9 = -12 5 = 5
Debe retornar 10 y ini=1 y fin=1
5+-6 = -1 5+-6+9 = 8 -6 = -6 -6+9 = 3 9 = 9