Ayuda con un ejercicio

Iniciado por moliverac8, 5 Diciembre 2016, 20:27 PM

0 Miembros y 1 Visitante están viendo este tema.

moliverac8

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.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define X 400000

typedef struct {
int a;
int e;
int i;
int o;
int u;
} Vocales;

typedef struct {
int caracteres;
int palabras;
int puntuacion;
Vocales vocales;
} Datos;

int vocales(FILE *fp){
int a, suma = 0;
char cadena[X];
for (a = 0; a < X; a++) {
fscanf (fp, "%c", &cadena[a]);
if (cadena[a] == 'a' || cadena[a] == 'A')
suma++;
}
return suma;
}

int totales(FILE *fp){
int total = 0;
char cadena[X];
fscanf (fp, "%c", &cadena[X]);
total = strlen(cadena);
return total;

}

int palabras(FILE *fp){
char caracter;
int total;
while((caracter = getc(fp)) != EOF) {
if (caracter == ' ')
total++;
}
return total;
}


int main () {

int a, total, puntu;
char caracter;
Datos datos;

FILE *fp;
fp = fopen("quijote.txt", "r");

datos.vocales.a = vocales(fp);
datos.caracteres = totales(fp);
total = palabras(fp);

while((caracter = getc(fp)) != EOF) {
if (caracter == ',' || caracter == ';' || caracter == '.' || caracter == '?' || caracter == '¿' || caracter == '¡' || caracter == '!')
puntu++;
}





printf ("%d, %d, %d, %d\n", datos.vocales.a, datos.caracteres, total, puntu);

return (1);

}

jvm1994

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

Cita de: http://c.conclase.net/librerias/index.php/?ansifun=getcValor 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.
"La posibilidad de crear tu mundo."

int main()
{
eMundo * Own = world_new();
if(Own != NULL)
{
    world_create(Own);
}

return 0;
}

moliverac8

Dios muchas gracias, estaba ya desesperado con el ejercicio jajaja,

moliverac8

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?

jvm1994

#4
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:

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.
"La posibilidad de crear tu mundo."

int main()
{
eMundo * Own = world_new();
if(Own != NULL)
{
    world_create(Own);
}

return 0;
}

engel lex

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

#include <stdio.h>

int main() {
printf("%x\n", '?');
printf("%x\n", '¿');
printf("%x\n", '!');
printf("%x\n", '¡');
printf("%x\n", 'n');
printf("%x\n", 'ñ');
return 0;
}


para compararlo no es tan simple porque se asume que es una comparación entre char array (strings)
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

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?

moliverac8

Cita de: jvm1994 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:

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.

jvm1994

#8
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.




int main()
{
char cadena[100]; //Buffer de 100.
FILE * pFile = fopen("archivo.txt", "r"); // Abrimos el archivo para lectura.

if(pFile != NULL) // Validamos que el puntero pFile apunte a algún lado. (Que exista)
{
   // Si existe comenzamos tu algoritmo.

   while(!feof(pFile)) // Mientras no se llegue al final del archivo, iteramos.
   {
       fscanf(pFile, "%s", cadena); // Cada vez que itere almacenará una palabra en cadena.
   
      // Funciones que analizan la cadena y retornan valores, que indican cosas
     // Según tus necesidades, por ejemplo.. cantidad de caracteres..
     // (Dentro de la funcion de cantidad de carecteres se puede evaluar si existen tales
    // caracteres que no son standa del ascii)

   }

}

}


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.
"La posibilidad de crear tu mundo."

int main()
{
eMundo * Own = world_new();
if(Own != NULL)
{
    world_create(Own);
}

return 0;
}

engel lex

tienes que comparar 2 seguidos....

if (caracter == ',' || caracter == ';' || caracter == '.' || caracter == '?' || caracter == '¿' || caracter == '¡' || caracter == '!')
puntu++;
}

if (caracter == 0xc2 && siguiente_caracter == 0xbf){ // ¿
puntu++;
}



y hacer lo mismo con los otros, usa el código que te di antes de demostración para saber que valores comparar
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.