0% encontró este documento útil (0 votos)
89 vistas54 páginas

Fundamentos de Vectores y Matrices en C

El documento aborda los fundamentos de vectores y matrices en programación, incluyendo su declaración, limitaciones y operaciones básicas como la indexación. Se discuten también punteros, su relación con vectores, y la aritmética de punteros, así como ejemplos prácticos de uso. Además, se presentan bucles para manipular vectores y matrices, destacando la importancia de comprobar límites para evitar errores.

Cargado por

luna spam
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
89 vistas54 páginas

Fundamentos de Vectores y Matrices en C

El documento aborda los fundamentos de vectores y matrices en programación, incluyendo su declaración, limitaciones y operaciones básicas como la indexación. Se discuten también punteros, su relación con vectores, y la aritmética de punteros, así como ejemplos prácticos de uso. Además, se presentan bucles para manipular vectores y matrices, destacando la importancia de comprobar límites para evitar errores.

Cargado por

luna spam
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Vectores y Matrices

Fundamentos de Programación

7/27/2023 [email protected]
• Vectores
• Vectores
• Declaración de vectores
• Limitaciones
• Estructura de los vectores
• Operación indexación
• Vectores y bucles

• Matrices
• Matrices
• Matrices y bucles

7/27/2023 [email protected]
• Punteros y Vectores
• Punteros y Vectores
• Aritmética de punteros
• Paso de vectores a funciones
• Paso de matrices a funciones

• Cadenas de caracteres
• Cadenas de caracteres
• Funciones con cadenas

7/27/2023 [email protected]
Vectores

7/27/2023 [email protected]
Vectores
• También llamados arrays o arreglos

• Conjunto, estructura o secuencia de datos que agrupa una colección de datos


de un mismo tipo

• Pueden ser unidimensionales (vectores) o multidimensionales (matrices)

• Un elemento del vector se identifica mediante su posición dentro del mismo


(índice)

• Los índices van desde 0 hasta n-1

• Acceso a los datos secuencialmente (uno tras otro)

• Acceso al dato usando [ ], ej: vector[i] nos devolvería el dato que se encuentra en
la posición i del vector vector

5
7/27/2023 [email protected]
Vectores

6
7/27/2023 [email protected]
Declaración de vectores
• Dos partes importantes que constituyen un vector: tipo de datos que contiene y el
tamaño del mismo

#define DIM 7
TipoBasico id_vector[DIM];

• tipoBasico: tipo de dato correspondiente, ej: int, float, char, etc.

• id_vector: nombre de la variable

• DIM: macro del preprocesador que se transforma en una constante literal entera y
determina el número de elementos del vector (este tamaño es fijo y no se modifica
en la ejecución del programa)

• Nota: se usa #define en vez de const porque para la compilación ISO C90 la
longitud del vector debe saberse en tiempo de compilación y const se sabe en
ejecución
7
7/27/2023 [email protected]
Declaración de vectores
• Cuando se declara un vector, se reserva inmediatamente el espacio necesario en
memoria

• ¿Cuánto? El tamaño del tipo básico * número de elementos


(sizeof(tipoBasico)*DIM)

• Se pueden iniciar los vectores en su declaración, ej:


tipoBasico id_vector[DIM_opt] = {valor_1,valor_2,valor_3}

• En este caso, se puede omitir el tamaño del vector que se infiere a partir del
número de elementos que se indican

• Se pueden inicializar los vectores con menos elementos  los últimos


elementos se inician a cero; y con más elementos  los últimos no se incluyen

8
7/27/2023 [email protected]
Limitaciones
• En C los vectores sólo se usan de dos maneras:
1. Con el operador indexación ([ ])
2. Mediante la conversión implícita a un puntero que apunta al primer elemento del
vector

• Normalmente los vectores se usan seguido de los corchetes, ej: id_vector[i]

• Los vectores no se pueden ni asignar ni comparar aunque el compilador lo


admite

• Internamente el compilador los convierte en punteros y realiza la asignación y


comparación con el puntero  pueden producir errores graves, NO usar

