• Viernes 10 de Mayo de 2024, 02:07

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - espartako84

Páginas: [1]
1
C/C++ / Contar las palabras de un archivo.
« en: Viernes 18 de Enero de 2008, 07:37 »
Saludos.

Tengo que contar el número de palabras de un texto. Se considera palabra, aquella separada por un espacio '\n', o la ultima del archivo.

Todo marcha bien, hasta que el programa se encuentra dos espacios, o dos saltos de linea seguidos, que se vuelve "loco" y me los cuenta como palabras.

El código que he escrito es el siguiente:

Código: Text
  1.   ...
  2.  
  3.   FILE *fil;
  4.   int x, acum;
  5.   char aux[100], e;
  6.  
  7.     if ((fil = fopen(aux, "r")) == NULL)
  8.       printf("No se pudo abrir el archivo. \n");
  9.     else {
  10.     acum=0;
  11.       while (!feof(fil)) {
  12.     e = fgetc(fil);
  13.     if ( ((e == ' ' ) || feof(fil)  || (e == '\n')) && (acum == 0))
  14.       acum = 0;
  15.     else {
  16.     if (((e == ' ' ) || feof(fil)  || (e == '\n')) && (acum != 0)) {
  17.       x++;
  18.       acum = 0;
  19.     } else
  20.       acum++;
  21.       }
  22.     }
  23.   fclose(fil);
  24.    printf("El número de palabras del archivo es %d\n", x);
  25. ...
  26.  
  27.  

Los saco con fegtc, en vez de con fscanf, porque tiene que leer cualquier tipo de archivo, no solo los de texto. Básicamente lo que hago es sacar el carácter, comprobar que no cumple ninguna condición para que  sea final de palabra, y aumentar el acumulador. Si se cumple una condición de final de palabra, y el acum es 0, lo vuelvo a poner a 0 y leo el siguiente carácter. Si es distinto de 0, aumento el contador de palabras (el x++), y vuelvo a poner el acum a 0, para seguir contando.

Si le mandamos contar un texto de este estilo, juntito y bien ordenado:
Citar
#include <stdio.h>
Lo cuenta perfectamente.

El problema lo da cuanto tiene que contar un texto de este estilo:
Citar
#include    <stdio.h>


Cuando el programa se encuentra con varios saltos de línea o espacios seguidos, que se vuelve loco, pasa de la primera condicion del if
Código: Text
  1.     if ( ((e == ' ' ) || feof(fil)  || (e == '&#092;n')) && (acum == 0))
  2.  
Y me cuenta esos saltos de línea, o espacios como palabras.

En fin. Llevo como 7 horas dándole vueltas, y no se que puede ser, quizá la culpa la tenga la falta de horas de sueño...

Es una cosa tan "simple" a primera vista, que estoy sumamente mosqueado por no conseguir hacerlo...

Bueno, gracias por adelantado a todos aquellos que me lean.

Chao.

2
C/C++ / Problemilla Con Fork()
« en: Lunes 26 de Noviembre de 2007, 18:53 »
Saludos.

 tengo que crear un codigo, que cree procesos pesados (por esto he supuesto que se utiliza el fork, en vez de hilos, no?), de manera recurrente, que coexistan entre si, y sean todos hijos del mismo padre.

La intención es que dada un tamaño de una matriz cuadrada, NxN, y un divisor exacto de N, llamado h, divida la matriz, en submatrices, de tamaño hxh.
Habia pensado la siguiente estructura:

Código: Text
  1. #include&#60;stdio.h&#62;
  2.  
  3. int h;
  4.  
  5.  
  6. void hijos2 (int Nv2, int Nh2){
  7.   switch (fork()) {
  8.     case -1:
  9.       printf(&#34;Error&#092;n&#34;);
  10.       break;
  11.     case 0:
  12.       printf(&#34;Es el hijo numero %d cuyo padre es %d, HIJOS2 coordendas %d, %d&#092;n&#34;, getpid(), getppid(),Nv2, Nh2);
  13.     //  fflush(stdout);
  14.       break;
  15.     default:
  16.       if ((Nh2-h) &#62; 0)
  17.       hijos2(Nv2, Nh2-h);
  18.       break;
  19.   }
  20.   return;
  21. }
  22.  
  23. void hijos (int Nv, int Nh) {
  24.   switch (fork()) {
  25.     case -1:
  26.       printf(&#34;Error&#092;n&#34;);
  27.       break;
  28.     case 0:
  29.       printf(&#34;Es el hijo numero %d cuyo padre es %d. HIJOS, coordenadas %d, %d&#092;n&#34;, getpid(), getppid(), Nv, Nh);
  30.     //fflush(stdout);
  31.       break;
  32.     default:
  33.       if ((Nh-h) &#62; 0)
  34.         hijos2(Nv,Nh-h);
  35.       if ((Nv-h) &#62; 0)
  36.         hijos(Nv-h, Nh);
  37.       break;
  38.       }
  39. return;
  40. }
  41.  
  42.  
  43. main (){
  44.   int cas, temp;
  45. printf(&#34;Introduzca el numero de casillas, y el divisor: &#092;n&#34;);
  46. scanf(&#34;%d%d&#34;, &cas, &h);
  47.  
  48. hijos(cas, cas);
  49.  
  50. }
  51.  

Tecnicamente la funcion hijos, crea los procesos para analizar las submatrices de la columna Nh, e hijos 2 crea los proceos para analizar la columna.

La salida deberia ser:
Código: Text
  1. Introduzca el numero de casillas, y el divisor:
  2. 4 2
  3. Es el hijo numero 25520 cuyo padre es 25519. HIJOS, coordenadas 4, 4
  4. Es el hijo numero 25521 cuyo padre es 25519, HIJOS2 coordendas 4, 2
  5. Es el hijo numero 25524 cuyo padre es 25519. HIJOS, coordenadas 2, 4
  6. Es el hijo numero 25525 cuyo padre es 25519, HIJOS2 coordendas 2, 2
  7.  
  8.  

Pero en realidad resulta:
Código: Text
  1. Introduzca el numero de casillas, y el divisor:
  2. 4 2
  3. Es el hijo numero 25520 cuyo padre es 25519. HIJOS, coordenadas 4, 4
  4. Es el hijo numero 25521 cuyo padre es 25519, HIJOS2 coordendas 4, 2
  5. Es el hijo numero 25522 cuyo padre es 25521. HIJOS, coordenadas 2, 4
  6. Es el hijo numero 25523 cuyo padre es 25521, HIJOS2 coordendas 2, 2
  7. Es el hijo numero 25524 cuyo padre es 25519. HIJOS, coordenadas 2, 4
  8. Es el hijo numero 25525 cuyo padre es 25519, HIJOS2 coordendas 2, 2
  9.  
  10.  

El hijo 25521 le da por reproducirse, y crea 2 vastagos  :unsure:

Y tecnicamente las 2 funciones funcionan bien, ya que si eliminamos

Código: Text
  1. ...
  2. default:
  3.     //  if ((Nh-h) &#62; 0)
  4.     //    hijos2(Nv,Nh-h);
  5.       if ((Nv-h) &#62; 0)
  6.         hijos(Nv-h, Nh);
  7.       break;
  8. ...
  9.  

o

Código: Text
  1. ...
  2. default:
  3.       if ((Nh-h) &#62; 0)
  4.         hijos2(Nv,Nh-h);
  5.     //  if ((Nv-h) &#62; 0)
  6.     //    hijos(Nv-h, Nh);
  7.       break;
  8. ...
  9.  

en la funcion hijos, crea perfectamente los subprocesos para la linea o la columna primera de la matriz. No se donde esta el problema, y ya llevo 2 dias dandole vueltas al problema.  Os adjunto el archivo con el programa.

Muchas gracias por la antención.

PD: Valla tocho que os he soltado, cuando me lio a escribir  :comp:

Páginas: [1]