Ver Mensaje Individual
  #8 (permalink)  
Antiguo 30/11/2013, 04:56
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: contar palabras de una cadena

@guzzano: mejor tu segunda funcion que la primera, en la primera si entras 'hola' te cuenta 0 palabras. Mas abajo cualgo una implemetacion de tu idea.

@vangodp: lo mismo, si entras un texto vacío te cuenta 1 palabra, es decir que cumple la faena pq cuenta palabras pero la cumple mal. Imagina un empleado de un banco que su trabajo consiste en contar billetes: el trabajo de contar billetes lo hace, hasta aqui todo bien, pero si los cuenta mal la cosa ya no vale.

La version de guzzano de determinar las palabras en funcion de los espacios parece una buena opcion, voy a implementar algo mas de codigo siguiendo la misma idea de contar por separadores pero con mas separadores (ya que lo hacemos que sea a lo grande):

Código C:
Ver original
  1. int main() {
  2.     char ch, txt[] = "esto.es una     frase., ., ., de, prueba";
  3.     int q, w, soff, eoff, colisiones, falsos_positivos;
  4.     char tokens[] = " ',.;:-_!?¿¡(){}[]|@#~%&/\\";
  5.  
  6.     soff = eoff = 0;
  7.     colisiones = 0;
  8.     falsos_positivos = 0;
  9.     if(strlen(txt)) {
  10.         for(q = 0; q <= strlen(txt); q++) {
  11.             ch = (q == strlen(txt))? tokens[0]:txt[q];
  12.             if(chrmatch(tokens, ch)) {
  13.                 eoff = q;
  14.                 if(soff < eoff) {
  15.                     colisiones++;
  16.                     printf("[");
  17.                     for(w = soff; w < eoff; w++) {
  18.                         printf("%c", txt[w]);
  19.                     }
  20.                     printf("]");
  21.                 }
  22.                 else {
  23.                     falsos_positivos++;
  24.                 }
  25.                 soff = eoff+1;
  26.             }
  27.         }
  28.     }
  29.  
  30.     printf("\nCreo que hay %d palabras y %d falsos positivos\n", colisiones, falsos_positivos);
  31.  
  32.     return 0;
  33. }

La funcion chrmatch no existe, solo es un buscador de caracteres dentro de una lista, me sirve para determinar si un caracter está en la lista de caracteres que considero separadores:

Código C:
Ver original
  1. char chrmatch(char *lista, char ch) {
  2.     int q;
  3.     for(q = 0; q < strlen(lista); q++) {
  4.         if(lista[q] == ch) {
  5.             return 1;
  6.         }
  7.     }
  8.     return 0;
  9. }

Los falsos positivos son un separador seguido de otro separador (es decir un separador que separa otro separador), que con la busqueda directa me contaria como palabra. Si quiero usar mas separadores solo tengo que añadirlos como caracter a la lista de tokens. De igual forma puedo ampliar la funcionalidad añadiendo una lista de palabras excluidas. La parte que muestra los caracteres es solo para ver que está haciendo, el comparador que determina si es algo significativo es el de la distancia entre offsets.

@vangodp: ya se que estoy haciendo los deberes de otro, pero a veces practicando tambien se aprende. Tu has copiado y pegado un codigo de otro sitio que como te comenté mas arriba en determinados casos da un resultado erroneo, pero no te hubiese costado nada hacer un par de pruebas para ver como responde. No te lo tomes mal, es solo mi opinion ;)

Saludos
vosk

Última edición por vosk; 30/11/2013 a las 05:03