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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


  Mostrar Mensajes
Páginas: 1 ... 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [26] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ... 125
251  Programación / Programación C/C++ / Re: Optimización de algoritmo de fuerza bruta en: 3 Septiembre 2014, 08:16 am
La verdad no entendí mucho, por otro lado hice una función pow que solo trabaja con enteros pensé que de esta manera podría ser mas rápida pero no:

Código
  1. int pow2(int x, int n)
  2. {
  3.    int p;
  4.    for ( p = 1 ; n > 0 ; --n )
  5.        p *= x;
  6.    return p;
  7. }

Saludos kutcher

La librería estándar ha sido programada y optimizada por gente bastante ducha tanto en matemáticas como en programación... es complicado sacar una versión que sea más eficiente (no es imposible pero...)

En cualquier caso yo creo que puedes optimizar la función "arrastrando" el valor de "end", de esta forma sólo llamas a pow una vez durante la ejecución de la función.

Código
  1. void bruteforce(int inc, int fin, char *rotation)
  2. {
  3.    int i = 0, j, len = strlen(rotation);
  4.    long int r = 0, c;
  5.    char test[200];
  6.    long int end = (long int)pow( len, inc );
  7.    for(j = inc; j < fin+1; j++)
  8.    {
  9.        r = 0;
  10.        end *= len;
  11.        while(r != end)
  12.        {
  13.            c = r;
  14.            while(i < j)
  15.            {
  16.                test[i] = rotation[c % len];
  17.                c = (long int)c / len;
  18.                i++;
  19.            }
  20.            test[i] = '\0';
  21.            puts(test);
  22.            i = 0;
  23.            r++;
  24.        }
  25.    }
  26. }
252  Programación / Programación C/C++ / Re: Se puede programar en C en un programa de C++? en: 2 Septiembre 2014, 14:50 pm
C es totalmente compatible con C++ (al revés no, ojo)... actualmente un compilador de C++ es perfectamente capaz de compilar código escrito en C... lo que sucede es que lo compilará como si fuese C++. Esto último implica que los mensajes de compilación ( warnings y advertencias ) pueden ser diferentes.
253  Programación / Ejercicios / Re: Una mano por favor , ejercicio de c en: 2 Septiembre 2014, 12:01 pm
Como te dijo Caster, el problema es de precisión.

Quizás, antes de realizar operaciones con decimales deberías aprender cómo se almacenan éstos números y que problemas pueden aparecer.

Los números en coma flotante permiten almacenar números bastante grandes / pequeños incluso con decimales... pero a cambio sacrifica precisión. Si quieres reducir esta pérdida de precisión puedes probar a usar double en vez de float.

Código
  1. printf("%6.1f + %6.1f =",op1,op2);

Tu ahí estás forzando a que en el número se imprima únicamente hasta el primer decimal... pero eso no quiere decir que el número real almacenado en op1 y op2 vayan a tener un número con un decimal... la conversión a coma flotante puede hacer que el número almacenado no sea exactamente el que esperas.

A modo de ejemplo: un float tiene una precisión de 6 dígitos, esto quiere decir que un número, por ejemplo el 1 puede acabar representado dentro del rango 0.999990 y 1.000009. O el número 12.3, este número puede acabar representado por un número cualquiera dentro del rango 12.29990 y 12.30009.

Lo dicho, si esta precisión te da problemas, cambia a double.
254  Programación / Programación C/C++ / Re: Proyecto-Registros en: 2 Septiembre 2014, 09:40 am
carlosabcs18, un par de detalles:

* El código decóralo con las etiquetas GeSHi... elige el lenguaje adecuado para que el texto se formatee correctamente.

* En C++ existe la clase string, la cual permite sustituir las cadenas de C (char*). Usar esta clase tiene varias ventajas: Simplifica el código, se evitan varios errores tontos, no tienes que pegarte con punteros...

