Nota: 100 IE-0117 Programación Bajo Plataformas Abiertas Prof. Francisco Siles Canales Hugo Zúñiga Calvo A96988 Laboratorio 13: Arreglos, Cadenas de Caracteres y Entrada y Salida 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. Para esto primeramente se recibe una cadena de caracteres del tipo char, el cual recibe como argumento de entrada un valor digitado por el usuario de manera interactiva, una vez que se tiene el argumento se llama a la función que se llama conversión para efectuar la conversión de cadenas de char a int, para esto primeramente se implementó un sistema para validar si la cadena introducida corresponde a un digito o no de manera que se pueda seleccionar adecuadamente el valor de retorno. Si la cadena corresponde efectivamente a un valor flotante, entonces se utiliza la función atoi para llevar a cabo la conversión, sino se retorna el valor default que menciona el apartado. Código: #include #include #include #include <stdio.h> <ctype.h> <string.h> <stdlib.h> float Conversion(char dato[]); //Funcion main para el programa int main(){ char dato[] = {}; float ValorRetorno; //Se solicita el valor a revisar de manera dinamica printf("Digite el numero que desea procesar\n"); scanf("%s",dato); //Se llama a la funcion Conversion para transformar el char[] a int ValorRetorno = Conversion(dato); printf("El Dato es: %f\n",ValorRetorno); return 0; } float Conversion(char dato[]){ //Se utiliza un bit de signo para determinar al caso en que el valor digitado sea negativo int signo = 0; int finalizar = 0; int puntoEnc = 0; int punto,contador,i; float valorFinal = 0; //Si el primer dato de la cadena de caracteres es un -, entonces el bit de signo se inicializa en 1 if (dato[0] == '-'){ signo = 1; } //Se hace un ciclo for para determinar si todos los caracteres son numericos o punto for(i = 0+signo;i < strlen(dato); i++){ //Se determina si el valor tiene unicamente un punto y si todos los demas caracteres son numericos if(dato[i] == '.' && puntoEnc == 0){ puntoEnc = 1; } else{ printf("%d\n",strlen(dato)); if(isdigit(dato[i])){ finalizar = 0; } else{ finalizar = 1; break; } } } //La bandera finalizar determina si el ciclo se finalizo porque la cadena introducida no corresponde a un float if (finalizar == 1){ return -999999; } //Si la cadena es un float, entonces se convierte mediante la funcion atof. else{ valorFinal = atof(dato); return valorFinal; } } Validación del Código: 1) Introduciendo el valor de 0.12309: hugo@hugo-Satellite-L305:~/Desktop/Laboratorio_14$ ./CadenaDeCaracteres.o Digite el numero que desea procesar 0.12309 El Dato es: 0.123090 2) Introduciendo el valor de .45: hugo@hugo-Satellite-L305:~/Desktop/Laboratorio_14$ ./CadenaDeCaracteres.o Digite el numero que desea procesar .45 El Dato es: 0.450000 3) Intrduciendo el valor de -18: hugo@hugo-Satellite-L305:~/Desktop/Laboratorio_14$ ./CadenaDeCaracteres.o Digite el numero que desea procesar -18 El Dato es: -18.000000 4) Introduciendo el valor de -.34: hugo@hugo-Satellite-L305:~/Desktop/Laboratorio_14$ ./CadenaDeCaracteres.o Digite el numero que desea procesar -.34 El Dato es: -0.340000 2) Escriba un programa que reciba, a través de la línea de comandos, el nombre de un archivo que contenga números enteros (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. Primeramente para recibir los argumentos de la línea de comandos se utilizó la combinación de argc, con argv de manera que se recibiesen los datos adecuadamente. Una vez obtenidos los argumentos se procedió a crea el File Handler para proceder a abrir el archivo para lectura, una vez que se abre el archivo se lee uno por uno los caracteres y se almacena en una lista temporal hasta que se encuentra un valor de cambio de línea, en ese momento la lista temporal se transforma a integer mediante la función atoi y se almacena en una lista permanente. Una vez que se finaliza se utiliza la función qsort para ordenar la lista permanente de integer. Una vez que se obtiene la lista ordenada, se procede a imprimir cada uno de los miembros en pantalla. Código: #include <stdio.h> #include <stdlib.h> int comp(const void *,const void *); // Se crea la funcion main con los argumentos argc y argv para poder recibir argumentos del cli int main(int argc, char *argv[]){ int contador; int i = 0; //Se inicializa la lista temporal int valores[100] = {}; char c; //Se inicializa la lista temporal de char char valor[100] = {}; //Se crea el File Handler FILE *fp; //Se abre el archivo para lectura fp = fopen(argv[1],"r"); //Se determina si el archivo existe if(fp == NULL){ printf("Fracaso\n"); } //Se implementa la lectura char por char del archivo else{ c = getc(fp); for(contador = 0; c != EOF;contador++){ //Se almacenan todos los valores en una lista de char hasta que se encuetra el cambio de linea if(c != '\n'){ valor[contador] = c; } //Cuando se alcanza el cambio de linea se reinicia la lista y despues se transforma en entero y se almacena en la lista de int else{ valor[contador] = '\0'; valores[i] = atoi(valor); contador = -1 ; i++; } c = getc(fp); } i++; valores[i] = '\0'; close(fp); //Se crea una lista permanente para ordenarla int Ordenar[i-1]; //Se almacenan los valores de la lista temporal en la lista a ordenar for(contador = 0; valores[contador] != '\0'; contador++){ Ordenar[contador] = valores[contador]; } //Se utiliza el qsort para ordenar la lista qsort(Ordenar,sizeof(Ordenar)/sizeof(int),sizeof(int),comp); for(contador = 0; contador<sizeof(Ordenar)/sizeof(int);contador++){ printf("%d\n",Ordenar[contador]); } } } return 0; //Esta funcion es utilizada por el qsort para determinar las relaciones de magnitud de las variables int comp(const void * pa, const void * pb){ int a = *(const int*)pa; int b = *(const int*)pb; if (a ==b){ return 0; } else{ if(a < b){ return -1; } else{ return 1; } } } Validación del Código: La validación se llevó a cabo utilizando el archivo Numeros Prueba en la carpeta del laboratorio.