- 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.
- 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]]++;
- 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);