Laboratorio 14. Arreglos, cadenas de caracteres y Entrada / Salida

Anuncio
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 ) ;
}
Descargar