Código
  1. // Version C
  2. char producto[20];
  3.  
  4. strcpy( producto, "Coche" );
  5.  
  6. // Versión C++
  7. std::string producto = "Coche";

* No es recomendable usar variables globales. Las variables globales pueden ser hasta peligrosas. No merece la pena ahorrarse dos líneas de código. En pocas ocasiones es necesario usar una variable global.

* En C++ existen los denominados contenedores. El contenedor más popular es "vector", el cual te permite gestionar listas no ordenadas de elementos. Con esta clase puedes sustituir tu variable "vendedores". Sustituir un arreglo C por un contenedor tiene la ventaja de que, por ejemplo, te puedes despreocupar del número de elementos en la lista, el contenedor se redimensiona por si solo cuando sea necesario.

Código
  1. std::vector< vendedor > vendedores;
  2.  
  3. // Insertar nuevo vendedor
  4. // ----------
  5.  
  6. vendedor nuevo_vendedor;
  7. // dar valores al nuevo vendedor
  8. // ...
  9.  
  10. vendedores.push_back( nuevo_vendedor );
  11.  
  12. // Vaciar la lista de vendedores
  13. vendedores.clear( );
  14.  
  15. // Saber el numero de vendedores dados de alta
  16. std::cout << vendedores.size( ) << std::endl;

* En C++ suele ser recomendable no anidar clases, eso es más propio de C y normalmente dificulta la legibilidad del código:

Código
  1. struct direccion
  2. {
  3.  std::string calle;
  4.  int numero;
  5.  std::string urbanizacion;
  6. };
  7.  
  8. struct vendedor
  9. {
  10.  int dni;
  11.  std::string nombre;
  12.  std::string apellidos;
  13.  direccion dir;
  14.  std::vector< producto > prod;
  15.  
  16.  // La siguiente variable ahora sobra, el contenedor ya tiene esta informacion
  17.  // int n_prod;
  18. };

* No pongas varias instrucciones en la misma línea. Al compilador le va a dar igual que las instrucciones estén todas seguidas o en diferentes líneas, el programa va a ocupar prácticamente lo mismo... pero la legibilidad del código se resiente. No te proporciona ningún beneficio y perjudica el mantenimiento del codigo:

Código
  1. // opcion mala
  2. cout<< "Producto: ";   fflush(stdin);      gets(vendedores[nv].prod.producto);
  3.  
  4. // opcion buena
  5. cout<< "Producto: ";
  6. fflush(stdin);
  7. gets(vendedores[nv].prod.producto);

* No uses fflush sobre stdin. fflush está pensado únicamente para bufferes de salida, no de entrada. El resultado puede ser indeterminado... además, ya puestos a usar C++, usa cin en vez de gets y compañía.

Ampliando el tema de fflush... si ya de por si no es recomendable mezclarlo con stdin... menos aún usarlo junto a cin. cin es una clase y es independiente de stdin... actúan sobre el mismo buffer, pero no tienen por qué trabajar igual, puedes acabar con problemas de sincromismo.

Si quieres limpiar el buffer de cin lo mejor es hacer algo tal que:

Código
  1. // Limpiar todo el buffer
  2. cin.ignore( std::numeric_limits< std::streamsize >::max( ) );
  3.  
  4. // Limpiar el buffer hasta el primer salto de línea.
  5. cin.ignore( std::numeric_limits< std::streamsize >::max( ), '\n' );

Y, por supuesto, no es recomendable mezclar accesos a cin con el uso de gets, scanf, ...

* Me he fijado en que la clase "producto" tiene un "subtotal"... este campo es el resultado de la operación cantidad*precioVenta. Este planteamiento presenta el inconveniente de que si en algún momento actualizas uno de estos dos campos y no recalculas "subtotal" entonces tendrás una inconsistencia.

A mi modo de ver sería recomendable calcular este valor sobre la marcha cuando se requiera mediante un método:

