Solución a la Tarea 7: Máquina descompuesta
En la solución que muestro abajo tengo dos funciones. La primera
función es muy sencilla: sólo nos dice de qué tipo
es un caracter c, siendo las opciones "minúscula",
"mayúscula" y "otro". La segunda función es la que hace
todo el trabajo. La idea general es la siguiente: tendremos una
variable m que nos dice que es lo que debemos hacer con la siguiente
letra que veamos: si m = 1 entonces la debemos volver mayúscula
pero si m = 0 entonces la debemos volver minúscula. Como la
primera letra debe ser mayúscula, m comienza con el valor 1. Si
cuando m = 1 tenemos una letra, entonces la volvemos mayúscula y
hacemos m = 0. Si cuando m = 0 tenemos un punto, entonces hacemos m =
1. Finalmente, si m = 0 y tenemos una letra, entonces la volvemos
minúscula. En los demás casos no hacemos nada. Por
supuesto, todo esto lo hacemos en un ciclo desde el principio y hasta
el final de la cadena. Otra forma de resolver esta tarea
consistía de primero volver todas las letras mayúsculas
(o minúsculas) y luego hacer un ciclo parecido al descrito
arriba para arreglar las letras que deben ser minúsculas (o
mayúsculas). La ventaja de esta segunda forma es que el ciclo es
bastante más sencillo, la desventaja es que se procesa la cadena
dos veces.
#include <stdio.h>
int tipo(int c)
{
if ('a' <= c &&
c <= 'z')
return 1;
if ('A' <= c &&
c <= 'Z')
return 2;
return 0;
}
void arregla(char s[])
{
int i, m = 1, t;
for (i = 0; s[i]; i++) {
t = tipo(s[i]);
if (s[i] ==
'.') {
m
= 1;
} else if (t
== 2) {
if
(m == 0)
s[i] = s[i] - 'A' + 'a';
m
= 0;
} else if (t
== 1) {
if
(m == 1)
s[i] = s[i] - 'a' + 'A';
m
= 0;
}
}
}
int main(void)
{
char s[81];
gets(s);
arregla(s);
puts(s);
return 0;
}
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada
Salida
a
A
A
A
hola.
mundo.
Hola. Mundo.
HOLA. MUNDO.
Hola. Mundo.
HoLa. MuNdO.
Hola. Mundo.
hOlA. MuNdO.
Hola. Mundo.
Mi Numero. 123 No
ES. Mi numero. 123 No es.
3.1416 es
PI. 3.1416
Es pi.
PI es
3.1416
Pi es 3.1416
S.o.S.s.O.s.
S.O.S.S.O.S.
Para probar su tarea en UNIX, escriban la instrucción gcc maquinNN.c -o maquin para
compilar su programa, y la instrucción ./maquin
para correrlo.
Algunos errores comúnes fueron: (a) No procesar los puntos
correctamente. (b) Suponer que después de un punto hay un
espacio y luego una letra. (c) No revisar que si una letra que
debía ser mayúscula ya es mayúscula no hay que
cambiarla. (d) No revisar que si una letra que debía ser
minúscula ya es minúscula no hay que cambiarla. (e) Si
generaron una segunda cadena, olvidar poner el caracter nulo al final.