elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 125
41  Programación / Programación C/C++ / Re: Necesito ayuda en este codigo please en: 12 Marzo 2015, 08:35 am
Código
  1. if((*it) == borrar){      
  2.                       NomEst.erase(it);
  3.                       --it;

Una vez que haces "erase", el iterador que has utilizado deja de ser válido, ya que el elemento al que apunta deja de pertenecer al vector. Cualquier operación sobre ese vector que realices después del "erase" es una operación no válida.

Para hacer esto tienes varias opciones. Yo te comento dos de ellas:

1. Creas un iterador temporal y después borras el elemento. De esta forma conservas un iterador válido después de la operación:

Código
  1. if((*it) == borrar){
  2.  std::vector< std::string > itTemp = it--;
  3.  NomEst.erase( itTemp );

Porque claro, el iterador sobre el que se hace "erase" deja de ser válido... pero el resto de iteradores siguen siendo totalmente válidos.

El problema que tiene este sistema es que si intentas eliminar el primer elemento del vector, it-- resulta entonces en una operación no válida. Puedes intentar hacer una lógica un poco más completa para detectar esta situación y actuar en consecuencia, o puedes pasar a la otra opción.

2. Hacer uso de la STL para marcar los elementos a borrar. Hay una función en la STL llamada "remove". Esta función itera un contenedor y ejecuta una comprobación sobre cada elemento. Si la condición resulta positiva, marca el elemento para eliminar. Al finalizar la función, los elementos a borrar se encontrarán al final del vector, por lo que nos podemos cargar todos de un plumazo borrando un rango de iteradores.

Código
  1. std::vector< std::string > itEnd = std::remove( NomEst.begin( ), NomEst.end( ), nombre );
  2. NomEst.erase( itEnd, NomEst.end( ) );

"remove" pertenece a la librería "algorithm"

También existe la función "remove_if". Si bien esta variante es mucho más potente, puesto que permite usar una función personalizada para detectar los elementos a eliminar, es un pelín más compleja de usar y no merece la pena en este caso tan sencillo. Te lo comento por si te pica la curiosidad y quieres investigar un poco más sobre el tema.

En cuanto a tu problema con la búsqueda... fflush no se puede usar con buffer de entrada y stdin es un buffer de entrada. Conclusión, esa línea no debería estar en tu programa. Si necesitas borrar el buffer de entrada hay otros mecanismos, buscando en google encontrarás algunos), pero no creo que necesites limpiarlo en tu caso.

Un saludo.
42  Programación / Programación C/C++ / Re: Necesito ayuda en este codigo please en: 11 Marzo 2015, 15:54 pm
Código
  1. void setNomEst(vector<string> pNomEst){NomEst = pNomEst;}

El código funciona, hasta ahí todo bien. Sin embargo te pongo un pequeño "pero". En la función de arriba, pNomEst va a ser una copia del vector que pases como parámetro. Una vez hecha la copia, el contenido de pNomEst se va a copiar en la variable interna NomEst, es decir, vas a copiar el puntero dos veces.

Este comportamiento suele ser algo a evitar por cuestiones de rendimiento. Puedes evitar una de las dos copias pasando el argumento por referencia en vez de por valor:

Código
  1. void setNomEst(const vector<string>& pNomEst){NomEst = pNomEst;}

Añadimos "const" porque la referencia se comporta, a efectos prácticos, como un puntero. Dado que no se desea que "pNomEst" cambie dentro de esta función, lo suyo es etiquetar la variable como "const" para asegurarnos.

Un saludo
43  Programación / Programación C/C++ / Re: Programa para C++ en: 11 Marzo 2015, 14:47 pm
Lo actual ahora no venia siendo C++14?
44  Programación / Programación C/C++ / Re: Consulta - Empezar por librería [C++] en: 10 Marzo 2015, 17:33 pm
una librería no es más que un "paquete" de clases y funciones que puedes usar para añadir funcionalidad a tu aplicación. Usar librerías no implica crear aplicaciones gráficas, así como el diseño de aplicaciones gráficas no implica usar librerías.

Las librerías pueden ser estáticas o dinámicas. Las estáticas se empaquetan junto al ejecutable en tiempo de compilación (un ejemplo lo tienes en la librería estándar de C o C++). Las dinámicas son archivos independientes que se enlazan en tiempo de ejecución.

En cuanto al tema de aplicaciones gráficas. Todos los sistemas gráficos que uses en windows van a usar, antes o después, la API de Windows. Sin embargo, aunque todos acaben pasando por ese aro, eso es totalmente transparente para tí. Cada librería gráfica tiene sus ventajas y sus inconvenientes. La cosa es que cates varios sistemas y eligas con cual te quedas.

Algunos ejemplos de librerías gráficas:

* API de Windows
* MFC (solo si programas con VS)
* Qt
* wxWidgets

Si preguntas por preferencias, lo dicho, cada uno te dirá una diferente. Sin embargo no suele haber un claro ganador en este punto.

Un saludo.
45  Programación / Programación C/C++ / Re: Alguien que me ayude a hacer este codigo mas eficiente en: 10 Marzo 2015, 09:10 am
Pero vamos a ver... ¿cuánto puede tardar en ejecutarse este código? ¿Media milésima de segundo? ¿una milésima?

Vamos, a no ser que estés cargando una base de datos con 200.000.000.000 registros no creo que consigas notar diferencia alguna entre tu código y uno totalmente optimizado.

Pero tu mismo:

Los objetos pesados se pasan por referencia, no por valor.

Código
  1. cEstudiante(string vnomv) : nomv(vnomv){}

En esa línea estás creando un string temporal que, posteriormente, se usará para asignar el valor de "nomv". En tu código no vas a notar ningúna diferencia, pero es bastante más óptimo pasar los strings por referencia para evitar la creación de objetos temporales:

Código
  1. cEstudiante(const string& vnomv) : nomv(vnomv){}

No uses system

Las llamadas a "system" son muy lentas. Es mucho más eficiente programarte tu propia rutina que espere una pulsación del teclado.

Evita la copia innecesaria de objetos

Código
  1. cEstudiante runEstudiante = vEstudiante[i];

Ahí estás haciendo una copia de vEstudiante. Después de esa línea "runEstudiante" y "vEstudiante" son dos objetos independientes... estas copias consumen tiempo de ejecución y memoria.

Puedes evitar la copia usando referencias o haciendo uso de iteradores:

Código
  1. cEstudiante& runEstudiante = vEstudiante[i];

Código
  1. std::vector< cEstudiante >::iterator it, itEnd = vEstudiante.end( );
  2. for (it = vEstudiante.begin( ); it != itEnd; ++it )
  3. {
  4.  if( it->nomv == NomEst)
  5.    cont++;
  6. }

fflush es solo para buffer de salida

Código
  1. fflush(stdin);

Esa línea tienes que evitarla a toda costa. fflush, de acuerdo con el estándar, está pensado para vaciar un buffer de salida, no un buffer de entrada. Dependiendo del sistema operativo esta línea te puede dar problemas.

Y con esto ya tienes algo con lo que empezar. Aunque no esperes notar demasiada diferencia... si tu programa hiciese cálculos matemáticos intensivos todavía... pero manejar un vector de 20 o 30 objetos...
46  Programación / Programación C/C++ / Re: Consulta - Introducir varios datos en Struct [C++] en: 9 Marzo 2015, 17:49 pm
Iteras el array y, para cada elemento, compruebas si los parámetros de dicho elemento coinciden con los buscados:

Código
  1. std::string nombre;
  2. std::cout << "Nombre del trabajador: " << std::endl;
  3. std::cin >> nombre;
  4.  
  5. for( int i=0; i < 20; i++ )
  6. {
  7.  if ( Trabajador[i].nombre == nombre )
  8.  {
  9.    std::cout << "Nombre: " << Trabajador[i].nombre << std::endl;
  10.    std::cout << "Edad: " << Trabajador[num].edad << std::endl;
  11.    std::cout << "Empresa: " << Trabajador[num].empresa << std::endl;
  12.  }
  13. }

PD.: si usas "new", asegúrate de hacer "delete" cuando ya no vayas a usar el array para liberar la memoria
47  Programación / Programación C/C++ / Re: Consulta - Introducir varios datos en Struct [C++] en: 9 Marzo 2015, 16:35 pm
Lo normal es que la declaración del struct se haga fuera de la función:

Código
  1. struct Personaje{
  2.  char nombre[30];
  3.  int edad;
  4.  char empresa[30];
  5. };
  6.  
  7. int main( )
  8. {
  9.  struct Personaje Trabajador;
  10. }

Partiendo de esta base, para no guarrear mucho el código, siempre puedes crear un array fijo de elementos:

Código
  1. int main( )
  2. {
  3.  int i;
  4.  struct Personaje Trabajadores[20];
  5.  for( i=0; i < 20; ++i )
  6.    Trabajadores[ i ].edad = 20 + i;
  7. }

El ejemplo anterior crea un array de 20 elementos de tipo "Personaje". El bucle, para mostrarte un ejemplo sobre cómo se puede acceder a los elementos de ese array, asigna una edad a cada uno de ellos: 20 al primero, 21 al segundo, 22 al siguiente y así.

Esto es con arrays de tamaño fijo. También puedes crearlos del tamaño que tu quieras haciendo uso de la memoria dinámica:

Código
  1. int main( )
  2. {
  3.  int i;
  4.  struct Personaje *Trabajadores = (struct Personaje*)malloc( 20 * sizeof( struct Personaje ) );
  5.  for( i=0; i < 20; ++i )
  6.    Trabajadores[ i ].edad = 20 + i;
  7.  
  8.  free( Trabajadores );
  9. }

En el caso de la memoria dinámica, hay que acordarse de liberar luego esta memoria para poder reutilizarla en el futuro.

Un saludo.
48  Programación / Programación C/C++ / Re: Alguien que me ayude a hacer este codigo mas eficiente en: 9 Marzo 2015, 09:39 am
¿De verdad te preocupa la eficiencia de este código?
49  Programación / Programación C/C++ / Re: recorrer arrays en: 9 Marzo 2015, 08:20 am
No se hacen tareas. Publica tu código y tus dudas o no vas a recibir ninguna respuesta.

Un saludo
50  Programación / Programación C/C++ / Re: Error en clase circulo en: 6 Marzo 2015, 20:20 pm
otra cosa:

Código
  1. class Circulo
  2. {
  3.  // ...
  4.  char *Color;
  5. };

Con esa declaración de "Color"...

Código
  1. Circulo::Circulo() //por defecto
  2. {
  3.    strcpy(Color,"");
  4. }

Esa copia va a fallar... Color no apunta a ninguna dirección de memoria válida.

Y esta otra asignación:

Código
  1. Circulo::Circulo(float x,float y,unsigned diam,char *Color) //parametrizado
  2. {
  3.    this->Color= Color;
  4. }

Puede darte problemas, ya que los dos char* apuntan al mismo sitio... si modificas una de las dos cadenas la otra también va a cambiar:

Código
  1. int main( )
  2. {
  3.  char cad1[10];
  4.  strcpy( cad1, "Test" );
  5.  
  6.  Circulo circulo( 1, 2, cad );
  7.  
  8.    strcpy( cad1, "Hola" );
  9.  
  10.    std::cout << cad1 << std::endl;
  11.    std::cout << circulo.Color << std::endl; // Pon Color en el public para que esto compile.
  12. }

Y lo mismo con el constructor copia. No es un fallo como tal pero te puede dar problemas.

Un saludo.
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines