Você está na página 1de 18

FUNDAMENTOS DE

INFORMÁTICA

UNIDAD DIDÁCTICA 2

Tema 6 – Tipos estructurados de datos:


vectores o arrays

« Me lo explicaron y lo olvidé, lo ví y lo aprendí, lo hice y lo entendí.»


- Confucio -
Bibliografía

 Informática Aplicada. Programación en


Lenguaje C, P. Alcover
− Capítulo 11: vectores n-dimensionales
− Capítulo 12: cadenas de caracteres
Introducción

 Un vector es una estructura de datos que almacena


una cantidad fija de elementos del mismo tipo, a los
cuales se puede acceder por medio de un índice que
indica su posición dentro de la estructura

[mods] tipo_dato identificador [tam] [= {valores}] ;

mods:
auto, extern, static, const, signed, unsigned,
volatile, register
Ejemplos vectores

int arrayDeEnteros[2];
float a[100], b[30];
char arrayCaracteres[3] = {‘d’, ’5’, ’*’};
signed short serie[]={1, 3, 6, 8, 11, 16, 17, 27};

Los índices comienzan por 0:


printf (“serie[0]: %hd”, serie[0]); // → 1
printf (“serie[3]: %hd”, serie[3]); // → 8
printf (“serie[6]: %hd”, serie[6]); // → 17
Asignación y evaluación de vectores

La asignación y la evaluación de un vector requiere


siempre un índice:
serie[2] = 99; serie
0 serie[0]
int a = serie[6*4/3]; //expresión 1 serie[1]
4 serie[2]
Consideremos la sentencia: 9 serie[3]
16 serie[4]
int serie [10]; serie[5]
25
36 serie[6]
y la siguiente porción de código que serie[7]
49
inicializa los elementos del array: 64 serie[8]
81 serie[9]
for (i = 0; i < 10; i++)
serie[i] = i * i;
Almacenamiento de vectores en memoria

int valor;
int serie[5];
valor = serie [4];

Celdas Posiciones del vector


serie
10
Esto es la referencia 11 Los elementos del
12 vector ocupan
13 posiciones de
¡Ojo!, ‘serie’ es el nombre memoria contiguas
de la “flecha” 14
Tamaño de un vector

 Es posible salirse de los límites de un vector, aunque


no es recomendable:
serie [55] = 99; // ¡sobrescribe la memoria!
 El compilador no detecta el error, que se manifiesta en
tiempo de ejecución. Suele ser difícil de detectar
 Los vectores se pueden recorrer fácilmente utilizando
el operador sizeof:
for (i=0; i<(sizeof(serie)/sizeof(int)); i++)
Ejemplo: calificaciones clase.
Información del índice del vector ignorada

int main (void) {


float nota[40]; double media = 0.0;
int i, suspensos=0, aprobados=0;
for (i=0; i<40; i++) {
printf(“Nota del alumno %hd? ”, i);
scanf(“%f”, &nota[i]);
media += nota[i];
if (nota[i] >= 5.0) aprobados++;
else suspensos++;
}
printf(“Media %lf, aprobados %hd, suspensos %d\n“,
(media/40), aprobados, suspensos);
return 0;
}
Ejemplo: análisis de un sondeo (escala
1 a 10). Información del índice útil

Se ha realizado una encuesta a 20 personas acerca de la calidad de la


comida de un restaurante en una escala de 1 a 10. Se trata de colocar las 20
respuestas en un vector de enteros y resumir los resultados del sondeo.
int main (void) {
int respuestas[] = {1,2,6,4,8,5,9,7,8,10,1,6,3,8,6,10,3,
8,2,7};
int frecuencia [10], i;
// Cada respuesta es el subíndice del array frecuencia
for (i = 0; i < 20; i++) frecuencia[i] = 0;
for (i = 0; i < 20; i++)
frecuencia[respuestas[i]-1] ++;
for (i = 0; i < 20; i++)
printf (“Resp. %d, frec. %d\n”, (i+1), respuestas[i]);
return 0;
}
Observaciones sobre vectores

 No hay restricciones respecto del tipo de datos que


