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 - amchacon

#511
No te olvides de los punteros:
char* cadena = "Hola que tal";En esta ultima forma, es importante recalcar que no puedes modificar el contenido de la cadena. Aunque si puedes hacer que el puntero apunte a una cadena nueva:
Código (cpp) [Seleccionar]
char * cadena = "Hola que haces";
cadena = "cuentame lo que haces";
cadena = "el wasap, o que haces?";
#512
Programación C/C++ / Re: problemilla en c++
4 Septiembre 2013, 13:51 PM
Un método (algo chapuzero) es poner un getchar() al principio del codigo, si funciona hasta el getchar() ve avanzando. De esa forma identificaras la línea que da problemas.

Lo más probable que sea algún puntero.
#513
En la estructura, Información es un puntero y no un objeto. Si no inicializas el puntero te va a dar error.

Solución 1, convertirlo de puntero a objeto:

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

struct Datos {
       char *Nombre;
       int Edad;
};

struct Categorias {
       char *Deporte;
       int Atletas;
       Datos Informacion;
};

int main(int argc, char *argv[])
{
    Categorias *Otro= new Categorias[10];

    Otro[0].Informacion.Nombre = "Miau";

    return EXIT_SUCCESS;
}


Solución 2:

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

struct Datos {
       char *Nombre;
       int Edad;
};

struct Categorias {
       char *Deporte;
       int Atletas;
       Datos *Informacion;
};

int main(int argc, char *argv[])
{
    Categorias *Otro= new Categorias[10];

    Otro[0].Informacion = new Datos;

    Otro[0].Informacion->Nombre= "Oscar";

    return EXIT_SUCCESS;
}


Solución 3, usar un constructor que lo inicialize:

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

struct Datos {
       char *Nombre;
       int Edad;
};

struct Categorias {
       char *Deporte;
       int Atletas;
       Datos *Informacion;

       Categorias() { Informacion = new Datos;}
};

int main(int argc, char *argv[])
{
    Categorias *Otro= new Categorias[10];

    Otro[0].Informacion->Nombre= "Oscar";

    return EXIT_SUCCESS;
}


Solución 4, inicializar nombre desde un constructor:

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

struct Datos {
       char *Nombre;
       int Edad;

       Datos(char* nombre) : Nombre(nombre) {}
};

struct Categorias {
       char *Deporte;
       int Atletas;
       Datos *Informacion;

       Categorias(char* Nombre = NULL) { Informacion = new Datos(Nombre);}
};

int main(int argc, char *argv[])
{
    Categorias *Otro= new Categorias("Oscar");

    return EXIT_SUCCESS;
}

#514
Busqueda binaria.

El algoritmo es sencillo, tienes que ordenar el diccionario alfabeticamente. Haces la comparación con el elemento medio, puede pasar tres cosas:

- Que sea la palabra que buscas.
- Que esté después de la palabra que buscas. Descartas la segunda mitad.
- Que esté antes de la palabra que buscas. Descartas la primera mitad.

Vuelves ha hacer lo mismo en las palabras que te queden hasta que la encuentres. En cada comparación estarás descartando la mitad de las palabras cada vez ;)

Para hacer las comparaciones, puedes ayudarte de los operadores == y > de los strings.

PD: Por cierto, para leer una linea entera de un archivo tienes la función getline.
#515
Cita de: eferion en  1 Septiembre 2013, 11:29 AM
"fichero" es un objeto de tipo "ifstream". El problema que tienes es que getline no es una función válida como tal.
getline también puede usarse como una función, con sobrecarga para strings:
http://www.cplusplus.com/reference/string/string/getline/

El error está en que estás haciendo una copia del fichero para pasarlo a la función, tienes que pasarlo por referencia:

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void leerFichero(ifstream &fichero){

  string palabra;

  while(!fichero.eof()){

      getline(fichero,palabra,',');
      cout <<palabra;

  }

}

int main(int argc, char** argv) {

  ifstream fichero("personal.txt");

  if(fichero.is_open()){

      leerFichero(fichero);

  }else{

      cout <<"\nNo se pudo abrir el fichero";

  }

  return 0;
}
#516
Programación C/C++ / Re: PROBLEMA C++
24 Agosto 2013, 09:29 AM
const char Meses[12] = {"Enero","Febrero","Marzo","Avril",...};

Y para encontrar el mes:

int i = 0;
int Mes = 0;

for (i = 0; i < 12;i++)
{
   if (strcmp(Entrada,Meses[i]) == 0)
   {
       Mes = i+1;
       break;
   }
}

if (!Mes) puts("No se encontro el mes");
#517
Cita de: rir3760 en 23 Agosto 2013, 16:18 PM
Lo usual en un sistema con direcciones de 32 bits es acceder a 4GB de memoria (2^^32 es igual a 4,294,967,296).
Eso es para el SO. Los programas solo pueden adceder a 2 gb, lo pone en el mismo link  y es muy fácil demostrarlo:



https://dl.dropboxusercontent.com/u/69551225/Saturar_Memoria.exe

Como puedes ver, aún me queda más de 1 GB de memoria sin usar. Si compilo el programa en 64 bits, me ocupa toda la memoria.
#518
Programación C/C++ / Re: [Ayuda] Vectores
23 Agosto 2013, 17:04 PM
Cita de: bemone en 23 Agosto 2013, 16:01 PM
Con vector1 me refiero a vsNumeros y con vector2 a cartonGanador.
Pues el código es correcto, asi que el error debe estar en otra parte  :huh:

Los dos vectores tienen el mismo tamaño no?

Cita de: bemone en 23 Agosto 2013, 16:01 PMEn cuanto al vector lo puedo poner asi:
Código (cpp) [Seleccionar]
int Cartones::compararCartones(const Cartones &ganador){
    int coincidencias = 0;
    for(unsigned int i=0; i<ganador.getNumeros().size(); i++){
        if(ganador.getNumeros()[i] == 'X' && this->vsNumeros[i] == 'X'){
            this->vsNumeros[i] = 'A';
            coincidencias++;
        }
        else
            this->vsNumeros[i] = 'D';
    }
        return coincidencias;
}

Eso es peor, en cada iteración estas generando un vector nuevo *_*. Lo puedes dejar como estaba si eso, si es un vector de 10-20 números no supone tanta carga (lo malo sería si fuesen 1000 números xD).
#519
Programación C/C++ / Re: ¿Qué hago mal?
23 Agosto 2013, 12:46 PM
"No me cifra correctamente"

Vamos a ver, hay que ser más específico xD. Que entrada has introducido, que salida te sale y que salida debería salir.

De momento, te digo que no me convence el algoritmo. Exactamente en:

char cifrar(char *texto, int i)
{
char textoencriptado[200];

//aqui aplicamos la operacion matematica que queramos
//pero como el texto saldra cifrado, quien lo lea no podra saber en principio la operacion de encriptacion que se ha aplicado
if(texto[i]=='A') //asignamos unos valores aleatoriamente antes de ver, con los ultimos 6 else if, si el caracter a cifrar se encuentra en el rango especificado de valores,
//de esta manera, hacemos muy complicado encontrar una regla para descifrar el texto
textoencriptado[i]='.';
else if(texto[i]=='.')
textoencriptado[i]=' ';
else if(texto[i]==' ')
textoencriptado[i]='a';
else if(texto[i]=='b')
textoencriptado[i]='B';
else if(texto[i]=='e')
textoencriptado[i]='l';
else if(texto[i]=='+')
textoencriptado[i]='=';
else if(texto[i]=='?')
textoencriptado[i]='t';
else if(texto[i]=='3')
textoencriptado[i]='b';
else if(texto[i]=='9')
textoencriptado[i]='0';
else if(texto[i]=='e')
textoencriptado[i]='k';
else if(texto[i]=='n')
textoencriptado[i]='H';
else if(texto[i]=='i')
textoencriptado[i]='p';
else if(texto[i]=='Q')
textoencriptado[i]='s';
else if(texto[i]=='R')
textoencriptado[i]='x';
else if(texto[i]=='r')
textoencriptado[i]='E';
else if(texto[i]=='u')
textoencriptado[i]='0';
else if(texto[i]=='p')
textoencriptado[i]='d';
else if(texto[i]=='@')
textoencriptado[i]='Q';
else if(texto[i]=='d')
textoencriptado[i]='D';
else if(texto[i]==')')
textoencriptado[i]='I';
else if(texto[i]>='{')
textoencriptado[i]='(';
else if(texto[i]>='0' && texto[i]<=';')
textoencriptado[i]=texto[i]+'STX';
else if(texto[i]>='<' && texto[i]<='M')
textoencriptado[i]=texto[i]+'VT';
else if(texto[i]>'M' && texto[i]<='Z')
textoencriptado[i]=texto[i]+'SOH';
else if(texto[i]>=']' && texto[i]<='i')
textoencriptado[i]=texto[i]-'DC4';
else if(texto[i]<='j' && texto[i]<='u')
textoencriptado[i]=texto[i]-'ETX';

return textoencriptado[i];
}


Empezemos:

char textoencriptado[200];

¿Para que creas un array de 200 caracteres si luego devuelves uno?

Después has puesto una tabla de ifs muy larga y muy confusa, es muy fácil que se te escapen casos o te confundas... Yo haría un array global con las encriptaciones:
const char Encriptacion[28] = {'e','s','a',...};

Vas poniendo sus valores en orden alfabetico (el primer valor del array correspondera a la cifrado de la a, el segundo a la cifrado de la b...).

Y la funcion Cifrar seria algo tal que asi:

char cifrar(char texto)
{
  return Encriptacion[texto-'a'];
}


Otra cosa, en el codigo has puesto:
gets(texto);

Se recomiendo usar fgets en su lugar:
http://c.conclase.net/librerias/?ansifun=fgets
#520
Programación C/C++ / Re: [Ayuda] Vectores
23 Agosto 2013, 10:02 AM
¿A quien te refieres con vector1? ¿Al vsNumeros?

Por cierto, unos consejos de eficiencia:

Código (cpp) [Seleccionar]
int Cartones::compararCartones(Cartones ganador){

No pases el objeto entero, su copia supone un desperdicio de memoria y de tiempo de ejecución. Pasa una referencia en su lugar, y ya de paso lo haces constante:

Código (cpp) [Seleccionar]
int Cartones::compararCartones(const Cartones &ganador){

Por otro lado:

Código (cpp) [Seleccionar]
vector<char> cartonGanador = ganador.getNumeros();

Copiar un vector supone gastar muchos recursos. No sé si es mejor que devuelvas un puntero/referencia al vector, aunque eso supondría un encapsulamiento más débil.