Análisis laboratorio 13 - Cadenas de caracteres (strings)

Asignatura: Fundamentos de Informática
Especialidad: Electrónica - UPV/EHU
Curso académico: 2013-2014
Profesor: Ismael Etxeberria Agiriano
  1. 13-001:
    El prototipo de esta función será:
      void IntercalaEspacios (char *str);
    
    Para intercalar los espacios en la misma cadena (la función ha de suponer que el tamaño de la cadena es suficiente) lo primero que haremos será obtener la longitud de la cadena, ya sea "a mano" o utilizando la función strlen cuyo prototipo se define en <string.h> y la utilizaremos como se describe a continuación:
      #include <string.h>
      ...
      n = strlen (str);
      ...
    
    Cada uno de los i caracteres de la cadena los copiaremos a la posición 2*i pero tendremos que operar de derecha a izquierda (emprezando del final de la cadena) para no perder información. Para cada carácter que copiemos tendremos que copiar un espacio en la posición 2*i+1 (salvo, quizá, el último).
    No se debe olvidar el caráter terminador '\0'.
    En el programa principal es importante definir la cadena de caracteres con espacio suficiente para el texto que introduzcamos en la lectura y el doble cuando intercalemos los espacios.

  2. 13-002:
    En el programa principal tendremos la definición de la cadena (por ejemplo de 1024 caracteres, aunque nunca será suficiente) y del vector de contadores.
      char frase[1024];
      int  cnt[256];
    
    De esta manera, cnt[65] contendrá las ocurrencias de 'A's, según la tabla de caracteres ASCII, cnt[52] del dígito '4' y cnt[125] las ocurrencias del carácter '}'.
    Si contamos el carácter terminador en realidad estaremos contando cuántas cadenas distintas hemos contado ya que cada cadena de caracteres sólo puede tener un terminador.
    Para incrementar las ocurrencias del carácter i-ésimo de la cadena str haremos en el vector de contadores v:
      car_i = str[i];
      v[car_i]++;
    
    Puesto todo junto:
      v[str[i]]++;
    

  3. 13-003:
    Un posible algoritmo consistirá en utilizar dos contadores, i y j que se inicializarán al primer y último carácter de la cadena respectivamente:
      i = 0;
      j = strlen (str) - 1;
    
    Cada carácter i-ésimo ha de tener su correspondiente j-ésimo igual. Cada iteración y mientras i sea menor que j tendremos cuidado de avanzar todos los espacios str[i] y retroceder todos los espacios str[j]. Si en algún momento str[i] es distinto de str[j] podemos terminar la función devolviendo directamente que la cadena no es palíndroma:
      return 0;
    
    Si i y j se cruzan quiere decir que la frase representa un palíndromo.
    Un detalle a tener en cuenta es que si vamos a ignorar mayúsculas y minúsculas tendremos que comparar letras convertidas a mayúsculas (o a minúsculas). Podríamos utilizar una función:
      char Mayuscula (char letra);