Sunteți pe pagina 1din 9

ESCUELA POLITCNICA SUPERIOR

INFORMTICA CURSO 2014-15

PRCTICA 5: VECTORES
HASTA AHORA...
En prcticas anteriores se ha aprendido:
La estructura principal de un programa en C: la funcin main y las libreras.
Variables y Constantes: con sus respectivos tipos, usos y funcionamiento.
Funciones printf/scanf: muestra y obtencin de informacin por pantalla/teclado.
Programacin estructurada en funciones: divisin en subproblemas y reusabilidad.
Condicionales if/else: ejecucin de un programa en rbol.
Programacin iterativa utilizando las instrucciones while y for.

OBJETIVOS
En esta prctica trabajaremos con conjuntos de variables agrupadas bajo un mismo nombre:
vectores.
La idea es evitar crear multitud de variables del mismo tipo, y crear solo un elemento que agrupe
todas las variables del mismo tipo.

PRERREQUISITOS
Para el correcto desarrollo de esta prctica, el alumno ANTES DE LA SESIN DE PRCTICA EN
EL LABORATORIO, debe leer con atencin y comprender el contenido de la parte terica de dicha
prctica y realizar los dos primeros ejercicios.
Se aconseja el uso del material de apoyo de la asignatura. As, para esta prctica sobre vectores el
alumno puede consultar la siguiente bibliografa:

Rodrguez Jdar, M.A. y otros, Fundamentos de informtica para ingeniera industrial:


o

Del Captulo 4, Fundamentos de programacin: apartado 4.6.1, Vector o tabla unidimensional1 y apartado 4.6.2 Tabla bidimensional o matriz.

VECTORES
Descripcin
Hay ocasiones en las que tenemos que almacenar en nuestros programas un conjunto grande de
valores, todos del mismo tipo. Hay veces que se presenta problemtico el crear tantas variables
como necesitemos, sobre todo si ellas tienen alguna relacin entre s y nos interesa que formen un
conjunto indivisible. Para esta tarea, podemos hacer uso de los vectores (array en ingls): conjunto
de variables del mismo tipo identificadas todas con el mismo nombre y con posiciones
consecutivos entre ellas.

Los prrafos dedicados a cadenas de caracteres no son necesarios para esta prctica

A. Declaracin de vectores
A la hora de crear un vector, todos los elementos que lo forman han de ser de igual tipo. De esa
forma la creacin de un vector se realiza de la siguiente manera:
tipo nombre[TAMANYO];

tipo: se corresponde con el tipo de todos los elementos que forman el vector

nombre: utilizado para acceder a los elementos del mismo.

TAMANYO: nmero de elementos que posee el vector.

Ejemplo:

int v[10];

Nota: los vectores creados de esta forma poseen un nmero FIJO de elementos, de forma que
hay que especificar un nmero constante a la hora de crearlo (no puede ser una variable).
B. Inicializacin en la declaracin
Si a la hora de crear el vector queremos aportar unos valores iniciales a sus elementos, podramos
hacerlo de la siguiente manera:
tipo nombre[N] = {valor0, valor1, valor2, , valorN-1};

Ejemplo:

int v[10] = {8,2,3,4,1,0,3,9,2,7};

C. Acceso a los elementos de un vector


Para acceder a los elementos de un vector hay que hacer uso del nombre con el que se ha creado e
indicar, mediante un ndice, a qu elemento queremos acceder.
De esta forma, para acceder al elemento i-simo del vector creado anteriormente, se hara:
v[i]

Nota: los elementos de un vector se identifican mediante la posicin que ocupan dentro de l.
Esta posicin abarca valores entre el 0 y el N-1 (ambos inclusive), si hemos definido el vector con
un tamao de N (cuidado!!! La posicin N no existe!!!)
Se puede hacer uso de estos accesos para leer o escribir en una posicin concreta del vector. Una
vez que se acceda a dicha posicin, hay que tratar el elemento como una variable del tipo base a
todos los efectos.
Ejemplos:

v[0] = 23;
a = v[8] + v[5];
printf(El primer elemento del vector es %d\n, v[0]);

D. Recorrido de vectores
Se ha hablado del uso de los vectores como almacenes indivisibles de variables del mismo tipo
pero, aparte de ello, tienen alguna otra ventaja?
Al encontrarse almacenados en posiciones consecutivas y hacer uso de un ndice numrico para
acceder a cada uno de los elementos, si queremos realizar la misma operacin sobre todos los
elementos del vector, podramos ahorrarnos trabajo Hasta ahora, para inicializar los 10 elementos
de un vector, se realizara las asignacin de un valor de manera individual a cada elemento:
int v[10];
v[0]=0;
v[1]=0;
v[2]=0;

v[3]=0;
v[4]=0;
v[5]=0;
v[6]=0;
v[7]=0;
v[8]=0;
v[9]=0;

Y si hacemos uso de un bucle?


int v[10];
int i;
for(i=0; i<10; i++)
{
v[i]=0;
}

No es ms cmodo?
Un ejemplo ms complejo de utilizacin de un vector sera:
#include <stdio.h>
main() {
int i;
float sensores[100];
printf("Valores errneos en los sensores:\n");
for(i=0;i<100;i++)
{
if(sensores[i]<0 || sensores[i]>1000)
{
printf("sensor %d => %f\n", i, sensores[i]);
}
}
}

Como se puede comprobar al ejecutar el cdigo, aparecen una serie de valores extraos. Ocurre lo
mismo que con las variables normales: cuando creamos variables, inicialmente pueden contener
basura. Debemos darle un valor inicial.
La otra forma es hacerlo mediante asignaciones normales, por ejemplo dentro de un bucle.
#include <stdio.h>
main()
{
int i;
float sensores[100];
for(i=0;i<100;i++)
{
printf(Introduzca valor de posicion %d: , i);
scanf(%f, &sensores[i]);
}
printf("Valores errneos en los sensores:\n");
for(i=0;i<100;i++)
{

if(sensores[i]<0 || sensores[i]>1000)
{
printf("sensor %d => %d\n", i, sensores[i]);
}
}
}

Qu sucedera si la informacin para almacenar necesitara de ms de una dimensin para ser


representada? Pues, de forma muy similar, un vector puede contener ms de una dimensin, de
forma que podra asemejarse al concepto de matriz matemtica (caso de dos dimensiones), o a ms
dimensiones si fueran necesarias.
En cuanto a dos dimensiones, veremos los mismos aspectos que se han visto con una sola
dimensin.
Para distinguir ms fcilmente los vectores de una dimensin de los bidimensionales (y viceversa),
a partir de ahora se denominarn vectores a los unidimensionales y matrices a los
bidimensionales.
A. Declaracin de matrices
A la hora de crear una matriz, la nomenclatura es idntica a un vector, pero indicando dos
dimensiones diferentes. Cada una de ellas deber estar contenida entre corchetes:
tipo nombre[FILAS][COLUMNAS];

tipo: se corresponde con el tipo de todos los elementos que forman la matriz

nombre: utilizado para acceder a los elementos de la matriz.

FILAS: nmero de elementos que conforman la primera dimensin de la matriz.

COLUMNAS: nmero de elementos que conforman la segunda dimensin de la matriz.

Ejemplo:

int m[3][2];

Nota: las matrices creadas de esta forma poseen un nmero FIJO de elementos (para ambas
dimensiones), de forma que hay que especificar un tamao constante para filas y columnas a la
hora de crear la matriz (no pueden ser variables).
B. Inicializacin en la declaracin
Si a la hora de crear el vector queremos aportar unos valores iniciales a sus elementos, podramos
hacerlo de la siguiente manera:
tipo nombre[N][M]={{valor0,0,, valor0,M-1},,{valorN-1,0,, valorN-1,M-1}};

Ejemplo:

int m[3][2]={{8,2},{3,4},{1,0}};

C. Acceso a los elementos de una matriz


Para acceder a los elementos de una matriz hay que hacer uso del nombre con el que se ha creado e
indicar, mediante dos ndice, a qu elemento queremos acceder (fila y columna dentro de la matriz).
De esta forma, para acceder al elemento de la fila i-sima y columna j-sima de la matriz creada
anteriormente, se hara:
m[i][j]

Nota: los elementos de una matriz se identifican mediante la posicin que ocupan dentro de ella
(en ambas dimensiones). Esta posicin abarca valores entre el 0 y el N-1 (ambos inclusive) para
fila y entre 0 y M-1 (para columna), al igual que suceda con un vector pero extrapolado a las dos
4

dimensiones.
Se puede hacer uso de estos accesos para leer o escribir en una posicin concreta. Una vez que se
acceda a dicha posicin, hay que tratar el elemento como una variable del tipo base a todos los
efectos.
Ejemplos:

m[0][1] = 23;
a = m[2][0] + m[0][1];
printf(El primer elemento de la matriz es %d\n, m[0][0]);

D. Recorrido de matrices
La misma ventaja de la que se dispona con los vectores a la hora de acceder a ellos puede ser tenida
en cuenta con las matrices. En este caso, al disponer de dos dimensiones, se necesitarn dos bucles
para poder recorrer la matriz al completo: uno para filas y otro para columnas.
Uno de esos bucles deber ser interior al otro, por qu? Si se pretende hacer un recorrido completo
sobre la matriz, para cada valor indicado para filas se deber hacer un barrido completo por todas
las columnas. Eso, a nivel de cdigo, se traduce en que para cada valor del ndice del bucle (dentro
del bucle) se deber hacer un recorrido sobre todos los posibles valores de columna. En la prctica,
basta con hacer un doble bucle para recorrerla al completo:
int m[25][50];
int i, j;
for(i=0; i<25; i++)
{
for(j=0; j<50; j++)
{
m[i][j]=0;
}
}

EJERCICIOS DE VECTORES
Ejercicio 1: Escribir un programa que pida 10 nmeros enteros por teclado y los guarde en un
vector de 10 elementos, de tipo entero.
Ejercicio 2: Modificar el programa anterior para que, despus de haber ledo los 10 nmeros,
cuente cuntos son positivos y cuntos negativos.
Ejercicio 3: Modificar el programa del ejercicio 2 de forma que separe en dos nuevos vectores lo
nmeros positivos y negativos. Para finalizar, debe mostrar por pantalla el vector de nmeros
negativos.
Ejercicio 4: Crear un programa que contenga una funcin llamada copiarVector que reciba dos
vectores enteros y el tamao de los mismos (deben de ser del mismo tamao) y que copie en el
segundo vector el contenido del primero (Consultar Prctica5 anexo).
Ejercicio 5: Escriba un programa que, dado un vector de 10 elementos (introducidos por teclado si
se desea), se realice una inversin de las posiciones de los elementos de dicho vector, devolviendo
por pantalla el vector invertido. Utilice un segundo vector de 10 elementos para almacenar los
5

resultados y luego utilice ste para mostrar el resultado por pantalla.


(1,2,3,4,5) se invierte > (5,4,3,2,1)
Ejercicio 6: Dado un vector de nmeros reales de tamao 100, crear un programa que indique el
nmero menor, el mayor y el promedio entre dichos elementos.
Ejercicio 7: Realice una funcin que reciba: un vector de float con un tamao de 100; un entero
que indicar cuntas de esas posiciones estn ocupadas por un nmero (se encontrarn en las
primeras posiciones, de ah en adelante no nos importar sus valores, aunque lo comn es que estn
a 0); tambin recibir un float, que ser el nuevo valor a insertar; y por ltimo recibir un entero que
le indique la posicin dnde insertarlo dentro del array. Tenga en cuenta que no queremos perder
ninguna informacin que ya estuviera en esa posicin, as que si est ocupada tendremos que
desplazar el resto de elementos.
Ejercicio 8: Realizar ahora el ejercicio 15 de la prctica 3, haciendo uso de un vector de enteros
para conseguir, de forma eficiente, poder almacenar la descomposicin factorial de un nmero.
Ejercicio 9 (Simplificacin de ejercicio de examen): Suponiendo que, en un vector de enteros de
un tamao determinado (a eleccin del alumno), tenemos almacenado en cada posicin una cifra de
un nmero concreto (en orden): indique si dicho nmero es capica o no, usando una funcin
aparte.
Aclaracin: nmero 1331, almacenado como

3 3

