elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con un ejercicio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con un ejercicio  (Leído 4,099 veces)
moliverac8

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Ayuda con un ejercicio
« en: 5 Diciembre 2016, 20:27 pm »

Buenas, estoy haciendo un ejercicio en el que se me pide contar entre otras cosas el numero de palabras que hay en un archivo de txt. Estoy ya un poco desesperado porque no encuentro el error en mi código y no encuentro una solución.
En el código adjunto cuando llama a la función palabras, que cuenta las palabras(obvio), no me cuenta nada.
Sin embargo, si borro las llamadas a las otras dos funciones que hay justo delante, si que cuenta.
No entiendo este comportamiento, agradecería muchísimo la ayuda.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define X 400000
  5.  
  6. typedef struct {
  7. int a;
  8. int e;
  9. int i;
  10. int o;
  11. int u;
  12. } Vocales;
  13.  
  14. typedef struct {
  15. int caracteres;
  16. int palabras;
  17. int puntuacion;
  18. Vocales vocales;
  19. } Datos;
  20.  
  21. int vocales(FILE *fp){
  22. int a, suma = 0;
  23. char cadena[X];
  24. for (a = 0; a < X; a++) {
  25. fscanf (fp, "%c", &cadena[a]);
  26. if (cadena[a] == 'a' || cadena[a] == 'A')
  27. suma++;
  28. }
  29. return suma;
  30. }
  31.  
  32. int totales(FILE *fp){
  33. int total = 0;
  34. char cadena[X];
  35. fscanf (fp, "%c", &cadena[X]);
  36. total = strlen(cadena);
  37. return total;
  38.  
  39. }
  40.  
  41. int palabras(FILE *fp){
  42. char caracter;
  43. int total;
  44. while((caracter = getc(fp)) != EOF) {
  45. if (caracter == ' ')
  46. total++;
  47. }
  48. return total;
  49. }
  50.  
  51.  
  52. int main () {
  53.  
  54. int a, total, puntu;
  55. char caracter;
  56. Datos datos;
  57.  
  58. FILE *fp;
  59. fp = fopen("quijote.txt", "r");
  60.  
  61. datos.vocales.a = vocales(fp);
  62. datos.caracteres = totales(fp);
  63. total = palabras(fp);
  64.  
  65. while((caracter = getc(fp)) != EOF) {
  66. if (caracter == ',' || caracter == ';' || caracter == '.' || caracter == '?' || caracter == '¿' || caracter == '¡' || caracter == '!')
  67. puntu++;
  68. }
  69.  
  70.  
  71.  
  72.  
  73.  
  74. printf ("%d, %d, %d, %d\n", datos.vocales.a, datos.caracteres, total, puntu);
  75.  
  76. return (1);
  77.  
  78. }


« Última modificación: 5 Diciembre 2016, 20:49 pm por engel lex » En línea

jvm1994

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #1 en: 6 Diciembre 2016, 04:45 am »

Pregunta, no sería necesario agregar un rewind a tus funciones para que vuelva a el principio del archivo?

Valor de retorno:

^
La función getc retorna el carácter siguiente desde el stream de entrada apuntado por stream. Si el stream está en el final de fichero, el indicador del final de fichero para el stream es activado y getc retorna EOF. Si ocurre un error de lectura, el indicador de error para el stream es activado y getc retorna EOF.


« Última modificación: 6 Diciembre 2016, 04:49 am por jvm1994 » En línea

"La posibilidad de crear tu mundo."
Código
  1. int main()
  2. {
  3. eMundo * Own = world_new();
  4. if(Own != NULL)
  5. {
  6.    world_create(Own);
  7. }
  8.  
  9. return 0;
  10. }
moliverac8

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #2 en: 6 Diciembre 2016, 10:31 am »

Dios muchas gracias, estaba ya desesperado con el ejercicio jajaja,
En línea

moliverac8

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #3 en: 6 Diciembre 2016, 11:08 am »

Una última cosa, cuando compilo me sale siempre este error, ejercicio.c:116:115: warning: multi-character character constant [-Wmultichar]
 racter == '.' || caracter == '?' || caracter == '¿' || caracter == '¡' || car
                                                                     ^
, alguna idea de como arreglarlo?
En línea

jvm1994

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #4 en: 6 Diciembre 2016, 15:46 pm »

Jaja suele suceder, a veces uno se estanca, por eso es bueno participar en estas comunidades  :rolleyes:

Copié tu código en mi IDE (C::B 16.01)

Lo compilé y todo figuraba bien, después me tomé el trabajo de modificar esto, agregando un carácter de más:

Código:
if (caracter == ',sd' || caracter == ';' |

caracter == ',sd' || caracter ==

Y recién ahí me tiró el warning de Multi-Character.

A vos te lo sigue tirando?? Si tu ide tiene la opción "Reconstruí" el proyecto entero.
« Última modificación: 6 Diciembre 2016, 15:48 pm por jvm1994 » En línea

"La posibilidad de crear tu mundo."
Código
  1. int main()
  2. {
  3. eMundo * Own = world_new();
  4. if(Own != NULL)
  5. {
  6.    world_create(Own);
  7. }
  8.  
  9. return 0;
  10. }
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #5 en: 6 Diciembre 2016, 17:10 pm »

Código:
if (caracter == ',' || caracter == ';' || caracter == '.' || caracter == '?' || caracter == '¿' || caracter == '¡' || caracter == '!')

'?' y '¡' no son ascii standard... eso quieres decir que al igual que la "ñ" ocupará 2 caracteres... por eso te dice que estás intentando guardar un multicaracter, en un caracter

una pequeña demostración

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. printf("%x\n", '?');
  5. printf("%x\n", '¿');
  6. printf("%x\n", '!');
  7. printf("%x\n", '¡');
  8. printf("%x\n", 'n');
  9. printf("%x\n", 'ñ');
  10. return 0;
  11. }
  12.  

para compararlo no es tan simple porque se asume que es una comparación entre char array (strings)
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
moliverac8

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #6 en: 6 Diciembre 2016, 17:21 pm »

Entiendo, la cuestión es que el ejercicio me pide que cuente los signos de puntuación de un .txt.
Podría no incluirlos en la cuenta, los que me comentas que nos son ASCII si no me queda otra opción...pero hay alguna forma de contarlos?
En línea

moliverac8

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #7 en: 6 Diciembre 2016, 17:29 pm »

Jaja suele suceder, a veces uno se estanca, por eso es bueno participar en estas comunidades  :rolleyes:

Copié tu código en mi IDE (C::B 16.01)

Lo compilé y todo figuraba bien, después me tomé el trabajo de modificar esto, agregando un carácter de más:

Código:
if (caracter == ',sd' || caracter == ';' |

caracter == ',sd' || caracter ==

Y recién ahí me tiró el warning de Multi-Character.

A vos te lo sigue tirando?? Si tu ide tiene la opción "Reconstruí" el proyecto entero.

Lo estoy compilando en la terminal de Ubuntu, mi profesor me pide que luego use el makefile y demás así que trato de no hacerlo todo con el NetBeans para acostumbrarme.
En línea

jvm1994

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #8 en: 6 Diciembre 2016, 17:36 pm »

No estoy lo suficientemente interiorizado en el tema por que mañana rindo dos finales y estoy estudiando pero a ver.

Podrías almacenar las palabras en una cadena y analizar el contenido de la cadena. (Palabra a palaba).

De esta manera podrías hacer unas funciones que busquen "esos caracteres que no son Standar de ASCII" y además adaptar tus otras funciones, pasarle esas cadenas por referencia y analizarlas.


Código
  1.  
  2. int main()
  3. {
  4. char cadena[100]; //Buffer de 100.
  5. FILE * pFile = fopen("archivo.txt", "r"); // Abrimos el archivo para lectura.
  6.  
  7. if(pFile != NULL) // Validamos que el puntero pFile apunte a algún lado. (Que exista)
  8. {
  9.    // Si existe comenzamos tu algoritmo.
  10.  
  11.    while(!feof(pFile)) // Mientras no se llegue al final del archivo, iteramos.
  12.    {
  13.        fscanf(pFile, "%s", cadena); // Cada vez que itere almacenará una palabra en cadena.
  14.  
  15.       // Funciones que analizan la cadena y retornan valores, que indican cosas
  16.      // Según tus necesidades, por ejemplo.. cantidad de caracteres..
  17.      // (Dentro de la funcion de cantidad de carecteres se puede evaluar si existen tales
  18.     // caracteres que no son standa del ascii)
  19.  
  20.    }
  21.  
  22. }
  23.  
  24. }
  25.  

No sé si sirve o si me explico, pero la idea quizá te ayude.

Analizar una cadena evitaría este error, sin embargo analizar carácter a carácter, no.
« Última modificación: 6 Diciembre 2016, 18:11 pm por jvm1994 » En línea

"La posibilidad de crear tu mundo."
Código
  1. int main()
  2. {
  3. eMundo * Own = world_new();
  4. if(Own != NULL)
  5. {
  6.    world_create(Own);
  7. }
  8.  
  9. return 0;
  10. }
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con un ejercicio
« Respuesta #9 en: 6 Diciembre 2016, 17:40 pm »

tienes que comparar 2 seguidos....

Código
  1. if (caracter == ',' || caracter == ';' || caracter == '.' || caracter == '?' || caracter == '¿' || caracter == '¡' || caracter == '!')
  2. puntu++;
  3. }
  4.  
  5. if (caracter == 0xc2 && siguiente_caracter == 0xbf){ // ¿
  6. puntu++;
  7. }
  8.  
  9.  

y hacer lo mismo con los otros, usa el código que te di antes de demostración para saber que valores comparar
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Ejercicio C 100
Ejercicios
Dem0ny 2 6,026 Último mensaje 19 Diciembre 2007, 22:45 pm
por Dem0ny
Ayuda co un ejercicio de C#
.NET (C#, VB.NET, ASP)
hitori batusai 2 5,342 Último mensaje 22 Febrero 2008, 01:53 am
por hitori batusai
Ayuda con ejercicio de VB
Programación Visual Basic
guada_sp 5 3,337 Último mensaje 8 Marzo 2008, 02:54 am
por ‭‭‭‭jackl007
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 15,721 Último mensaje 5 Septiembre 2010, 02:57 am
por TGa.
Ayuda ejercicio de Pascal, cuando uno no lo ve claro pide ayuda
Programación General
manu3742 1 3,229 Último mensaje 31 Marzo 2011, 15:43 pm
por d(-_-)b
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines