Nota: 100 UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 14 I CICLO 2012 Laboratorio 14. Arreglos, cadenas de caracteres y Entrada / Salida Estudiante: José David Vargas Quirós Carné: B16945 1. Se escribió una función que recibe una cadena de caracteres y verifica que corresponda a un número de punto flotante válido, retornando dicho número convertido, en tipo de dato "float". Si hay algún error se retorna -999999. La función revisa que el vector de caracteres contenga únicamente números, como máximo un punto o coma y admite un signo negativo como primer caracter. Por lo tanto, admite entradas como -100, 42, 0.23, -.2345 .20 y ,56. Al utilizar la librería math, se requiere compilar con un comando como "gcc pFlotante.c -lm -o pFlotante.exe". El -lm es necesario para indicar al compilador que se utiliza la librería math. En el main además se implementó lo necesario para probar el funcionamiento de la función. Al ejecutar el programa se solicita un número al usuario. La función verifica lo introducido como un número de punto flotante y si es correcto lo convierte y el programa lo imprime como float. El código del archivo adjunto pFlotante.c es: / / Se i n c l u y e s t d i o . h para poder u t i l i z a r l a s f u n c i o n e s de e n t r a d a y s a l i d a , c t y p e . h para usar l a f u n c i ón i s d i g i t ( ) , s t r i n g . h para poder usar l a f u n c i ón i s d i g i t ( ) y math . h para e l acceso a l a f u n c i ón pow ( ) . # i n c l u d e < s t d i o . h> # i n c l u d e < c t y p e . h> # i n c l u d e < s t r i n g . h> # i n c l u d e <math . h> f l o a t p F l o t a n t e ( char s t r [ 1 0 0 ] ) { / / Se d a c l a r a n y / o i n i c i a l i z a n algunas v a r i a b l e s n e c e s a r i a s . i n t i , exponente ; / / Punto almacenará l a p o s i c i ón d e l punto en e l v e c t o r de c a r a c t e r e s . I n i c i a l m e n t e ( s i no hay punto ) debe e s t a r a l f i n a l de l a cadena , después d e l ú l t i m o d í g i t o d e l número . i n t punto = s t r l e n ( s t r ) ; / / f almacena e l f l o a t . Cada i t e r a c i ón va sumando a f , que se r e t o r n a a l f i n a l . f l o a t f = 0; / / Signo almacena 1 o −1 de acuerdo a l s i g n o d e l número i n t r o d u c i d o . f l o a t signo = 1; / / Se r e c o r r e e l v e c t o r de c a r a c t e r e s con e l f i n de almacenar l a p o s i c i ón d e l punto , s i l o hay− f o r ( i = 0 ; i < s t r l e n ( s t r ) ; i ++) { UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 14 I CICLO 2012 / / S i e l c a r a c t e r es punto o coma , se almacena su p o s i c i ón en l a v a r i a b l e punto , pero s i ya hab í a un punto se devuelve e r r o r ( no debe haber dos puntos en un número ) con −999999. i f ( ( s t r [ i ] == ’ , ’ ) | | ( s t r [ i ] == ’ . ’ ) ) { i f ( punto ! = s t r l e n ( s t r ) ) { r e t u r n −999999; } else { punto = i ; } } } / / Se r e c o r r e nuevamente e l v e c t o r de c a r a c t e r e s para o b t e n e r e l f l o a t f o r ( i = 0 ; i < s t r l e n ( s t r ) ; i ++) { / / S i e l c a r a c t e r es un menos , se pone un n e g a t i v o a l a v a r i a b l e s i g n o . Antes se r e v i s a l a p o s i c i ón d e l menos . S i no e s t á a l i n i c i o se devuelve error . i f ( s t r [ i ] == ’ − ’ ) { i f ( i != 0) { r e t u r n −999999; } else { p r i n t f ( " negativo " ) ; s i g n o = −1; } / / S i e l c a r a c t e r es un d í g i t o , se debe sumar a f . E l exponente d e l elemento es " punto − i − 1" s i e s t á a l a i z q u i e r d a d e l punto , y " punto − i " s i e s t á a l a derecha . } else i f ( i s d i g i t ( s t r [ i ] ) ) { i f ( i < punto ) { exponente = punto − i − 1 ; } else { exponente = punto − i ; } f += ( ( i n t ) s t r [ i ] − 48) * pow ( 1 0 , exponente ) ; / / S i e l c a r a c t e r es un punto o coma se i g n o r a , pues ya se r e v i s a r o n e s t o s . S i es c u a l q u i e r o t r o c a r a c t e r , por ejemplo una l e t r a , se devuelve e r r o r . } e l s e i f ( ( s t r [ i ] == ’ , ’ ) | | ( s t r [ i ] == ’ . ’ ) ) { } e l s e { r e t u r n −999999; } } } / / Se r e t o r n a e l f l o t a n t e con e l s i g n o c o r r e c t o . r e t u r n signo * f ; UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 14 I CICLO 2012 i n t main ( ) { / / Se crea un v e c t o r de c a r a c t e r e s para c o n t e n e r l o que e l u s u a r i o d i g i t e . La máxima l o n g i t u d que se almacena es 100. char f [ 1 0 0 ] ; / / Se s o l i c i t a a l u s u a r i o un número y se e s c r i b e en e l v e c t o r , un c a r a c t e r por p o s i c i ón . p r i n t f ( " I n g r e s e un número : " ) ; scanf ( " % [ ^ \ n ] " , f ) ; / / Se imprime e l r e s u l t a d o , que l l a m a a l a f u n c i ón p F l o t a n t e . p r i n t f ( " E l f l o a t es : %f \ n " , p F l o t a n t e ( f ) ) ; } 2. Se escribió un programa que recibe por la línea de comandos el nombre de un archivo con números enteros. Por ejemplo, para ordenar el archivo lista.txt se usa un comando como: "./orden.exe lista.txt ". El programa lee del archivo y crea un vector de enteros, que luego ordena con el algoritmo de burbuja, para finalmente mostrar los números ordenados ascendentemente en pantalla. El código comentado del archivo orden.c adjunto es: / / Se i n c l u y e s t d i o para e l uso de f u n c i o n e s de e n t r a d a y s a l i d a y s t d l i b s o l o para e l uso de l a f u n c i o n e x i t ( ) que t e r m i n a l a e j e c u c i ón d e l programa # i n c l u d e < s t d i o . h> # i n c l u d e < s t d l i b . h> / / Esta f u n c i ón toma un v e c t o r y l o ordena mediante e l a l g o r i t m o de burbuja , de forma i t e r a t i v a . No r e t o r n a nada pues m o d i f i c a d i r e c t a m e n t e e l v e c t o r que r e c i b e , no hay necesidad de r e t o r n a r l o . void burbuja ( i n t v [ ] , i n t n ) { i n t i , j , temp ; f o r ( i = n−2; i >= 0 ; i −−) { f o r ( j =0; j <= i ; j ++) { i f ( v [ j ] > v [ j +1]) { temp = v [ j ] ; v [ j ] = v [ j +1]; v [ j +1] = temp ; } } } } / / main ( ) r e c i b a argc que c o n t i e n e l a c a n t i d a d de elementos enviados por l a t e r m i n a l y argv , un v e c t o r que c o n t i e n e d i c h o s elementos . v o i d main ( i n t argc , char * argv [ ] ) { / / E l o b j e t o de t i p o f i l e es un p u n t e r o FILE * o r i g e n ; / / Se i n i c i a l i z a n además o t r a s v a r i a b l e s n e c e s a r i a s ( i y n ) y e l v e c t o r de enteros v UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 LABORATORIO 14 I CICLO 2012 i n t v [100] , i , n ; / / Se abre e l a r c h i v o de o r i g e n o r i g e n = fopen ( argv [ 1 ] , " r " ) ; / / S i e l a r c h i v o de o r i g e n no e x i s t e se imprime un e r r o r y se t e r m i n a e l programa i f ( o r i g e n == NULL ) { f p r i n t f ( s t d e r r , " E r r o r de e n t r a d a \ n " ) ; exit (2) ; } / / Ahora se r e c o r r e e l a r c h i v o hasta e l f i n a l , almacenando cada e n t e r o en e l vector i =0; w h i l e ( f s c a n f ( o r i g e n , " %d " , &v [ i ] ) ! = EOF) { i +=1; } / / La c a n t i d a d t o t a l n de elementos en e l v e c t o r es i g u a l a l v a l o r f i n a l de i . n = i; / / Ahora se ordena e l v e c t o r burbuja ( v , n ) ; / / Por ú l t i m o se imprime e l v e c t o r ordenado f o r ( i =0; i <n ; i ++) { p r i n t f (" %d \ n " , v [ i ] ) ; } / / Y se c i e r r a e l a r c h i v o fclose ( origen ) ; }