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ú

Mensajes - 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
Programación C/C++ / Re: Devolver un Array
3 Enero 2017, 15:24 PM
Para mi la mejor forma de lograr lo que propones es usar una clase que contenga como dato miembro un vector y definir en el main un objeto de dicha clase.

Si tienes alguna duda respecto al código no dudes en preguntarme y si tengo alguna cosa mal corregidme por favor, que yo también estoy empezando a aprender ahora.
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

class NumeroAleatorio{
public:
int vector[4];

void GeneradorAleatorios(){
int numeroaleatorio;
srand(time(NULL)); /** para crear numero aleatorio **/
    for(int i =0; i < 5; i++){
      numeroaleatorio = (rand()%9)+1;                                  //Este bucle recorre el vector(array) desde la posición 0 a la 4 y le va dando valores a cada uno de sus elementos.
    vector[i] = numeroaleatorio;
    }
                         /** Lo que  se hace es comparar el valor de las variables para poder asi cambiarlas, **/
                          /**   inicialmente se tiene que todos los numeros iguales, pero luego, por medio del bucle
                                                                            se hacen las comparaciones y asi asegurar que ningun numero se repetira **/
   while( vector[3]==vector[2]){
    numeroaleatorio = (rand()%9)+1;
    vector[2] = numeroaleatorio;
       }
    while (vector[3] == vector[1]|| vector[2] == vector[1]){
            numeroaleatorio = (rand()%9)+1;
    vector[1] = numeroaleatorio;
       }

   while (vector[3] == vector[0]|| vector[2] == vector[0]||vector[1] == vector[0]){
    numeroaleatorio = (rand()%9)+1;
    vector[0] = numeroaleatorio;
   }
}
};

int main(){
NumeroAleatorio mi_numero_aleatorio;
.....

mi_numero_aleatorio.GeneradorAleatorios(); //La llamada en el main se realizaría así

mi_numero_aleatorio.vector[<índice>]; //Para realizar las comparaciones se accedería de esta manera a cada elemento del vector.
}


*Nota: Yo suelo usar más variables a la hora de definir el vector y lo declaro como dato miembro privado para que no pueda ser modificado fuera de la clase si no es a través de alguno de sus métodos, he decidido hacerlo así porque simplifica mucho a la hora de entender un código. Espero que los más expertos lo entiendan.
#3
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.