Nota: 100 Excelente! UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117 I CICLO 2012 LABORATORIO 14 ARREGLOS, CADENAS DE CARACTERES Y ENTRADA SALIDA CHRISTIAN CHAVES BEJARANO A81740 1. Escriba una función que tome como argumento una cadena de caracteres, verifique que los caracteres de la cadena correspondan a un número de punto flotante válido y realice la conversión, retornando el valor resultante. Si la validación de la cadena falla, debe retornarse el valor -999999 (o cualquier otro valor que permita identificar una condición de error). Escriba además un pequeño programa que permita probar el funcionamiento de la función. La función debe ser capaz de identificar números de punto flotante escritos de sistintas maneras (por ejemplo, -100, 42, 0.23, -.2345 y .20 son todos números de punto flotante válidos). Mediante el siguiente código desarrollado en lenguaje C se soluciona el problema propuesto, el código utiliza los elementos básicos del lenguaje de programación antes mencionado, como la declaración de variables, aritmética básica, operadores y expresiones introductorias, sin embargo en el presente laboratorio se incluye el manejo de arreglos y cadenas de caracteres. El código se compiló en la terminal mediante GCC digitando gcc nombredelarchivo -o nombredelprograma: # include < stdio .h > // Incluye informacion de la biblioteca estandar # include < string .h > // Permite el manejo de funciones para cadenas de caracteres definidas # include < stdlib .h > // Declara funciones para conversion numerica , asignacion de memoria y tareas semejantes # include < ctype .h > // Funciones para la prueba de caracteres /* Funcion que toma como argumento una cadena de caracteres y verifica que correspondan a un numero */ float funcion ( char * cadena ) { // Se define las variables iniciales requeridas int i ; int puntos =0; float numero ; /* Se recorre la cadena para verificar las diferentes situaciones planteadas */ for ( i = 0; i < ( strlen ( cadena ) ) ; i ++) { /* Se analiza cuantos puntos hay en la cadena y se almacena en puntos */ if ( cadena [ i ]== ’. ’) { puntos = puntos +1; } /* Se analiza si hay un menos en la posicion no correcta */ if ( i !=0 && cadena [ i ]== ’ - ’) { /* Se devuelve el error */ return ( -999999) ; break ; } /* Se prueba que cada valor sea un digito decimal */ if (!( isdigit ( cadena [ i ]) ) ) { 1 /* Ademas se evalua la posibilidad de que haya un punto o un menos */ if (( cadena [ i ]!= ’. ’) && ( cadena [ i ]!= ’ - ’) ) { /* Se devuelve el error */ return ( -999999) ; break ; } } /* Se determina error si se cuentan mas de dos puntos */ if (1 < puntos ) { /* Se devuelve el error */ return ( -999999) ; break ; } } /* Se convierte la cadena de caracteres a float */ numero = strtof ( cadena , NULL ) ; return numero ; } // Define una funcion llamada main que devuelve un entero int main () { float numero ; char cadena [] = " akdjhfs " ; /* CADENA A VARIAR PARA COMPROBAR LA FUNCION */ numero = funcion ( cadena ) ; /* se accede a funcion y se le da la cadena se recibe -999999 si hay error o la cadena convertida a numero flotante si es posible hacerlo */ printf ( " %f \ n " , numero ) ; /* se imprime el valor obtenido */ return 0; } La siguiente ilustración muestra la funcionabilidad del código presentado en el problema, en este caso se utilizo varias cadenas de caracteres inicialmente una que tuviera solamente números para no obtener error alguno, en el segundo intento una cadena de letras con números para inducir el error: Figura 1: Problema 1 2. Escriba un programa que reciba, a través de la línea de comandos, el nombre de un archivo que contenga números (uno por línea, máximo 100) en desorden, copie los números a un arreglo, ordene el arreglo de manera ascendente e imprima la lista de números ordenados en la terminal. El código nuevamente se basa en el uso de elementos básicos del lenguaje de programación antes mencionado, como la declaración de variables, aritmética básica, operadores y expresiones introductorias, sin embargo en 2 este caso se introduce el uso de entrada y salida de datos: # include < stdio .h > // Incluye informacion de la biblioteca estandar # include < string .h > // Permite el manejo de funciones para cadenas de caracteres definidas # include < stdlib .h > // Declara funciones para conversion numerica , asignacion de memoria y tareas semejantes # include < ctype .h > // Funciones para la prueba de caracteres // Define una funcion llamada main que devuelve un entero int main ( int argc , char * argv []) { // Se define las variables iniciales requeridas char cadena [100]; int arreglo [100]; int ordenado [100]; int i = 0 ,j ,k , temp ; /* variable auxiliar del tipo de los datos */ if ( argc != 2) { printf ( " Se debe escribir la cantidad de valores correcta para el manejo del argc " ) ; exit (1) ; } // Se crea el archivo correspondiente FILE * datos ; /* Se abre el archivo que coloca el usuario en la posicion mediante argv */ datos = fopen ( argv [1] , " r " ) ; // Examina los datos mientras no sea ni el inicio ni el fin continua dentro del while while ( fscanf ( datos , " %[^\ n ] " , cadena ) != EOF ) { fgetc ( datos ) ; arreglo [ i ]= atol ( cadena ) ; i ++; } fclose ( datos ) ; // Usa el metodo burbuja para lograr ordenar a los numeros for ( j =0; j < i ; j ++) { for ( k =0; k < i ; k ++) { if ( arreglo [ k ] > arreglo [ k +1]) { temp = arreglo [ k ]; arreglo [ k ] = arreglo [ k +1]; arreglo [ k +1] = temp ; } } } // imprime los numeros que ya han sido ordenados printf ( " Los numeros en orden ascendente son :\ n " ) ; /* Itera imprimiendo uno por uno */ for ( j = 0; j <= i ; j ++) { printf ( " %d \ n " , arreglo [ j ]) ; } return 0; } 3 La siguiente ilustración muestra la funcionabilidad del código presentado en el problema: Figura 2: Problema 2 4