Tablas y Cadenas

23
Curso 04-05.Práctica 5 1 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.

description

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. - PowerPoint PPT Presentation

Transcript of Tablas y Cadenas

Page 1: Tablas y Cadenas

Curso 04-05.Práctica 5 1

Tablas y Cadenas

CONTENIDO

TablasDeclaració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.

Page 2: Tablas y Cadenas

Curso 04-05.Práctica 5 2

Tablas

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.

¡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 )

Page 3: Tablas y Cadenas

Curso 04-05.Práctica 5 3

Tablas

LEATabla unidimensional:

nombre: tabla[dim] de tipo

Tabla multidimensional:nombre: tabla[dim_1, dim_2, ..., dim_N] de tipo

LEATabla unidimensional:

nombre: tabla[dim] de tipo

Tabla multidimensional:nombre: tabla[dim_1, dim_2, ..., dim_N] de tipo

CTabla unidimensional:

tipo nombre [dim];

Tabla multidimensional:tipo nombre [dim_1][dim_2]...[dim_N];

CTabla unidimensional:

tipo nombre [dim];

Tabla multidimensional:tipo nombre [dim_1][dim_2]...[dim_N];

Declaración de variables de tipo tabla: (LEA vs C)

Page 4: Tablas y Cadenas

Curso 04-05.Práctica 5 4

Tablas

LEAconst TAM: 10 MAXCAR: 80 NHORAS: 24 NFIL: 2 NCOL: 5var 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

LEAconst TAM: 10 MAXCAR: 80 NHORAS: 24 NFIL: 2 NCOL: 5var 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];

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];

Declaración de variables de tipo tabla: (Ejemplos)

Tablas unidimensionales

Tablasbidimensionales

Page 5: Tablas y Cadenas

Curso 04-05.Práctica 5 5

Tablas

LEATabla unidimensional:

Nombre: tabla [dim] de tipo

Tabla multidimensional:Nombre: tabla[dim_1, dim_2, ..., dim_N] de tipo

LEATabla unidimensional:

Nombre: tabla [dim] de tipo

Tabla multidimensional:Nombre: tabla[dim_1, dim_2, ..., dim_N] de tipo

CTabla unidimensional:

typedef tipo Nombre [dim];

Tabla multidimensional:typedef tipo Nombre [dim_1][dim_2]...[dim_N];

CTabla unidimensional:

typedef tipo Nombre [dim];

Tabla multidimensional:typedef tipo Nombre [dim_1][dim_2]...[dim_N];

Declaración de tipo tabla: (LEA vs C)

¡No ocupan memoria!

Page 6: Tablas y Cadenas

Curso 04-05.Práctica 5 6

Tablas

LEADeclaració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

LEADeclaració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

Declaración de tipos de tabla y de variables: (Ejemplos I)

CDeclaración de tipos Declaración de variablestypedef int Vector10[TAM]; Vector10 v;typedef char Cadena[MAXCAR]; Cadena palabra;typedef double Tempe[NHORAS]; Tempe tempera;typedef int Matriz2x5[NFIL][NCOL]; Matriz2x5 m;

CDeclaración de tipos Declaración de variablestypedef int Vector10[TAM]; Vector10 v;typedef char Cadena[MAXCAR]; Cadena palabra;typedef double Tempe[NHORAS]; Tempe tempera;typedef int Matriz2x5[NFIL][NCOL]; Matriz2x5 m;

Page 7: Tablas y Cadenas

Curso 04-05.Práctica 5 7

Tablas

Declaración de tipos de tabla y de variables: (Ejemplos II)

CDeclaración de tipos Declaración de variablestypedef int Vector10[TAM]; Vector10 v;typedef char Cadena[MAXCAR]; Cadena palabra;typedef double Tempe[NHORAS]; Tempe tempera;typedef int Matriz2x5[NFIL][NCOL]; Matriz2x5 m;

CDeclaración de tipos Declaración de variablestypedef int Vector10[TAM]; Vector10 v;typedef char Cadena[MAXCAR]; Cadena palabra;typedef double Tempe[NHORAS]; Tempe tempera;typedef int Matriz2x5[NFIL][NCOL]; Matriz2x5 m;

v 10 elementos

palabra

... 80 elementos

tempera

... 24 elementos

m 10 elementos

Si recordamos que:#define TAM 10#define MAXCAR 80#define NHORAS 24#define NFIL 2#define NCOL 5

Page 8: Tablas y Cadenas

Curso 04-05.Práctica 5 8