Código
  1. struct producto
  2. {
  3.  std::string producto;
  4.  int cantidad;
  5.  float precioVenta;
  6.  
  7.  float Subtotal( ) const
  8.  {
  9.    return static_cast< float >( cantidad ) * precioVenta;
  10.  }
  11. };

"static_cast" lo uso para convertir "cantidad" a float... prefiero los cast de C++ a los de C, son más seguros y más sencillos de localizar en el código.

* Procura que las variables signifiquen algo:

Código
  1. int n,i,v,w,nv,el_v,dni;

Si tu te encuentras esta línea en un programa cualquiera... ¿sabrías decir cual es la finalidad de cada una de esas variables? Costaría un poco, ¿verdad?

Y si en vez de esa línea te encuentras una tal que:

Código
  1. int num_vendedores, id_vendedor_datos, id_vendedor_productos, id_vendedor_eliminar;

¿Se entendería mejor el código?

Si este ejemplo no es lo suficientemente claro tengo otro:

Código
  1. // opcion 1
  2. h = x * i * ( 1.0 + d );
  3.  
  4. // opcion 2
  5. total = precio_unitario * unidades * ( 1.0 + iva );



Bueno, hasta aquí mis consejos prácticos... tengo más, así que si te quedas con ganas luego te comento.

Ahora vamos con tus "errores":

Código
  1. void e_vendedor( int x, int num)
  2. {
  3.    for(int i=x; i<(num-1); i++)
  4.      vendedor=vendedor[i+1];
  5.    num--;
  6.  
  7. }
  8.  
  9. // ...
  10.  
  11. e_vendedor(el_v-1,n);
  12.  

"num" se pasa por valor, luego "num--" no tendrá efecto sobre "n". Si pretendes modificar "v" dentro de "e_vendedor" tienes que pasar la variable por referencia:

Código
  1. void e_vendedor( int x, int& num)

Y el otro error:

Código
  1. void buscar( int dni)
  2. {
  3.    int band = 0;
  4.  
  5.    if(dni>0)
  6.    {
  7.        for(int i=0; i<dni; i++) // <<------ AQUI!!!!
  8.        {
  9.            if(vendedor.dni==dni)
  10.            {
  11.                cout<<"\n\n La direccion de "<<vendedor.nombres<<" "
  12.                    <<vendedor.apellidos<<" es : "
  13.                    <<vendedor.dir.calle<<" "<<vendedor.dir.numero<<" "<<vendedor.dir.urbanizacion<<endl ;
  14.                band = 1 ;
  15.                break;
  16.            }
  17.        }
  18.    }
  19.    else
  20.        cout<<"\n\tRegistro vacio..!";
  21.  
  22.    if(band==0)
  23.        cout<<"\n\n\tEl vendedor no fue encontrado! "<<endl;
  24. }

¿por qué asumes que "dni" lo puedes usar para recorrer la lista de vendedores? Si usas un arreglo de C tienes que pasar a la función la cantidad de vendedores en la lista. Si pasas un DNI que no exista el código va a leer fuera del arreglo y eso te va a dar problemas.
255  Programación / Programación C/C++ / Re: Acceso método de clase base/madre en: 1 Septiembre 2014, 12:59 pm
Lo correcto sería tener un método escrito de esta manera: [/b]

Código
  1. void Pescado::Sentido_Pescado(){
  2.  
  3. if(sentido==1) sentido=2;
  4. if(sentido==2) sentido=1;
  5.  
  6. }

Pero al implementarlo, no lleva a cabo el cambio de sentido. Desconozco el motivo.

Es fácil.

Caso 1: sentido = 2. El primer if se lo salta y en el segundo se cambia a sentido = 1
Caso 2: sentido = 1. Entra en el primer if, que cambia su valor( sentido = 2 ). Después entra en el segundo if que vuelve a cambiar su valor ( sentido = 1 )... has vuelto a tus orígenes.

El origen del problema es que el segundo if tendría que ir asociado a un else:

Código
  1. void Pescado::Sentido_Pescado(){
  2.  
  3. if(sentido==1) sentido=2;
  4. else if(sentido==2) sentido=1;
  5.  
  6. }

Sin embargo, dado que "sentido" únicamente tiene dos posibles valores, se puede simplificar aún más:

Código
  1. void Pescado::Sentido_Pescado(){
  2.  
  3. if(sentido==1) sentido=2;
  4. else sentido=1;
  5.  
  6. }

En cualquier caso, lo ideal para almacenar estados binarios si-no, verdadero-falso, avanzar-parar, lo mejor es, como te han comentado, usar la variable bool o, si la claridad del código lo requiere, enumerados (caso, por ejemplo, de derecha-izquierda, asignarle un 1 a derecha y 0 a izquierda o viceversa no parece algo demasiado obvio como para recordarlo durante la fase de implementación del código).

Un saludo.
256  Programación / Programación C/C++ / Re: Proyecto-Registros en: 1 Septiembre 2014, 12:13 pm
dudo mucho que le dejen usar sqlite... la idea será que aprenda a pegarse con el tratamiento de ficheros. Me equivoco?
257  Programación / Programación C/C++ / Re: Ayuda con programa por favor en: 8 Agosto 2014, 07:53 am
Puede que su problema sea que el código ni tan siquiera compila

* Falta '#' en ifdef
* A la clase fecha le falta la llave de cierre.
* Hay código fuente fuera del main.

Y ya no he seguido mirando porque me parece un poco falta de respeto presentar algo así...
258  Programación / Programación C/C++ / Re: Multiplicacion de matrices Anxk y Bkxm en: 7 Agosto 2014, 18:06 pm
Ya se habia inicializado previamente todos sus elementos a cero en el main  

Se inicializa... pero mal. Fíjate que se aprovecha la inicialización de B... si cambias los datos y haces que A deje de ser cuadrada tienes un problema.
259  Programación / Programación C/C++ / Re: Una duda muy simple en: 7 Agosto 2014, 12:05 pm
Código
  1. for ( int i=0; i < 10; i++ )
  2. {
  3.  int valor = i + 1;
  4.  std::cout << valor << std::endl;
  5. }

En el ejemplo anterior hay dos variables, i y valor.

  • i existe de forma continuada durante toda la vida del bucle. Cuando el código sale del bucle la variable simplemente deja de existir y su memoria puede ser ocupada por otra variable... el mundo es así de cruel.
  • valor existe únicamente dentro de cada iteración del bucle, es decir, durante la ejecución de este ejemplo se van a crear 10 variables "valor". Cada una de estas instancias se eliminará al terminar la iteración correspondiente.

Fuera del bucle, por tanto, no existirá ninguna de estas dos variables. Si accedieses a las posiciones de memoria donde estaban ubicadas puede que aún se mantenga el último valor que tenían dichas variables... pero la memoria no está reservada y, por tanto, no está asegurado que puedas recuperar dicho valor.
260  Programación / Programación C/C++ / Re: Suma aleatoria. en c en: 7 Agosto 2014, 10:46 am
Como te comentó ivancea96, los pasos a seguir son estos:

* Generas dos números aleatorios necesarios para la suma.
* Muestras al usuario los números elegidos y le preguntas por el resultado
* Lees el resultado propuesto por el usuario y lo comparas con el que has calculado tú.
* Si coinciden, pones un mensaje alegre felicitando al usuario por su enorme talento realizando sumas.
* Si no coinciden, envías un mensaje urgente a su profesor para que le suspenda en la próxima evaluación.

Por si necesitas documentación, aquí tienes algunos enlaces:

  • Aqui información sobre la generación de números aleatorios.
  • Aqui información sobre la función printf, necesaria para mostrar información al usuario
  • Aqui información sobre la función scanf, necesaria para pedir información al usuario

Y lo mejor de todo, en todos los enlaces hay ejemplos... más fácil imposible.
Páginas: 1 ... 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [26] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines