Sunteți pe pagina 1din 32

1

Tema 5: Estructuras estticas


de datos
Informtica
Grado en Ingeniera en Tecnologas Industriales
Departamento de Ingeniera de Sistemas y Automtica.
Escuela de Ingenieros. Universidad de Sevilla
2
ndice
1. Estructuras de datos estticas en DF:
1.1 Vectores
1.2 Matrices
2. Estructuras de datos estticas en C:
2.1 Vectores
2.2 Matrices
3
1.1 DF: Vectores
Objeto vector: representa una tabla
monodimensional.
Elementos:
Identificador:
nombre del vector e ndice
Nombre de cada componente del vector (en
minscula): nombre_del_vector
ndice
Valor: variable o constante
Tipo: entero, real, lgico, carcter
Informtica. GITI. Tema 5. DISA.US
4
1.1 DF: Vectores
Problema: Leer un vector de reales de dimensin 20
Objeto Nombre Valor Tipo
Vector de 20
componentes
v Variable Reales
ndice del
vector v
k Variable Entera
Uno 1 Constante Entera
Veinte 20 Constante Entera
Inicio
Fin
k<=20?
Leer v
k
SI
NO
1 k
1 k k
Nota:
DF: estructura iterativa con salida en cabeza,
donde se conoce a priori el nmero de iteraciones
C: for
Informtica. GITI. Tema 5. DISA.US
5
1.1 DF: Vectores
Problema: hallar la suma de las componentes de un
vector de dimensin 10 y escribir el resultado.
Objeto Nombre Valor Tipo
Vector de diez
componentes
v Variable Enteros
ndice del
vector v
i Variable Entera
Cero 0 Constante Entera
Uno 1 Constante Entera
Diez 10 Constante Entera
Resultado,
suma de las
diez
componentes
del vector
sp Variable Entera
Inicio
Fin
SI
NO
0 sp
1 i
i
v sp sp
1 i i
Escribir sp
i<=10?
Informtica. GITI. Tema 5. DISA.US
6
1.2. DF: Matrices
Objeto matriz: representa una tabla
bidimensional.
Elementos:
Identificador:
nombre de la matriz, ndice de la fila e ndice de la columna
Nombre de cada componente de la matriz (en minscula):
nombre_de_ la_matriz
ndice_fila,ndice_columna
Valor: variable o constante
Tipo: entero, real, lgico, carcter
Informtica. GITI. Tema 5. DISA.US
7
1.2. DF: Matrices
Problema: Leer M y N supuestos enteros y positivos.
Leer una matriz A con M filas y N columnas de
componentes reales.

N M M M
N
N
a a a
a a a
a a a
, 2 , 1 ,
, 2 2 , 2 1 , 2
, 1 2 , 1 1 , 1

Filas:k
Columnas:j
Elemento
genrico de
la matriz A:
a
k,j
Matriz A
Informtica. GITI. Tema 5. DISA.US
8
1.2. DF: Matrices
Problema: Leer M y N supuestos enteros y
positivos. Leer una matriz A con M filas y N
columnas de componentes reales.
Inicio
Fin
SI
NO
1 k
1 k k
Leer M, N
k<=M?
Lectura de la
filak de A
Bucles anidados:
- tiles para trabajar con matrices.
- Permiten recorrer todos los
elementos de la matriz.
- Normalmente, el bucle externo
recorre el ndice de filas y el bucle
interno recorre el ndice de columnas.
Informtica. GITI. Tema 5. DISA.US
9
1.2. DF: Matrices
Problema: Leer M y N supuestos
enteros y positivos. Leer una matriz A
con M filas y N columnas de
componentes reales.
Inicio
Fin
SI
NO
1 k
1 k k
Leer M, N
k<=M?
Lectura de la
filak de A
Inicio:Lectura
de lafilak de A
SI
NO
1 j
1 j j
j<=N?
Leer a
k,j
Fin:Lectura
de lafilak de A
Informtica. GITI. Tema 5. DISA.US
10
Nota
Nota:
DF: dos bucles anidados, cada uno con estructura
iterativa con salida en cabeza, donde se conoce a priori el
nmero de iteraciones.
C: dos bucles for anidados
Informtica. GITI. Tema 5. DISA.US
11
Objeto Nombre Valor Tipo
Dato de entrada
Nmero de filas
M Variable Entera
Dato de entrada
Nmero de
columnas
N Variable Entera
ndice de filas de
matriz
k Variable Entera
ndice de
columnas de
matriz
j Variable Entera
Uno 1 Constante Entera
Resultado, Matriz
de dimensin MxN
A Variable Reales
1.2. DF: Matrices
Tabla de objetos: Leer M y N supuestos enteros y positivos. Leer
una matriz A con M filas y N columnas de componentes reales.
Informtica. GITI. Tema 5. DISA.US
12
1.2. DF: Matrices
Problema: Hallar la suma de las componentes
de una matriz, cuya dimensin y componentes
se han de leer por teclado y por filas
Inicio
Fin
0 sp
Leer M, N
Lecturay suma
matriz A
Escribir sp
Informtica. GITI. Tema 5. DISA.US
13
2.1. DF: Matrices: Hallar la suma de las componentes de una
matriz, cuya dimensin y componentes se han de leer por
teclado y por filas
Inicio: Lecturay suma
Matriz A
SI
NO
1 k
1 k k
k<=M?
Lecturay suma
filak de A
Fin: Lecturay suma
Matriz A
Inicio:Lecturay suma
filak de A
SI
NO
1 j
1 j j
j<=N?
Leer a
k,j
Fin:Lecturay suma
filak de A
j k
a sp sp
,

