Nota: 100 Excelente! - Universidad de Costa Rica

Anuncio
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
Descargar