230 likes | 432 Views
Tablas y Cadenas. CONTENIDO Tablas Declaración de variables TABLA y definición de tipos. Manejo de TABLAS. Paso de parámetros de variables tipo TABLA. Cadenas de Caracteres ( un caso especial de tablas ) Declaración de variables CADENAS y definición de tipos.
E N D
Tablas y Cadenas • CONTENIDO • Tablas • Declaración de variables TABLA y definición de tipos. • Manejo de TABLAS. • Paso de parámetros de variables tipo TABLA. Cadenas de Caracteres (un caso especial de tablas) • Declaración de variables CADENAS y definición de tipos. • Manejo de Cadenas. La librería String.h. • Paso de parámetros de Cadenas.
Tablas ¡Atención! Distinguir entre número máximo de elementos (N) y número real de elementos (n) (Se puede preparar una tabla para una máximo de "N"elementos pero en cada ejecución trabajar con la información de sólo "n" elementos ,evidentemente n <= N.En C, n < N) • Una tabla es un conjunto de datos (llamados elementos), con las siguientes propiedades: • Son del mismo tipo (int, char, float, etc.). • Se denominan por el mismo nombre (el de la tabla) y se diferencian unos de otros mediante su posición (usandoíndices). Se denomina dimensión de una tabla al número máximo de elementos que la componen.
Tablas Declaración de variables de tipo tabla: (LEA vs C) LEA Tabla unidimensional: nombre: tabla[dim] de tipo Tabla multidimensional: nombre: tabla[dim_1, dim_2, ..., dim_N] de tipo C Tabla unidimensional: tipo nombre [dim]; Tabla multidimensional: tipo nombre [dim_1][dim_2]...[dim_N];
Tablas Tablas unidimensionales Tablas bidimensionales Declaración de variables de tipo tabla: (Ejemplos) LEA const TAM: 10 MAXCAR: 80 NHORAS: 24 NFIL: 2 NCOL: 5 var v: tabla[TAM] de entero palabra: tabla[MAXCAR] de caracter tempera: tabla[NHORAS] de real m: tabla[NFIL, NCOL] de entero dias_semana: tabla[7,10] de caracter C #define TAM 10 #define MAXCAR 80 #define NHORAS 24 #define NFIL 2 #define NCOL 5 int v [TAM]; char palabra [MAXCAR]; double tempera [NHORAS]; int m [NFIL][NCOL]; char dias_semana [7] [10];
Tablas ¡No ocupan memoria! Declaración de tipo tabla: (LEA vs C) LEA Tabla unidimensional: Nombre: tabla [dim] de tipo Tabla multidimensional: Nombre: tabla[dim_1, dim_2, ..., dim_N] de tipo C Tabla unidimensional: typedef tipo Nombre [dim]; Tabla multidimensional: typedef tipo Nombre [dim_1][dim_2]...[dim_N];
Tablas Declaración de tipos de tabla y de variables: (Ejemplos I) LEA Declaración de tipos Declaración de variables Vector10: tabla[TAM] de entero v: Vector10 Cadena: tabla[MAXCAR] de carácter palabra: Cadena Tempe: tabla[NHORAS] de real tempera: Tempe Matriz2x5: tabla[NFIL, NCOL] de entero m: Matriz2x5 C Declaración de tipos Declaración de variables typedef int Vector10[TAM]; Vector10 v; typedef char Cadena[MAXCAR]; Cadena palabra; typedef double Tempe[NHORAS]; Tempe tempera; typedef int Matriz2x5[NFIL][NCOL]; Matriz2x5 m;
Tablas v 10 elementos palabra ... 80 elementos tempera ... 24 elementos m 10 elementos Declaración de tipos de tabla y de variables: (Ejemplos II) C Declaración de tipos Declaración de variables typedef int Vector10[TAM]; Vector10 v; typedef char Cadena[MAXCAR]; Cadena palabra; typedef double Tempe[NHORAS]; Tempe tempera; typedef int Matriz2x5[NFIL][NCOL]; Matriz2x5 m; Si recordamos que: #define TAM 10 #define MAXCAR 80 #define NHORAS 24 #define NFIL 2 #define NCOL 5
Tablas v 0 1 2 3 4 5 6 7 8 9 0 1 m palabra 0 1 2 3 ... 76777879 0 1 2 3 4 Acceso a los elementos de una tabla Se realiza usando números enteros llamados índices. LEA variable_tabla[índice] i := v[6] (el índice comienza en 1) palabra[1] := 'A’ m[2,3] := 5 C variable_tabla[índice] i = v[5]; (el índice comienza en 0) palabra[0] = 'A’; m[1][2] = 5;
Tablas Vector10 v; v = &v[0] = FF3A v FF3A Cadena palabra; palabra = &palabra[0] =DA23 palabra ... DA23 Matriz2x5 m; m m = m[0] = &m[0][0] =F9B1 Es a su vez el nombre de otra tabla (la primera fila) F9B1 Uso del nombre de una tabla El nombre de una tabla es la dirección donde comienza la tabla, es decir, donde el compilador ubica la tabla, por tanto es una constante que no se puede modificar.
Tablas Pasa la dirección de comienzo de vector Pasa el número real de elementos, para que la función2 sepa hasta donde recorrer Paso de una tabla como parámetro (Por referencia - variable) LEA Llamada: funcion2 ( n_elementos, vector ) Definición: proc funcion2 (ent n: entero, ent/sal v: Vector10) var i: entero prin desde i:=1 hasta n v[ i ] := v[ i ] + 1 fdesde fin C Prototipo: /* cualquiera vale */ void funcion2 (int, Vector10); void funcion2 (int, int [ ]); void funcion2 (int, int *); Llamada: funcion2 ( n_elementos, vector ); Definición: void funcion2 ( int n, Vector10 v ) { int i; for ( i=0; i<n; i++) v[ i ]++; }
Tablas El compilador avisa si encuentra en la función1 una sentencia que modifica la tabla Paso de una tabla como parámetro por valor: (unidimensional) LEA Llamada: funcion1 (vector, n_elementos) Definición: proc funcion1 (ent v: Vector10, n: entero) var i: entero prin desde i:=1 hasta n escribir v[ i ] fdesde fin C Prototipo: /* cualquiera vale */ void funcion1 (const Vector10, int); void funcion1 (const int [ ], int); void funcion1 (const int *, int); Llamada: funcion1 (vector, n_elementos); Definición: void funcion1 (const Vector10 v, int n) { int i; for ( i=0; i<n; i++) printf ("%d\n", v[ i ] ); }
Tablas Paso de una tabla como parámetro por valor: (multidimensional) LEA Llamada: funcion3 (matriz, f, c) Definición: proc funcion3 (ent m: Matriz2x5, a: entero, b: entero) var i,j: entero prin desde i:=1 hasta a desde j:=1 hasta b escribir m[ i , j ] fdesde fdesde fin C Prototipo: /* cualquiera vale */ void funcion3 (const Matriz2x5, int, int); void funcion3 (const int [ ][ 5], int, int); Llamada: funcion3 ( matriz, f, c); Definición: void funcion3 (const Matriz2x5 m, int a, int b) { int i, j; for ( i=0; i<a; i++) for ( j=0; j<b; j++) printf ("%d\n", m[ i ][ j ]); }
Cadenas de Caracteres • El lenguaje C no tiene tipo predefinidos de datos para almacenar cadenas de caracteres. • Se puede conseguir un tipo de dato que permita el almacenamiento de cadenas de caracteres mediante el uso de tablas. Declaración de Cadena: (LEA vs C) LEA nombre: cadena C char nombre [dim];
Cadenas de Caracteres Se pueden inicializar en el momento de la declaración El último elemento de la cadena es el carácter '\0' La dimensión se ajusta al tamaño del valor inicial char palabra [ ]="Hola"; H o l a \0 H o l a \0 ? ? ... ? 0 1 2 3 4 0 1 2 3 4 5 6 ... maxcar-1 Declaración de Cadena: (Ejemplo) C #define MAXCAR 256 char palabra [MAXCAR]; char palabra [MAXCAR]={'H','o','l','a','\0'}; char palabra [MAXCAR]="Hola";
Cadenas de Caracteres ¡No ocupa memoria! Definición del Tipo Cadena: (LEA vs C) LEA const MAXCAR: 255 tipos cadena: tabla[MAXCAR] de caracter var palabra: cadena C #define MAXCAR 256 typedef char Cadena[MAXCAR]; Cadena palabra;
Cadenas de Caracteres palabra h o l a \0? ... ? ? 0 1 2 3 4 5 ... 255 Acceso a los elementos de una cadena Se realizan usando números enteros llamados índices. LEA nombre_cadena[índice] palabra[1] := ’h’ (el índice comienza en 1) C nombre_cadena[índice] palabra[0] = ’h’; (el índice comienza en 0)
Cadenas de Caracteres Sin el & ¡cadena es una dirección! Lectura y Escritura de Cadenas: (LEA vs C) LEA Lectura leer cadena Escritura escribir cadena C Lectura scanf ("%s", cadena); gets (cadena); Escritura printf ("%s", cadena); puts (cadena);
Cadenas de Caracteres Diferencia entre scanf y gets: • scanf se detiene al encontrar un espacio en blanco, un tabulador o un ‘\n’, que no se lee (se quedan en el buffer de entrada -con fflush(stdin) se limpia el buffer- ), y añade un ‘\0’ al final. • gets lee hasta encontrar un ‘\n’, que se lee (el buffer de entrada queda vacío), y se sustituye por un ‘\0’. Lectura y Escritura de Cadenas: (Ejemplos) LEA Lectura leer palabra Escritura escribir “Hola” C Lectura scanf ("%s", palabra); gets (palabra); Escritura printf ("%s", “Hola”); puts (“Hola”);
Cadenas de Caracteres Estas funciones están incluidas en el fichero de cabecera string.h Funciones para la manipulación de cadenas:(LEA vs C) LEA longitud := >, <, >=, <=, =, <> C strlen( ) /* longitud */ strcpy( ) /* asignación */ strcmp( ) /* comparación */
Cadenas de Caracteres Funciones para la manipulación de cadenas:(Ejemplos) LEA l := longitud (cadena) cadena1 := “Hola” si (cadena1 = cadena2) escribir "Las cadenas son iguales" si (cadena1 > cadena2) escribir "La 1ª cadena es mayor" si (cadena1 < cadena2) escribir "La 1ª cadena es menor" C l = strlen (cadena); strcpy (cadena1, “Hola”); if ( strcmp (cadena1, cadena2) == 0) puts ("Las cadenas son iguales"); if ( strcmp(cadena1, cadena2) > 0) puts ("La 1ª cadena es mayor"); if ( strcmp (cadena1, cadena2) < 0) puts ("La 1ª cadena es menor");
Cadenas de Caracteres Tabla de cadenas:(LEA vs C) LEA nombre: tabla[dim] de cadena C Cadena nombre[dim];
Cadenas de Caracteres L s u n e \0 M e s a r t \0 M c o e s i é r l \0 J e s u e v \0 n V e s i e r \0 d S o á b a \0 256 g o n D o m i \0 7 Tabla de cadenas:(Ejemplo) LEA const NDIAS: 7 var diasSemana: tabla[NDIAS] de cadena C #define NDIAS 7 #define MAXCAR 256 typedef char Cadena[MAXCAR]; Cadena diasSemana[NDIAS]; Cadena diasSemana[NDIAS] = {“lunes”, “martes”, ”miércoles”, ”jueves”, “viernes”, ”sábado”, “domingo”};
Cadenas de Caracteres válido porque el nombre de una tabla es la dirección del comienzo de la tabla en memoria, por tanto, se puede almacenar en un puntero. ¡Atención! No son equivalentes. En el caso b) se reserva memoria, en el caso c) no. Sin embargo, ambos sirven para recorrer una cadena. Cadenas en C y Punteros Alternativas para la declaración de una cadena a) Cadena palabra; b) char palabra[MAXCAR]; c) char *palabra; En la definición de una función a) void funcion (Cadena cadena1, Cadena cadena2) b) void funcion (char cadena1[ ], char cadena2[ ] ) c) void funcion (char *cadena1, char *cadena2)