puede contener un vector. Incluso otros vectores
 Los vectores tienen un tamaño fijo:
 No pueden crecer ni disminuir en tamaño
 Se dice que son estructuras estáticas de datos
(en contraposición con las estructuras dinámicas
de datos que si pueden variar el tamaño)
Vectores multidimensionales

 Basta con añadir más corchetes en la declaración


 Pero el tipo de los valores que almacenan tienen que ser el
mismo
int a [3][4];
char multiDim[5][6][7][111][456];
short mat[][3] = {{1, 2, 3}, {4, 5, 6}};
// C infiere la dimensión que falta

Columna 0 Columna 1 Columna 2 Columna 3


a es un vector de 3x4 enteros
Fila 0 a[0] a[0][0] a[0][1] a[0][2] a[0][3]
Fila 0 a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[i] es un vector de 4 enteros

Fila 2 a[2] a[2][0] a[2][1] a[2][2] a[2][3] a[i][j] es un entero


Recorrer vectores bidimensionales

#include <stdio.h>

int main (void) {


short mat[][3]={{1,2,3},{4,5,6}};
for (i=0; i < sizeof(mat)/sizeof(mat[0]); i++) {
for (j=0; j<sizeof(mat[0])/sizeof(short); j++)
printf("[%d,%d] -> %d\t", i, j, mat[i][j]);
printf("\n");
}
return 0;
}

 Se pueden cambiar los sizeof por el tamaño (filas y


columnas, literal entero) del array mat
Ejemplo: cálculo nota máxima

Cada fila representa un estudiante y cada columna representa una


calificación en diferentes exámenes
int main (void) {
int notas [][4] = {{77,68,86,73}, {96,87,89,81},
{70,90,86,81}};
int max = 0, i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++ ) {
if (notas[i][j] > max) max = notas[i][j];
}
}
printf(“La nota máxima del curso es %d”, max);
return 0;
}
Cadenas de caracteres

 Son vectores unidimensionales de caracteres, con la


característica especial de que el final de la cadena
está marcado con el carácter ‘\0’
 C (y la mayoría de lenguajes) proporcionan
construcciones especiales para la declaración y
manipulación de cadenas de caracteres, aunque son
esencialmente vectores (que acaban en ‘\0’)
 La librería <string.h> contiene funciones básicas
de manipulación de cadenas de caracteres
Declaración y uso

#include <stdio.h>
int main (void) {
char asignatura[] = "Informatica Aplicada";
char asign[] =
{'I','n','f','o','r','m','a','t','i','c','a',
' ', 'A','p','l',’i','c','a','d','a','\0'};
printf("%s | %s\n", asignatura, asign);
printf(“\’Asignatura\’ ocupa %hd, \’asign\’ ocupa %hd”,
(sizeof(asignatura)/sizeof(char)-1),
(sizeof(asign)/sizeof(char)-1) );
return 0;
}
Declaración y uso

int main (void) {


char i = 0, asignatura[] = "Informatica Aplicada";
char asign[] =
{'I','n','f','o','r','m','a','t','i','c','a',
' ', 'A','p','l',’i','c','a','d','a','\0'};
while (asign[i] != ‘\0’) {
printf(“|%c|”, asign[i]); i++;
}
i = 0; printf(“\n”);
for (i=0; i<(sizeof(asignatura)/sizeof(char)-1); i++)
printf(“|%c|”,asignatura[i]);
return 0;
}
Declaración y uso

• Lectura de teclado de un vector de caracteres:


char mensaje[30];
scanf("%[^\n]”, mensaje);
gets(mensaje);

• Ojo con el tamaño del vector. El mensaje tecleado no


debe ser mayor que el espacio reservado
Resumen del tema

 Vector: tipo de dato compuesto, de tamaño no


modificable una vez declarado, que almacena un
conjunto finito de valores de un mismo tipo de dato, a
los que se accede mediante un índice
 Útiles para datos homogéneo, ya que se accede a
cualquier valor utilizando el identificador del vector
(único) y el índice del valor deseado
 Muy importante no sobrepasar el tamaño real del
vector cuando se recorre
 Cadena de caracteres: vector de caracteres que
acaba con el carácter ‘\0’. Librería <string.h>

Você também pode gostar