Cvariable_tabla[índice] i = v[5];(el índice comienza en 0) palabra[0] = 'A’;

m[1][2] = 5;

Cvariable_tabla[índice] i = v[5];(el índice comienza en 0) palabra[0] = 'A’;

m[1][2] = 5;

Tablas

Acceso a los elementos de una tablaSe realiza usando números enteros llamados índices.

LEAvariable_tabla[índice] i := v[6](el índice comienza en 1) palabra[1] := 'A’

m[2,3] := 5

LEAvariable_tabla[índice] i := v[6](el índice comienza en 1) palabra[1] := 'A’

m[2,3] := 5

v0 1 2 3 4 5 6 7 8 9

m

0 1 2 3 4

01

0 1 2 3 ... 76 77 78 79palabr

a

Page 9: Tablas y Cadenas

Curso 04-05.Práctica 5 9

Tablas

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.

Uso del nombre de una tabla

Vector10 v;

FF3Av v = &v[0] = FF3A

palabra

...DA23

Cadena palabra;palabra = &palabra[0] =DA23

m

F9B1

Matriz2x5 m;m = m[0] = &m[0][0] =F9B1

Es a su vez el nombre de otra tabla (la primera fila)

Page 10: Tablas y Cadenas

Curso 04-05.Práctica 5 10

Tablas

LEALlamada: 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

LEALlamada: 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

CPrototipo: /* 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 ]++; }

CPrototipo: /* 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 ]++; }

Paso de una tabla como parámetro (Por referencia - variable)

Pasa la dirección de comienzo de vector

Pasa el número real de elementos, para

que la función2 sepa hasta donde recorrer

Page 11: Tablas y Cadenas

Curso 04-05.Práctica 5 11

Tablas

LEALlamada: 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

LEALlamada: 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

CPrototipo: /* 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 ] ); }

CPrototipo: /* 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 ] ); }

Paso de una tabla como parámetro por valor: (unidimensional) El compilador avisa si encuentra en la

función1 una sentencia que modifica la tabla

Page 12: Tablas y Cadenas

Curso 04-05.Práctica 5 12

Tablas

LEALlamada: 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

LEALlamada: 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

CPrototipo: /* 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 ]); }

CPrototipo: /* 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 ]); }

Paso de una tabla como parámetro por valor: (multidimensional)

Page 13: Tablas y Cadenas

Curso 04-05.Práctica 5 13

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.

LEA

nombre: cadena

LEA

nombre: cadena

C

char nombre [dim];

C

char nombre [dim];

Declaración de Cadena: (LEA vs C)

Page 14: Tablas y Cadenas

Curso 04-05.Práctica 5 14

C#define MAXCAR 256char palabra [MAXCAR];char palabra [MAXCAR]={'H','o','l','a','\0'}; char palabra [MAXCAR]="Hola";

C#define MAXCAR 256char palabra [MAXCAR];char palabra [MAXCAR]={'H','o','l','a','\0'}; char palabra [MAXCAR]="Hola";

Cadenas de Caracteres

Declaración de Cadena: (Ejemplo)

Se pueden inicializar en el momento de la declaración

0 1 2 3 4 5 6 ... maxcar-1

H o l a \0 ? ? ... ?

El último elemento de la cadena es el carácter '\0'

char palabra [ ]="Hola";

La dimensión se ajustaal tamaño del valor inicial

0 1 2 3 4

H o l a \0

Page 15: Tablas y Cadenas

Curso 04-05.Práctica 5 15

Cadenas de Caracteres

LEAconst MAXCAR: 255tipos cadena: tabla[MAXCAR] de caractervar palabra: cadena

LEAconst MAXCAR: 255tipos cadena: tabla[MAXCAR] de caractervar palabra: cadena

C#define MAXCAR 256typedef char Cadena[MAXCAR];

Cadena palabra;

C#define MAXCAR 256typedef char Cadena[MAXCAR];

Cadena palabra;

Definición del Tipo Cadena: (LEA vs C)

¡No ocupa memoria!

Page 16: Tablas y Cadenas

Curso 04-05.Práctica 5 16

Cnombre_cadena[índice] palabra[0] = ’h’;(el índice comienza en 0)

Cnombre_cadena[índice] palabra[0] = ’h’;(el índice comienza en 0)

Cadenas de Caracteres

Acceso a los elementos de una cadenaSe realizan usando números enteros llamados índices.

LEAnombre_cadena[índice] palabra[1] := ’h’(el índice comienza en 1)

LEAnombre_cadena[índice] palabra[1] := ’h’(el índice comienza en 1)

palabra 0 1 2 3 4 5 ... 255

h o l a \0 ? ... ? ?

Page 17: Tablas y Cadenas

Curso 04-05.Práctica 5 17

Cadenas de Caracteres

LEALecturaleer cadena

Escrituraescribir cadena

LEALecturaleer cadena

Escrituraescribir cadena

CLecturascanf ("%s", cadena);gets (cadena);

Escrituraprintf ("%s", cadena);puts (cadena);

CLecturascanf ("%s", cadena);gets (cadena);

Escrituraprintf ("%s", cadena);puts (cadena);

Lectura y Escritura de Cadenas: (LEA vs C)

Sin el & ¡cadena es una dirección!

Page 18: Tablas y Cadenas

Curso 04-05.Práctica 5 18

Cadenas de Caracteres

LEALecturaleer palabra

Escrituraescribir “Hola”

LEALecturaleer palabra

Escrituraescribir “Hola”

CLecturascanf ("%s", palabra);gets (palabra);

Escrituraprintf ("%s", “Hola”);puts (“Hola”);

CLecturascanf ("%s", palabra);gets (palabra);

Escrituraprintf ("%s", “Hola”);puts (“Hola”);

Lectura y Escritura de Cadenas: (Ejemplos)

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’.

Page 19: Tablas y Cadenas

Curso 04-05.Práctica 5 19

Cadenas de Caracteres

LEA

longitud

:=

>, <, >=, <=, =, <>

LEA

longitud

:=

>, <, >=, <=, =, <>

C

strlen( ) /* longitud */

strcpy( ) /* asignación */

strcmp( ) /* comparación */

C

strlen( ) /* longitud */

strcpy( ) /* asignación */

strcmp( ) /* comparación */

Funciones para la manipulación de cadenas:(LEA vs C)

Estas funciones están incluidas en el fichero de

cabecera string.h

Page 20: Tablas y Cadenas

Curso 04-05.Práctica 5 20

Cadenas de Caracteres

LEAl := 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"

LEAl := 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"

Cl = 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");

Cl = 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");

Funciones para la manipulación de cadenas:(Ejemplos)

Page 21: Tablas y Cadenas

Curso 04-05.Práctica 5 21

Cadenas de Caracteres

LEAnombre: tabla[dim] de cadena

LEAnombre: tabla[dim] de cadena

CCadena nombre[dim];

CCadena nombre[dim];

Tabla de cadenas:(LEA vs C)

Page 22: Tablas y Cadenas

Curso 04-05.Práctica 5 22

Cadenas de Caracteres

LEAconst NDIAS: 7

var diasSemana: tabla[NDIAS] de cadena

LEAconst NDIAS: 7

var diasSemana: tabla[NDIAS] de cadena

C#define NDIAS 7#define MAXCAR 256typedef char Cadena[MAXCAR];

Cadena diasSemana[NDIAS];Cadena diasSemana[NDIAS] = {“lunes”,

“martes”, ”miércoles”, ”jueves”, “viernes”, ”sábado”, “domingo”};

C#define NDIAS 7#define MAXCAR 256typedef char Cadena[MAXCAR];

Cadena diasSemana[NDIAS];Cadena diasSemana[NDIAS] = {“lunes”,

“martes”, ”miércoles”, ”jueves”, “viernes”, ”sábado”, “domingo”};

Tabla de cadenas:(Ejemplo)

L u n e s \0Ma r t e \0sM i é r c \0o l e sJ u e v e \0sV i e r e \0snS á b a o \0dD o m i o \0n g

256

7

Page 23: Tablas y Cadenas

Curso 04-05.Práctica 5 23

En la definición de una funcióna) void funcion (Cadena cadena1, Cadena cadena2)b) void funcion (char cadena1[ ], char cadena2[ ] )c) void funcion (char *cadena1, char *cadena2)

En la definición de una funcióna) void funcion (Cadena cadena1, Cadena cadena2)b) void funcion (char cadena1[ ], char cadena2[ ] )c) void funcion (char *cadena1, char *cadena2)

Cadenas de Caracteres

Cadenas en C y Punteros

Alternativas para la declaración de una cadenaa) Cadena palabra;b) char palabra[MAXCAR];c) char *palabra;

Alternativas para la declaración de una cadenaa) Cadena palabra;b) char palabra[MAXCAR];c) char *palabra;

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.