Inicio
Fin
0 sp
Leer M, N
Lecturay suma
matriz A
Escribir sp
14
Objeto Nombre Valor Tipo
Dato de entrada Nmero de
filas
M Variable Entera
Dato de entrada Nmero de
columnas
N Variable Entera
ndice de filas de matriz k Variable Entera
ndice de columnas de matriz j Variable Entera
Uno 1 Constante Entera
Cero 0 Constante Entera
Matriz de dimensin MxN A Variable Reales
Resultado, suma
componentes matriz A
sp Variable Real
2.1. DF: Matrices. Tabla de objetos: Hallar la suma de las
componentes de una matriz, cuya dimensin y
componentes se han de leer por teclado y por filas
Informtica. GITI. Tema 5. DISA.US
15
ndice
1. Estructuras de datos estticas en DF:
1.1 Vectores
1.2 Matrices
2. Estructuras de datos estticas en C:
2.1 Vectores
2.2 Matrices
Informtica. GITI. Tema 5. DISA.US
16
2.1 Vectores en C
Un vector en C es un conjunto de datos homogneos
(del mismo tipo), agrupados de manera contigua en
memoria y de acceso aleatorio.
Se pueden usar vectores de cualquier tipo de datos: int,
long, float, double, char, etc.
El uso de vectores en C requiere cumplir una serie de
pasos
1. Declaracin.
2. Inicializacin.
3. Acceso a elementos y Operaciones.
Informtica. GITI. Tema 5. DISA.US
17
2.1 Vectores en C
Declaracin de un vector. Se debe especificar:
El tipo de los elementos que lo forman.
El nombre de la variable.
El tamao o nmero de elementos del vector.
Sintaxis:
tipo nombre[tamao];
Al declarar un vector se reserva en memoria el espacio necesario para almacenar
todos sus elementos. El tamao del vector debe ser un valor constante
Ejemplos:
double alturas[10]; //vector de 10 reales de doble precisin
float notas[7]; // vector de 7 reales
int numeros[8]; // vector de 8 enteros
char s[20]; // vector de 20 caracteres
Informtica. GITI. Tema 5. DISA.US
18
2.1 Vectores en C
Declaracin de un vector: (Reserva de memoria)
La declaracin de un vector de tamao n implica reservar memoria para n
variables del tipo del vector de forma contigua en memoria
Ej: int vect[5] Si una variable entera ocupa 2 octetos, el vector completo
ocupa 10 octetos contiguos.
La reserva de memoria por defecto de C es de tipo esttico. Se debe
especificar a priori el tamao del vector y no puede decidirse o cambiarse
en tiempo de ejecucin. El tamao debe ser una CONSTANTE.
Ej:
Es correcto:
float dato[5];
----------------------------
#define N 10
int vector[N];
----------------------------
const int n=10;
char palabra[n];
No es correcto:
int n=5;
float dato[n];
---------------------------------
int n;
scanf(%d,&n);
int vector[s];
Informtica. GITI. Tema 5. DISA.US
19
2.1 Vectores en C
Inicializacin de Vectores
- Los elementos de un vector pueden inicializarse en su declaracin.
- Para ello, se da una lista de constantes separadas por comas y
delimitadas por llaves (pueden ser menos que el total de elementos del
vector, con lo que slo se inicializan los primeros elementos).
- Esta forma de inicializar slo es posible en la declaracin del vector.
- Ejemplos:
double alturas[10] = {1.8, 1.6, 1.75, 1.45};
float notas[7] = {5.5, 9.4, 4.1, 3.2, 8.1};
int numeros[8] = {1, 2, 3, 4, 5, 6, 7, 8};
char s[20] = {'H', 'o', 'l', 'a};
Informtica. GITI. Tema 5. DISA.US
20
2.1 Vectores en C
Acceso a elementos de vectores
- Para acceder a un elemento de un vector se debe especificar el nombre del vector,
seguido de la posicin (el ndice) que ocupa dicho elemento dentro del vector entre
corchetes.
- El ndice debe ser siempre una expresin entera, que puede ser una variable.
Ej: int x[10];
- En C el ndice de los elementos va desde 0 hasta N-1, siendo N el nmero de
componentes (elementos) del vector.
- Ejemplos:
alturas[4] = 1.95;
notas[5] = 8.75;
numeros[0] = numeros[0] + 5;
2 -1 5 7 -23 2 0 9 16 8
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] x[9]
Informtica. GITI. Tema 5. DISA.US
21
2.1 Vectores en C
Importante: En C el ndice de los elementos va desde 0 hasta N-1,
siendo N el nmero de componentes (elementos) del vector.
Inicio
Fin
k<=20?
Leer v
k
SI
NO
1 k
1 k k
main()
{
float v[20];
int k;
for(k=1;k<=20;k++)
scanf(%f,&v[k-1]);
}
Note que las
condiciones del bucle
se establecen para
recorrer 20 elementos
de v[0] a v[19]
Comprelo con el
diagrama de flujo
Ejemplo: Lectura de un vector de 20 componentes
Informtica. GITI. Tema 5. DISA.US
22
2.1 Vectores en C
Importante: C no comprueba si el ndice de un vector excede los lmites
de la tabla. Si el ndice es menor que 0 o mayor que N-1 el compilador no
detecta error.
Ejemplos de errores comunes:
/*Lectura incorrecta 20 eltos*/
void main (void)
{
float v[20];
int k;
for(k=1;k<=20;k++)
scanf(%f,&v[k]);
}
/*Mal sucesin Fibonacci*/
void main (void)
{
int v[10]={1,2};
int k;
for(k=1;k<10;k++)
v[k]=v[k-1]+v[k-2];
}
Informtica. GITI. Tema 5. DISA.US
23
2.1 Vectores en C
Vectores de caracteres:
Son importantes porque permiten almacenar palabras o frases de texto en
la memoria.
void main (void)
{
char cad[20]; /*Vector para almacenar texto*/
int i=0;
/*Lectura de un vector de caracteres hasta que se introduce un punto ( . ) o fin vector */
while((cad[i]=getchar())!='.' && i<20) i++;
printf("\n\n La cadena escrita es: ");
i=0;
while(cad[i]!='.' && i<20) /*Se muestran caracteres hasta encontrar un punto o fin vector */
{putchar(cad[i]);
i++;}
getch();/*Espera pulsacin tecla antes de salir*/
}
Informtica. GITI. Tema 5. DISA.US
24
2.1 Vectores en C
Ejemplo: Calcular los n primeros trminos de la sucesin Fibonacci
#include <stdio.h>
#define N 50
void main (void)
{
int v[N]={1,2}; /*Los dos primeros trminos son conocidos*/
int n,k;
do{
printf("\nIntroduzca un numero mayor que 0 y menor o igual que 50: ");
scanf("%d",&n);
}while(n<1 || n>50); /*Si el numero esta fuera de rango volvemos a preguntar*/
for(k=2;k<n;k++) /*Calculamos trminos de la sucesin*/
v[k]=v[k-1]+v[k-2];
printf("\nLos %2d primeros terminos de la sucesion Fibonnacci son:\n",n);
for(k=0;k<n;k++) /*Mostramos trminos calculados por pantalla*/
printf("%2d ",v[k]);
getch(); /*Esperamos a pulsar una tecla antes de salir*/
}
IMPORTANTE: Note que, aunque el
programa pide el nmero de trminos a
calcular, la declaracin del vector es
esttica de tamao 50. Por ello es
necesario comprobar que no se
calcularan ms de 50 trminos de la
sucesin
Informtica. GITI. Tema 5. DISA.US
25
2.1 Vectores en C
Ejemplo: Calcular la longitud de un vector de caracteres
#include <stdio.h>
#define N 100
void main (void)
{
char cad[N]; /*Vector para almacenar texto*/
int longitud=0,i=0;
/*Lectura de un vector de caracteres hasta que se introduce un punto ( . ) o fin vector */
while((cad[i]=getche())!='.' && i<N)
i++;
i=0;
while(cad[i]!='.' && i<N) /*Se cuentan caracteres hasta encontrar un punto o fin vector */
{i++;
longitud++;
}
printf("\nLa longitud del texto es: %2d",longitud);
getch(); /*Espera pulsacin tecla antes de salir*/
}
La longitud del vector de caracteres se
calcula excluyendo el terminador punto
(.)
De nuevo, es necesario limitar el
tamao mximo del vector al tamao
de la reserva esttica N.
Informtica. GITI. Tema 5. DISA.US
26
2.2 Matrices en C
Una matriz en C es un conjunto de datos bidimensional,
homogneos y agrupados de manera contigua en memoria y de
acceso aleatorio.
Se pueden usar matrices de cualquier tipo de datos: int, long, float,
double, char, etc.
Al igual que los vectores, las matrices deben declararse e
inicializarse antes de usar el contenido de sus elementos.
C interpreta las matrices como vectores de vectores
Informtica. GITI. Tema 5. DISA.US
27
2.2 Matrices en C
Declaracin de matrices
Para declarar una matriz se debe especificar:
El tipo de los elementos que lo forman.
El nombre de la variable.
El tamao en filas y columnas de la matriz.
Sintaxis:
tipo nombre[nmero filas][nmero columnas];
Al declarar una matriz se reserva memoria para almacenar todos sus
elementos de forma esttica. El nmero de filas y columnas debe ser
constante.
Ejemplos:
int A[2][2], B[2][3] ; /*Matrices de enteros*/
char C[2][3]; /*Matriz de caracteres de 2 filas y 3 columnas*/
Informtica. GITI. Tema 5. DISA.US
28
2.2 Matrices en C
Inicializacin de matrices
Los elementos de una matriz pueden inicializarse en su declaracin.
Para ello, se da una lista de constantes separadas por comas y
delimitadas por llaves (pueden ser menos que el total de elementos del
vector, con lo que slo se inicializan los primeros elementos).
Esta forma de inicializar slo es posible en la declaracin de la matriz
Ejemplos:
int A[2][2], B[2][3] = { {1,2,3} , {4,5,6}};
int C[2][3] = { 1, 2, 3, 4, 5, 6 };
Informtica. GITI. Tema 5. DISA.US
29
2.2 Matrices en C
Al igual que sucede con vectores:
El tamao en filas y columnas debe ser constante (reserva esttica)
Los ndices de filas y columnas comienzan en 0 y se extienden hasta NFILAS-1 para
las filas y NCOLUMNAS-1 para las columnas
No se comprueba si los ndices exceden los lmites de la matriz, con consecuencias
nefastas si esto sucede.
Sin embargo:
Los elementos de la matriz no se reservan todos contiguos en la memoria
Esto se debe a que C trata las matrices como vectores de vectores. Es decir, la declaracin
int m[3][4];
reserva espacio para 3 vectores de 4 enteros (Se reservan tantos vectores individuales de
tamao NCOLUMNAS, como indique el nmero de filas NFILAS)
Informtica. GITI. Tema 5. DISA.US
30
2.2 Matrices en C
Tratamiento de matrices como vectores
Es posible trabajar con matrices empleando procedimientos vectoriales, si se
considera que la matriz est linealizada por filas.
Es necesario cambiar el modo en que se declara y accede a los elementos de la
matriz.
Declaracin: float tabla[FIL][COL] pasara a reservarse como vector: float tabla[FIL*COL]
Acceso a elementos: Para referenciar el elemento tabla[i][j] escribimos tabla[ i*COL +j ]
Ejemplo:
int i,j,tabla[3][4];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
tabla[i][j]=i+j;
int i,j,tabla[3*4];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
tabla[i*4+j]=i+j;
Informtica. GITI. Tema 5. DISA.US
31
#include<stdio.h>
void main(void)
{
int i,j,M,N;
int A[50][50];
scanf("%d",&M);
scanf("%d",&N);
for(i=1;i<=M;i++) //Bucle de lectura con indices a 1
{
for(j=1;j<=N;j++)
{
printf("\nIntroduzca la componente %d %d de la matriz ",i,j);
scanf("%d",&A[i-1][j-1]);
}
}
printf("\n\n Ahora escribimos la matriz...");
for(i=0;i<M;i++) //Bucle de escritura con indices a 0
{
printf("\n");
for(j=0;j<N;j++)
printf("\t%d",A[i][j]);
}
scanf("%d",&i);
}
2.2 Matrices en C
Ejercicio: lectura y escritura de matriz de enteros
32
2.2 Matrices en C
Ejercicio: Suma de componentes de una matriz de enteros
#include<stdio.h>
void main(void)
{
int i,j,M,N,sp;
int A[50][50];
sp=0;
scanf("%d",&M);
scanf("%d",&N);
for(i=1;i<=M;i++) //Bucle de lectura con indices a 1
{
for(j=1;j<=N;j++)
{
printf("\nIntroduzca la componente %d %d de la matriz ",i,j);
scanf("%d",&A[i-1][j-1]);
sp=sp+A[i-1][j-1];
}
}
printf("\n La suma de las componentes es %d",sp);
scanf("%d",&i);
}
Informtica. GITI. Tema 5. DISA.US

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