Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Temas - TheFlash

#1
La idea es que tengo dos vectores(arrays) y quiero insertar el contenido del primero en una posición específica del segundo.

He encontrado una forma ineficiente de hacerlo:
Código (cpp) [Seleccionar]

InsertaSecuencia(SecuenciaCaracteres a_insertar, int posicion){
for(int i=0; i < a_insertar.total_utilizados; i++){

     if (total_utilizados < TAMANIO  &&  pos_insercion >= 0   
         && posicion <= total_utilizados){

         for (int i = total_utilizados ; i > posicion ; i--)
            vector_privado[i] = vector_privado[i-1];

         vector_privado[posicion] = a_insertar.vector_privado[i];
         total_utilizados++;
         posicion++;
      }
}

*Nota: Se trata de un método dentro de una clase. Por eso muchas de las variables no están declaradas.

Pero la idea, y lo que me pide el ejercicio es hacer un algoritmo que haga lo mismo pero haciendo uso de un solo bucle.
#2
Espero que me podais echar una manilla porque por más que lo reviso no se donde puede estar el fallo ya que el código compila perfectamente, el problema está en que cuando lo ejecuto me salta una ventana emergente que dice que el programa dejó de funcionar. Mi hipótesis es que el fallo está en que el programa intenta acceder a una dirección de memoria a la que no tiene acceso por lo que el sistema operativo aborta automáticamente la ejecución del programa, pero como he dicho no se donde puede estar el fallo.

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std ;
class SecuenciaEnteros{
private:
  static const int TAMANIO = 50;
  long vector_privado[TAMANIO];
  int total_utilizados;
public:
     ......
};
class SecuenciaCaracteres{
private:
  static const int TAMANIO = 2e6;
  char vector_privado[TAMANIO];
  int total_utilizados;
  }

public:
    ............

FrecuenciaCaracter Moda(){
     
     SecuenciaCaracteres procesados;
     FrecuenciaCaracter moda;
     char caracter_actual;
SecuenciaEnteros conteo_frecuencia;
     bool encontrado;

     moda.frecuencia = 0;

     for (int i = 0 ; i < total_utilizados ; i++){
        caracter_actual = vector_privado[i];
        encontrado = false;
       
        for (int j = 0; j < procesados.TotalUtilizados() && !encontrado; j++){
           if (caracter_actual == procesados.vector_privado[j])
              encontrado = true;
        }

        if (! encontrado){
           procesados.Aniade(caracter_actual);
           conteo_frecuencia = procesados.PosicionesOcurrencias(caracter_actual, i, procesados.total_utilizados);

           if (conteo_frecuencia.TotalUtilizados() > moda.frecuencia) {
              moda.frecuencia = conteo_frecuencia.TotalUtilizados();
              moda.caracter   = caracter_actual;
           }
        }
     }

     return moda;
}

  SecuenciaEnteros PosicionesOcurrencias(char buscado, int izq, int der){
     SecuenciaEnteros conteo_frecuencia;

     for (int k = izq ; k <= der ; k++)
              if (buscado == vector_privado[k])
                 conteo_frecuencia.Aniade(k);

     return conteo_frecuencia;
  }
SecuenciaCaracteres Descodifica(){
SecuenciaCaracteres descodificado;
bool anterior_es_blanco;
int i, siguiente;

  i = 0;
  anterior_es_blanco = true;

  while (i < total_utilizados){
     siguiente = i+1;

     if (vector_privado[i] != ' '){
        if (anterior_es_blanco ||
           (siguiente < total_utilizados && vector_privado[siguiente] == ' ')){
             
           descodificado.Aniade(vector_privado[i]);
        }

        anterior_es_blanco = false;
     }
     else
        anterior_es_blanco = true;

     i = siguiente;
     
  return descodificado;
  }
  }
};
int main(){
  const char TERMINADOR = '#';
  char caracter;
  SecuenciaCaracteres mi_moda;
  FrecuenciaCaracter moda;

  //Entrada de datos
  cout << "Moda."
       << "\nIntroduzca caracteres con terminador " << TERMINADOR << "\n";
  caracter = cin.get();
  while(caracter != TERMINADOR && mi_moda.TotalUtilizados() < mi_moda.Capacidad()){
  mi_moda.Aniade(caracter);
  caracter = cin.get();
  }

  moda = mi_moda.Moda();


cout << "\nModa:       " << "<" << moda.caracter << ">"
       << "\nFrecuencia: " << moda.frecuencia;
}


He cortado un poco el código para que no sea tan largo ya que cada clase tiene multitud de métodos que no vienen al caso ahora. Comento un poco el objetivo del programa para que sepais por donde van los tiros más o menos. La idea es ir introduciendo caracteres en un vector creando un objeto de la clase SecuenciaCaracteres y que el método Moda() te calcule el caracter más repetido y su número de repeticiones.

*Nota: El ejercicio tiene que hacerse de la forma planteada,  ya que anteriormente ya he tenido que hacerlo de formas alternativas.

Por cierto, si podeis echarle un vistazo también al método Descodifica os lo agradecería, porque también me ha dado problemas en otro de los ejercicios.