Curso de Programación en C/Prog125
Ir a la navegación
Ir a la búsqueda
Prog125
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5
6 char DesplegaMenu( void );
7 void ComeLinea( void );
8 void Desplega( void (* fp)( char * ), char * str );
9 void AMayuscula( char * );
10 void AMinuscula( char * );
11 void Invierta( char * );
12 void Tonto( char * );
13
14 int main(void)
15 {
16 char Linea[81];
17 char Copia[81];
18 char Seleccion;
19 void (*pfun)(char *); // Declarar un pointer a función, pfun, que tiene
20 // argumento de char * y no valor de returno
21 printf( "\nIngresa una línea (<Enter> para terminar): " );
22 while( fgets( Linea, 79, stdin ) && Linea[0] != '\n' )
23 {
24 if( *(Linea + strlen( Linea ) -1 ) != '\n' )
25 {
26 fputs( "La línea que entraste es demasiado largo.\nSolo 79 chars MAX",
27 stderr );
28 exit(1);
29 }
30 *(Linea + strlen( Linea ) -1 ) = '\0';
31
32 while( ( Seleccion = DesplegaMenu() ) != 's' )
33 {
34 switch( Seleccion )
35 {
36 case 'y' : pfun = AMayuscula; break;
37 case 'n' : pfun = AMinuscula; break;
38 case 'i' : pfun = Invierta; break;
39 case 'o' : pfun = Tonto; break;
40 }
41 strcpy( Copia, Linea );
42 Desplega( pfun, Copia );
43 }
44 printf( "\nIngresa una línea (<Enter> para terminar): " );
45 }
46 puts( "\n¡Adios!\n" );
47 return 0;
48 }
49
50 char DesplegaMenu( void )
51 {
52 char ans;
53 puts( "\n\t\ty) Todo Mayúsculas \t\tn) Todo Minúsculas" );
54 puts( "\t\ti) Invertir \t\to) Cómo original" );
55 puts( "\t\ts) Siguiente string" );
56 printf( "\tElige una opción: " );
57 ans = getchar();
58 ans = tolower(ans);
59 ComeLinea();
60 while( strchr( "ynios", ans ) == NULL )
61 {
62 printf( "\tElige y, n, i, o, o s: " );
63 ans = tolower( getchar() );
64 ComeLinea();
65 }
66 return ans;
67 }
68
69 void ComeLinea( void )
70 {
71 while( getchar() != '\n' )
72 continue;
73 }
74
75 void AMayuscula( char * str )
76 {
77 while( *str )
78 {
79 *str = toupper( *str );
80 str++;
81 }
82 }
83
84 void AMinuscula( char * str )
85 {
86 while( *str )
87 {
88 *str = tolower( *str );
89 str++;
90 }
91 }
92
93 void Invierta( char * str )
94 {
95 while( *str )
96 {
97 if( islower( *str ) )
98 *str = toupper( *str );
99 else if( isupper( *str ) )
100 *str = tolower( *str );
101 str++;
102 }
103 }
104
105 void Tonto(char * str)
106 {
107 // No cambio el string
108 }
109
110 void Desplega( void (* fp)( char * ), char * str )
111 {
112 (*fp)( str ); // aplicar la función
113 printf( "\n\tEl Resultado: %s\n", str );
114 }
Resultado
[rrc@localhost CClase]$ gcc -Wall -o Prog125 Prog125.c [rrc@localhost CClase]$ ./Prog125 Ingresa una línea (<Enter> para terminar): ¡Adios! [rrc@localhost CClase]$ ./Prog125 Ingresa una línea (<Enter> para terminar): Una Línea y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: y El Resultado: UNA LíNEA y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: n El Resultado: una línea y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: o El Resultado: Una Línea y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: i El Resultado: uNA líNEA y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: s Ingresa una línea (<Enter> para terminar): OTRA línea y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: y El Resultado: OTRA LíNEA y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: r Elige y, n, i, o, o s: i El Resultado: otra LíNEA y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: n El Resultado: otra línea y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: o El Resultado: OTRA línea y) Todo Mayúsculas n) Todo Minúsculas i) Invertir o) Cómo original s) Siguiente string Elige un opción: s Ingresa una línea (<Enter> para terminar): ¡Adios! [rrc@localhost CClase]$