Solución a la Tarea 7: Sopa de letras
Hay varias formas de resolver este problema. Una de ellas es la
siguiente: Primero averiguamos si P aparece dentro de S, luego
invertimos P y al final averiguamos si la P al reves aparece dentro de
S. Esto lo logramos hacer con dos funciones, como se muestra abajo:
#include <stdio.h>
int aparece(char s[], char t[])
{
int i, j, k;
for (i = 0; t[i]; i++) {
for (j = 0, k = i; t[k] && (t[k] == s[j]);
j++, k++);
if (!s[j]) return 1;
}
return 0;
}
void alreves(char s[])
{
int c, i, j;
for (j = 0; s[j]; j++);
for (i = 0, j--; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
int main(void)
{
char p[101], s[101];
int d, r;
gets(p);
gets(s);
d = aparece(p, s);
alreves(p);
r = aparece(p, s);
printf("%d %d\n", d, r);
return 0;
}
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada (cadenas separadas por
espacios) Salida
AVE
AAVEEEVAVEVAEVEVAVEVVVEAVE 1 1
ERA
TAREA 0 1
CASA
NO 0 0
IGUALES
IGUALES 1 0
ALREVES
SEVERLA 0 1
ALPRI
ALPRINCIPIO 1 0
FINAL
ESTAVAALFINAL 1 0
ENMEDIO
PONEMOSENMEDIOLACADENA 1 0
ANITALAVALATINA
ANITALAVALATINA 1 1
LA
LAPONEMOSALPRINCIPIOENMEDIOYALFINAL 1 1
Para probar su tarea en UNIX, escriban la instrucción gcc letrasNN.c -o letras para
compilar su programa, y la instrucción ./letras para correrlo.
Algunos errores comúnes fueron: (a) No verificar correctamente
si la cadena P aparecía al principio, enmedio o al final de S.
(b) No verificar si la cadena P alrevés aparecía al
principio, enmedio o al final de S. (c) Invertir P incorrectamente. (d)
Al revisar al derecho, no fijarse en los caracteres nulos. (e) Al
revisar alrevés, no fijarse en que las cadenas terminan con el
caracter en la posición 0 de cada vector.