Programación Básica Estructuras de Datos y Funciones en C

advertisement
Programación Básica
Estructuras de Datos y Funciones en C
Arturo Vega González
a.vega@ugto.mx
Division de Ciencias e Ingenierı́as
Universidad de Guanajuato
Campus León
Sesión 8
Universidad de Guanajuato, DCI, Campus León
1 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Contenido
1
Estructuras de Datos
Uniones
Typedef
Enumeraciones
2
El Preprocesador de C
Subcomandos (directivas)
Control
3
Introducción a funciones
4
Ejercicios
Universidad de Guanajuato, DCI, Campus León
2 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Estructura de Datos
Conjunto de N elementos que están agrupados por medio de un
único nombre.
Pueden ser de distinto tipo
Es un tipo definido dentro del programa
Los elementos o miembros de la estructura pueden a su vez ser
otra estructura
Se utiliza la palabra reservada struct para declarar una
estructura
double
int
o_
cha
Universidad de Guanajuato, DCI, Campus León
float
r
otr
o
tip
...
3 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Uniones
Uniones
Conjunto de N elementos que están agrupados por medio de un
único nombre.
Pueden ser de distinto tipo
Es un tipo definido dentro del programa
Los elementos o miembros de la estructura pueden a su vez ser
otra union
Se utiliza la palabra reservada union para declarar una union
Entonces, ¿Cuál es la diferencia entre una estructura y una unión?
Universidad de Guanajuato, DCI, Campus León
4 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Uniones
Uniones
La diferencia entre las dos es que en una estructura, los
miembros ocupan diferentes áreas de la memoria, pero en una
unión, los miembros ocupan la misma área de memoria.
Los miembros pueden ser de distinto tipo
El tamaño de una unión es el de su miembro de mayor tamaño
Es una variable la cual podrı́a guardar (en momentos diferentes)
objetos de diferentes tamaños y tipos
Universidad de Guanajuato, DCI, Campus León
5 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Uniones
Uniones
Cuando dos o más variables comparten la misma memoria,
entonces se define una unión. ejemplo:
u n i o n tom
{
c h a r ch ;
int x ;
} t;
El código anterior declara una unión que se verı́a ası́ en memoria.
X
byte 1
byte 2
ch
Universidad de Guanajuato, DCI, Campus León
6 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Uniones
Uniones
Definición y declaración(1)
union
{
int i ;
float f ;
} VariableU ;
variableU es una union de dos miembros (i, f)
Universidad de Guanajuato, DCI, Campus León
7 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Uniones
Uniones
Definición (2)
u n i o n Nombre
{
t i p o 1 Campo1 ;
t i p o 2 Campo2 ;
...
t i p o N CampoN ;
};
Declaración
u n i o n Nombre VarU ;
Universidad de Guanajuato, DCI, Campus León
8 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Uniones
Union
El acceso es de forma similar a la de una estructura
Se realiza indicando nombre de la variable tipo union y el
elemento individual separados por un punto “.”
VariableUnion.ElementoUnion
Cuando se utilizan apuntadores (pointer), el separador es:
“− >”
VariableUnion->ElementoUnion
El procesamiento de una unión solo se puede hacer elemento por
elemento.
Recordar que los elementos ocupan la misma área de memoria.
Del ejemplo anterior: Como ”variableU.i” y ”variableU.f”
ocupan la misma área de memoria, modificar uno modifica el
valor del otro, algunas veces de maneras impredecibles.
Universidad de Guanajuato, DCI, Campus León
9 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Uniones
Uniones
Ejemplo
u n i o n w o r d b y t e /∗ Se d e c l a r a l a u n i o n w o r d b y t e
{
u n s i g n e d s h o r t word ;
/∗ 2 b y t e s ∗/
unsigned char byte [ 2 ] ;
/∗ 2 b y t e s ∗/
};
/∗ E l tamaño de l a u n i o n e s de d o s b y t e s ∗/
∗/
u n i o n w o r d b y t e wb ; /∗ Se d e c l a r a una v a r i a b l e t i p o u n i o n ∗/
wb . word = 0 x 0 f 0 a ;
/∗ Se a s i g n a un v a l o r a e s t a v a r i a b l e ∗/
/∗ Por medio d e l o t r o miembro s e a c c e s a e l v a l o r a s i g n a d o ∗/
p r i n t f ( “ b y t e b a j o : %d\ n” , wb . b y t e [ 0 ] ) ;
/∗ 10 ∗/
p r i n t f ( “ b y t e a l t o : %d\ n” , wb . b y t e [ 1 ] ) ; /∗
Universidad de Guanajuato, DCI, Campus León
10 / 33
15 ∗/
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Typedef
Typedef: Nuevos tipos de datos
Se puede dar un nombre nuevo a cualquier tipo de datos
mediante typedef.
Es común utilizarlo para dar un alias o sinónimo al nombre de la
estructura, de esta forma se evita el tener que poner ”struct
NombreEstructura” cada vez que se declare una variable.
Sintaxis:
typedef struct
{
...
} NombreEstructura ;
...
NombreEstructura V a r i a b l e ;
Universidad de Guanajuato, DCI, Campus León
11 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Typedef
Ejemplo
typedef int entero ;
typedef struct
{
c h a r nombre [ 3 0 ] ;
char c a l l e [ 4 0 ] ;
char ciudad [ 2 0 ] ;
char estado [ 3 ] ;
unsigned i n t codigo ;
} sdireccion ;
sdireccion info direccion ;
s d i r e c c i o n Agenda [ 1 0 0 ] ;
e n t e r o a , b =3;
Universidad de Guanajuato, DCI, Campus León
12 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Enumeraciones
Enumeraciones
Es un conjunto de constantes enteras con nombre.
En su declaración se especifica todos los valores legales que
puede tener una variable del tipo enum
Se declara de forma similar a la de una estructura:
enum n o m b r e e n u m e r a c i o n { l i s t a d e e n u m e r a c i ó n } l i s t a d e v a r i a b l e s ;
Los valores de una enumeración se inician con 0 a menos que se
indique otro valor, y se incrementan en 1.
Los identificadores en una enumeración deben ser únicos. Los
nombres de las constantes no pueden ser modificados en el
programa.
Universidad de Guanajuato, DCI, Campus León
13 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Enumeraciones
Ejemplo
enum ComunidadDCI { a d m i n i s t r a t i v o , e s t u d i a n t e , p r o f e s o r } ;
...
enum ComunidadDCI p e r s o n a ;
f o r ( i=a d m i n i s t r a t i v o ; i <=p r o f e s o r ; i ++)
...
persona = a d m i n i s t r a t i v o ;
i f ( p e r s o n a == e s t u d i a n t e )
...
enum ComunidadDCI { a d m i n i s t r a t i v o =200 , e s t u d i a n t e , p r o f e s o r } ;
...
enum ComunidadDCI { a d m i n i s t r a t i v o , e s t u d i a n t e =200 , p r o f e s o r } ;
Universidad de Guanajuato, DCI, Campus León
14 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Enumeraciones
Ejercicio
Escribir un programa que use el tipo enumeración para mostrar
el nombre de un mes, su predecesor y su sucesor.
El mes se ingresará desde el teclado dando un número entre 1 y
12.
Universidad de Guanajuato, DCI, Campus León
15 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Enumeraciones
Solución
#i n c l u d e < s t d i o . h>
i n t main ( v o i d ) {
enum meses {ENE = 1 , FEB , MAR, ABR, MAY, JUN ,
JUL , AGO, SEP , OCT, NOV, DIC } ;
enum meses mesesID ;
enum meses C o n t a d o r M e s e s ;
c h a r ∗ mesNombre [ ] = { ” ” , ” E n e r o ” , ” F e b r e r o ” , ” Marzo ” ,
” A b r i l ” , ”Mayo” , ” J u n i o ” , ” J u l i o ” ,
” Agosto ” , ” Septiembre ” , ” Octubre ” ,
” Noviembre ” , ” Diciembre ” } ;
i n t CualMes =0;
Universidad de Guanajuato, DCI, Campus León
16 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Enumeraciones
Solución continuación
// D e s p l i e g u e de l o s meses u s a n d o enum
f o r ( C o n t a d o r M e s e s = ENE ; C o n t a d o r M e s e s <= DIC ; C o n t a d o r M e s e s++)
p r i n t f ( ”%2d%11 s \n” , C o n t a d o r M e s e s , mesNombre [ C o n t a d o r M e s e s ] ) ;
// s o l i c i t a r un numero p a r a i m p r i m i r e l mes s e l e c c i o n a d o , e l
p r i n t f ( ” \n I n t r o d u c e un numero de mes ( 1 − 1 2 ) : ” ) ;
s c a n f ( ”%d” , ( i n t ∗)(& mesesID ) ) ; // c a s t
anterio
// s c a n f (”%d” ,& CualMes ) ; // o t r a f o r m a u s a n d o un e n t e r o
// mesesID = CualMes ;
// p r i n t f ( ” \ n E l mes e s : %s \n \n ” , mesNombre [ me s e s ID ] ) ;
Universidad de Guanajuato, DCI, Campus León
17 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Estructuras de Datos
Enumeraciones
Solución continuación
// D e s p l i e g u e d e l mes a n t e r i o r y s i g u i e n t e u s a n d o enum
i f ( mese sI D >= ENE && mesesID <= DIC ) {
f o r ( C o n t a d o r M e s e s = ENE ; C o n t a d o r M e s e s <= DIC ; C o n t a d o r M e s e s++)
i f ( C o n t a d o r M e s e s == mesesID ) {
i f ( mesesID==ENE)
p r i n t f ( ” \n E l mes a n t e r i o r e s : %s ” , mesNombre [ DIC ] ) ;
else
p r i n t f ( ” \n E l mes a n t e r i o r e s : %s ” , mesNombre [ mesesID − 1 ] ) ;
p r i n t f ( ” \n E l mes s e l e c c i o n a d o e s : %s ” , mesNombre [ me s e s ID ] ) ;
i f ( mesesID==DIC )
p r i n t f ( ” \n E l mes s i g u i e n t e e s : %s \n” , mesNombre [ ENE ] ) ;
else
p r i n t f ( ” \n E l mes s i g u i e n t e e s : %s \n” , mesNombre [ m e s e s ID + 1 ] )
}
}
return (0);
}
Universidad de Guanajuato, DCI, Campus León
18 / 33
Programación Básica
Estructuras de Datos y Funciones en C
El Preprocesador de C
Pasos para crear un ejecutable
Preprocesador:
Transforma el programa
fuente, convirtiéndolo en otro
archivo fuente “predigerido”.
Elimina comentarios, incluye
otros archivos y sustituye las
definiciones.
Compilador:
Convierte el fuente entregado
por el preprocesador en un
archivo en lenguaje máquina:
archivo objeto.
Enlazador:
Un archivo objeto es código
máquina, pero no se puede
ejecutar, porque le falta
código que se encuentra en
otros archivos binarios. El
enlazador genera el ejecutable
binario, a partir del contenido
de los archivos objetos y de
las bibliotecas.
Universidad de Guanajuato, DCI, Campus León
19 / 33
Programa fuente
(código fuente)
Preprocesador
Compilador
Enlazador
Programa ejecutable
Programación Básica
Estructuras de Datos y Funciones en C
El Preprocesador de C
El Preprocesador
Preprocesador: Transforma el programa fuente, convirtiéndolo
en otro archivo fuente “predigerido”. Elimina comentarios,
incluye otros archivos y sustituye las definiciones.
El preprocesador tiene su propio lenguaje
Los programas son más fáciles de leer
Los programas son más fáciles de modificar
Facilita la transferencia a otros arquitecturas
Universidad de Guanajuato, DCI, Campus León
20 / 33
Programación Básica
Estructuras de Datos y Funciones en C
El Preprocesador de C
Subcomandos (directivas)
#include
Se utiliza para incluir otro archivo de definiciones o archivo de
biblioteca y de esta forma compilar otro archivo.
#include <archivo>
#include ”archivo”
Elemplo
#i n c l u d e < s t d i o . h>
#i n c l u d e <math . h>
#i n c l u d e < l i b r e r i a e s p e c i a l . h>
Cuando se indica <archivo> se le dice al compilador que busque
donde están los archivos de biblioteca o del sistema. Si se usa la
forma ”archivo” entonces el compilador busca en el directorio actual,
es decir, donde el programa esta siendo ejecutado.
Universidad de Guanajuato, DCI, Campus León
21 / 33
Programación Básica
Estructuras de Datos y Funciones en C
El Preprocesador de C
Subcomandos (directivas)
#define
Se utiliza para definir constantes o una macro. Esta definición es
sustituida por el código establecido por el programador. #define
acepta argumentos en la definición de macros.
#define <Nombre-Cte-Macro> <Nombre-de-Remplazo>
Elemplo
#d e f i n e Maximo 300
#d e f i n e Minimo 0
#d e f i n e
Falso 0
#d e f i n e
Verdadero 1
#d e f i n e MIN( a , b ) ( a<b ) ? a : b
...
f o r ( i=Minimo ; i <Maximo ; i ++)
p r i n t f ( ” E l minimo de %d y %d
Universidad de Guanajuato, DCI, Campus León
e s %d\n” , A [ i ] , B [ i ] , MIN(A [ i ] , B [ i ] ) ) ;
22 / 33
Programación Básica
Estructuras de Datos y Funciones en C
El Preprocesador de C
Subcomandos (directivas)
#if, #ifdef
Evalúa una expresión constante entera. Siempre se debe terminar con
#endif para delimitar el fin de esta sentencia. Se puede utilizar else (
#elif o #else)
Elemplo
#d e f i n e
#d e f i n e
#d e f i n e
#d e f i n e
#d e f i n e
#d e f i n e
Maximo 300
Minimo 0
MEX 0
EUA 1
GB 2
PAIS ACTIVO MEX
#i f PAIS ACTIVO == MEX
c h a r moneda [ ] = ” p e s o s ” ;
#e l i f PAIS ACTIVO == EUA
c h a r moneda [ ] = ” d o l a r ” ;
#e l s e
c h a r moneda [ ] = ” l i b r a ” ;
#e n d i f
Universidad de Guanajuato, DCI, Campus León
23 / 33
Programación Básica
Estructuras de Datos y Funciones en C
El Preprocesador de C
Subcomandos (directivas)
#if, #ifdef
Otro método de compilación condicional es utilizar las clausulas
#ifdef y #ifndef. Sintaxis:
#i f d e f <nombre macro>
<s e c u e n c i a de s e n t e c i a s >
#e n d i f
#i f n d e f <nombre macro>
<s e c u e n c i a de s e n t e c i a s >
#e n d i f
#undef se utiliza para quitar una definición de una constante o
macro que se haya definido previamente. El formato general es:
#undef <nombre macro>
Universidad de Guanajuato, DCI, Campus León
24 / 33
Programación Básica
Estructuras de Datos y Funciones en C
El Preprocesador de C
Control
Control del preprocesador
Se puede usar el compilador para controlar los valores asignados o
definidos en la lı́nea de comandos. Para esto, se usa la opción
-Dmacro[=defn], por ejemplo:
gcc -DTAMLINEA=80 prog.c -o prog.out
Esto es equivalente a:
#define TAMLINEA 80
También se puede poner un sı́mbolo sin valor, por ejemplo:
gcc -DDEBUG prog.c -o prog.out
En donde el valor que se toma es de 1 para esta macro.
Universidad de Guanajuato, DCI, Campus León
25 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Introducción a funciones
Introducción a funciones en C
Una función es un conjunto de instrucciones (declaraciones,
definiciones, ...), que realizan una tarea especifica.
En C, la función main es la que indica donde comienza la
ejecución de nuestro programa, es decir es la función principal
Funciones vs. Procedimientos
Una función regresa un valor
Un procedimiento no regresa un valor, pero puede modificar sus
argumentos.
En C, una función puede o no regresar un valor y puede o no
modificar sus argumentos.
Universidad de Guanajuato, DCI, Campus León
26 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Introducción a funciones
Introducción a funciones en C
Recordando el primer programa ...
#i n c l u d e < s t d i o . h>
i n t main ( v o i d )
{
p r i n t f ( ” P r o g r a m a c i o n b a s i c a . \ n” ) ;
return 0;
}
Podemos escribir una función que realice lo mismo
void imprimeMensaje ( void )
{
p r i n t f ( ” P r o g r a m a c i o n b a s i c a . \ n” ) ;
}
Universidad de Guanajuato, DCI, Campus León
27 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Introducción a funciones
Introducción a funciones en C
La diferencia entre la función imprimeMensaje y la función main, esta
en la primer linea, la cual indica:
Quien puede invocarla
El tipo de valor que regresa
Su nombre
Los argumentos que requiere
La selección del nombre de la función es tan relevante como la
selección del nombre de las variables. estos tienen que ser relevantes
y acorde a su uso, de tal forma que la lectura del programa sea fácil.
Universidad de Guanajuato, DCI, Campus León
28 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Introducción a funciones
Introducción a funciones en C
Escribiendo e invocando una función. ¿Valor de retorno?
#i n c l u d e < s t d i o . h>
void imprimeMensaje ( void )
{
p r i n t f ( ” P r o g r a m a c i ó n b á s i c a . \ n” ) ;
}
i n t main ( v o i d )
{
imprimeMensaje ( ) ;
return 0;
}
Universidad de Guanajuato, DCI, Campus León
29 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Introducción a funciones
Introducción a funciones en C
Más sobre invocación de las funciones
#i n c l u d e < s t d i o . h>
void imprimeMensaje ( void )
{
p r i n t f ( ” P r o g r a m a c i ó n b á s i c a . \ n” ) ;
}
i n t main ( v o i d )
{
int i ;
f o r ( i =1; i <=5; i ++)
imprimeMensaje ( ) ;
return 0;
}
Universidad de Guanajuato, DCI, Campus León
30 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Introducción a funciones
Introducción a funciones en C
El formato general de una función en C es:
Tipo dato que regresa
N o m b r e D e L a F u n c i ó n ( L i s t a d e A r g u m e n t o s )
{
D e c l a r a c i ó n de v a r i a b l e s l o c a l e s
C ó d i g o de l a f u n c i ó n
r e g r e s o de
a l g ú n v a l o r de a c u e r d o a l t i p o
}
Universidad de Guanajuato, DCI, Campus León
31 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Introducción a funciones
Introducción a funciones en C
Ejemplo:
// f u n c i ó n que d e v u e l v e e l mı́nimo de d o s n úmeros e n t e r o s
i n t minimo ( i n t a , i n t b )
{
i n t m; // d e c l a r a l a v a r i a b l e m p a r a a l m a c e n a r e l r e s u l t a d o
i f ( a<b )
m = a;
else
m = b;
// a s i g n a un v a l o r de a c u e r d o a l o s p a r á m e t r o s
r e t u r n (m) ;
// r e g r e s a e l v a l o r
}
Universidad de Guanajuato, DCI, Campus León
32 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Ejercicios
Ejercicios
Objetivo: Entender el uso de las directivas del preprocesador y el uso
de las funciones en C
Definir una macro min(a,b) para determinar el entero más
pequeño. Definir otra macro min3(a,b,c) en términos de
min(a,b). Incorporar las macros en un programa demostrativo en
donde se pida al usuario tres números y se muestre el más
pequeño.
Escriba una función que calcule de la distancia euclidiana entre
dos puntos e incorpore la función en un programa demostrativo
donde se pida al usuario el valor de dos puntos y despliegue la
distancia euclidiana. Puede o no usar estructuras.
Universidad de Guanajuato, DCI, Campus León
33 / 33
Programación Básica
Estructuras de Datos y Funciones en C
Descargar