Programación Básica Arreglos y Estructuras de Datos (2) Arturo Vega González [email protected] Division de Ciencias e Ingenierı́as Universidad de Guanajuato Campus León Sesión 7 Universidad de Guanajuato, DCI, Campus León 1 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Contenido 1 Librerı́as o Biblioteca de Funciones 2 Arreglos Más sobre cadenas Areglos en Fortran 3 Estructuras de Datos Universidad de Guanajuato, DCI, Campus León 2 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Librerı́as o Biblioteca de Funciones Librerı́as o Biblioteca de funciones Inclusión de librerı́as o biblioteca de funciones (Archivos de cabecera) mediante: #i n c l u d e Entonces: #i n c l u d e #i n c l u d e #i n c l u d e #i n c l u d e < s t d i o . h> <math . h> ” O t r a s F u n c i o n e s . h” ” b i b l i o t e c a . h” Universidad de Guanajuato, DCI, Campus León 3 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Librerı́as o Biblioteca de Funciones Librerı́as o Biblioteca de funciones Algunas Librerı́as comunes: stdio.h stdlib.h math.h string.h time.h Provee las funciones básicas de entrada/salida del lenguaje C. Contiene funciones útiles para operaciones como conversión de tipos, generación de números pseudo- aleatorios, gestión de memoria dinámica, control de procesos, funciones de entorno, funciones de ordenación y búsqueda Contiene las funciones matemáticas más comunes Contiene funciones para la manipulación de cadenas de caracteres Contiene funciones para la manipulación de fecha y hora Universidad de Guanajuato, DCI, Campus León 4 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Librerı́as o Biblioteca de Funciones Librerı́a stdio.h Otras funciones que incluye stdio.h son: getchar(void) putchar(char ch) getc(FILE *archivo) putc(char ch, FILE *Archivo) fopen(...) fclose(...) fprintf(...) fscanf(...) Lee un caracter de la entrada estándar Escribe un caracter a la salida esándar Lee un caracter de un archivo Escribe un caracter a un archivo Abre un archivo Cierra un archivo Imprime a un archivo Lee de un archivo y varias más... Universidad de Guanajuato, DCI, Campus León 5 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Librerı́as o Biblioteca de Funciones Librerı́a math.h Algunas funciones que incluye math.h son: double double double double double double double double double pow(double x, double y) sqrt(double x) sin(double x) sinh(double x) tan(double x) tanh(double x) ceil(double x) cos(double x) exp(double x) double fabs(double x) double floor(double x) Devuelve el valor de x elevado a y. Devuelve la raı́z cuadrada no negativa de x. Devuelve el seno de x, donde x está dado en radianes. Regresa el seno hiperbólico de x. Devuelve la tangente de x Devuelve la tangente hiperbólica de x. Redondea x hacia arriba al entero más cercano. Devuelve el coseno de x Devuelve el valor de e (la base de los logaritmos naturales) elevado a la potencia x Devuelve el valor absoluto del número en punto flotante x. Redondea x hacia abajo al entero más cercano. y varias más... Universidad de Guanajuato, DCI, Campus León 6 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Librerı́as o Biblioteca de Funciones Librerı́a stdlib.h Algunas funciones que incluye stdlib.h son: rand(void) srand(unsigned int seed) abs(int x) long int labs(long int x) div t div(int numer, int denom) double atof(const char *cadena) int atoi(const char *cadena) double strtod(const char *cadena, char **finap) double strtol(const char *cadena, char *finap, int base) Devuelve un entero aleatorio Establece la semilla para el generador de números aleatorios Regresa el valor absoluto de x Regresa el valor absoluto de x Calcula el valor numer entre denom y devuelve el cociente y el resto en una estructura llamada div t que contiene dos miembros llamados quot y rem. Convierte una cadena a un valor flotante. Convierte una cadena a un valor entero. Convierte una cadena a un valor de punto flotante. Convierte una cadena a un entero largo de acuerdo a una base dada, la cual deberá estar entre 2 y 36 inclusive. y varias más... Universidad de Guanajuato, DCI, Campus León 7 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Arreglos Los arreglos son un conjunto de datos del mismo tipo que tienen un ı́ndice para distinguirlos La notación xi es equivalente en C a: x[i]. donde i es el ı́ndice de la variable x El conjunto de datos se almacena en espacios de memoria contigua. Los indices en C comienzan en cero (0) Los indices en Fortran generalmente comienzan en uno (1), pero se puede especificar el rango de los indices. Los arreglos pueden ser n-dimensionales. Universidad de Guanajuato, DCI, Campus León 8 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Declaración de arreglos C f l o a t A[20] ; f l o a t B[ 5 ] = {0.0 , 2.0 , 1.5 , 1.0 , 0.5} int a [10] = { 2 }; Fortran real , dimension (3) : : x real , dimension (4 ,5) : : z r e a l , d i m e n s i o n ( 0 : 8 ) , A1 r e a l , d i m e n s i o n ( 2 : 5 ) , A2 real : : xx ( 3 ) , z z ( 4 , 5 ) Universidad de Guanajuato, DCI, Campus León 9 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Arreglos #i n c l u d e < s t d i o . h> i n t main ( v o i d ) { i n t t , i , num [ 3 ] [ 4 ] ; f o r ( t =0; t <3; ++t ) f o r ( i =0; i <4; ++i ) num [ t ] [ i ]=( t ∗4)+ i ∗ 1 ; f o r ( t =0; t <3; ++t ) { f o r ( i =0; i <4; ++i ) p r i n t f ( ”num[%d ] [ % d ] = %d ” , t , i , num [ t ] [ i ] ) ; p r i n t f ( ” \n” ) ; } } Universidad de Guanajuato, DCI, Campus León 10 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Más sobre cadenas Cadenas de caracteres Cadena o string se utiliza para manipular sı́mbolos o caracteres alfanuméricos Una Cadena es básicamente un arreglo de caracteres o del tipo char La terminación de la cadena se debe especificar con un caracter nulo ’\0’ Por lo que hay que considerar un espacio mas! Universidad de Guanajuato, DCI, Campus León 11 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Más sobre cadenas Cadenas #i n c l u d e < s t d i o . h> i n t main ( v o i d ) { char cadena [5]= ” hol a ” ; c h a r c a d e n a 2 [ 5 ] = { ’ h ’ , ’ o ’ , ’ l ’ , ’ a ’ , ’ \0 ’ } ; c h a r nombre [ 1 5 ] , a p e l l i d o s [ 3 0 ] ; p r i n t f ( ” I n t r o d u c e t u nombre : ” ) ; s c a n f ( ”%s ” , nombre ) ; p r i n t f (” Introduce tus a p e l l i d o s : ” ) ; s c a n f ( ”%s ” , a p e l l i d o s ) ; p r i n t f ( ”Tu Nombre e s %s %s \n” , nombre , a p e l l i d o s ) ; } Universidad de Guanajuato, DCI, Campus León 12 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Más sobre cadenas Operaciones con Cadenas Las cadenas no se manipulan igual que los enteros o flotantes #i n c l u d e < s t d i o . h> i n t main ( v o i d ) { c h a r nombre [ 1 5 ] , a p e l l i d o s [ 3 0 ] , nombrecompleto [ 5 0 ] ; nombre = ”Ana M a rı́ a ” ; \∗ I n c o r r e c t o ∗\ a p e l l i d o s = ” gómez gómez ” ; \∗ I n c o r r e c t o ∗\ n o m b r e c o m p l e t o = nombre + a p e l l i d o s ; \∗ I n c o r r e c t o ∗\ } Universidad de Guanajuato, DCI, Campus León 13 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Más sobre cadenas Cadenas de caracteres ejemplo de getchar y scanf para leer mientras exista un dato. c h a r ch ; w h i l e ( ch=g e t c h a r ( ) , ch>=0 ) // s i e s menor que c e r o e n t o n c e s f i n de d a t o s ... c h a r ch ; w h i l e ( s c a n f ( ”%c ” , &ch ) == 1 ) // s c a n f r e g r e s a c e r o s i e l c a r a c t e r e s n u l o . Universidad de Guanajuato, DCI, Campus León 14 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Más sobre cadenas Cadenas de caracteres Las funciones para manejo de cadenas se encuentran definidas en string.h. char *strcpy(const char *dest, const char *orig) int strcmp(const char *s1, const char *s2) int strlen(const char *s) char *strncat(char *s1, const char *s2, size t n) Copia la cadena de caracteres apuntada por orig al vector apuntado por dest. Compara las dos cadenas de caracteres s1 y s2. Devuelve un entero menor, igual o mayor que cero si se encuentra que s1 es, respectivamente, menor que, igual a, o mayor que s2. Calcula la longitud de la cadena de caracteres. Agrega n caracteres de s2 a s1 y varias mas ... Universidad de Guanajuato, DCI, Campus León 15 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Más sobre cadenas Cadena de caracteres char ∗ s1 = ” Hola ” ; char ∗ s2 ; int longitud ; l o n g i t u d = s t r l e n ( ” Hola ” ) ; ( v o i d ) s t r c p y ( s2 , s 1 ) ; ... char ∗ s1 = ” Hola ” ; char ∗ s2 = 2 ; int longitud = 2; ( v o i d ) s t r n c p y ( s2 , s1 , l o n g i t u d ) ; /∗ s 2 = ”Ho” ∗/ No olvidar incluir string.h Universidad de Guanajuato, DCI, Campus León 16 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Areglos en Fortran Declaración de arreglos Fortran real , dimension (3) : : x real , dimension (4 ,5) : : z r e a l : : w( 3 0 ) , M a t r i z ( 1 0 , 1 0 ) r e a l , d i m e n s i o n ( 0 : 8 ) , A1 r e a l , d i m e n s i o n ( 2 : 5 ) , A2 real : : xx ( 3 ) , z z ( 4 , 5 ) Universidad de Guanajuato, DCI, Campus León 17 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Areglos en Fortran Operaciones program o p e r a c i o n e s r e a l : : a ( 3 , 3 ) , b ( 3 , 3 ) , c ( 3 , 3 ) , v1 ( 3 ) , v2 ( 3 ) , t = 3. , c1 , c2 integer :: i , j do i =1 ,3 do j =1 ,3 a ( i , j )=( i+j ) end do v1 ( i )= i ∗ 6 . 5 end do b=t ∗ a ! p r o d u c t o e l e m e n t o a e l e m e n t o c=a+b c=−c b=c ∗ a v2=s i n ( v1 ) v1=t ∗ v1+5∗v2 ! c o m b i n a c i o n l i n e a l print ∗ ,a , b , c end program o p e r a c i o n e s Universidad de Guanajuato, DCI, Campus León 18 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Arreglos Areglos en Fortran Ejercicios (1) Comente el programa anterior Modifique el programa anterior para que imprima la matriz a, b y c en una forma mas entendible (filas y renglones) Escriba un programa en C que pida los datos de dos matrices de 3x3 y las sume Escriba un programa en C que lea una cadena de caracteres en minúsculas y la despliegue en Mayusculas sin usar alguna función de la libreria string.h (tip: ver tabla ASCII) Universidad de Guanajuato, DCI, Campus León 19 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Introducción a 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 double int o_ cha Universidad de Guanajuato, DCI, Campus León float r otr o tip ... 20 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Estructuras de Datos Definición y declaración(1) s t r u c t Nombre { t i p o 1 Campo1 ; t i p o 2 Campo2 ; ... t i p o N CampoN ; } Alumno ; Alumno es una variable del tipo Nombre Universidad de Guanajuato, DCI, Campus León 21 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Estructuras de Datos Definición (2) s t r u c t Nombre { t i p o 1 Campo1 ; t i p o 2 Campo2 ; ... t i p o N CampoN ; }; Declaración s t r u c t Nombre Var1 ; Universidad de Guanajuato, DCI, Campus León 22 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Estructuras de Datos Acceso a los elementos de una estructura de datos. Se realiza indicando nombre de la variable tipo estructura y el elemento individual separados por un punto “.” VariableEstructura.ElementoEstructura Cuando se utilizan apuntadores (pointer), el separador es: “− >” VariableEstructura->ElementoEstructura El procesamiento de una estructura solo se puede hacer elemento por elemento. Universidad de Guanajuato, DCI, Campus León 23 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Ejemplo de Estructura de Datos s t r u c t Fecha { i n t Dia ; c h a r Mes [ 1 0 ] ; i n t Anio ; }; ... s t r u c t Fecha Hoy = { 2 1 , ” Marzo ” , 2 0 1 2 } , V a r F e c ha ; ... V a r F e c ha = Hoy ; Hoy . Dia = 2 1 ; Hoy . A n i o = 2 0 1 2 ; p r i n t f ( “ E l mes e s : %s \n” , Hoy . Mes ) ; ( Fecha . A n i o % 4 == 0 ) && ( Fecha . A n i o % 100 != 0 ) ) ( Fecha . A n i o % 400 == 0 ) Universidad de Guanajuato, DCI, Campus León 24 / 29 || Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Estructura de Datos Ejemplo #i n c l u d e < s t d i o . h> i n t main ( v o i d ) { struct { i n t i d ; // i d e n t i f i c a d o r d e l alumno c h a r nom [ 2 0 ] ; // nombre float calificacion ; } alumno ; p r i n t f ( ” E s c r i b e e l i d e n t i f i c a d o r y e l nombre d e l alumno \n” ) ; s c a n f ( ”%d %s ” , &alumno . i d , alumno . nom ) ; alumno . c a l i f i c a c i o n = 8 0 . 0 ; i f ( alumno . i d > 1 0 0 ) p r i n t f ( ” E l alumno e s %s \n” , alumno . nom ) ; return (0); } Universidad de Guanajuato, DCI, Campus León 25 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Arreglos de Estructura de Datos struct trabajador { c h a r nombre [ 2 0 ] ; char a p e l l i d o s [ 4 0 ] ; i n t edad ; }; s t r u c t t r a b a j a d o r Academicos [ 2 0 ] ; struct trabajador Administrativos [20]; Universidad de Guanajuato, DCI, Campus León 26 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Estructuras de datos Ejercicio: Escriba un programa en C que utilice una estructura (struct), para definir un punto en el plano cartesiano (X,Y) (tipo float) Pida al usuario dos puntos Calcule y despliegue la distancia de un punto a otro p d(P1 , P2 ) = (x2 − x1 )2 + (y2 − y1 )2 Universidad de Guanajuato, DCI, Campus León 27 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Solución (1) #i n c l u d e < s t d i o . h> #i n c l u d e <math . h> i n t main ( v o i d ) { s t r u c t Punto { double x ; double y ; }; s t r u c t Punto A , B ; double D i s t a n c i a ; p r i n t f ( ” Teclea l o s v a l o r e s d e l punto A ( x , y ) s c a n f ( ”% l f % l f ” , &A . x , &A . y ) ; p r i n t f ( ” Teclea l o s v a l o r e s d e l punto B ( x , y ) s c a n f ( ”% l f % l f ” , &B . x , &B . y ) ; Universidad de Guanajuato, DCI, Campus León 28 / 29 \n” ) ; \n” ) ; Programcaión Básica Arreglos y Estructuras de Datos (2) Estructuras de Datos Solución (2) // c a l c u l a m o s l a d i s t a n c i a e n t r e ambos p u n t o s . D i s t a n c i a = s q r t ( pow ( ( B . x−A . x ) , 2 ) + pow ( ( B . y−A . y ) , 2 ) ) ; p r i n t f ( ” La d i s t a n c i a e s : % l f \n” , D i s t a n c i a ) ; return (0); } Para crear el ejecutable incluir la libreria math.h en el enlazador (caso particular de fedora) g c c d i s t a n c i a . c −lm −o d i s t a n c i a . o u t Universidad de Guanajuato, DCI, Campus León 29 / 29 Programcaión Básica Arreglos y Estructuras de Datos (2)