the programming programación programacion practica lenguaje language kernighan español entorno book c string kernighan-and-ritchie

programación - the c programming language amazon



¿Cómo completo K & R Exercise 2-4? (5)

Gran libro. Si yo fuera usted, procedería exactamente como para el squeeze () en la sección 2.8, pero en lugar de una comparación directa (s [i]! = C) escribiría y explotaría una función

int contains(char s[], int c)

que devuelve 1 si la cadena s contiene c, 0 en caso contrario. Comience con el enfoque simple; cuando funciona puede mejorar el rendimiento con soluciones más complejas (búsqueda binaria, pero tenga en cuenta que el problema no requiere que los caracteres en s2 estén en un orden particular).

Estoy aprendiendo cómo escribir programas en C usando el libro k & r (The C Programming Language) y tengo un problema con uno de los ejercicios. Me pide que detecte y elimine un carácter en la cadena s1, que coincide con cualquier carácter de la cadena s2.

Entonces, digamos s1 = "A";

Y s2 = "AABAACAADAAE"

Quiero que me devuelva "BCDE"

Sé que estoy en el camino correcto, simplemente no sé cómo diseñar programas, ¿podría darme algún consejo adicional? Traté de leer sobre el algoritmo del árbol de búsqueda binaria, pero sentí que era un poco demasiado avanzado para esta tarea mundana.

¡Gracias a todos!

/* An alternate version of squeeze(s1, s2) that deletes each character in * s1 that matches any character in the string s2 * * [email protected] */ #include <stdio.h> #include <string.h> void squeeze(char s[], char t[]); char string[] = "BAD"; char sstring[] = "ABC"; int main(void) { squeeze(string, sstring); return 0; } void squeeze(char s[], char t[]) { int i, j, d; d = 0; if(strstr(s, t) == NULL) printf("%c", s[i]); s[j] = ''/0''; }


No necesita una búsqueda binaria elegante para hacer el trabajo. Lo que necesita es un bucle doble que verifique la ocurrencia de cada char en una cadena en otra, y copie los caracteres que no se producen en una tercera matriz (que es el resultado).

El código puede ser algo como lo siguiente (¡no probado!):

char *s1, *s2, *result; /* original strings and the result string */ int len1, len2; /* lengths of the strings */ for (i = 0; i < len1; i++) { for (j = 0; j < len2; j++) { if (s1[i] == s2[j]) { break; } } if (j == len2) { /* s1[i] is not found in s2 */ *result = s1[i]; result++; /* assuming your result array is long enough */ } }


Una búsqueda binaria es demasiado exagerada para esto. Necesitas tres índices. Un índice ( i ) para recorrer s , un índice ( k ) para recorrer t , y un índice ( j ) para realizar un seguimiento de dónde se encuentra en s para los caracteres que debe conservar porque no están en t . Por lo tanto, para cada personaje en s , verifique y vea si está en t . Si no es así, guárdalo en s .

void squeeze(char *s, char *t) { int i, j, k; int found = 0; for(i = j = 0; s[i] != ''/0''; i++) { found = 0; for(k = 0; t[k] != ''/0'' && (found == 0); k++) { if(t[k] == s[i]) { found = 1; } } if(found == 0) { s[j++] = s[i]; } } s[j] = ''/0''; }


void squeeze(char s1[], char s2[]) { int i,j,k; char c; for(i=0;s2[i]!=''/0'';i++) { c=s2[i]; for(j=k=0;s1[j]!=''/0'';j++) if(s1[j]!=c) s1[k++]=s1[j]; s1[k]=''/0''; } }


esta es mi función:

void squeeze(char s1[],char s2[]) { int i,j,p; int found; p=0; for(i=0;s1[i]!=''/0'';i++) { for(j=0;s2[j]!=''/0'';j++) if(s1[i]==s2[j]) found=YES; else found=NO; if(found==NO) s1[p++]=s1[i]; } s1[p]=''/0''; }