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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 125
1  Programación / Programación C/C++ / Re: Borrar números repetidos en vector en: 11 Mayo 2015, 08:55 am
Perdona, la respuesta que te puse no estaba bien redactada... hay que tener cuidado con los corchetes. En mi caso hay texto que desapareció.

Al igual que para usar la clase "vector" has de añadir "#include <vector>", para la clase "set" tienes que poner su include correspondiente :)
2  Programación / Programación C/C++ / Re: Borrar números repetidos en vector en: 8 Mayo 2015, 09:52 am
Código
  1. vecNumeros.erase(vecNumeros.begin()+1);

Esa línea está borrando SIEMPRE el segundo elemento del vector. Dado que supongo que tu idea es eliminar el elemento "x", tal vez deberías plantearte el cambiar ese "+1" por un "+x".

Por otro lado:

Código
  1. for(i=0; i<pos; i++)
  2. {
  3.  for(x=1; x<pos; x++)

Fíjate que se va a dar el caso que i==x, en tal circuntancia acabarías detectando, erróneamente, que tienes un elemento duplicado cuando no es así. "x" debería empezar en "i+1" para no comparar un elemento del vector consigo mismo. Además, cada vez que eliminas un elemento deberías retroceder el índice "x" una posición para no saltarte elementos (si borras v[ x ], el elemento que estaba en v[ x+1 ] pasa a estar en v[ x ])

PD.: un truco para cuando termines la práctica... el contenedor "set" tiene dos características importantes: sus elementos están ordenados y no admite duplicados. Estas propiedades las puedes aprovechar, en tu caso, de dos formas diferentes:

1.  Aprovechando que no admite duplicados. Desventaja: los elementos del vector aparecerán descolocados)

Código
  1. void vecBorrar(vector<int>&vecNumeros)
  2. {
  3.  // Declaramos y rellenamos el contenedor "set"
  4.  std::set< int > temporal( vecNumeros.begin( ), vecNumeros.end( ) );
  5.  
  6.  // Vaciamos el vector
  7.  vecNumeros.clear( );
  8.  
  9.  // Volcamos el contenido de "set", al vector. Aquí ya no hay duplicados
  10.  vecNumeros.insert( vecNumeros.begin( ), temporal.begin( ), temporal.end( ) );
  11. }

2. Preguntando al set si el elemento existe... si existe es que está duplicado:

Código
  1. void vecBorrar(vector<int>&vecNumeros)
  2. {
  3.  // Declaramos y rellenamos el contenedor "set"
  4.  std::set< int > temporal;
  5.  
  6.  for( int i=0; i < vecNumeros.size( ); i++ )
  7.  {
  8.    if( temporal.count( vecNumeros[ i ] ) == 0 )
  9.      temporal.insert( vecNumeros[ i ] ); // Número no duplicado
  10.    else
  11.    {
  12.      vecNumeros.erase( vecNumeros.begin( ) + i ); // Número duplicado. Lo borramos
  13.      i--; // Hay que retroceder una posición para evitar saltarnos elementos
  14.    }
  15.  }
  16. }

Un saludo
3  Programación / Programación C/C++ / Re: Array elementos repetidos en: 5 Mayo 2015, 17:32 pm
Tienes varias opciones. La primera se vale únicamente de tu código, el resto (lo he pensado mejor y solo pongo dos formas: la primera que será la que tengas que aplicar ahora y la segunda es más para que veas que no es necesario reinventar la rueda) usan funcionalidades de la STL

1. Paso a paso: Como los vectores originales están ordenados, puedes rellenar el vector final con el siguiente algoritmo:

  1. Partes de dos vectores iniciales, V1 y V2 y de un vector final V3.
  2. Inicializas los 'i' y 'j' a 0. 'i' iterará sobre el vector 'V1' y 'j' sobre el vector 'V2'
  3. Si el elemento V1[ i ] < V2[ j ]:
  3.1. añades V1[ i ] a V3
  3.2. incrementas 'i'
  3.3. Verificas que 'i' < n1:
  3.3.1. Si se cumple saltas al punto 3.
  3.3.2. Si no se cumple, añades todos los elementos que falten en V2 y sales
  4. En caso contrario, puede suceder que V1[ i ] == V2[ j ] o que V1[ i ] > V2[ j ]. A efectos prácticos las operaciones a realizar son las mismas. Básicamente repite los pasos comentados a partir de 3.1 pero para V2[ j ] y n2


2. usa el contenedor "set". Este contenedor tiene dos propiedades fundamentales:

* Sus elementos están siempre ordenados
* No admite duplicados

Después de almacenar todos los elementos en el set, vuelcas su contenido al vector resultado y... magia!!!

