• No se han encontrado resultados

Práctica Guiada: Vectores y Matrices

N/A
N/A
Protected

Academic year: 2021

Share "Práctica Guiada: Vectores y Matrices"

Copied!
7
0
0

Texto completo

(1)

Práctica Guiada: Vectores y Matrices

1.

Objetivos

Al finalizar esta actividad, serás capaz de:

1.

Escribir la declaración de vectores y matrices de tipos básicos.

2.

Escribir el código necesario para recorrer los elementos de vectores y matrices.

3.

Escribir el código necesario para acceder a un elemento de un vector o una matriz.

2.

Motivación

Hasta ahora hemos trabajado con datos elementales (enteros, reales, caracteres; int, float, char)

donde podíamos almacenar un sólo dato del tipo especificado. En muchas ocasiones es necesario trabajar con gran cantidad de datos de un mismo tipo.

Por ejemplo imagina que tienes que hacer un programa donde el usuario es un profesor que quiere almacenar las notas de sus alumnos para posteriormente hacer estadísticas y cálculos como nota máxima, mínima, la media, etc.

Podríamos hacerlo declarando una variable de tipo float para cada nota pero eso puede llegar a ser

intratable si la cantidad de notas a almacenar fuera muy grande. Además el programa sería muy engorroso y difícil de entender.

Con los vectores y las matrices conseguimos, bajo un único nombre, es decir, con una única variable, almacenar tantos valores de un mismo tipo como queramos (según el tamaño que definamos en su declaración). En el ejemplo anterior, tendríamos un vector de float con longitud, por ejemplo 100,

donde podríamos almacenar hasta 100 valores reales.

3.

Los vectores y las matrices en C

3.1.

Vectores

Los vectores, también llamados tablas unidimensionales, son tipos de datos compuestos o estructurados caracterizados por:

• Todos los elementos del vector son del mismo tipo

• Todos los elementos del vector son referenciados con el mismo nombre y la diferencia entre ellos es el índice de la posición que ocupan dentro del vector

• Todos sus elementos son almacenados en posiciones de memoria contiguas. El formato general para la declaración de una variable de tipo vector es la siguiente:

Tipo_de_datos nombre_del_vector [tamaño_del_vector]

Donde:

• Tipo_de_datos indica el tipo de datos almacenados en la variable vector que se está declarando

(int, float, char o cualquier otro tipo definido).

• Nombre_del_vector indica el nombre de la variable vector que se está declarando. Con este

nombre refenciaremos a cada elemento del vector.

• Tamaño es un entero, o una constante de tipo entero, que indica cuántas posiciones tiene ese

vector, es decir, cuál es el número máximo de elementos del tipo Tipo_de_datos que se pueden guardar en la variable Nombre_del_vector que estamos declarando. El tamaño no puede ser una

(2)

Por ejemplo:

float notas[100];

sería la declaración de la variable notas donde podríamos almacenar hasta 100 números reales.

Graficamente podríamos representarlo así:

notas

Para acceder a cada casilla del vector utilizamos un número entero llamado subíndice, que indica la posición del elemento dentro del vector. En C, los elementos empiezan a numerarse en el 0. Así el primer elemento del vector notas será notas sub 0, el segundo notas sub 1, etc., y el último notas sub 99.

Fíjate que el último elemento es el que ocupa la posición tamaño_del_vector menos 1.

notas

0 1 2 3 99 La sintaxis para acceder a estos elementos en C es la siguiente:

notas[0] (primer elemento) notas[1] (segundo elemento)

notas[99] (último elemento)

Operaciones que podemos hacer con un vector

a.- Consultar o leer el valor de un elemento del vector

Si queremos poner en la variable nota_alu5, la nota del alumno que tenemos en la posición 5 del vector

anterior, haríamos la siguiente asignación:

float notas[100], nota_alu5; /*Declaración de variables */ ...

nota_alu5 = notas[5];

b.- Asignar o escribir un valor en un elemento del vector

Si queremos poner un 8 al alumno que está en la posición 5 haríamos la siguiente asignación:

notas[5] = 8;

En estos dos casos, el acceso al elemento del vector que queremos leer o en el que queremos escribir es directo, porque solamente leemos o modificamos un elemento, el 5 en ambos ejemplos. Si queremos recorrer todo el vector, ya sea para leer como para escribir, tendremos que utilizar un bucle.

c.- Recorrido de un vector

Para recorrer el vector utilizaremos el bucle while, que dará tantas vueltas como elementos del vector tengamos que visitar.

Mira el siguiente ejemplo:

(3)

{

float notas[MAX];

int i;

i=0; while ( i<MAX)

{ printf(“Dame la nota de la posición %d: “, i);

scanf(“%f”, &notas[i]);

i++;

} }

Este programa pide las notas de los alumnos y las almacena en el vector notas.

Ejercicio 1: Escribe el anterior programa en el ordenador y verifica con el depurador cómo se van

colocando cada valor en su posición correspondiente del vector.

Observa como en la pestaña Depurar aparecen las variables del programa, en este caso la variable i, y

la variable notas.

A la izquierda de notas, aparece el contenido de cada elemento del vector. Observa que los elementos a

los que todavía no se les ha asignado un valor (para subíndices mayores que 1) tienen un valor inicialmente tienen un valor “raro”, “basura” podríamos decir, porque el programa todavía no le ha puesto ningún valor. En cuanto se introduzcan los valores por teclado verás como se almacenan en cada elemento del vector.

Ejercicio 2: Modifica el anterior programa para que una vez introducidos las notas en el vector, muestre

por pantalla las notas suspendidas. El programa ha de indicar también en qué posición del vector se encuentra la nota. Es decir los mensajes que se escribirían por pantalla serían del tipo

Posicion 2 Nota 4

para cada nota suspendida que encuentres en el vector.

Ejercicio 3: Modifica el anterior programa para que al final diga cuántos suspensos y cuántos aprobados

ha habido, y muestre también el porcentaje de ambos.

3.2.

Matrices

Las matrices, también llamados tablas bidimensionales, son tipos de datos compuestos o estructurados caracterizados por:

• Todos los elementos de la matriz son del mismo tipo

• Todos los elementos de la matriz son referenciados con el mismo nombre y la diferencia entre ellos son los índices de la posición que ocupan dentro de la matriz

El formato general para la declaración de una variable de tipo matriz es la siguiente:

(4)

Donde:

Tipo_de_datos indica el tipo de datos almacenados en la variable matriz que se está declarando

(int, float, char o cualquier otro tipo definido).

Nombre_de_la_matriz indica el nombre de la variable matriz que se está declarando. Con este

nombre refenciaremos a cada elemento de la matriz.

Número_filas es un entero, o una constante de tipo entero, que indica cuántas filas tiene esa

matriz

Número_columnas es un entero, o una constante de tipo entero, que indica cuántas columnas tiene esa matriz. El número de filas y de columnas no puede ser una variable

Por ejemplo:

#define MAX_ASIG 6 /*Definición de las constantes */ #define MAX_ALUM 40

...

float notas[MAX_ASIG][MAX_ALUM];

Sería la declaración de la variable notas donde almacenaríamos todas las notas de los alumnos de cada

asignatura. MAX_ASIG y MAX_ALUM serían dos constantes con valores enteros declaradas anteriormente.

Graficamente podríamos representarlo así:

En este ejemplo la fila indica la asignatura y la columna el alumno.

Para acceder a cada elemento de la matriz utilizamos dos números enteros llamados subíndices, que indica la fila y la columna donde se encuentra el elemento dentro de la matriz. En C, los elementos empiezan a numerarse en el 0. Así el primer elemento de la matriz notas será notas[0][0] y el último notas [MAX_ASIG -1][MAX_ALUM – 1].

Si te fijas notarás que es exactamente igual que los vectores, pero con 2 dimensiones (la fila y la columna) en lugar de 1.

Operaciones que podemos hacer con una matriz

a.- Consultar o leer el valor de un elemento de la matriz

Si queremos poner en la variable nota_alu5, la nota del alumno que tenemos en la posición 5 dentro de

la asignatura 0, haríamos la siguiente asignación:

float nota_alu5, notas[MAX_ASIG][NAX_ALUM]; /*Declaración de variables*/ ...

nota_alu5 = notas[0][5];

b.- Asignar o escribir un valor en un elemento de la matriz

(5)

notas[0][5] = 8;

En estos dos casos, el acceso al elemento de la matriz que queremos leer o en el que queremos escribir es directo, porque solamente leemos o modificamos un elemento, el fila 0, columna 5 en estos ejemplos. Si queremos recorrer toda la matriz, ya sea para leer como para escribir, tendremos que utilizar un bucle.

c.- Recorrido de una matriz

Para recorrer la matriz también utilizaremos el bucle while, al igual que para recorrer un vector.

Podemos recorrer la matriz por filas o por columnas. La manera de hacerlo dependerá del ejercicio.

En el siguiente ejemplo se piden las notas por teclado haciendo un recorrido por filas, pidiendo consecutivamente las notas de todos los alumnos de cada asignatura:

#define MAX_ASIG 6 #define MAX_ALUM 40 void main()

{

float notas [MAX_ASIG][MAX_ALUM]; int i,j;

i=0;

while(i<MAX_ASIG) /*Para cada asignatura (para cada fila)*/ { printf(“Dame las notas de la asignatura %d: “, i);

j=0;

while(j<MAX_ALUM) /* Para cada alumno de cada asignatura (para cada columna de cada fila) */ { printf(“Nota del alumno %d:”, j);

scanf(“%f”, &notas[i][j]); j++; } i++; } }

Escribe el anterior código en el ordenador y comprueba con el debugger como se van almacenando los valores que introduces por teclado dentro de la matriz notas.

Igual que con los vectores verás en el apartado Depurar la variable notas de tipo matriz de float. En

este caso el depurador del Dev++ funciona bastante mal y no permite ver todos los elementos, sino sólo los primeros.

Habrás observado que ejecutar el programa anterior paso a paso es un poco pesado porque los bucles dan muchas vueltas. Cuando estamos es fase de pruebas, conviene probar con tamaños pequeños de vectores y matrices hasta que estemos seguros que el programa funciona correctamente. Entonces lo ejecutaremos con los tamaños reales. Fíjate lo fácil que es cambiar los tamaños para hacer pruebas. Simplemente tienes que cambiar los valores de las constantes definidas con los #define (el resto de

código se queda igual).

Ejercicio 4: Amplia el programa anterior para que al final muestre por pantalla las notas del alumno 3 en

(6)

Ejercicio 5: Modifica el anterior programa para que en lugar de solo mostrar las notas del alumno 3,

muestre las notas de todos los alumnos, indicando primero el alumno y después las notas de cada asignatura. Es decir:

Notas del alumno 0:

Asignatura 0 Nota 5,6 Asignatura 1 Nota 9,2 … etc

Ejercicio 6: Amplia el programa del ejercicio 5 para almacenar en otra variable de tipo vector la nota

media de las asignaturas de cada alumno y las muestre por pantalla. Los mensajes serían del estilo:

La nota media del alumno 0 es 6,9 La nota media del alumno 1 es 5,9 … etc

4.

Error común

El error más común al trabajar tanto con vectores como con matrices es lo que se suele llamar “pasarse del rango del vector”, es decir, acceder a un elemento que no pertenece el vector.

Ilustraremos esto con un ejemplo:

#define MAX 10 void main() { float notas[MAX]; int i; i=0; while (i<=MAX)

{ printf(“Dame la nota de la posición %d: “, i);

scanf(“%f”, &notas[i]);

i++;

} }

Ejercicio 7: Escribe el anterior código en el ordenador y ejecútalo paso a paso con el debugger. Este

sería el aspecto después de 1 iteración, observa como i vale 1 y hemos introducido un 6 en notas[0].

Ejecútalo hasta el final y di ¿Qué valor tiene la variable i al salir del bucle? ¿Cuántos valores hemos

introducido en total? ¿Funciona correctamente? ¿Por qué? ¿Cómo lo arreglarías?

Ejercicio 8. Escribe un programa que dado un vector de caracteres de tamaño 100, diga cuántas veces

aparece la letra a. Las letras en el vector ya están introducidas y el último carácter es el ‘.’. Para

declarar un vector de caracteres y asignarle una frase acabada en un ‘.’ puede hacer lo siguiente: char frase [80] = “Esta es la frase.”

(7)

Ejercicio 9. Escribe un programa que dada una matriz cuadrada (tantas filas como columnas) de

enteros, almacene en otra variable de tipo matriz de enteros, la transpuesta de la primera. La matriz transpuesta se obtiene cambiando filas por columnas.

Ejercicio 10. Escribe un programa que dada una matriz de enteros, construya un vector en el que cada

posición contenga el máximo de todos los valores que hay en la fila correspondiente de la matriz. Por ejemplo, en la posición 7 del vector debe quedar el valor mayor de entre todos los que hay en la fila 7 de la matriz (posiciones [7][0], [7][1], [7][2], etc.).

Referencias

Documento similar

usando Excel 153 7.1 Introducción 153 7.2 Operaciones entre matrices y vectores con Excel 153 Matriz por vector columna 153 Vector fila por matriz 158 7.3 Multiplicación de

The 'On-boarding of users to Substance, Product, Organisation and Referentials (SPOR) data services' document must be considered the reference guidance, as this document includes the

In medicinal products containing more than one manufactured item (e.g., contraceptive having different strengths and fixed dose combination as part of the same medicinal

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)

d) que haya «identidad de órgano» (con identidad de Sala y Sección); e) que haya alteridad, es decir, que las sentencias aportadas sean de persona distinta a la recurrente, e) que

De hecho, este sometimiento periódico al voto, esta decisión periódica de los electores sobre la gestión ha sido uno de los componentes teóricos más interesantes de la