Ejercicio 10: Teniendo un nmero almacenado de igual forma que en el ejercicio anterior, cree una
funcin que indique si dicho nmero es mltiplo de 3. Nota: un nmero es mltiplo de tres si la
suma de todas sus cifras es mltiplo de tres.
Ejercicio 11: Dado un vector de nmero enteros (tamao y valores indicados por el alumno),
realice una ordenacin ascendente de los valores de dicho vector.
Hay muchas formas de ordenar los elementos de un vector, a continuacin se explica una de esas
tcnicas, llamada Algoritmo de la Burbuja. Este algoritmo se basa en ir comparando los elementos
2 a 2 e ir viendo cul es el mayor (o menor) de entre ellos. En caso de no estar ordenados entre los
dos, se intercambian. De esta forma, al comparar el primero con todos los restantes, tras la primera
iteracin del bucle externo, en la primera posicin estar el mayor (o menor) del conjunto.
Posteriormente, se incrementa la i y se pasa a ordenar el segundo mayor (o menor). Finalmente, el
vector quedar ordenado segn el criterio establecido.
Desde i=primero hasta i=ltimo-1
Desde j=i+1 hasta j=ltimo
si vector[i] < vector[j]
aux = vector[i]
vector[i] = vector[j]
vector[j] = aux
fin si
fin desde
fin desde

Nota 1: En este ejemplo se realiza una ordenacin ascendente, pues la condicin del if busca que
ambos elementos no se encuentren ordenados para intercambiarlos (condicin justamente opuesta).
Nota 2: las instrucciones situadas en el cuerpo de la instruccin condicional intercambian los
elementos situados en las dos posiciones comparadas.
Ejercicio 12: Dado un vector de nmero enteros (tamao y valores indicados por el alumno),
6

realice una ordenacin descendente de los valores de dicho vector.


Ejercicio 13: Intente calcular el valor mximo y mnimo del vector, haciendo uso previamente de
las ordenaciones.
Ejercicio 14: Realice un programa que busque el valor mximo y mnimo de un vector de enteros
sin hacer uso de la ordenacin.
Para ello puede usar el siguiente algoritmo de bsqueda del valor mximo en un vector y deducir
como sera el clculo del mnimo:
Bsqueda de mximo
mximo = vector[0]
posicin = 0
desde i=segundo hasta i=ltimo
si vector[i] > mximo
mximo = vector[i]
posicin = i
fin si
fin desde

Nota: Se supone inicialmente que el valor mximo es el que se encuentra en la primera posicin del
vector. A partir de ah, haciendo un recorrido desde el segundo en adelante, se comparan uno a uno
los valores de las sucesivas posiciones del vector, comprobando si son mayores al mximo que
tenemos hasta ahora. En el pseudocdigo, se guarda el valor y la posicin que ocupa en el vector.
Ejercicio 15: Realice un programa que busque el valor cero en un vector de enteros.
Para ello puede usar los siguientes algoritmos de bsqueda de un valor concreto:
Bsqueda simple de valor concreto
posicin = -1
desde i=primero hasta i=ltimo
si vector[i] == valor
posicin = i
fin si
fin desde
Bsqueda valor concreto con escape, siendo n el tamao del vector
posicin = -1
i = 0
mientras i < n Y posicin == -1
si vector[i] == valor
posicin = i
fin si
incremento de i
fin mientras

Ejercicio 16: Basndose en el ejercicio anterior, realice una funcin que busque un valor concreto
en un vector. La funcin recibe como parmetros el vector, el tamao del vector y el valor a buscar
y devuelve la posicin del valor en el vector o -1 si el valor no se encuentra en dicho vector. Qu
pasa si el valor est repetido?
Nota: en el anexo se explica cmo se pasan los vectores como parmetros.
7

Ejercicio 17: Poseemos un vector de 20 posiciones, de tipo float (a este vector lo llamaremos
clase). Este vector almacenar las notas finales de cada alumno en dicha clase, de tal forma que
un alumno vendr identificado numricamente por la posicin que ocupa en el vector. Pida que se
introduzcan las notas tericas y prcticas de cada alumno y almacene la nota final realizando un
porcentaje del 30% de la nota terica y del 70% de la nota prctica. Cuando posea el vector
completo, calcule el porcentaje de alumnos aprobados y el porcentaje de alumnos suspensos
respecto al total.
Ejercicio 18: Mejore el ejercicio anterior, de forma que se mostrar el porcentaje de alumnos
suspensos, el porcentaje de aprobados, el porcentaje de notables y el porcentaje de sobresalientes.
Podra indicar el identificador del alumno que posea la mejor nota? Y la peor?

EJERCICIOS DE MATRICES
Ejercicio 1: Realice un programa que actualice los elementos de una matriz bidimensional (de
dimensin 4x3) con valores introducidos por teclado. Declare las dimensiones como dos constantes
M (para el nmero de filas) y N (para el nmero de columnas).
Ejercicio 2: Realice un programa que calcule el sumatorio y la media aritmtica de todos los
elementos de la matriz utilizada en el ejercicio anterior.
Ejercicio 3: Realice un programa que pida un determinado valor por teclado y nos muestre el
nmero de apariciones de dicho valor en la matriz utilizada anteriormente.
Ejercicio 4: Escriba un programa que compruebe si dos matrices bidimensionales (de dimensin
MxN) compruebe si son exactamente iguales (poseen todos sus elementos iguales).
Ejercicio 5: Escriba un programa que a partir de una matriz cuadrada obtenga su correspondiente
matriz traspuesta.
Ejercicio 6: Escriba un programa que declare e inicialice en el cdigo una matriz bidimensional aik
(de dimensin MN) y un vector bk (de dimensin N) y que calcule el vector producto de ambos ci
(de dimensin M). Los valores de las dimensiones de la matriz y los vectores deben definirse como
constantes en el programa. Recuerde que los elementos del vector producto se calculan segn la
expresin:

Ejercicio 7: Escriba un programa que, dada una matriz bidimensional (de dimensin NN), realice
un giro de 90 (en sentido de las agujas del reloj) en la posicin de todos sus elementos, dando
como resultado una nueva matriz NN con los valores en sus nuevas posiciones.
[1 2] Giro 90 > [3 1]
[3 4]
[4 2]
Ejercicio 8: Crear un programa que cree una matriz de 18 X 10 indicando que poseemos una
empresa de 18 vendedores cada uno de los cuales vende 10 productos. La matriz almacena los
ingresos obtenidos por cada vendedor en cada producto, de modo que un men permite almacenar
los ingresos, revisar el total de cada vendedor y obtener los ingresos totales.
Ejercicio 9: Crear un programa con un men, que mediante un men admita reservar o cancelar
asientos de un avin, as como mostrar qu asientos estn ocupados y libres actualmente. El array
tendr 25 filas y 4 columnas.

ANEXO: PASO DE PARMETROS POR REFERENCIA


Hasta ahora, las funciones que hemos visto reciban parmetros pero slo consultaban sus valores
para realizar clculos u operaciones internas. Es decir, pasbamos los parmetros por valor. Para
los vectores y matrices (y por lo tanto, como veremos en la prctica 6, para las cadenas) nos interesa
alterar los valores de sus elementos y que cuando termine la funcin se queden estos elementos
modificados, por eso se dice que para los vectores y matrices se pasan los parmetros por
referencia.
En el lenguaje C una funcin slo puede devolver (usando la sentencia return) un valor, pero
mediante el paso de parmetros por referencia, puede modificar los valores de un vector dentro del
cuerpo de la funcin y as devolver todo el contenido que este tipo de datos almacenan.
Ejemplo de una funcin que tiene parmetros por referencia:
Crear una funcin llamada copiarVector que reciba dos vectores de enteros y el tamao de los
mismos (deben ser del mismo tamao) y que consiga copiar en el segundo vector el contenido del
primero.
#include <stdio.h>
#define TAM 10
void copiaVector(int [], int[], int);
main()
{
int a[TAM]= {1,2,3,4,5,6,1,2,3,4}, b[TAM];
int i;
copiaVector(a, b, TAM);
for(i=0;i<TAM;i++)
printf("%d ", b[i]);
}
void copiaVector(int vect1[], int vect2[], int t)
{
int i;
for(i=0;i<t;i++)
vect2[i]=vect1[i]; // cuando termine la funcin, vect2 tiene los
// mismos valores de vect1
}

S-ar putea să vă placă și