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.