Laboratorio 13: Arreglos, Cadenas de Caracteres y Entrada y Salida

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