Código
  1. // Añadimos todos los elementos al contenedor "set"
  2. std::set contenedorTemporal;
  3. for( int i=0; i<n1; ++i )
  4.  contenedorTemporal.insert( V1[ i ] );
  5. for( int i=0; i<n2; ++i )
  6.  contenedorTempora.insert( V2[ i ] );
  7.  
  8. // Ahora volcamos el contenido a V3
  9. int* ptr = V3;
  10. for( auto it = contenedorTempora.begin( ); it != contenedorTemporal.end( ); ++it, ++ptr )
  11.  *ptr = *it;
  12. n3 = contenedorTemporal.size( ); // Actualizamos n3 para indicar el número de elementos en V3
  13. // En este punto, V3 tiene una lista de elementos ordenados y sin duplicados

Notas finales:

Acostúmbrate a usar nombres que signifiquen algo: n1, n2, n3, V1, V2, ... no dicen gran cosa y no ayudan demasiado en la lectura del código. No tengas miedo de usar nombres más largos... lo acabarás agradeciendo.
4  Programación / Programación C/C++ / Re: Cadena de caracteres. Ayuda urgente! en: 2 Mayo 2015, 20:06 pm
no me dejan hacer uso de alguna librería

la función strcmp que te comenté pertenece al estándar de C/C++, es más, está incluido en la librería "string".... esa que el profesor te pide utilizar.
5  Programación / Programación C/C++ / Re: ayuda con ejercicio en devc ++ en: 30 Abril 2015, 16:24 pm
¿eso es lo que tienes? ¿solo?

Es decir, no tienes nada más que el código que has expuesto??

Pues mira, empieza por implementar el algoritmo de la cola. Hasta que no sepas cómo funciona una cola no vas a tener la menor idea sobre qué operaciones tienes que realizar para hacer lo que te piden.

Por cierto, la cola es LIFO, FIFO o se trata símplemente de una lista enlazada??? Bueno, tampoco hace falta que respondas ahora... primero implementa el algoritmo de la cola :)

Un saludo
6  Programación / Programación C/C++ / Re: Cadena de caracteres. Ayuda urgente! en: 30 Abril 2015, 16:19 pm
Coincido con lo dicho con engel_lex.

De todas formas un apunte rápido:

Las cadenas no se pueden comparar usando el operador ==. Hay que usar strcmp o similares.

Código
  1. nombre==N[i]

Esa comparación de ahí arriba devolverá "false" SIEMPRE salvo que el puntero "nombre" y el puntero "N[ i ]" apunten a la misma posición de memoria... lo cual veo poco probable (por no decir imposible) dado tu código.

Si en vez de usar char* para las cadenas pasases a usar la clase "string", entonces sí que podrías usar de forma segura el operador de comparación.

Un saludo
7  Programación / Programación C/C++ / Re: me podrian revisar este programa de listas m da error en las ultima llave en: 29 Abril 2015, 14:49 pm
¿Por qué tiene tu código dos funciones "main"?
8  Programación / Programación C/C++ / Re: buenas este es el mismo programa de listas con etiquetas en: 29 Abril 2015, 14:48 pm
1. Llevas más de 130 mensajes escritos has tenido tiempo de sobra para saber que el código hay que decorarlo con las etiquetas GeSHi

2. ¿Eres capaz de escribir un texto que se entienda? si la respuesta es sí, ¿tánto te cuesta escribir algo legible en el foro? Que tampoco es que hayas escrito un resumen de El Quijote... son 16 palabras.

3. "Tengo un error". vale... cual es? No esperarás que me copie tu código y empiece a depurarlo para arreglar todos y cada uno de los errores que pueda tener, no?
9  Programación / Programación C/C++ / Re: [Ayuda] ¿Cuál es el problema en el código? en: 27 Abril 2015, 11:31 am
Gracias, me sirvió! También encontré otra solución utilizando el puntero this.

No es otra solución. En mi respuesta te puse este código:

Código
  1. Empleado::Empleado(long _DNI, char* _NomApe, int He, int Me, int Se, int Hs, int Ms, int Ss)
  2. : Persona(_DNI, _NomApe),
  3. {
  4. HorarioEntrada = Tiempo (He, Me, Se);
  5. HorarioSalida = Tiempo (Hs, Ms, Ss);
  6. }

El puntero "this" es un puntero implícito que está presente en todos los métodos y funciones no estáticos de una clase. Que no lo indiques explícitamente no quiere decir que no se esté usando. Es decir, el ejemplo que te puse es exactamente el mismo que este otro:

Código
  1. Empleado::Empleado(long _DNI, char* _NomApe, int He, int Me, int Se, int Hs, int Ms, int Ss)
  2. : Persona(_DNI, _NomApe),
  3. {
  4. this->HorarioEntrada = Tiempo (He, Me, Se);
  5. this->HorarioSalida = Tiempo (Hs, Ms, Ss);
  6. }

Ahora si bien el programa me funciona perfectamente, no termino de entenderlo bien. ¿Me podrías explicar un poco mas detallado como funciona esto? Gracias.

Código
  1. Empleado::Empleado(long _DNI, char* _NomApe, int He, int Me, int Se, int Hs, int Ms, int Ss)
  2.  : Persona(_DNI, _NomApe)
  3. {
  4. Tiempo HorarioEntrada(He, Me, Se);
  5. Tiempo HorarioSalida(Hs, Ms, Ss);
  6. }

Si te fijas, en tu código inicial estás creando dos variables, de tipo "Tiempo". Estas variables son, obviamente, locales, lo que implica que se perderán cuando la ejecución abandone este constructor.

Resulta que los nombres elegidos para estas variables coinciden con los de las variables miembro de la clase "Empleado", pero aún así siguen siendo variables diferentes.

Un ejemplo:

Código
  1. int main( )
  2. {
  3.  int i;
  4.  i = 0;
  5.  std::cout << "aqui vale 0: " << i << std::endl;
  6.  {
  7.    int i ;
  8.    i = 1;
  9.    std::cout << "aqui vale 1: " << i << std::endl;
  10.    {
  11.      int i;
  12.      i = 2;
  13.      std::cout << "aqui vale 2: " <<  i << std::endl;
  14.    }
  15.    std::cout << "aqui vuelve a valer 1: " << i << std::endl;
  16.  }
  17.  std::cout << "aqui vuelve a valer 0: " << i << std::endl;
  18. }

Lo que ha sucedido en el ejemplo anterior es que hemos creado 3 variables diferentes. Las 3 se llaman igual... pero eso es como si en tu clase te encuentras con dos compañeros que se llaman Luis... si tu pegas a uno al otro no le sale un moratón en el ojo así como por arte de magia, verdad? pues eso.

Cuando dos variables tienen el mismo nombre pero pertenecen a ámbitos diferentes (no puedes crear dos variables que se llamen igual dentro del mismo ámbito), el compilador pasará a usar aquella que sea más cercana al ámbito actual, es decir, la que sea "más local". Cuando se sale del ámbito de esta variable, el compilador la destruye y, si se sigue encontrando con conflictos, pasa a usar la siguiente más local.

Este fue el motivo que llevó a justificar el uso de "this". Dentro de una función cualquiera, incluidos constructores, los argumentos y las variables locales son "más locales" que las variables miembro de la clase. Si resulta que una variable local se llama igual que una variable miembro verás que es imposible acceder a dicha variable miembro salvo que uses "this". ¿Por qué con this si se puede? pues porque la variable local no es visible desde dicho puntero... por algo es una variable local.

Espero que con esto te haya quedado más claro el origen del problema.

Un saludo.
10  Programación / Programación C/C++ / Re: [Ayuda] ¿Cuál es el problema en el código? en: 27 Abril 2015, 09:27 am
Código
  1. Empleado::Empleado(long _DNI, char* _NomApe, int He, int Me, int Se, int Hs, int Ms, int Ss): Persona(_DNI, _NomApe){
  2.    Tiempo HorarioEntrada(He, Me, Se);
  3.    Tiempo HorarioSalida(Hs, Ms, Ss);
  4. }

En ese constructor estás creando dos variables locales llamdas "HorarioEntrada" y "HorarioSalida". Casualmente estos nombres coinciden con el de las variables miembro de "Empleado"... pero no son iguales. El resultado es que las variables miembro no van a almacenar esos datos.

Tienes dos opciones:

1. Mueves esas inicializaciones de sitio:

Código
  1. Empleado::Empleado(long _DNI, char* _NomApe, int He, int Me, int Se, int Hs, int Ms, int Ss)
  2.  : Persona(_DNI, _NomApe),
  3.    HorarioEntrada(He, Me, Se),
  4.    HorarioSalida(Hs, Ms, Ss)
  5. {
  6. }

2. Realizas una asignación:

Código
  1. Empleado::Empleado(long _DNI, char* _NomApe, int He, int Me, int Se, int Hs, int Ms, int Ss)
  2.  : Persona(_DNI, _NomApe),
  3. {
  4.  HorarioEntrada = Tiempo (He, Me, Se);
  5.  HorarioSalida = Tiempo (Hs, Ms, Ss);
  6. }

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