Ocurrencia de palabras en c++!!

Iniciado por Norberto2.0, 3 Mayo 2011, 06:11 AM

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

Norberto2.0

He intentado de mil formas hacerlo, pero no me sale, soy principiante;
1.   Permitir que el usuario especifique el nombre del archivo a analizar en una línea de comando. 
2.   Si no ingresa un nombre de archivo, los datos se tomaran de la entrada estándar (cin), terminando el texto con una línea que contenga sólo el carácter 0.
3.   La salida debe contener las palabras y su frecuencia de aparición, una palabra por línea y en orden descendente.
Requerimientos de implementación detallados
1.   Lea las palabras  y almacénelas en una variable de tipo string utilizando el operador de entrada estándar (<<).
2.   Use operaciones de la clase string y funciones de ctype para convertir todas las palabras a letras minúsculas y separar caracteres de puntuación de las mismas.
3.   Defina una clase Tabla, que contenga un arreglo, cuyas componentes  incluyan cada palabra y su frecuencia de aparición. Defina como una constante el tamaño máximo del arreglo (por ejemplo 1000).
4.   La clase Tabla debe contener al menos las siguientes funciones:
a)   void agrega(string pal), agrega pal al arreglo si su  primera aparación e inicializa la frecuencia en 1. Si no, si ya existe pal en el arreglo, incrementa su frecuencia en 1
b)    void ordena(void), ordena el arreglo de acuerdo a la componente frecuencia. a map container to accumulate the frequency counts for each word. The word can be used as the key.
c) void despliega(void), imprime en la salida estándar el arreglo ordenado, graficando la frecuencia de aparición de cada palabra.

es mas el main, y los metodos que me cuestan, necesito hacer un inventario, pero con este programa simplificaria bastante mi proyecto. gracias

ssaammuu

Vas a tener que enseñar el código que has intentando crear y/o que partes no puedes hacer porque nadie va a crear el programa entero por ti.

Norberto2.0

este es mi archivo tabla.h, debo implementar los metodos, pero cuando lo hago me itra un error en la linea del tabla.cpp; #include "tabla.h"

#ifndef TABLA_H
#define TABLA
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>


using namespace std;


class Tabla {
      private:
              const int max = 100;
              string miarreglo[][] = new String [max,2];
             
      public:
           void agrega(string pal); // agrega pal al arreglo e inicializa su frecuencia en 1, si ya esta pal, aumenta la frecuencia en 1.
           void ordena(void); // ordena el arreglo de acuerdo a su frecuencia(una variable puede guardar la frecuencia de la palabra, siendo la palabra su clave)
           void despliega(void);//imprime en la salida estándar el arreglo ordenado, graficando la frecuencia de aparición de cada palabra.

   
};
#endif

ssaammuu

#3

const int max = 100;
string miarreglo[][] = new String [max,2];

No puedes asignarles el valor en la cabecera. Eso debes hacerlo en tabla.cpp A lo mejor te conviene definir max fuera de la clase y tener
string miarreglo[max][2];

También te estás olvidando del constructor y destructor, si quieres crear objetos de la clase vas a necesitarlos.

Norberto2.0

ya cree el constructor =)
pero me sigue tirando error en el tabla.cpp
en la linea de
#include "tabla.h"

Norberto2.0

eso hice ahora =)

Citar
#ifndef TABLA_H
#define TABLA
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>


using namespace std;
const int max = 100;

class Tabla {
      private:
              string miarreglo[max][2];
             
      public:
             Tabla(void){
                    for (int i=0;i<100;i++){
                        miarreglo[][] = ["",0];
             }
             void agrega(string); // agrega pal al arreglo e inicializa su frecuencia en 1, si ya esta pal, aumenta la frecuencia en 1.
             void ordena(void); // ordena el arreglo de acuerdo a su frecuencia(una variable puede guardar la frecuencia de la palabra, siendo la palabra su clave)
             void despliega(void);//imprime en la salida estándar el arreglo ordenado, graficando la frecuencia de aparición de cada palabra.

   
};
#endif


ssaammuu

Primero que te falta un }
En C/C++

miarreglo[][] = ["",0];

Esto no lo puedes hacer

En todo caso:

for (int i=0;i<100;i++){
      miarreglo[i][0] = "";
      miarreglo[i][1] = "";
}

Norberto2.0

gracias.. en el metodo agregar
Citar
void Tabla::agrega(string pal){
       for (int j=0; j<max; j++){
           if(miarreglo[j][j]==pal){
                   miarreglo[j][j]= miarreglo(j,1);
           }
           else{
                aqui como  agrego pal?}
       }
}


eso es correcto?

ssaammuu

No se lo que intentas hacer pero de momento te puedo decir que no es correcto por la sintaxis.
miarreglo[j][j]= miarreglo(j,1);

Me parece que tu lo que quieres es un arreglo de palabras con su respectivo número de apariciones. Si es eso vas a tener que declarar una estructura y despues tener una pila de esa estructura o mejor aun, un vector.

struct sPalabra{
    string palabra;
    int numero;
};

class Tabla {
      private:
              vector<sPalabra> misPalabras;

      public:
             void agrega(string); // agrega pal al arreglo e inicializa su frecuencia en 1, si ya esta pal, aumenta la frecuencia en 1.
             void ordena(void); // ordena el arreglo de acuerdo a su frecuencia(una variable puede guardar la frecuencia de la palabra, siendo la palabra su clave)
             void despliega(void);//imprime en la salida estándar el arreglo ordenado, graficando la frecuencia de aparición de cada palabra.

};


Puedes agregar de esta manera

void Tabla::agrega(string palabra){
    //comprobamos todas las palabras y si se encuentra incrementa el numero
    for (int i=0;i<misPalabras.size();i++){
        if (misPalabras[i].palabra==palabra){
        misPalabras[i].numero++;
        return;
        }
    }
    //si no la agregamos
    misPalabras.push_back(sPalabra{palabra,1});
};


Pero, la verdad es que por la forma de intentar declarar arreglos, tendrías que aprender lo básico antes de saltar a las clases ya que si no te va a costar mucho avanzar.