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

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 ... 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ... 125
341  Programación / Programación C/C++ / Re: Ayuda! en: 28 Junio 2014, 16:26 pm
si por aumentar i te refieres a i=1+1 ... que es como tienes en tu código... ahí i va a valer SIEMPRE 2... luego NUNCA va a alcanzar el valor necesario para que el código abandone el bucle... ahí es donde entra la parte de aprender a usar el depurador... si usas el depurador este problema lo ves en seguida porque te das cuenta de que i no cambia su valor en la vida.
342  Programación / Programación C/C++ / Re: Programa para distinguir palindromos: en: 27 Junio 2014, 12:55 pm
Respeta la nomenclatura de las funciones

Todas las funciones en C y C++ tienen la siguiente forma:

Código:
TIPO_RETORNO nombreFuncion( [ARGUMENTOS] ){ }

En tu caso, palindromo no respeta esta nomenclatura ya que, por ejemplo, no tiene los paréntesis (nota que "argumentos" está entre corchetes... esto es porque son opcionales... sin embargo el resto es obligatorio).

No uses variables globales

Es muy cómodo declarar una variable global al inicio del programa y después olvidarse de pasar argumentos a las funciones. El pero es que esta forma de trabajar provoca más problemas que beneficios.

Declarar una variable dentro de una función es prácticamente gratis y usar los argumentos te permite aislar el código de forma más eficaz. Además el código queda mucho más legible.

Para gestionar cadenas, usa char* o, mejor aún, la clase string

char únicamente permite almacenar un carácter. Es decir, para leer una cadena necesitas un array de caracteres. Los arrays de caracteres se declaran tal que "char* cadena". Eso sí has de tener en cuenta que ahora cadena es un puntero y hay que tener cuidado a la hora de utilizar punteros.

Por ejemplo, para copiar una cadena de caracteres en otra no puedes hacer "cadena1 = cadena2" como queda claro con el siguiente ejemplo:

Código
  1. char cadena1[10] = "Hola";
  2. char *cadena2;
  3.  
  4. cadena2 = cadena1;
  5.  
  6. cadena2[ 0 ] = 'S';
  7.  
  8. // Imprime por pantalla: Sola
  9. std::cout << cadena1 << std::endl;

Lo que hace la asignación es que el puntero "cadena2" apunta al mismo sitio que "cadena1", por lo que cualquier cambio que se haga en una de las variables afecta directamente a la otra. La forma correcta de copiar cadenas de caracteres es (una de ellas):

Código
  1. char cadena1[10] = "Hola";
  2. char cadena2[10];
  3.  
  4. strcpy( cadena2, cadena1 );
  5.  
  6. cadena2[ 0 ] = 'S';
  7.  
  8. // Imprime por pantalla: Hola
  9. std::cout << cadena1 << std::endl;

Nota para los del foro: Se que hay formas más seguras de copiar las cadenas de caracteres... esto es un ejemplo ;)

La opción b es hacer uso de una clase diseñada específicamente para gestionar cadenas de caracteres. Hablo de la clase string. string se encarga de hacer todas las operaciones engorrosas de los arrays de caracteres de forma transparente para el programador:

Código
  1. std::string cadena1 = "Hola";
  2. std::string cadena2;
  3.  
  4. cadena2 = cadena1;
  5.  
  6. cadena2[ 0 ] = 'S';
  7.  
  8. // Imprime por pantalla: Hola
  9. std::cout << cadena1 << std::endl;

Además, string dispone de otras tantas "cosas buenas":

Código
  1. std::string cadena = "ABCDEF";
  2. std::string cadena2 = cadena + "GHI";
  3.  
  4. std::cout << "Contenido:" << cadena << std::endl;
  5. std::cout << "Longitud: " << cadena.size( ) << std::endl;
  6. std::cout << "Probando la concatenacion: " << cadena2 << std::endl;
  7. // ...

Aprende a leer los mensajes de error de compilación

Al principio te costará, pero es un paso necesario con el que tienes que pegarte. El compilador te va a dar mucha información, pero has de saber interpretarla correctamente. No tengas miedo a pegarte con ello.

Aprende a usar los depuradores de código

Después de entender los mensajes de compilación, el siguiente paso es meterse de lleno en la depuración de código. Mano de santo para corregir errores a la hora de diseñar la algoritmia de la aplicación.
343  Programación / Programación C/C++ / Re: Consulta C++ en: 27 Junio 2014, 12:38 pm
a que como he contemplado en unas librerías ya trae para hacer todo sus sockets, etc.. pero me gustaría saber si se pueden unir... por ejemplo desde la línea 0 hasta la 10 de código C++ y de la 11 hasta la 20 de código OpenGl.

Pues en esa línea no queda nada claro... a ver.

Si tu haces uso de una librería opengl o cualquier otra... lo que sucederá es que tu código acabará llamando en algún momento a funciones o clases pertenecientes a dicha librería... es decir, siempre será código C o C++ o el que uses... no va a ser código opengl.

No se si me explico.

Obviamente utilizar una librería en tu programa no te limita a tener que hacer llamadas a dicha librería en todas y cada una de las líneas de tu código... simplemente pasa a ser parte de tu programa y tu haces uso de las utilidades de dicha librería cuando te viene bien.
344  Programación / Programación C/C++ / Re: Consulta C++ en: 27 Junio 2014, 12:15 pm
opengl no es un lenguaje de programación... es una librería que proporciona capacidades gráficas a tu aplicación. Esto quiere decir que para usar opengl en tu programa necesitas un lenguaje de programación, que puede ser casi el que te de la gana: C, C++, C#, Java, pascal, VB, ...
345  Programación / Programación C/C++ / Re: Datos por claves en: 27 Junio 2014, 11:14 am
auto es una palabra reservada de C++. Aparece a partir de C++11, por lo que si estás compilando con un compilador antiguo o que no tenga activa la opción C++11 (por ejemplo para MinGw hay que compilar con uno de estos dos flags, depende de la versión: -std=c++0x -std=c++11 )

lo que hace auto es dejar al compilador elegir el tipo de dato:

Código
  1. auto valor1 = 1; // valor sera de tipo int
  2. auto valor2 = 14.5; // valor sera de tipo double

En el caso que ocupa el ejemplo, las siguientes dos líneas son equivalentes:

Código
  1. auto it = elementos.begin( );
  2. std::vector< std::pair< std::string, int > >::iterator it = elementos.begin( );

Aquí se ve claro el motivo por el que uso "auto" en vez de su declaración formal, por claridad.

La otra ventaja que tiene usar "auto" es que si cambio la definición del contenedor no tengo que actualizar el uso del iterador, ya que "auto" hace ese trabajo por mí :). Eso sí, esta palabra es mejor usarla con cuidado porque puede complicar la lectura del código y dar problemas si se usa de forma indiscriminada.

Ya que estamos hablando de esto, it es un iterador. Los iteradores se utilizan para recorrer contenedores en general. Es un elemento muy interesante e importante y saberlo usar aporta bastante potencia a la gestión de contenedores.

En este caso, el bucle for lo que está haciendo es crear un iterador que apunta al primer elemento del contenedor... y recorrerá todos los elementos del vector (++it) hasta que llegue al final.
346  Programación / Programación C/C++ / Re: Borland en: 27 Junio 2014, 09:59 am
MSVC: Compilador de Microsoft... aunque lo suyo es instalarse el IDE, que viene con compilador (mira las versiones express de visual studio, que son gratuítas )

MinGW: Compilador Open Source de GNU. Para usar este compilador puedes hacer uso de diferentes IDEs (codeblocks por ejemplo)

Compilador de borland: No se por qué versión irán ahora, pero Borland sigue sacando compiladores para C++, Delphi, ...
347  Programación / Programación C/C++ / Re: Datos por claves en: 27 Junio 2014, 09:38 am
Si necesitas que los elementos se almacenen en orden, puedes usar std::pair y un vector:

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. int main( )
  6. {
  7.  std::vector< std::pair< std::string, int > > elementos;
  8.  
  9.  elementos.push_back( std::make_pair( "firstElement", 100 ) );
  10.  elementos.push_back( std::make_pair( "secondElement", 200 ) );
  11.  
  12.  for ( auto it = elementos.begin( ); it != elementos.end( ); ++it )
  13.    std::cout << it->first << " " << it->second << std::endl;
  14. }

Si te da igual el orden, puedes usar un mapa directamente

Código
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4.  
  5. int main( )
  6. {
  7.  std::map< std::string, int > elementos;
  8.  
  9.  elementos.insert( "firstElement", 100 );
  10.  elementos[ "secondElement" ] = 200;
  11.  
  12.  // volcado iterativo
  13.  for ( auto it = elementos.begin( ); it != elementos.end( ); ++it )
  14.    std::cout << it->first << " " << it->second << std::endl;
  15.  
  16.  // recuperar valores por claves:
  17.  std::cout << "firstElement" << " " << elementos[ "firstElement" ] << std::endl;
  18.  std::cout << "secondElement" << " " << elementos[ "secondElement" ] << std::endl;
  19. }