• Tamaño limitado: si tamaño más pequeño que el número de datos  no se


pueden guardar; si el tamaño es más grande  posiciones vacías

9
7/27/2023 [email protected]
Estructura de los vectores
• En C, los vectores agrupan varias variables del mismo tipo de manera
secuencial en memoria es decir, las variables van una tras otra sin huecos entre
medias

• La posición de inicio de un vector es 0

• Todas las variables del vector ocupan el mismo tamaño, para encontrar la
variable individual en memoria, desplazar n Bytes: índice * sizeof(tipoBasico)

10
7/27/2023 [email protected]
Operador indexación
• La única operación propia de los vectores es la indexación: id_vector[indice]

• El resultado de la operación puede verse de dos maneras:


1. Determinar una de las variables que componen el vector y usar dicha variable en el
lado izquierdo de una asignación o como operando de una operación dirección de
2. Obtener el valor que contienen las variables componentes del vector y usar dicho valor
en un proceso (evaluación) más grande

• Una limitación importante de la indexación en C: la indexación no comprueba


si hemos llegado al final del vector

• Hay que comprobar los límites o tendremos un error de limit out of bounds

• IMPORTANTE: comprobar que todos los elementos del vector existen

11
7/27/2023 [email protected]
Vectores y bucles
• Gran cantidad de problemas usan vectores + bucles, normalmente: índices de
vectores + for

• Dos categorías de bucles:


1. Manipulación de los elementos 1 a 1, por ejemplo: mostrar los valores por pantalla
2. Realizar operaciones sobre los elementos del vector, por ejemplo: sumar 3 a cada elemento

• Para estos casos se suele usar:

int i;
for (i=0;i<DIM;i++){
/*Sentencias sobre id_vector[i]*/
}

• Importante: comprobar que no nos salimos de rango

int i; int i;
for (i=0;i<DIM-1;i++){ for (i=1;i<DIM;i++){
/*Sentencias sobre id_vector[i] e id_vector[i+1]*/ /*Sentencias sobre id_vector[i-1] e id_vector[i]*/
} } 12
7/27/2023 [email protected]
Vectores y bucles
• Ejemplo 1:
Escribir un programa que genere un vector entero de tamaño 7 y que se inicie con
números aleatorios entre 0-9:
a) Intercambie la posición i de un vector por la i+1
b) Encuentre el valor máximo y su posición
c) Ordene el vector de mayor a menor valor

13
7/27/2023 [email protected]
Vectores y bucles
• Ejemplo 1 a:
Posible solución

Salida

14
7/27/2023 [email protected]
Vectores y bucles
• Ejemplo 1 b:
Posible solución

Salida

15
7/27/2023 [email protected]
Vectores y bucles
• Ejemplo 1 c:
Posible solución

Salida

16
7/27/2023 [email protected]
Matrices

7/27/2023 [email protected]
Matrices
• En C, son vectores de vectores, es decir, se pueden ver como vectores cuyas
componentes son vectores

• Al igual que en los vectores, se usa el operador indexación (aquí hay dos: uno
para las filas y otro para las columnas)

#define FILAS 7
#define COLUMNAS 3
tipoBasico id_matriz[FILAS][COLUMNAS];

• Donde, tipoBasico es el tipo de las componentes de la matriz, id_matriz es el


identificador de la variable, FILAS es el número de filas y COLUMNAS el
número de columnas de la matriz respectivamente.

• Índices: 0..(FILAS-1), 0..(COLUMNAS-1)


18
7/27/2023 [email protected]
Matrices
• Para matrices de orden superior (más de 2 índices): añadir más dimensiones

19
7/27/2023 [email protected]
Matrices
• Al hacer: id_matriz[m]  esta indexación nos devuelve la fila m-ésima de la
matriz

• Al hacer: id_matriz[m][n]  esta indexación nos devuelve el elemento que se


encuentra en la fila m-ésima y columna n-ésima

• Inicialización: tipoBasico id_matriz[FILAS][COLUMNAS] =


{{a11,a12,…,a1n}, {a21,a22,…,a2n},…,{am1,am2,…,amn}}

20
7/27/2023 [email protected]
Matrices y bucles
• Para recorrer una matriz, normalmente se usan 2 bucles anidados

int i,j;

for(i=0;i<FILAS;i++){

for (j=0;j<COLUMNAS;j++){

/*Operaciones sobre las posiciones i,j de la matriz: matriz[i][j]*/

21
7/27/2023 [email protected]
Matrices y bucles
• Ejemplo 2:
Escribir un programa que genere una matriz de enteros de tamaño 3x3 y que se inicie con
números aleatorios entre 0-9:
a) Encuentre el valor máximo y su coordenada
b) Calcule la traspuesta de una matriz

22
7/27/2023 [email protected]
Matrices y bucles
• Ejemplo 2 a:
Posible solución

Salida

23
7/27/2023 [email protected]
Matrices y bucles
• Ejemplo 2 b:
Posible solución

Salida

24
7/27/2023 [email protected]
Punteros y vectores

7/27/2023 [email protected]
Punteros y vectores
• En C, existe correspondencia entre vectores y punteros (¡AL REVÉS NO!)

• Conversión implícita, permite convertir un vector a puntero:


1. el puntero apunta al tipo de la componente del vector, es decir, si el vector es de
tipoBasico, el puntero es de tipo tipoBasico*
2. el puntero resultante apunta a la primera componente del vector

tipoBasico *p;
tipoBasico vector[DIM];
p = vector;

• El resultado del operador [] sobre un puntero que apunta al primer elemento de


un vector, es el mismo que el aplicado a un vector. Dos pasos:
1. realizar la suma del puntero con el entero entre los corchetes
2. aplicar el operador de indirección sobre el resultado

26
7/27/2023 [email protected]
Punteros y vectores
• Declaración parámetros formales: los vectores se pueden usar como
parámetros formales. El compilador de C usa un puntero al tipo de las
componentes del vector

• Los vectores se usan siempre como parámetros formales por referencia, es decir
de Entrada/Salida. Las siguientes declaraciones serían equivalentes

void funcion1 (tipoBasico vector[DIM]);


void funcion2 (tipoBasico *vector)

• Debido a la equivalencia, existen librerías (<stdio.h> o <string.h>, por ejemplo)


en donde se usan punteros en lugar de vectores en las declaraciones de las
funciones. ¿Cómo distinguir estos casos?

void funcion (tipoBasico *a, int n);


tipoRetorno funcion (const tipoBasico *a,int n)
27
7/27/2023 [email protected]
Punteros y vectores
• Vectores de punteros: se pueden declarar vectores cuyas componentes
sean punteros

tipoBasico * id_vector_punteros [DIM];

• Punteros a un vector: se pueden declarar punteros que apunten a


vectores

tipoBasico (* id_vector_punteros) [DIM];

28
7/27/2023 [email protected]
Aritmética de punteros
• Restringido a punteros que apunten a variables de tipo vector

• Los punteros, al almacenar direcciones de memoria, no tiene una operación


que coincida con las habituales sobre los conjuntos habituales (enteros, reales,
etc.)

• Pero sí que existe una aritmética cuyo significado es el desplazamiento de la


dirección de memoria

• Las operaciones no son internas, es decir, necesitamos un puntero como


operando izquierdo y otro como derecho

• La resta de dos punteros devuelve un número entero y no otro puntero

29
7/27/2023 [email protected]
Aritmética de punteros

30
7/27/2023 [email protected]
Aritmética de punteros
• Ejemplo 3:
Escribir un programa que:
a) Cree un vector de 10 posiciones relleno con valores enteros y un puntero que apunte a la
primera posición de dicho vector. Al puntero le sumará un número (que coincida con una de
las posiciones del vector) y se mostrará por pantalla tanto el valor al que apunta el vector
original como el valor al que apunta vector suma
b) Cree un vector de 10 posiciones relleno con valores enteros y un puntero que apunte a la
última posición de dicho vector. Al puntero le restará un número (que coincida con una de las
posiciones del vector) y se mostrará por pantalla tanto el valor al que apunta el vector original
como el valor al que apunta vector resta
c) Cree un vector de 10 posiciones relleno con valores enteros y dos punteros: uno que apunte a
la sexta posición de dicho vector y otro, a la segunda. Los punteros serán restados y se
mostrará por pantalla el valor obtenido

31
7/27/2023 [email protected]
Aritmética de punteros
• Ejemplo 3 a:
Posible solución

Salida

32
7/27/2023 [email protected]
Aritmética de punteros
• Ejemplo 3 b:
Posible solución

Salida

33
7/27/2023 [email protected]
Aritmética de punteros
• Ejemplo 3 c:
Posible solución

Salida

34
7/27/2023 [email protected]
Paso de vectores a funciones
• Se pasa un puntero al primer elemento del vector. Varios casos

1. void función(tipoBasico vector[3]);  vector de tamaño conocido,


en compilación el 3 se ignora, útil para el programador

2. void función(tipoBasico vector[], unsigned tam);  vector de


cualquier tamaño, segundo elemento indica el tamaño del vector

3. void función(tipoBasico *vector)  vector como puntero, tiene un


tamaño conocido pero ignorado por compilador y programador,
se puede pasar un vector (conversión implícita)

35
7/27/2023 [email protected]
Paso de vectores a funciones

4. void función(tipoBasico *vector, unsigned tam);  vector de


cualquier tamaño, se puede pasar un vector (conversión implícita),
más usado en C

5. Cuando se pasa un vector a una función, el vector tiene que estar


declarado, en otro caso, ¡error grave!

36
7/27/2023 [email protected]
Paso de vectores a funciones
• Ejemplo 4:

a) Escribir una función crecientes que, al ejecutarse, pida al usuario introducir por teclado valores
estrictamente positivos que sean asignados a los n primeros elementos de un array v de datos
de tipo double. La petición de valor para su asignación a cada elemento del array se debe
repetir si el valor introducido no es estrictamente mayor que el anterior. Por lo tanto, al
terminar la ejecución de la función de los n primeros valores del array deben tener valores
estrictamente positivos en orden estrictamente creciente. v y n son los dos parámetros de la
función. Nota: se supone que n siempre es mayor que 0.
b) La función voltear debe invertir el orden de los n primeros elementos de un array v de DIM
valores reales. El resto de los elementos deben inicializarse al valor 0 y la función debe
retornar el valor 1. Si el valor de n es mayor que el valor de DIM, la función no debe
modificar el array v y debe retornar el valor 0. v y n son los parámetros de la función

37
7/27/2023 [email protected]
Paso de vectores a funciones
• Ejemplo 4 a:
Posible solución

38
7/27/2023 [email protected]
Paso de vectores a funciones
• Ejemplo 4 b:
Posible solución

39
7/27/2023 [email protected]
Paso de matrices a funciones
• Mismo caso que para vectores

1. void función(tipoBasico matriz[4][3]);  matriz de tamaño


conocido, en compilación el 4 y el 3 se ignoran

2. void función(tipoBasico matriz[][3], unsigned filas);  matriz


cuyo número de columnas es constante pero el número de filas
variable. NO puede tener el número de columnas variable. Nota:
hay que saber el tamaño de la fila pero no así el número de ellas

40
7/27/2023 [email protected]
Paso de matrices a funciones
3. void funcion(tipoBasico (*matriz)[3], unsigned filas, unsigned
columnas)  dirección de memoria del primer elemento e indicar
el número de filas y columnas. (NO USAR, EL COMPILADOR
DE C DA PROBLEMAS CON ESTA OPCIÓN)

4. Como con los vectores, al pasar una matriz a una función, la


matriz tiene que estar declarada

41
7/27/2023 [email protected]
Paso de matrices a funciones
• Ejemplo 5:
Construir la función camino_minimo que dada una matriz de enteros de tamaño nx5 y el número, n,
de filas, retorne la suma mínima de todos los valores encontrados en la secuencia del recorrido
desde la casilla (0,0) hasta la casilla (n-1,4) siguiendo dos posibles caminos: i) hacia abajo hasta la
última fila y luego, hacia la derecha hasta llegar a la última casilla o ii) hacia la derecha hasta llegar
a la última columna y luego, hacia abajo. Por ejemplo: dada la matriz que se indica a continuación,
el resultado será 24. Nota: las casillas que impliquen un cambio de dirección, solamente
computarán una vez.

42
7/27/2023 [email protected]
Paso de matrices a funciones
• Ejemplo 5:
Posible solución

43
7/27/2023 [email protected]
Cadenas de caracteres

7/27/2023 [email protected]
Cadenas de caracteres

• Caso particular de vectores en donde todas las componentes son


caracteres

• Permite almacenar datos de tipo alfanumérico con cero, uno o más


caracteres

• Nota: una cadena alfanumérica es una secuencia: letras, dígitos,


símbolos o signos de puntuación codificada según alguno de los
estándares de codificación de texto (UTF-8, ISO-8859-1,etc.)

45
7/27/2023 [email protected]
Cadenas de caracteres
• Sintaxis en C

char id_cadena [dim_opt] = “texto libre”

 donde: id_cadena es el identificador; dim_opt es la capacidad de la cadena


(opcional), si no se indica, la capacidad se extrae del tamaño del texto;
“texto libre” es el valor de la cadena

• En C, una cadena puede tener longitud efectiva  la cadena de


caracteres tiene una longitud distinta al añadírsele un caracter nulo (0 o
‘\0’). Se añade de forma automática

• Existen funciones predefinidas en C, declaradas en <string.h>, que


sólo se comportan correctamente cuando las cadenas acaban en
caracter nulo
46
7/27/2023 [email protected]
Cadenas de caracteres
• Debido al caracter nulo:

1. Capacidad máxima: número máximo de caracteres que se podrían


guardar

2. Longitud efectiva: número de caracteres en un momento dado


(número de caracteres hasta el nulo).

47
7/27/2023 [email protected]
Funciones con cadenas
• <string.h>

48
7/27/2023 [email protected]
Funciones con cadenas
• <stdio.h>: nuevo especificador de formato “%s”

 printf  inmediato
 scanf  complicaciones

1. Suprimir & porque una cadena se convierte a puntero


(scanf(“%s”,cadena);)
2. Las cadenas tienen tamaño máximo  indicar el número de
caracteres leídos de teclado (“%numero+s”), ej:
scanf(“%31s”,cadena);  CUIDADO con el caracter nulo!!

 scanf lee caracteres hasta encontrar un blanco (espacio, tabulador,


salto de línea). Para leer toda una línea (más caracter nulo), usar
gets
49
7/27/2023 [email protected]
Funciones con cadenas
• Ejemplo 6:
Construir la función balanceo para que, dada como parámetro una expresión matemática
almacenada en una cadena, compruebe si el balanceo de paréntesis es correcto (se abre y cierran
correctamente). Para ello es necesario comprobar que: (a) el número de cierres nunca es superior al
de aperturas durante todo el recorrido del primero al último caracter de la cadena y (b) el total de
aperturas y el total de cierres es el mismo al finalizar el recorrido. Si el balance es correcto entonces
debe retornar el valor 1, y en caso contrario, retorna el valor 0. Nota: no puede emplearse ninguna
función de la librería string.h

50
7/27/2023 [email protected]
Funciones con cadenas
• Ejemplo 6:
Posible solución

51
7/27/2023 [email protected]
Funciones con cadenas
• Ejemplo 7:
Escribir un programa que pida al usuario introducir por teclado una cadena de caracteres (de
tamaño máximo 20) y, a continuación, un caracter. Seguidamente debe mostrar por pantalla el
número de caracteres de la cadena diferentes al caracter introducido y la propia cadena modificada
sustituyendo todas las veces que aparezca dicho caracter por ‘#’. Nota: puede emplearse la librería
string.h

52
7/27/2023 [email protected]
Funciones con cadenas
• Ejemplo 7:
Posible solución

53
7/27/2023 [email protected]
Vectores y Matrices

Fundamentos de Programación

7/27/2023 [email protected]

También podría gustarte