4.1 INTRODUCCIÓN - El objetivo del capítulo es aprender a declarar y manejar tres tipos de datos avanzados: vectores, cadenas de caracteres y estructuras. VECTOR Conjunto de variables numéricas (usaremos int o float) Lección 4 CADENA DE CARACTERES Tipos avanzados de datos Conjunto de caracteres (variables de tipo char) ESTRUCTURAS Conjunto de datos de cualquier tipo. 4-1 4-2 4.2 VECTORES 4.2.2 ELEMENTOS DE UN VECTOR - Un vector es un conjunto de variables numéricas del mismo tipo. - Se referencian con el nombre del vector seguido de un subíndice entero escrito entre corchetes (el subíndice representa la posición del elemento dentro del vector). - Ejemplo: vector de números enteros de 6 elementos (dimensión=6) 2 0 -7 5 32 - ¡¡ OJO: La primera posición tiene el subíndice 0 !!. -1 - Ejemplo: 4.2.1 DECLARACIÓN DE UN VECTOR int terna[3]; - Sintaxis: tipo identificador[dimensión]; tipo identificador dimensión Tipo de los elementos del vector (int, float, etc.). Nombre del vector. Número de elementos del vector (constante entera). terna[0] terna[1] terna[2] - Las variables del vector tienen un valor indeterminado hasta que no se les asigna uno. - Ejemplo: int terna[3]; 4-3 4-4 - Ejemplo: - Ejemplo: #include <stdio.h> #include <stdio.h> void main() { int terna[3]; void main() { int v[2]; terna[0] = 10; terna[1] = 2*terna[0]; terna[2] = terna[0] + terna[1]; printf("v[0] vale %d\n", v[0]); printf("v[1] vale %d\n", v[1]); } printf(“Primera = %d\n", terna[0]); printf(“Segunda = %d\n", terna[1]); printf(“Tercera = %d\n", terna[2]); Salida por pantalla: } v[0] vale -858993460 Salida por pantalla: v[1] vale -858993460 Primera = 10 Segunda = 20 Tercera = 30 4-5 4-6 4.2.4 RECORRIDO POR LOS ELEMENTOS DE UN VECTOR 4.2.3 INICIALIZACIÓN DE UN VECTOR - Normalmente, la dimensión de los vectores suele ser un número relativamente grande y se manejan con la ayuda de bucles. - Los elementos de un vector pueden inicializarse en el momento de la declaración: - Puede utilizarse cualquier bucle, pero lo habitual es utilizar un for. Ejemplo: - Ejemplo: int terna[3] = { 10 , 20 , 30 }; ... - Si se omite la dimensión del vector, se considera que ésta es igual al número de valores asignados: int i, vector[dimensión]; ... Ejemplo: for (i = 0; i < dimensión; i++) int v[ ] = { 4 , 5 , 7 }; // Dimensión = 3 ... 4-7 4-8 Ejemplo: leer un vector desde el teclado e imprimirlo en la pantalla 4.3 CADENAS DE CARACTERES - Una cadena de caracteres es un conjunto de variables de tipo char. #include <stdio.h> void main() { int v[3]; int i; - Ejemplo: cadena de caracteres de dimensión 5 H // Crea el vector v con 3 elementos de tipo int // Subíndice para el vector o l a \0 4.3.1 DECLARACIÓN printf("Introduzca los tres elementos del vector\n"); for (i = 0; i < 3; i++) scanf("%d", &v[i]); - Sintaxis: char identificador[dimensión]; identificador dimensión printf(“\nLos elementos del vector son los siguientes: \n"); for (i = 0; i < 3; i++) printf(“v[%d] = %d \n", i , v[i] ); Nombre de la cadena. Número de elementos de la cadena (constante entera), incluyendo el carácter nulo (‘\0’). - Ejemplo: char cadena[5]; } 4-9 4.3.2 ELEMENTOS DE UNA CADENA 4-10 4.3.3 INICIALIZACIÓN DE UNA CADENA - Se referencian con el nombre de la cadena seguido de un subíndice entero escrito entre corchetes (el subíndice representa la posición del carácter dentro de la cadena). - Ejemplos: char mensaje[11] = “Hola mundo”; H o l a H o l a M u n d o \0 - ¡¡ OJO !!: char mensaje[11]= “Hola”; - La primera posición tiene el subíndice 0. - La última posición contiene el carácter nulo. \0 - Si se omite la dimensión, se considera que ésta es igual al número de caracteres asignados: - Ejemplo: H o l a \0 char mensaje[ ] = { ‘H’, ‘o’, ‘l’, ‘a’ , ‘\0’ } ; H o l a \0 char mensaje[ ] = { 72, 111, 108, 97, 0 } ; H o l a \0 char mensaje[ ] = “Hola”;// La dimensión es 5 int cad[5]; - Otras formas de inicialización: cad[0] cad[1] cad[2] cad[3] cad[4]=‘\0’ - Los caracteres de la cadena tienen un valor indeterminado hasta que no se les asigna uno. 4-11 4-12 4.3.4 RECORRIDO POR LOS ELEMENTOS DE UNA CADENA Ejemplo: imprimir una cadena en la pantalla carácter a carácter. - Puede utilizarse cualquier bucle, aunque lo habitual es utilizar un while. - A diferencia de los vectores no se utiliza la dimensión de la cadena, sino que se recorre hasta encontrar el carácter nulo ‘\0’. - Ejemplo: #include <stdio.h> void main() { char mensaje[51]="Hola Mundo"; int i; char cadena[dimension]; int i; // Con while i=0 while (cadena[i]!=‘\0’) { … i++; } i=0; while (mensaje[i]!='\0') { printf("%c", mensaje[i]); i++; } } //Con for for (i=0; cadena[i]!=‘\0’ ; i++) … 4-13 4-14 4.3.5 IMPRIMIR UNA CADENA DE CARACTERES CON printf() 4.3.6 LEER UNA CADENA DE CARACTERES - Como ya sabemos, pero utilizando el especificador de formato %s. - Con scanf(), usando el especificador de formato %s. - Ejemplo: Ejemplo: #include <stdio.h> #include <stdio.h> void main () { char asignatura[51]; void main() { char mensaje[51]="Hola Mundo"; scanf("%s", asignatura); // Excepción: ¡¡ No se pone & !! printf("%s\n", asignatura); printf("%s\n", mensaje); } } 4-15 Salida: Salida: Calculo Fundamentos de informatica Calculo Fundamentos 4-16 - Para leer cadenas de caracteres que tienen espacios en blanco con scanf() hay que utilizar una especificación de formato personalizada (libro, pág 157). 4.4 ESTRUCTURAS - Permiten almacenar datos de diferentes tipos bajo un mismo nombre. - O, más fácil, utilizar la función gets() de stdio.h - Sintaxis: struct identificador - Ejemplo: { #include <stdio.h> tipo_1 miembro_1; tipo_2 miembro_2; void main () { char asignatura[51]; … tipo_n miembro_n; gets(asignatura); printf("%s\n", asignatura); }; } identificador Nombre de la estructura. Salida: miembro_n Componente n-ésimo de la estructura. Fundamentos de informatica tipo_n Tipo de datos del miembro_n. Fundamentos de informatica 4-17 4-18 - La estructura suele declararse antes de la función main() como un objeto global (la estructura es conocida y accesible para todas las funciones del programa). - Ejemplo: ficha de laboratorio - Ejemplo: Nombre Nombre Apellidos #include <stdio.h> struct ficha struct ficha { char nombre[50]; char apellidos[50]; int matricula; }; { Nombre Apellidos Nº de matrícula Apellidos Nº de matrícula char char apellidos[50]; Nº de matrícula int matricula; nombre[50]; }; void main () { … } 4-19 4-20 4.4.1 DECLARACIÓN DE VARIABLES - Una manera de evitar el uso de la palabra struct es definir un tipo de datos sinónimo de la estructura utilizando typedef (libro: apartado 4.7, pág 86) - Sintaxis: - Ejemplo: struct nombre_estructura variable1, variable2, … ; - Siempre hay que poner la palabra reservada struct delante. #include <stdio.h> - Ejemplo: typedef struct { char nombre[50]; char apellidos[50]; int matricula; } #include <stdio.h> struct ficha { char nombre[50]; char apellidos[50]; int matricula; }; void main () { struct ficha alumno; … } ficha; void main () { ficha alumno; … } 4-21 Ejemplo: 4.4.2 MIEMBROS DE UNA ESTRUCTURA - Se nombran escribiendo el operador punto (.) después del nombre de la variable. variable_estructura.miembro - Sintaxis: - Por ejemplo, si alumno es una variable de tipo ficha, sus miembros son: alumno.nombre alumno.apellidos alumno.matricula 4-22 Cadena de caracteres Cadena de caracteres Variable entera #include <stdio.h> typedef struct { char nombre[50]; char apellidos[50]; int matricula; } ficha; void main () { ficha alumno; 4.4.3 OPERACIONES CON VARIABLES DE UNA ESTRUCTURA printf("Nombre:"); scanf(“%s”, alumno.nombre); printf("Apellidos:"); scanf(“%s”,alumno.apellidos); printf(“Matricula:"); scanf("%d", &alumno.matricula); - Inicialización: ficha alumno1= { “Jose”, “Lopez Lopez”, 1150}, alumno2; - Asignarle el valor de otra variable de tipo estructura: printf("\n%s %s\n", alumno.nombre, alumno.apellidos); printf("Matricula: %d\n", alumno.matricula); alumno2=alumno1; 4-23 } 4-24