348  Programación / Programación C/C++ / Re: juego memoria en c++ en: 27 Junio 2014, 09:27 am
jperez2016 haznos un favor a todos y respira hondo, por favor.

No puedes ir en plan metralleta bombardeando con fallos diferentes que no tienen ninguna relación entre sí sin tan siquiera saber si los errores anteriores están corregidos. No digo que haya que regalar bombones... pero con dar de vez en cuando las gracias cuando alguien te aporta una solución es de agradecer.

Para empezar tienes que saber que para que te demos una solución puede no ser suficiente poner las 30 líneas de un bucle para encontrar un error. Por ejemplo, en el primer código que has puesto, el que no tiene las etiquetas GeSHi, no has puesto de qué tipo son las variables que se usan... simbolos1 es una matriz de tipo int... dos vectores anidados... una clase propia... esta información es importante de cara a evaluar un código.

Y bueno, te voy a dar algunas sugerencias más, es tu decisión adoptarlas o ignorarlas:

Usa el tipo bool
Para variables que sean "si/no" o "verdadero/falso", es conveniente usar el tipo bool. 'encontrado', en tu caso, tiene dos posibles valores: 's' y 'n'. La solución que has adoptado no es la más conveniente porque... qué sucede si te equivocas y pones 'S' ??? tu código dejará de funcionar. Lo bueno de usar el tipo bool es que si pasas valores que no sean true o false el compilador te avisará de ello... digamos que te apoyas en el compilador para detectar errores.

Reduce el ámbito de las variables
En C++ puedes declarar la variable que controla el bucle dentro del propio for, con esto consigues que la vida de esa variable esté limitada al propio bucle. Te permite evitar errores tontos al reutilizar variables:

Código
  1. for( int i=0; i<5; i++ )
  2.  cout << i << " ";
  3.  
  4. // Esta linea da error... i no existe
  5. cout << i << endl;
  6.  
  7. // Aqui puedes redeclarar i sin problemas
  8. for ( int i=2; i<10; i++ )
  9.  cout << i << " ";

Haz uso de los contenedores de C++
Para controlar listas de elementos (hablando de tu primera duda) lo mejor es usar los contenedores de C++:

  • vector: los elementos se almacenan en el orden que tu les dictes. Admite valores duplicados.
  • set: los elementos se almacenan ordenados de menor a mayor. No admite duplicados.
  • multiset: los elementos se almacenan ordenados de menor a mayor. Admite duplicados.
  • map: almacena un par "clave - valor". No admite claves duplicadas pero sí valores duplicados.
  • multimap: similar a map, admite claves duplicadas.

A continuación te presento dos formas (hay más) de usar contenedores para comprobar números repetidos:

* Opción 1. Es la mejor si los elementos tienen que estar desordenados
Código
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. int main( )
  6. {
  7.  std::vector< int > elementos;
  8.  elementos.push_back( 3 );
  9.  
  10.  for ( int i=0; i<10; i++ )
  11.  {
  12.    // find busca 'i' en el vector y, si se encuentra, devuelve su posicion
  13.    if ( std::find( elementos.begin( ), elementos.end( ), i ) == elementos.end( ) )
  14.      elementos.push_back( i );
  15.  }
  16.  
  17.  // Imprime en pantalla: 3 0 1 2 4 5 6 7 8 9
  18.  for ( int i=0; i<elementos.size( ); i++ )
  19.    std::cout << i << " ";

* Opción 2: ideal si no importa el orden de los elementos:

Código
  1. #include <iostream>
  2. #include <set>
  3.  
  4. int main( )
  5. {
  6.  std::set< int > elementos;
  7.  
  8.  for ( int i=0; i<10; i++ )
  9.    elementos.insert( i );
  10.  
  11.  for ( int i=0; i<10; i++ )
  12.    elementos.insert( i );
  13.  
  14.  // set no funciona con indices, hay que recurrir a los iteradores
  15.  // Imprime por pantalla: 0 1 2 3 4 5 6 7 8 9
  16.  // No hay elementos repetidos
  17.  for ( auto it = elementos.begin( ); it != elementos.end( ); ++it )
  18.    cout << *it << " ";
  19. }

No uses conio.h

conio.h no es portable, es mejor no usar este tipo de librerías y recurrir a opciones que se ajusten más al estándar. Una posibilidad para sustituir a getch es std::cin.ignore( ), aunque no es la única.

Aprende a usar enumerados

Hay que evitar en la medida de lo posible poner valores "a pelo" en el código, ya que son propensos a provocar errores.

En tu caso, por ejemplo, tienes 2 jugadores. Esto lo puedes expresar en el código de la siguiente forma:

Código
  1. enum Jugador
  2. {
  3.  NoJugador,
  4.  Jugador1,
  5.  Jugador2
  6. };
  7.  
  8. int main( )
  9. {
  10.  Jugador jug = NoJugador;
  11.  
  12.  int respuesta;
  13.  cout << "Introduce el jugador activo: ";
  14.  cin >> respuesta;
  15.  
  16.  switch ( respuesta )
  17.  {
  18.    case 1:
  19.      jug = Jugador1;
  20.      break;
  21.  
  22.    case 2:
  23.      jug = Jugador2;
  24.      break;
  25.  }
  26.  
  27.  if ( jug == NoJugador )
  28.    cout << "Jugador " << jug << " elegido" << endl;
  29.  else
  30.    cout << "No se ha seleccionado un jugador valido" << endl;
  31. }

Parejas de datos

Si en algún momento necesitas manejar parejas de datos, puedes usar la clase "pair". Incluso puedes combinar pair con contenedores:

Código
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. int main( )
  5. {
  6.  std::vector< std::pair< int, float > > datos;
  7.  
  8.  datos.push_back( std::make_pair( 1, 3.4 ) );
  9.  datos.push_back( std::make_pair( 2, 5.7 ) );
  10.  
  11.  for ( int i = 0; i < datos.size( ); i++ )
  12.  {
  13.    int valorEntero = datos[ i ].first; // Recuperamos el primer elemento del pair
  14.    float valorDecimal = datos[ i ].second; // Recuperamos el segundo elemento del pair
  15.  
  16.    std::cout << valorEntero << " - " << valorDecimal << std::endl;
  17.  }
  18. }
349  Programación / Programación C/C++ / Re: Ayuda! en: 27 Junio 2014, 08:17 am
Haber el error ya no es ese nisiquiera ya lo solucione era el users que no debe ir ahí porque es un comando prederminado

O no te sabes explicar o no sabes lo que estás haciendo... lo que te dijo Eternal es

El path esta mal, no mire nada mas ya que eso salta a la vista, la \ se usa para secuencias de escape, la que corresponde usar en tu caso es \\ .

Es decir, que sustituyeses los símbolos '\' por '\\', ya que '\' se utiliza para secuencias de escape, es decir, se interpreta ese carácter y el siguiente como uno solo que además tiene un efecto especial: '\n' salto de línea, '\t' tabulador, etc.

Dicho en cristiano. Tu ruta debería quedar: C:\\Users\\HERNAN\\Desktop\\prueba.txt

lo del conio es porque lo necesito

Lo necesitas por... espera, no me lo digas... getch??

hay mil alternativas a getch... tu por ejemplo que estás usando C++ puedes recurrir, por ejemplo, a "std::cin.ignore()". Tiene la ventaja de que es una solución estándar y multiplataforma. Ahora, si prefieres coger malos hábitos nada más empezar tú mismo, es tu decisión.

Por cierto, si respondo a un mensaje con dudas lo menos que espero es que el interesado se tome la molestia de leer mi respuesta completa... por respeto y deferencia más que nada. Te lo digo porque te puse el enlace a un post en el que se indican malas prácticas en C y C++, además de explicar los motivos explica también diferentes posibilidades y soluciones. Por tu forma de hablar entiendo que has pasado de ese punto completamente... si no vas a leer las respuetas por que no te gustan... ¿para qué pides ayuda?

y ahora mi problema es que el programa cuando abre el archivo entra en un bucle infinito y no sale porque no se todavia

Pues mira, si te molestases en leer las respuestas de la gente lo sabrías. Además también deberías aprender a usar el depurador de código... al principio cuesta cogerle el punto, pero en cuanto adquieres soltura descubres lo práctico y útil que es: te permite evaluar y modificar variables, ves la secuencia de ejecución, puedes saltar instrucciones...


350  Programación / Programación C/C++ / Re: Problema con Dev C++ en: 26 Junio 2014, 13:15 pm
No sabría decirte... hace como que 8 años que no uso DEV
Páginas: 1 ... 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines