SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
Programación I. Tema 5
Programación I. Tema 5
Estructuras de datos
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 2
Contenido
Contenido
„ Arrays de una y varias dimensiones
„ Ejemplos de arrays en C.
„ Cadenas de caracteres
„ Funciones básicas para el manejo de cadenas de caracteres
en C
„ Ejemplos de cadena de caracteres en C
„ Estructuras
„ Ejemplos de estructuras en C
Programación I. Tema 5
Programación I. Tema 5
Estructuras de datos.
ARRAYS
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 4
Vectores: Un primer problema
Vectores: Un primer problema
„ Diseñar y codificar un programa que controle las ventas y
existencias de un almacén.
„ Dicho almacén sólo dispone de dos tipos de artículos. Libros y
cuadernos. El programa deberá presentar al usuario un menú con las
siguientes opciones:
1. Añadir existencias: permitirá al usuario añadir una
cantidad cualquiera de libros o cuadernos al almacén.
2. Eliminar existencias: quitará del almacén una unidad de
libros o de cuadernos.
3. Mostrar existencias: Sacará por pantalla la cantidad de
libros y cuadernos que hay en el almacén.
4. Salir: Abandonará el programa.
„ El programa no guardará al acabar los datos que esté manejando y al
arrancar preguntará al usuario por las existencias iniciales de libros y
de cuadernos.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 5
Arrays
Arrays. Definición
. Definición
V = (V0,V1,V2,….,VN)
V0
V1
VN
V2
„ Coincide con el concepto
matemático de vector.
„ Un vector (o array) es:
„ Una colección de variables
todas del mismo tipo.
„ Con un nombre único. (V)
„ A los que se accede ó
distingue mediante un
índice.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 6
Array
Array: Declaración
: Declaración
„ Declaración: Un Array se declara:
En notación de Diseño (entorno)
Nombre Clase Tipo Funcionalidad
MAX_ARTICULOS constante entero (5) Cantidad máxima de artículos de un almacén
Articulos variable array
de MAX_ARTICULOS
de tipo entero
Almacena los contadores de los artículos en el
almacén
referencia a que es un array
número de elementos
(índices de 0 a MAX_ARTICULOS-1)
tipo base de todos los elementos
del array
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 7
Vector: Declaración
Vector: Declaración
„ En C se declara:
<tipo_base_de_los_elementos> NombreVariableArray [expresion]
………………………..
#define MAX_ARTICULOS 5
void main (void)
{
int articulos [MAX_ARTICULOS];
…………………………………………………..
}
puede ser cualquier tipo
(char, int , float, etc)
nombre de la variable que
referencia todo el array
se calcula por el compilador
y genera el numero de elementos
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 8
Vector: Declaración
Vector: Declaración
„ Ejemplo:
#include <stdio.h>
#define LONGITUD 58
void main (void)
{
int mi_tabla [150];
char mensaje [LONGITUD];
float distancias [ (LONGITUD*10) + 1 ];
long numeros [10], datos [20];
...................
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 9
Arrays
Arrays: Posicionamiento
: Posicionamiento
„ En Memoria se encuentran:
A
Posición 0
de memoria
0 1 2 N-1
100 102 xxx
101
Posición M
de memoria
nombre del array (A)
índice que indica la posición relativa
respecto del comienzo del array (empieza en 0)
Los elementos de un array están en posiciones consecutivas de memoria
Si A0 está en la posición 100 Æ A1 esta en 101Æ A2 en 102 etc.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 10
Arrays
Arrays: Asignación
: Asignación
„ Asignación de valores:
„ A un array se le pueden asignar valores a sus elementos
de dos formas:
1. Asignando inicialmente valores (inicialización)
static <tipo_base> Nombre [expresion] = {exp1,…,expn}
static int numeros [5] = {1,2,3,4,5};
static char vocales [ ] = {‘a’,‘e’,‘i’,‘o’,‘u’};
100 101 102 103 104 105 106 107 108 109
posición0 posición M
índices
0 1 2 3 4
1 2 3 4 5 a e i o u
0 1 2 3 4
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 11
Arrays
Arrays: Asignación
: Asignación
2. Asignando valores con sentencias de asignación a
sus elementos:
id_array [expresion] = expresion;
posición0 posición N
100 102 103 104
101
0 1 2 3 4
? ? ? 4 ?
el nombre identifica todo el array el índice identifica todo el elemento
int numeros [5];
………………………………
numeros [3] = 4;
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 12
Arrays
Arrays: Limitaciones de uso
: Limitaciones de uso
„ Para asignar valores a un array en tiempo de ejecución
hay que hacerlo elemento a elemento.
„ No se puede asignar el contenido de una variable de tipo
array a otra utilizando una sentencia de asignación, ya
que el nombre del array representa la dirección de
almacenamiento del array.
ERROR
#include <stdio.h>
void main (void)
{
int porcentaje [4] = { 7, 9, 12, 16};
int iva [4];
.....................
iva = porcentaje; /* Pretende copiar
un array en el otro */
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 13
Arrays
Arrays: Limitaciones de uso
: Limitaciones de uso
„ No se pueden comparar arrays.
„ Para acceder a cada uno de los elementos se pueden usar
expresiones, siempre que su resultado no exceda de los límites
del array.
int tabla [8];
int x;
tabla [0] = 28;
x = 2;
tabla [(3*x)+1] = 32;
tabla [8] = 10; /*fuera del ARRAY*/
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 14
Arrays
Arrays: Ejemplo
: Ejemplo
„ Rellenar un array de enteros de tamaño MAX_ARRAY (10) con
números leídos del teclado y comprobar si un número que se
le pide al usuario esta dentro del array.
„ El programa termina con un mensaje de encontrado o no.
#include <stdio.h>
#define MAX_ARRAY 10
void main (void)
{
int vectorEnteros [MAX_ARRAY];
int indice=0, numero;
/* Aquí va el relleno del array */
fscanf (stdin,“%d”,&numero); fflush(stdin);
while ((numero!=vectorEnteros[indice])&&(indice<MAX_ARRAY))
indice++;
if (numero==vectorEnteros[indice])
fprintf(stdout,“se ha encontrado el numero %d: ”,numero);
else
fprintf(stdout,“no se ha encontrado el numero %d: ”,numero);
}
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 15
Arrays
Arrays de varias dimensiones
de varias dimensiones
„ Es posible disponer de arrays de más de una dimensión (2,
3, etc.).
„ Si son de más dos dimensiones se conocen con el nombre
de matrices.
„ Se declaran con la siguiente sintaxis:
tipo_base Nombre [expr1]….[exprN];
tamaño de la 1ª dimensión tamaño de la Nª dimensión
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 16
Arrays
Arrays de varias dimensiones
de varias dimensiones
float tabla [3] [4];
char matriz [2] [5] = { {‘a’,’e’,’i’,’o’,’u’},
{‘b’,’c’,’d’,’f’,’h’} };
int cubo [3] [3] [3]; /* Declaración de matriz de
tres dimensiones */
tabla [0] [0] = 12.7;
tabla [1] [2] = 4.3;
tabla
tabla [][0]
?
tabla [][1]
?
tabla [][2]
?
tabla [][3]
?
tabla [][0]
?
tabla [][1]
?
tabla [][2]
?
tabla [][3]
?
tabla[0][]
tabla [][0]
?
tabla [][1]
?
tabla [][2]
?
tabla [][3]
?
tabla[1][]
tabla[2][]
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 17
Arrays
Arrays de varias dimensiones: Ejemplo
de varias dimensiones: Ejemplo
„ Programa que inicializa los elementos de una tabla de
dos dimensiones (10x20) con la suma de sus índices.
void main (void)
{
int tabla[10][20];
int i,j; /* índices para recorrer las matrices */
for (i=0; i<10; i++)
for (j=0; j< 20; j++)
tabla[i][j]= i+j;
}
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 18
Arrays
Arrays & punteros
& punteros
„ En una declaración de un array tal como:
int numeros [5];
„ la variable números representa un puntero
constante (no se puede modificar) que contiene la
dirección de la primera posición del array.
„ Por ejemplo:
char vocales [5]={‘a’,’e’,’i’,’o’,’u’};
char * letra;
vocales letra
100 102 103 104
101 200
posición0 posición N
0 1 2 3 4
a e i o u ?
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 19
Arrays
Arrays & punteros
& punteros
„ Por ejemplo: (¿Qué cosas están permitidas?)
char vocales [5]={‘a’,’e’,’i’,’o’,’u’};
char * letra;
char vocales [5]={‘a’,’e’,’i’,’o’,’u’};
char * letra;
letra = vocales;
/* equivale a letra=&vocales[0];*/
letra++;
/* equivale a letra=&vocales[1];*/
/* o a letra=letra+1; */
letra = vocales;
/* equivale a letra=&vocales[0];*/
letra++;
/* equivale a letra=&vocales[1];*/
/* o a letra=letra+1; */
Por ejemplo: ¿Qué cosas no están permitidas?
vocales = letra;
vocales ++;
vocales = letra;
vocales ++; vocales es un puntero cte.
vocales
a
b
i
o
u
letra
Programación I. Tema 5
Programación I. Tema 5
Estructuras de datos.
CADENAS DE CARACTERES
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 21
Cadenas de caracteres
Cadenas de caracteres
„ Concepto:
„ Es un array unidimensional en el que sus elementos son
caracteres
„ No existe un tipo específico.
„ Declaración genérica de cadena de caracteres:
char id_cadena [];
char * id_cadena;
„ Se inicializan como array normal o asignando una
constante de tipo cadena de caracteres.
„ Si no se especifica el tamaño del array, éste será el
tamaño de la cadena más 1, ya que el compilador
añade el carácter NULL (‘0’) al final de la cadena.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 22
Cadenas de caracteres. Ejemplo
Cadenas de caracteres. Ejemplo
„ Ejemplos de declaración de variables como cadenas de
caracteres en C:
char asignatura [] = “programacion1”;
0 1 2 13
p r o g r a m a c i o n 1 0
0 1 2 13
p r o g r a m a c i o n 1 0 ?
24
char asignatura [25] = “programacion1”;
char asignatura [13] = “programacion1”;
0 1 2 12
p r o g r a m a c i o n 1
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 23
Asignación de valores
Asignación de valores
„ A una cadena de caracteres se le puede asignar valores
como a cualquier array
„ En la declaración:
char asignatura [25] = “programacion1”;
asignatura = “programacion1”;
„ Procesándola como cualquier array:
no se puede
asignar valores
de esta forma
char asignatura[25]=“programacion1”;
fprintf(stdout,“la asignatura es:”);
for(i=0;i<14;i++)
fprintf(stdout,“%c”, asignatura[i]);
ƒ Usando funciones de librería
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 24
Cadenas y punteros
Cadenas y punteros
„ Una cadena de caracteres puede manejarse mediante un
puntero al primer elemento:
0 1 19
? ? ? ? ? ?
char nombre [20];
char *p;
p = nombre;
fscanf(stdin,“%s”, p);
reserva memoria
para la cadena
NO reserva memoria
para la cadena
nombre letra
0 1 19
1 a z 0 ?
si tecleamos “1az”
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 25
Cadenas y punteros
Cadenas y punteros
„ Una cadena de caracteres constante puede ser
referenciada mediante un puntero, pero el contenido no
se puede alterar mediante dicho puntero:
„ Ejemplo
char *p = “perro”;
p = “gato”;
/*incorrecto*/
p
0 1
p e r r o 0 g a t o 0
2 3 4 5 0 1 2 3 4
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 26
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ fgets #include <stdio.h>
char * fgets (char *string, int n, FILE *stream );
#include <stdio.h>
char * fgets (char *string, int n, FILE *stream );
ƒLee una línea de hasta n caracteres del fichero de
entrada (stream) y los almacena en la cadena de
caracteres especificada por string incluyendo el carácter
de newLine (‘n’) y añadiendo ‘0’ al final.
ƒSi leemos mas de n caracteres almacena n-1 y
substituye el carácter n por ‘0’.
ƒValor devuelto:
•Si se ha ejecutado correctamente, devuelve un puntero a la
cadena de caracteres leída.
•Si ha habido algún error, devuelve un puntero a NULL.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 27
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ fputs #include <stdio.h>
int fputs (const char *string, FILE *stream );
#include <stdio.h>
int fputs (const char *string, FILE *stream );
ƒCopia en el fichero de salida (stream) la
cadena de caracteres especificada por string.
ƒValor devuelto:
•Si se ha ejecutado correctamente, devuelve un
valor positivo.
•Si ha habido algún error, devuelve EOF.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 28
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ Ejemplo – fgets, fputs:
•¿Cómo se controlarían los posibles errores?
#include <stdio.h>
void main (void)
{
char nombre [30];
printf (“Escriba su nombre: “);
fgets (nombre,30,stdin);
printf (“nSu nombre es: ”);
fputs (nombre,stdout);
.........................
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 29
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ Ejemplo – fgets, fputs:
„ Codificar un programa en C que lea unas líneas de hasta
N caracteres y las escriba en la pantalla.
ƒ Terminará cuando se teclee una línea vacía.
#include <stdio.h>
#define N 80
void main (void)
{
char linea [N];
do
{
fgets(linea,N,stdin);
/* precaución por si linea es menor de N */
if (linea[strlen (linea)-1]==‘n’)
linea[strlen(linea)-1]=‘0‘;
fputs (“la linea es: ”, stdout);
fputs(linea, stdout);
}while (linea[0]!=`0´);
}
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 30
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ strcpy
#include <string.h>
char* strcpy (char* strDestination,const char* strSource);
#include <string.h>
char* strcpy (char* strDestination,const char* strSource);
ƒCopia la cadena de caracteres strSource
(que debe estar terminada en ‘0’) en la
cadena de caracteres strDestination, incluido
el ‘0’.
ƒValor devuelto:
•Si se ha ejecutado correctamente, devuelve un
puntero a la cadena strDestination.
•Si ha habido algún error, devuelve un puntero a
NULL.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 31
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ strcmp
#include <string.h>
int strcmp (const char* string1,const char* string2);
#include <string.h>
int strcmp (const char* string1,const char* string2);
ƒCompara la cadena de caracteres string1 con
la cadena de caracteres string2.
•Ambas cadenas deben terminar en ‘0’.
ƒValor devuelto:
•Si string1 es igual a string2, devuelve un cero.
•Si string1 es menor que string2, devuelve un
número negativo.
•Si string1 es mayor que string2, devuelve un
número positivo.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 32
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ strlen
#include <string.h>
int strlen (const char * string);
#include <string.h>
int strlen (const char * string);
ƒHalla la longitud de la cadena de caracteres
string (debe terminar en ‘0’).
ƒValor devuelto:
•Si se ha ejecutado correctamente, devuelve la
longitud en bytes de la cadena string, sin incluir
el ‘0’.
•Si ha habido algún error, devuelve un cero.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 33
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ Ejemplo - strcmp, strcpy, strlen:
#include <stdio.h>
#include <string.h>
#define DIM 30
void main (void)
{
char nombre1 [DIM],nombre2 [DIM],nombre3 [DIM] = “Pepe”;
int aux;
fprintf (stdout,“ Escriba su nombre: “);
fgets (nombre1, DIM, stdin);
aux = strcmp (nombre1,nombre3);
if (aux == 0)
fprintf (stdout,“Hola %s, bienvenido”,nombre1);
else
{
strcpy (nombre2,nombre1);
fprintf (stdout,“Hola %s, tu nombre tiene %d
letras”, nombre2, strlen (nombre2));
}
}
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 34
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ strchr
#include <string.h>
char * strchr (const char * string, int c);
#include <string.h>
char * strchr (const char * string, int c);
ƒBusca el carácter c en la cadena de
caracteres string (debe terminar en ‘0’).
ƒValor devuelto:
•Si el carácter buscado se encuentra en la
cadena, devuelve un puntero a la primera
aparición del carácter.
•Si el carácter no se encuentra, devuelve un
puntero a NULL.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 35
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ Ejemplo - strchr :
#include <stdio.h>
#include <string.h>
void main (void)
{
char direccion [50];
int caracter = ‘M’; /* Carácter buscado */
char *punt; /* Apuntará al valor devuelto
por strchr */
strcpy (direccion,”Calle Mayor n. 11“);
punt = strchr (direccion,caracter);
if (punt != NULL)
fprintf (stdout,“El carácter %c está en
la cadena %sn”,*punt,direccion);
else
fprintf (stdout,“El caracter %c no se ha
encontrado.n”,caracter);
}
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 36
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ strtok
#include <string.h>
char* strtok (char* strToken, const char* strDelimit);
#include <string.h>
char* strtok (char* strToken, const char* strDelimit);
ƒBusca el siguiente delimitador strDelimit en
la cadena de caracteres strToken (debe terminar
en ‘0’).
ƒValor devuelto:
•Cada vez que se invoca devuelve un puntero a
una palabra de la cadena strToken, en la que se
consideran como delimitadores de palabra los
especificados en strDelimit.
•Cuando no se encuentran más palabras,
devuelve un puntero a NULL.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 37
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ Ejemplo - strtok :
la primera vez se
pasa la cadena y el
resto el valor NULL
#include <stdio.h>
#include <string.h>
void main (void)
{
char *cad = “Prueba, cadena-pequeña- con
separadores,
varios.fin”;
char *palabra;
palabra = strtok (cad, “ ,.-”);
while (palabra != NULL)
{
fprintf (stdout,“%sn”,palabra);
palabra = strtok (NULL, “ ,.-”);
}
}
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 38
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ Ejercicio propuesto :
„ Presentar un mensaje por pantalla indicando si
una secuencia de 10 caracteres es palíndromo.
ƒ Una secuencia de caracteres es palíndromo si se lee
igual de derecha a izquierda que de izquierda a
derecha.
Mirar si es palíndromo
INICIO
Mientras principio<final y
sean iguales los elementos del array de índices
principio y final hacer
principio <- siguiente(principio+1)
final<-anterior(final-1)
finMientras
FIN
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 39
Funciones de cadenas de caracteres
Funciones de cadenas de caracteres
„ Codificación “palíndromo”:
#include <stdio.h>
#define LONGITUD 10
void main (void)
{
char secuencia[LONGITUD+1]; /* palabra a analizar */
int principio = 0, palin;
int final = LONGITUD-1;
fprintf(stdout,“Teclee una secuencia de 10 caracteres: n”);
gets(secuencia);
while ((principio < final)&&
(palin = (secuencia[principio]==secuencia[final])))
{
principio = principio + 1;
final = final - 1;
}
if (palin)
fprintf(stdout,“Es una secuencia palíndromo);
else
fprintf(stdout,“No es una secuencia palíndromo);
}
Programación I. Tema 5
Programación I. Tema 5
Estructuras de datos.
ESTRUCTURAS
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 41
Estructuras. Definición
Estructuras. Definición
„ Concepto:
„ Conjunto de N elementos heterogéneos que
están agrupados bajo un único nombre.
„ Heterogéneo: pueden ser de distinto tipo
„ Es un tipo definido por el programador
„ Los miembros de una estructura pueden ser
a su vez otras estructuras.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 42
Estructuras. Declaración
Estructuras. Declaración
„ Notación de diseño:
Nombre Clase Tipo
variable
Objeto compuesto de 4 objetos de tipo
cadena de 30 caracteres (nombre,
apellidos, dirección, DNI) y un objeto de
tipo entero (edad)
Funcionalidad
pepe
Se emplea para
almacenar las
características de la
persona pepe
ƒ Sintaxis en en C
ƒstruct: palabra reservada para la estructura
ƒtipo : miembros que forman la estructura
ƒtypedef : declaración de nuevos tipos
•Existen 3 formas de declaración …
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 43
Estructuras. Declaración en C
Estructuras. Declaración en C
„ Sintaxis (1):
„ Se declara la estructura y se define la variable
de tipo estructura al mismo tiempo.
struct <nombre de la
estructura>
{
<tipo> <nombre del campo>;
<tipo> <nombre del campo>;
..................
} <variable de tipo estructura>;
puede ser cualquier tipo
(char, int , float, etc)
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 44
Estructuras. Declaración en C
Estructuras. Declaración en C
„ Ejemplo 1:
#include <stdio.h>
void main (void)
{
struct persona
{
char nombre [30];
char apellidos [30];
char direccion [30];
int edad;
char dni [30];
} pepe; /* pepe es una variable
de tipo struct persona */
.............
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 45
Estructuras. Declaración en C
Estructuras. Declaración en C
„ Sintaxis (2):
„ Se declara primero la estructura y después se
define la variable de tipo estructura.
„ Ventaja: pueden definirse otras variables del
mismo tipo sin tener que repetir la
estructura.
struct <nombre de la estructura>
{
<tipo> <nombre del campo>;
<tipo> <nombre del campo>;
.................
};
struct <nombre de la estructura> <variable de tipo estructura>;
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 46
Estructuras. Declaración en C
Estructuras. Declaración en C
„ Ejemplo 2:
#include <stdio.h>
void main (void)
{
struct persona
{
char nombre [30];
char apellidos [30];
char direccion [30];
int edad;
char dni [30];
};
struct persona pepe;
struct persona amigos [10];
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 47
Estructuras. Declaración en C
Estructuras. Declaración en C
„ Sintaxis (3): -recomendado-
„ Se declara un nuevo tipo de datos que se
puede usar como cualquier otro tipo de datos
predefinido en C al declarar las variables.
„ Ventaja: independencia de la declaración
del tipo de datos y la definición de variables
de ese tipo
typedef struct [ <nombre de la estructura> ]
{
<tipo> <nombre del campo>;
<tipo> <nombre del campo>;
................
} <nombre del tipo estructura>;
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 48
Estructuras. Declaración en C
Estructuras. Declaración en C
„ Ejemplo 3: -recomendado-
#include <stdio.h>
typedef struct
{
char nombre [30];
char apellidos [30];
char direccion [30];
int edad;
char dni [30];
} TPersona;
void main (void)
{
TPersona pepe, juan;
TPersona amigos [10];
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 49
Estructuras. Nuevos tipos de datos
Estructuras. Nuevos tipos de datos
„ Notación de diseño con “typedef”:
„ Si el programador declara un nuevo tipo de
datos con “typedef”, para el diseño del entorno
es válida la siguiente declaración:
Nombre Clase Tipo
variable
TPersona
(definido más abajo)
Funcionalidad
pepe
Se emplea para
almacenar las
características de
la persona pepe
•tipo TPersona se describiría a continuación....
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 50
Estructuras. Acceso
Estructuras. Acceso
„ Formas de acceso a los miembros de una
estructura:
„ 1. Mediante la variable de tipo estructura
<variable de tipo estructura> . <nombre del campo>;
„ 2. Mediante un puntero a la variable de tipo
estructura:
<puntero a la variable de tipo estructura> -> <nombre del campo>;
„ A todos los efectos, el campo de una
estructura es una variable de un tipo
determinado y se puede tratar como tal.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 51
Estructuras. Acceso
Estructuras. Acceso
„ Ejemplo 1:
typedef struct persona
{
char nombre[30];
char apellidos[30];
int edad;
}TPersona;
... ... .. ... ... ... ... ... ...
TPersona persona;
strcpy(persona.nombre,“Antonio”);
strcpy(persona.apellidos,“Martinez Santos”);
persona.edad=30;
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 52
Estructuras. Acceso
Estructuras. Acceso
„ Ejemplo 2:
typedef struct persona
{
char nombre[30];
char apellidos[30];
int edad;
}TPersona;
... ... .. ... ... ... ... ... ...
TPersona *persona;
strcpy(persona->nombre,“Antonio”);
strcpy(persona->apellidos,“Martinez
Santos”);
persona->edad=30;
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 53
Estructuras. Acceso
Estructuras. Acceso
„ Ejemplo 3:
„ Definición y acceso a las variables en la misma
sentencia:
typedef struct persona
{
char nombre[30];
char apellidos[30];
int edad;
}TPersona;
... ... .. ... ... ... ... ... ...
TPersona persona={“Antonio”, “Martinez Santos”,
30};
TPersona *pers1;
strcpy((*pers1).nombre,“Ana”; )
/*Igual que strcpy(pers1->nombre,“Ana”); */
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 54
Estructuras. Asignación de valores
Estructuras. Asignación de valores
„ La asignación de valores a una estructura se puede hacer
campo a campo, o asignando el contenido de una variable
de tipo estructura a otra del mismo tipo, ya que el nombre
de la estructura representa el contenido de la variable.
TPersona persona={“Antonio”, “Martinez Santos”,
30};
TPersona pers1;
strcpy(pers1.nombre, persona.nombre);
strcpy(pers1.apellidos, persona.apellidos);
pers1.edad = persona.edad;
/* o bien */
pers1 = persona; /* Es necesario que o las dos
estructuras sean del mismo tipo.
*/
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 55
Estructuras. Ejercicios
Estructuras. Ejercicios
„ Ejercicio 1:
„ Definir los tipos de datos TElem1 y TElem2.
siguiente
nombre
precio
stock
nombre
año
color
anterior
Tcosa1
TElem1 TElem2
Tcosa2
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 56
Estructuras. Ejercicios
Estructuras. Ejercicios
„ Ejercicio 2:
„ Dadas las siguientes variables.
ƒ TElem1 elemento1;
ƒ TElem2 elemento2;
1. Pedir por pantalla los datos correspondientes a las
variables “elemento1” y “elemento2”, almacenándolos
en los campos correspondientes de las estructuras.
2. Asignar los punteros de las estructuras de forma que
apunten como se indicaba en el ejercicio anterior.
3. Mostrar por pantalla los datos almacenados en la
variable “elemento1” direccionando los campos de su
estructura a través de la variable “elemento2”.
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 57
Estructuras. Ejercicios
Estructuras. Ejercicios
„ Ejercicio 3:
„ Definir los arrays “punteros” y “amigos”, haciendo que
los punteros apunten según se indica en la figura.
punteros[0]
punteros :
punteros[1] punteros[MAX -1]
amigos[0]
nombre: ”AB”
telefono: ”xx”
edad: 20
peso: 70
TPersona
amigos[1]
nombre: ”BC”
telefono: ”xx”
edad: 21
peso: 68
TPersona
amigos[2]
nombre: ”CD”
telefono: ”xx”
edad: 22
peso: 66
TPersona
amigos[MAX-1]
nombre:
telefono: ”xx”
edad:
peso:
TPersona
amigos :
punteros[2]
Curso 06/07
Programación I: Estructuras de datos. Tema 5 - 58
Estructuras. Ejercicios
Estructuras. Ejercicios
„ Ejercicio 4:
1. Inicializar el array “amigos” tal y como se
indica en la figura del ejercicio 3 a través del
array “punteros”.
2. Mostrar por pantalla el contenido del array
“amigos” empezando por el elemento MAX-1 y
terminando por el cero, sin usar para nada el
array “punteros”.
Programación I. Tema 5
Programación I. Tema 5
Estructuras de datos

Weitere ähnliche Inhalte

Ähnlich wie Tema 5 - Estructuras de datos.pdf

Ähnlich wie Tema 5 - Estructuras de datos.pdf (20)

Arrays C++
Arrays C++Arrays C++
Arrays C++
 
Utp lpi_s5_arreglos 2012-2
 Utp lpi_s5_arreglos 2012-2 Utp lpi_s5_arreglos 2012-2
Utp lpi_s5_arreglos 2012-2
 
Fundamentos de Programacion - Unidad 5 arreglos (vectores)
Fundamentos de Programacion - Unidad 5 arreglos (vectores)Fundamentos de Programacion - Unidad 5 arreglos (vectores)
Fundamentos de Programacion - Unidad 5 arreglos (vectores)
 
Fundamentos de Programación - Unidad IV: Arreglos (Vectores)
Fundamentos de Programación - Unidad IV: Arreglos (Vectores)Fundamentos de Programación - Unidad IV: Arreglos (Vectores)
Fundamentos de Programación - Unidad IV: Arreglos (Vectores)
 
Sesion 5
Sesion 5Sesion 5
Sesion 5
 
Arreglos java
Arreglos javaArreglos java
Arreglos java
 
Arreglos en C
Arreglos en CArreglos en C
Arreglos en C
 
Arreglos
ArreglosArreglos
Arreglos
 
Arreglos c++
Arreglos c++Arreglos c++
Arreglos c++
 
Arreglos
ArreglosArreglos
Arreglos
 
Arreglos
ArreglosArreglos
Arreglos
 
06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C
 
Los 5 fantasticos
Los 5 fantasticosLos 5 fantasticos
Los 5 fantasticos
 
Clase 9- programacion
Clase 9- programacionClase 9- programacion
Clase 9- programacion
 
ARRAYS (LISTAS Y TABLAS) EN C++
ARRAYS (LISTAS Y TABLAS) EN C++ARRAYS (LISTAS Y TABLAS) EN C++
ARRAYS (LISTAS Y TABLAS) EN C++
 
Arreglos
ArreglosArreglos
Arreglos
 
Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10
 
Programación 1: arreglos en C
Programación 1: arreglos en CProgramación 1: arreglos en C
Programación 1: arreglos en C
 
array
arrayarray
array
 
Programacion fantasticos
Programacion  fantasticosProgramacion  fantasticos
Programacion fantasticos
 

Tema 5 - Estructuras de datos.pdf

  • 1. Programación I. Tema 5 Programación I. Tema 5 Estructuras de datos
  • 2. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 2 Contenido Contenido „ Arrays de una y varias dimensiones „ Ejemplos de arrays en C. „ Cadenas de caracteres „ Funciones básicas para el manejo de cadenas de caracteres en C „ Ejemplos de cadena de caracteres en C „ Estructuras „ Ejemplos de estructuras en C
  • 3. Programación I. Tema 5 Programación I. Tema 5 Estructuras de datos. ARRAYS
  • 4. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 4 Vectores: Un primer problema Vectores: Un primer problema „ Diseñar y codificar un programa que controle las ventas y existencias de un almacén. „ Dicho almacén sólo dispone de dos tipos de artículos. Libros y cuadernos. El programa deberá presentar al usuario un menú con las siguientes opciones: 1. Añadir existencias: permitirá al usuario añadir una cantidad cualquiera de libros o cuadernos al almacén. 2. Eliminar existencias: quitará del almacén una unidad de libros o de cuadernos. 3. Mostrar existencias: Sacará por pantalla la cantidad de libros y cuadernos que hay en el almacén. 4. Salir: Abandonará el programa. „ El programa no guardará al acabar los datos que esté manejando y al arrancar preguntará al usuario por las existencias iniciales de libros y de cuadernos.
  • 5. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 5 Arrays Arrays. Definición . Definición V = (V0,V1,V2,….,VN) V0 V1 VN V2 „ Coincide con el concepto matemático de vector. „ Un vector (o array) es: „ Una colección de variables todas del mismo tipo. „ Con un nombre único. (V) „ A los que se accede ó distingue mediante un índice.
  • 6. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 6 Array Array: Declaración : Declaración „ Declaración: Un Array se declara: En notación de Diseño (entorno) Nombre Clase Tipo Funcionalidad MAX_ARTICULOS constante entero (5) Cantidad máxima de artículos de un almacén Articulos variable array de MAX_ARTICULOS de tipo entero Almacena los contadores de los artículos en el almacén referencia a que es un array número de elementos (índices de 0 a MAX_ARTICULOS-1) tipo base de todos los elementos del array
  • 7. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 7 Vector: Declaración Vector: Declaración „ En C se declara: <tipo_base_de_los_elementos> NombreVariableArray [expresion] ……………………….. #define MAX_ARTICULOS 5 void main (void) { int articulos [MAX_ARTICULOS]; ………………………………………………….. } puede ser cualquier tipo (char, int , float, etc) nombre de la variable que referencia todo el array se calcula por el compilador y genera el numero de elementos
  • 8. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 8 Vector: Declaración Vector: Declaración „ Ejemplo: #include <stdio.h> #define LONGITUD 58 void main (void) { int mi_tabla [150]; char mensaje [LONGITUD]; float distancias [ (LONGITUD*10) + 1 ]; long numeros [10], datos [20]; ...................
  • 9. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 9 Arrays Arrays: Posicionamiento : Posicionamiento „ En Memoria se encuentran: A Posición 0 de memoria 0 1 2 N-1 100 102 xxx 101 Posición M de memoria nombre del array (A) índice que indica la posición relativa respecto del comienzo del array (empieza en 0) Los elementos de un array están en posiciones consecutivas de memoria Si A0 está en la posición 100 Æ A1 esta en 101Æ A2 en 102 etc.
  • 10. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 10 Arrays Arrays: Asignación : Asignación „ Asignación de valores: „ A un array se le pueden asignar valores a sus elementos de dos formas: 1. Asignando inicialmente valores (inicialización) static <tipo_base> Nombre [expresion] = {exp1,…,expn} static int numeros [5] = {1,2,3,4,5}; static char vocales [ ] = {‘a’,‘e’,‘i’,‘o’,‘u’}; 100 101 102 103 104 105 106 107 108 109 posición0 posición M índices 0 1 2 3 4 1 2 3 4 5 a e i o u 0 1 2 3 4
  • 11. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 11 Arrays Arrays: Asignación : Asignación 2. Asignando valores con sentencias de asignación a sus elementos: id_array [expresion] = expresion; posición0 posición N 100 102 103 104 101 0 1 2 3 4 ? ? ? 4 ? el nombre identifica todo el array el índice identifica todo el elemento int numeros [5]; ……………………………… numeros [3] = 4;
  • 12. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 12 Arrays Arrays: Limitaciones de uso : Limitaciones de uso „ Para asignar valores a un array en tiempo de ejecución hay que hacerlo elemento a elemento. „ No se puede asignar el contenido de una variable de tipo array a otra utilizando una sentencia de asignación, ya que el nombre del array representa la dirección de almacenamiento del array. ERROR #include <stdio.h> void main (void) { int porcentaje [4] = { 7, 9, 12, 16}; int iva [4]; ..................... iva = porcentaje; /* Pretende copiar un array en el otro */
  • 13. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 13 Arrays Arrays: Limitaciones de uso : Limitaciones de uso „ No se pueden comparar arrays. „ Para acceder a cada uno de los elementos se pueden usar expresiones, siempre que su resultado no exceda de los límites del array. int tabla [8]; int x; tabla [0] = 28; x = 2; tabla [(3*x)+1] = 32; tabla [8] = 10; /*fuera del ARRAY*/
  • 14. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 14 Arrays Arrays: Ejemplo : Ejemplo „ Rellenar un array de enteros de tamaño MAX_ARRAY (10) con números leídos del teclado y comprobar si un número que se le pide al usuario esta dentro del array. „ El programa termina con un mensaje de encontrado o no. #include <stdio.h> #define MAX_ARRAY 10 void main (void) { int vectorEnteros [MAX_ARRAY]; int indice=0, numero; /* Aquí va el relleno del array */ fscanf (stdin,“%d”,&numero); fflush(stdin); while ((numero!=vectorEnteros[indice])&&(indice<MAX_ARRAY)) indice++; if (numero==vectorEnteros[indice]) fprintf(stdout,“se ha encontrado el numero %d: ”,numero); else fprintf(stdout,“no se ha encontrado el numero %d: ”,numero); }
  • 15. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 15 Arrays Arrays de varias dimensiones de varias dimensiones „ Es posible disponer de arrays de más de una dimensión (2, 3, etc.). „ Si son de más dos dimensiones se conocen con el nombre de matrices. „ Se declaran con la siguiente sintaxis: tipo_base Nombre [expr1]….[exprN]; tamaño de la 1ª dimensión tamaño de la Nª dimensión
  • 16. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 16 Arrays Arrays de varias dimensiones de varias dimensiones float tabla [3] [4]; char matriz [2] [5] = { {‘a’,’e’,’i’,’o’,’u’}, {‘b’,’c’,’d’,’f’,’h’} }; int cubo [3] [3] [3]; /* Declaración de matriz de tres dimensiones */ tabla [0] [0] = 12.7; tabla [1] [2] = 4.3; tabla tabla [][0] ? tabla [][1] ? tabla [][2] ? tabla [][3] ? tabla [][0] ? tabla [][1] ? tabla [][2] ? tabla [][3] ? tabla[0][] tabla [][0] ? tabla [][1] ? tabla [][2] ? tabla [][3] ? tabla[1][] tabla[2][]
  • 17. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 17 Arrays Arrays de varias dimensiones: Ejemplo de varias dimensiones: Ejemplo „ Programa que inicializa los elementos de una tabla de dos dimensiones (10x20) con la suma de sus índices. void main (void) { int tabla[10][20]; int i,j; /* índices para recorrer las matrices */ for (i=0; i<10; i++) for (j=0; j< 20; j++) tabla[i][j]= i+j; }
  • 18. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 18 Arrays Arrays & punteros & punteros „ En una declaración de un array tal como: int numeros [5]; „ la variable números representa un puntero constante (no se puede modificar) que contiene la dirección de la primera posición del array. „ Por ejemplo: char vocales [5]={‘a’,’e’,’i’,’o’,’u’}; char * letra; vocales letra 100 102 103 104 101 200 posición0 posición N 0 1 2 3 4 a e i o u ?
  • 19. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 19 Arrays Arrays & punteros & punteros „ Por ejemplo: (¿Qué cosas están permitidas?) char vocales [5]={‘a’,’e’,’i’,’o’,’u’}; char * letra; char vocales [5]={‘a’,’e’,’i’,’o’,’u’}; char * letra; letra = vocales; /* equivale a letra=&vocales[0];*/ letra++; /* equivale a letra=&vocales[1];*/ /* o a letra=letra+1; */ letra = vocales; /* equivale a letra=&vocales[0];*/ letra++; /* equivale a letra=&vocales[1];*/ /* o a letra=letra+1; */ Por ejemplo: ¿Qué cosas no están permitidas? vocales = letra; vocales ++; vocales = letra; vocales ++; vocales es un puntero cte. vocales a b i o u letra
  • 20. Programación I. Tema 5 Programación I. Tema 5 Estructuras de datos. CADENAS DE CARACTERES
  • 21. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 21 Cadenas de caracteres Cadenas de caracteres „ Concepto: „ Es un array unidimensional en el que sus elementos son caracteres „ No existe un tipo específico. „ Declaración genérica de cadena de caracteres: char id_cadena []; char * id_cadena; „ Se inicializan como array normal o asignando una constante de tipo cadena de caracteres. „ Si no se especifica el tamaño del array, éste será el tamaño de la cadena más 1, ya que el compilador añade el carácter NULL (‘0’) al final de la cadena.
  • 22. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 22 Cadenas de caracteres. Ejemplo Cadenas de caracteres. Ejemplo „ Ejemplos de declaración de variables como cadenas de caracteres en C: char asignatura [] = “programacion1”; 0 1 2 13 p r o g r a m a c i o n 1 0 0 1 2 13 p r o g r a m a c i o n 1 0 ? 24 char asignatura [25] = “programacion1”; char asignatura [13] = “programacion1”; 0 1 2 12 p r o g r a m a c i o n 1
  • 23. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 23 Asignación de valores Asignación de valores „ A una cadena de caracteres se le puede asignar valores como a cualquier array „ En la declaración: char asignatura [25] = “programacion1”; asignatura = “programacion1”; „ Procesándola como cualquier array: no se puede asignar valores de esta forma char asignatura[25]=“programacion1”; fprintf(stdout,“la asignatura es:”); for(i=0;i<14;i++) fprintf(stdout,“%c”, asignatura[i]); ƒ Usando funciones de librería
  • 24. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 24 Cadenas y punteros Cadenas y punteros „ Una cadena de caracteres puede manejarse mediante un puntero al primer elemento: 0 1 19 ? ? ? ? ? ? char nombre [20]; char *p; p = nombre; fscanf(stdin,“%s”, p); reserva memoria para la cadena NO reserva memoria para la cadena nombre letra 0 1 19 1 a z 0 ? si tecleamos “1az”
  • 25. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 25 Cadenas y punteros Cadenas y punteros „ Una cadena de caracteres constante puede ser referenciada mediante un puntero, pero el contenido no se puede alterar mediante dicho puntero: „ Ejemplo char *p = “perro”; p = “gato”; /*incorrecto*/ p 0 1 p e r r o 0 g a t o 0 2 3 4 5 0 1 2 3 4
  • 26. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 26 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ fgets #include <stdio.h> char * fgets (char *string, int n, FILE *stream ); #include <stdio.h> char * fgets (char *string, int n, FILE *stream ); ƒLee una línea de hasta n caracteres del fichero de entrada (stream) y los almacena en la cadena de caracteres especificada por string incluyendo el carácter de newLine (‘n’) y añadiendo ‘0’ al final. ƒSi leemos mas de n caracteres almacena n-1 y substituye el carácter n por ‘0’. ƒValor devuelto: •Si se ha ejecutado correctamente, devuelve un puntero a la cadena de caracteres leída. •Si ha habido algún error, devuelve un puntero a NULL.
  • 27. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 27 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ fputs #include <stdio.h> int fputs (const char *string, FILE *stream ); #include <stdio.h> int fputs (const char *string, FILE *stream ); ƒCopia en el fichero de salida (stream) la cadena de caracteres especificada por string. ƒValor devuelto: •Si se ha ejecutado correctamente, devuelve un valor positivo. •Si ha habido algún error, devuelve EOF.
  • 28. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 28 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ Ejemplo – fgets, fputs: •¿Cómo se controlarían los posibles errores? #include <stdio.h> void main (void) { char nombre [30]; printf (“Escriba su nombre: “); fgets (nombre,30,stdin); printf (“nSu nombre es: ”); fputs (nombre,stdout); .........................
  • 29. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 29 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ Ejemplo – fgets, fputs: „ Codificar un programa en C que lea unas líneas de hasta N caracteres y las escriba en la pantalla. ƒ Terminará cuando se teclee una línea vacía. #include <stdio.h> #define N 80 void main (void) { char linea [N]; do { fgets(linea,N,stdin); /* precaución por si linea es menor de N */ if (linea[strlen (linea)-1]==‘n’) linea[strlen(linea)-1]=‘0‘; fputs (“la linea es: ”, stdout); fputs(linea, stdout); }while (linea[0]!=`0´); }
  • 30. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 30 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ strcpy #include <string.h> char* strcpy (char* strDestination,const char* strSource); #include <string.h> char* strcpy (char* strDestination,const char* strSource); ƒCopia la cadena de caracteres strSource (que debe estar terminada en ‘0’) en la cadena de caracteres strDestination, incluido el ‘0’. ƒValor devuelto: •Si se ha ejecutado correctamente, devuelve un puntero a la cadena strDestination. •Si ha habido algún error, devuelve un puntero a NULL.
  • 31. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 31 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ strcmp #include <string.h> int strcmp (const char* string1,const char* string2); #include <string.h> int strcmp (const char* string1,const char* string2); ƒCompara la cadena de caracteres string1 con la cadena de caracteres string2. •Ambas cadenas deben terminar en ‘0’. ƒValor devuelto: •Si string1 es igual a string2, devuelve un cero. •Si string1 es menor que string2, devuelve un número negativo. •Si string1 es mayor que string2, devuelve un número positivo.
  • 32. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 32 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ strlen #include <string.h> int strlen (const char * string); #include <string.h> int strlen (const char * string); ƒHalla la longitud de la cadena de caracteres string (debe terminar en ‘0’). ƒValor devuelto: •Si se ha ejecutado correctamente, devuelve la longitud en bytes de la cadena string, sin incluir el ‘0’. •Si ha habido algún error, devuelve un cero.
  • 33. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 33 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ Ejemplo - strcmp, strcpy, strlen: #include <stdio.h> #include <string.h> #define DIM 30 void main (void) { char nombre1 [DIM],nombre2 [DIM],nombre3 [DIM] = “Pepe”; int aux; fprintf (stdout,“ Escriba su nombre: “); fgets (nombre1, DIM, stdin); aux = strcmp (nombre1,nombre3); if (aux == 0) fprintf (stdout,“Hola %s, bienvenido”,nombre1); else { strcpy (nombre2,nombre1); fprintf (stdout,“Hola %s, tu nombre tiene %d letras”, nombre2, strlen (nombre2)); } }
  • 34. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 34 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ strchr #include <string.h> char * strchr (const char * string, int c); #include <string.h> char * strchr (const char * string, int c); ƒBusca el carácter c en la cadena de caracteres string (debe terminar en ‘0’). ƒValor devuelto: •Si el carácter buscado se encuentra en la cadena, devuelve un puntero a la primera aparición del carácter. •Si el carácter no se encuentra, devuelve un puntero a NULL.
  • 35. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 35 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ Ejemplo - strchr : #include <stdio.h> #include <string.h> void main (void) { char direccion [50]; int caracter = ‘M’; /* Carácter buscado */ char *punt; /* Apuntará al valor devuelto por strchr */ strcpy (direccion,”Calle Mayor n. 11“); punt = strchr (direccion,caracter); if (punt != NULL) fprintf (stdout,“El carácter %c está en la cadena %sn”,*punt,direccion); else fprintf (stdout,“El caracter %c no se ha encontrado.n”,caracter); }
  • 36. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 36 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ strtok #include <string.h> char* strtok (char* strToken, const char* strDelimit); #include <string.h> char* strtok (char* strToken, const char* strDelimit); ƒBusca el siguiente delimitador strDelimit en la cadena de caracteres strToken (debe terminar en ‘0’). ƒValor devuelto: •Cada vez que se invoca devuelve un puntero a una palabra de la cadena strToken, en la que se consideran como delimitadores de palabra los especificados en strDelimit. •Cuando no se encuentran más palabras, devuelve un puntero a NULL.
  • 37. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 37 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ Ejemplo - strtok : la primera vez se pasa la cadena y el resto el valor NULL #include <stdio.h> #include <string.h> void main (void) { char *cad = “Prueba, cadena-pequeña- con separadores, varios.fin”; char *palabra; palabra = strtok (cad, “ ,.-”); while (palabra != NULL) { fprintf (stdout,“%sn”,palabra); palabra = strtok (NULL, “ ,.-”); } }
  • 38. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 38 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ Ejercicio propuesto : „ Presentar un mensaje por pantalla indicando si una secuencia de 10 caracteres es palíndromo. ƒ Una secuencia de caracteres es palíndromo si se lee igual de derecha a izquierda que de izquierda a derecha. Mirar si es palíndromo INICIO Mientras principio<final y sean iguales los elementos del array de índices principio y final hacer principio <- siguiente(principio+1) final<-anterior(final-1) finMientras FIN
  • 39. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 39 Funciones de cadenas de caracteres Funciones de cadenas de caracteres „ Codificación “palíndromo”: #include <stdio.h> #define LONGITUD 10 void main (void) { char secuencia[LONGITUD+1]; /* palabra a analizar */ int principio = 0, palin; int final = LONGITUD-1; fprintf(stdout,“Teclee una secuencia de 10 caracteres: n”); gets(secuencia); while ((principio < final)&& (palin = (secuencia[principio]==secuencia[final]))) { principio = principio + 1; final = final - 1; } if (palin) fprintf(stdout,“Es una secuencia palíndromo); else fprintf(stdout,“No es una secuencia palíndromo); }
  • 40. Programación I. Tema 5 Programación I. Tema 5 Estructuras de datos. ESTRUCTURAS
  • 41. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 41 Estructuras. Definición Estructuras. Definición „ Concepto: „ Conjunto de N elementos heterogéneos que están agrupados bajo un único nombre. „ Heterogéneo: pueden ser de distinto tipo „ Es un tipo definido por el programador „ Los miembros de una estructura pueden ser a su vez otras estructuras.
  • 42. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 42 Estructuras. Declaración Estructuras. Declaración „ Notación de diseño: Nombre Clase Tipo variable Objeto compuesto de 4 objetos de tipo cadena de 30 caracteres (nombre, apellidos, dirección, DNI) y un objeto de tipo entero (edad) Funcionalidad pepe Se emplea para almacenar las características de la persona pepe ƒ Sintaxis en en C ƒstruct: palabra reservada para la estructura ƒtipo : miembros que forman la estructura ƒtypedef : declaración de nuevos tipos •Existen 3 formas de declaración …
  • 43. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 43 Estructuras. Declaración en C Estructuras. Declaración en C „ Sintaxis (1): „ Se declara la estructura y se define la variable de tipo estructura al mismo tiempo. struct <nombre de la estructura> { <tipo> <nombre del campo>; <tipo> <nombre del campo>; .................. } <variable de tipo estructura>; puede ser cualquier tipo (char, int , float, etc)
  • 44. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 44 Estructuras. Declaración en C Estructuras. Declaración en C „ Ejemplo 1: #include <stdio.h> void main (void) { struct persona { char nombre [30]; char apellidos [30]; char direccion [30]; int edad; char dni [30]; } pepe; /* pepe es una variable de tipo struct persona */ .............
  • 45. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 45 Estructuras. Declaración en C Estructuras. Declaración en C „ Sintaxis (2): „ Se declara primero la estructura y después se define la variable de tipo estructura. „ Ventaja: pueden definirse otras variables del mismo tipo sin tener que repetir la estructura. struct <nombre de la estructura> { <tipo> <nombre del campo>; <tipo> <nombre del campo>; ................. }; struct <nombre de la estructura> <variable de tipo estructura>;
  • 46. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 46 Estructuras. Declaración en C Estructuras. Declaración en C „ Ejemplo 2: #include <stdio.h> void main (void) { struct persona { char nombre [30]; char apellidos [30]; char direccion [30]; int edad; char dni [30]; }; struct persona pepe; struct persona amigos [10];
  • 47. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 47 Estructuras. Declaración en C Estructuras. Declaración en C „ Sintaxis (3): -recomendado- „ Se declara un nuevo tipo de datos que se puede usar como cualquier otro tipo de datos predefinido en C al declarar las variables. „ Ventaja: independencia de la declaración del tipo de datos y la definición de variables de ese tipo typedef struct [ <nombre de la estructura> ] { <tipo> <nombre del campo>; <tipo> <nombre del campo>; ................ } <nombre del tipo estructura>;
  • 48. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 48 Estructuras. Declaración en C Estructuras. Declaración en C „ Ejemplo 3: -recomendado- #include <stdio.h> typedef struct { char nombre [30]; char apellidos [30]; char direccion [30]; int edad; char dni [30]; } TPersona; void main (void) { TPersona pepe, juan; TPersona amigos [10];
  • 49. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 49 Estructuras. Nuevos tipos de datos Estructuras. Nuevos tipos de datos „ Notación de diseño con “typedef”: „ Si el programador declara un nuevo tipo de datos con “typedef”, para el diseño del entorno es válida la siguiente declaración: Nombre Clase Tipo variable TPersona (definido más abajo) Funcionalidad pepe Se emplea para almacenar las características de la persona pepe •tipo TPersona se describiría a continuación....
  • 50. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 50 Estructuras. Acceso Estructuras. Acceso „ Formas de acceso a los miembros de una estructura: „ 1. Mediante la variable de tipo estructura <variable de tipo estructura> . <nombre del campo>; „ 2. Mediante un puntero a la variable de tipo estructura: <puntero a la variable de tipo estructura> -> <nombre del campo>; „ A todos los efectos, el campo de una estructura es una variable de un tipo determinado y se puede tratar como tal.
  • 51. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 51 Estructuras. Acceso Estructuras. Acceso „ Ejemplo 1: typedef struct persona { char nombre[30]; char apellidos[30]; int edad; }TPersona; ... ... .. ... ... ... ... ... ... TPersona persona; strcpy(persona.nombre,“Antonio”); strcpy(persona.apellidos,“Martinez Santos”); persona.edad=30;
  • 52. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 52 Estructuras. Acceso Estructuras. Acceso „ Ejemplo 2: typedef struct persona { char nombre[30]; char apellidos[30]; int edad; }TPersona; ... ... .. ... ... ... ... ... ... TPersona *persona; strcpy(persona->nombre,“Antonio”); strcpy(persona->apellidos,“Martinez Santos”); persona->edad=30;
  • 53. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 53 Estructuras. Acceso Estructuras. Acceso „ Ejemplo 3: „ Definición y acceso a las variables en la misma sentencia: typedef struct persona { char nombre[30]; char apellidos[30]; int edad; }TPersona; ... ... .. ... ... ... ... ... ... TPersona persona={“Antonio”, “Martinez Santos”, 30}; TPersona *pers1; strcpy((*pers1).nombre,“Ana”; ) /*Igual que strcpy(pers1->nombre,“Ana”); */
  • 54. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 54 Estructuras. Asignación de valores Estructuras. Asignación de valores „ La asignación de valores a una estructura se puede hacer campo a campo, o asignando el contenido de una variable de tipo estructura a otra del mismo tipo, ya que el nombre de la estructura representa el contenido de la variable. TPersona persona={“Antonio”, “Martinez Santos”, 30}; TPersona pers1; strcpy(pers1.nombre, persona.nombre); strcpy(pers1.apellidos, persona.apellidos); pers1.edad = persona.edad; /* o bien */ pers1 = persona; /* Es necesario que o las dos estructuras sean del mismo tipo. */
  • 55. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 55 Estructuras. Ejercicios Estructuras. Ejercicios „ Ejercicio 1: „ Definir los tipos de datos TElem1 y TElem2. siguiente nombre precio stock nombre año color anterior Tcosa1 TElem1 TElem2 Tcosa2
  • 56. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 56 Estructuras. Ejercicios Estructuras. Ejercicios „ Ejercicio 2: „ Dadas las siguientes variables. ƒ TElem1 elemento1; ƒ TElem2 elemento2; 1. Pedir por pantalla los datos correspondientes a las variables “elemento1” y “elemento2”, almacenándolos en los campos correspondientes de las estructuras. 2. Asignar los punteros de las estructuras de forma que apunten como se indicaba en el ejercicio anterior. 3. Mostrar por pantalla los datos almacenados en la variable “elemento1” direccionando los campos de su estructura a través de la variable “elemento2”.
  • 57. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 57 Estructuras. Ejercicios Estructuras. Ejercicios „ Ejercicio 3: „ Definir los arrays “punteros” y “amigos”, haciendo que los punteros apunten según se indica en la figura. punteros[0] punteros : punteros[1] punteros[MAX -1] amigos[0] nombre: ”AB” telefono: ”xx” edad: 20 peso: 70 TPersona amigos[1] nombre: ”BC” telefono: ”xx” edad: 21 peso: 68 TPersona amigos[2] nombre: ”CD” telefono: ”xx” edad: 22 peso: 66 TPersona amigos[MAX-1] nombre: telefono: ”xx” edad: peso: TPersona amigos : punteros[2]
  • 58. Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 58 Estructuras. Ejercicios Estructuras. Ejercicios „ Ejercicio 4: 1. Inicializar el array “amigos” tal y como se indica en la figura del ejercicio 3 a través del array “punteros”. 2. Mostrar por pantalla el contenido del array “amigos” empezando por el elemento MAX-1 y terminando por el cero, sin usar para nada el array “punteros”.
  • 59. Programación I. Tema 5 Programación I. Tema 5 Estructuras de datos