• Jueves 28 de Marzo de 2024, 10:30

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - nachete_222

Páginas: [1]
1
C/C++ / Re:Pasar Array de una funcion a otra
« en: Lunes 2 de Junio de 2014, 21:51 »
Citar
13.    int opcion, art, codigo[0], cantidad[0];
Fijate en esto, estas reservando espacio para dos vectores que van a contener "enteros", y cuanto espacio reservas?   >> \[0], osea, nada. Eso esta en la función "menu()", de manera que si llamas a la funcion "VerArticulos()" desde la función "menu()", estas lanzando dicha función sobre unos vectores que no existen.

Citar
60.    int codigo[art];
61.    int cantidad[art];
Aquí estamos en la función "AnhiadirArticulos()". Aquí si que estás reservando espacio para los vectores, por eso al terminar de añadir los articulos se pueden ver, gracias a la llamada que haces a la función (    VerArticulos( art, codigo, &cantidad[0] ); ). Habeis oído alguna vez el dicho de "Lo que pasa en Las Vegas se queda en Las Vegas" ? con las funciones pasa otro tanto de lo mismo. si construyes un vector dentro de una función y dicho vector no esta en el ambito global del programa o no lo devuelve la función, al terminar la función se termina también la visibilidad del vector. "Lo que pasa en las funciones se queda en las funciones".

Necesitas una estrategia para hacer el vector visible a todas las funciones.

Citar
50.    /* esto la verdad me recomendaron hacerlo pero aun no me queda claro cual es la funcion */
51.    art = tran = op = cod = 0;
52.
53.    system("cls");
Esto es una asignación multiple que no tiene mucho misterio, basicamente estas inicializando todas esas variables a cero, al mismo tiempo, el operador '=' se evalua de derecha a izquierda, lo cual quiere decir que estas inicializando  'cod = 0' despues 'op' al valor que contenga 'cod', esto es cero, despues 'tran' al valor que contenga 'op' y así sucesivamente, esto se hace para asegurarnos que dichas variables no contengan un valor residual que estubiese en el espacio de memoria que estamos reservando para ellas.
system("cls");  simplemente limpia la pantalla de la consola, de esta manera en vez de ir llenando la consola con opciones unas debajo de otras, se limpia en cada función para que aparezca todo mas limpio, y mas claro.

Un saludo,
Nacho

2
C/C++ / Re:Pasar Array de una funcion a otra
« en: Domingo 1 de Junio de 2014, 13:31 »
A simple vista hay unos cuantos detalles que deberías revisar:
Citar
2. #include <conio.h>
esta cabecera es exclusiva del entorno de consola de windows. Si realmente deseas crear código portable no deberías usarla, en el código que pones no veo necesidad para incluirla... no se si tienes pensado usar funciones pertenecientes a ella mas tarde. Algo similar sucede con <stdio.h>, que básicamente es la versión en C de la cabecera para C++ que si tienes incluida después <iostream>, o dicho de otro modo con <iostream> no necesitas <stdio.h>. La ultima vez que he tenido que incluir ambas, fue en un programa que necesitaba utilizar la constante 'EOF', la cual no he visto que la uses por ningún lado.

Citar
40. for ( int i=0; i<=art; i++ )
esto te va a dar un error por desplazamiento en 1, el numero de articulos es igual a la cantidad de ellos que existen en el array, si son cinco, ese for intentaría acceder a 6 artículos (de los indices 0 a 5, ambos incluidos, eso supone un total de 6)

Citar
65. for ( int i=1; i<=art; i++ )
Ten cuidado con esto, recuerda que los ordenadores no cuentan como nosotros, ellos empiezan en cero.

resumiendo, el primer for intenta acceder a un elemento mas de los que existen, el segundo intenta acceder desde el segundo de la lista hasta uno mas de los que existen.

Citar
[.....]
esto significa que aquí falta código??, intenta publicar código completo, intenta también poner comentarios en el código para que sea mas fácil seguir la lógica del programa.

un saludo,
Nacho

3
C/C++ / Re:Método de Trapecio
« en: Sábado 31 de Mayo de 2014, 03:34 »
.

4
C/C++ / Re: Programacion de fractal: Triangulo Sierpinsky
« en: Jueves 8 de Mayo de 2014, 23:10 »
Citar
58.        /* primer triangulo - inicial */
59.
60.        triangulo[n].xC=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/4;
61.        triangulo[n].yC=triangulo[n].xA +(triangulo[n].yC - triangulo[n].yA)/2;

linea 61. (triangulo[n].xA) - esto te va a dar problemas cuando los triangulos no esten en la base.
Si puedes comentar un poco tu código para que sea más facil de leer sería estupendo.

a simple vista hay un par de detalles que no me cuadran muy bien.
1. el triangulo de Sierpinsky es un triangulo "equilatero" y el que tu pones como inicial no lo es.
2. a medida que hacemos iteraciones "se multiplica por 3" el número de triangulos resultantes.
     esto es un progresión geométrica, no se de donde sale el numero 6 para la cantidad de triangulos
     deberian ser 1, 3, 9, 27.... etc. segun numero de iteraciones.
hay alguna razón para que sean 6 ?

Y Si!,  los valores del segundo triángulo los estas machacando con el tercer triángulo, evidentemente si das la misma variable en el tercer triángulo, estas sobreescribiendo los valores que calculaste con el segundo.

creo que la mejor forma de abordar el problema sería con una función que reciba 3 puntos como parámetros
y calcule otros tres. Luego es cuestión de escoger los puntos que van en cada triangulo. Se llama esta función con cada uno de los triangulos de cada una de las iteraciones y podria calcular tantos como se quisiese.

un saludo.
Nacho

5
C/C++ / Re:Problema para separar numeros en sus digitos
« en: Viernes 14 de Marzo de 2014, 03:55 »
Pero te ha dicho que en C++ y le has contestado en C

Ahí va una solución. Yo te pongo un programa para resolver un numero de 5 digitos exactamente y tu te lo trabajas para numeros que tengan cantidades arbitrarias de numeros.

Código: [Seleccionar]
// separa los digitos de un numero
#include <iostream>
using namespace std;

// la función main comienza la ejecución del programa
int main()
{
int num1;  // número que introduce el usuario

cout << "Digite un numero de 5 digitos: ";
cin >> num1;

cout << "\n" << num1 / 10000 << "   " << num1 % 10000 / 1000 << "   "
     << num1 % 1000 / 100 << "   " << num1 % 100 / 10 << "   "
<< num1 % 10 << endl;

return 0; // indica que el programa terminó satisfactoriamente

} // fin de la función main

La explicación es la siguiente:
si tu numero tiene 5 digitos buscas la unidad seguida de ceros que tenga 5 digitos, en este caso 10000, al dividir por 10000 te separa el primer numero y lo imprimes.
para el siguiente numero haces el "modulo" (%) de 10000 y esto te deja de resto 4 digitos que los divides por la unidad seguida de ceros que tenga 4 digitos, osea 1000,
el tercer paso es similar al segundo haces el "modulo" de 1000 para quedarte con solo 3 digitos y los divides por unidad seguida de ceros con 3 digitos en total, osea 100....
y asi sucesivamente....
¡Espero haberme explicado bien!

Un saludo
Nacho

6
C/C++ / Re:consulta sobre un problema en C++
« en: Martes 11 de Marzo de 2014, 16:22 »
De momento, si no aparece solución creativa, lo he dejado usando un truco muy popular en el mundo de la programación de juegos...

Código: [Seleccionar]
while ( true ) { 
   entrada

   if ( condicion de guardia )
      break;

   else {
      .... resto de codigo
   }
}

esto crea un ciclo infinito, con la condición de salida del ciclo en la instrucción if. Esto se usa mucho para el loop principal de los videojuegos, donde la condición de salida suele ser la pulsacion de la tecla <ESCAPE> que suele enviar a una rutina de terminación del juego.

Con esta solución el ciclo while cumple su función y solo se evalua la condición de guardia una vez. Pero no se si a nivel academico esto será una solución muy decente. El programa queda exactamente igual al primero que puse. Solo se cambia while ( litros != -1 ) por while ( true ), el resto del programa es exactamente lo mismo, lo cual demuestra que la condicion del while original no sacaba el programa del ciclo.

El problema aquí es que hay que evaluar primero si se introduce una cantidad válida para los litros, y como esto aparece primero que la distancia, si se introduce el valor de salida, necesito un mecanismo para saltar el resto del codigo, por eso tengo el "if... else". En fin, de momento no se me ocurre nada mejor...

Un Saludo
Nacho

7
C/C++ / Re:consulta sobre un problema en C++
« en: Martes 11 de Marzo de 2014, 01:11 »
Bueno, primero de todo decir que lo he hecho así para respetar el enunciado del problema, que especifica que debe ser una estructura "while". El programa funciona y da un resultado correcto.

Efectivamente, como tu bien apuntas el "break" no solo salta la ejecución de "else", sino que sale del bucle directamente. (lo he comprobado con el debugger). Con lo cual, básicamente solo comprueba que la entrada es distinta de -1 y continua, pero cuando es igual a -1 se encarga el break de salir del bucle y no se utiliza la comparación del while. Sigue siendo necesario para los casos en que se introducen valores validos para los cálculos.

Ya me parecía a mi que la doble comparación no era una "lógica de programación" demasiado elegante, pero la verdad es que, respetando el enunciado, no se me ocurría mejor forma de hacerlo,  ya había pensado en el "do... while" pero no quise utilizarlo por lo que comento de respetar el enunciado, ya que es un ejercicio y hay que ceñirse a lo que indica.

en cualquier caso con do while me parece mas elegante y mejor planteado, pero me gustaría saber si hay mas sugerencias utilizando únicamente while

Un saludo,
Nacho

8
C/C++ / consulta sobre un problema en C++
« en: Lunes 10 de Marzo de 2014, 22:37 »
En un problema de programación se proporciona el siguiente enunciado y un ejemplo de la ejecución del mismo.

--- enunciado del problema ---

2.16

Los conductores están preocupados por el kilometraje recorrido por sus automóviles. Un conductor ha dado seguimiento a varios tanques de gasolina, registrando los kilómetros recorridos y los litros utilizados en ese recorrido. Desarrolle un programa en C++ que utilice una estructura while, para introducir los kilómetros recorridos y los litros utilizados de cada tanque. El programa debe calcular y desplegar los kilómetros por litro, obtenidos de cada tanque. Después de procesar toda la información de entrada, el programa debe calcular y desplegar la combinación de kilómetros por litro obtenidos por todos los tanques.

--- resultado de ejecución ---

Introduzca los litros utilizados (-1 en adelante): 12.8
Introduzca los kilometros recorridos: 287
Los kilometros / litro para este tanque fueron 22.421875

Introduzca los litros utilizados (-1 en adelante): 10.3
Introduzca los kilometros recorridos: 200
Los kilometros / litro para este tanque fueron 19.417476

Introduzca los litros utilizados (-1 en adelante): 5
Introduzca los kilometros recorridos: 120
Los kilometros / litro para este tanque fueron 24.000000

Introduzca los litros utilizados (-1 en adelante): -1

El promedio total de kilometros/litro fue de 21.601423


He desarrollado este código para resolver el problema...

Código: [Seleccionar]
// Ej. 2.16: ej02_16.cpp
// Calcular los kilometros recorridos por litro y el promedio
#include <iostream>

using std::cout;
using std::cin;
using std::endl;
using std::fixed;

#include <iomanip>

using std::setprecision;

// la función main comienza la ejecución del programa
int main()
{
double distancia;     // declara distancia
double litros;        // declara litros
double resultado;     // declara resultado
double totalkms = 0;  // declara kilometros totales
double totLitros = 0; // inicializa total litros

while ( litros != -1 ) {
// indica la entrada y obtiene el valor a partir del usuario (litros)
// -1 para terminar el ciclo while
cout << "Introduzca los litros utilizados (-1 en adelante): ";
cin >> litros;

if ( litros == -1 ) // comprueba si la entrada es -1
    break; // se salta el bloque "else" si la entrada fue -1
   
else { // si la entrada no fue -1 continua con este bloque
// indica entrada y obtiene valor del usuario (kilometros recorridos)
    cout << "Introduzca los kilometros recorridos: ";
    cin >> distancia;

    resultado = distancia / litros; // calcula los kilometros por litro
    totLitros += litros;            // calcula el total de litros consumido
    totalkms += distancia;          // calcula el total de distancia recorrida
   
    // despliega resultados por tanque
    cout << fixed << setprecision ( 6 );
    cout << "Los kilometros / litro para este tanque fueron " << resultado
         << "\n" << endl;
}

} // fin de while

// despliega el promedio a partir de las variables "totLitros" y "totalkms"
cout << "\nEl promedio total de kilometros/litro fue de "
     << totalkms / totLitros << endl;

return 0; // indica terminación exitosa

} // fin de la función main

Al crear el programa me han surgido unas dudas respecto a la estructura "if", ya que comprueba por segunda vez si el valor centinela se ha introducido, para evitar el bloque despues de "else".

Se comprueba como condición en la estructura "while" para terminar la ejecución del programa y también en "if" para evitar que sume el valor -1 a los litros e introduzca errores en el calculo del promedio, y la pregunta es, ¿si esto es necesario o existe una forma mejor de hacerlo?

Un saludo,
Nacho

9
Python / Re:Eliminar archivos duplicados del sistema
« en: Martes 4 de Septiembre de 2012, 01:10 »
Hola,

me gustaría hacer un pequeño aporte mas.

Me rondaba la cabeza el tema y no sabia por que, pero tenia en mente que la función sabersiya() no producía un hash md5 correcto al menos en windows, así que lo comprobé, las opciones por defecto al abrir archivos son 'lectura' y 'modo texto', y ya sabemos todos que microsoft es muy particular a la hora de interpretar los saltos de línea, utilizando dos caracteres en lugar de uno solo, el famoso 'retorno de carro' y el 'salto de línea', si abrimos dando las opciones de lectura y modo binario 'rb', conseguimos un código mas portable y mas independiente de la plataforma.

al abrir el archivo se hace con opciones por defecto.
archi = open(archivo) # Esto produce un hash incorrecto

debería abrirse con las opciones 'rb'
archi = open(archivo, 'rb') # Esto produce el hash correcto

aunque yo trabajo en una maquina con linux, la comprobación la he hecho en una maquina windows, no se si en linux pasara lo mismo...
aquí dejo la comprobación:

Código: [Seleccionar]
C:\Documents and Settings\n\Programacion\Python>md5deep resultados.txt
679b1f3244e3d285bf134ff0de4770fd  C:\Documents and Settings\n\Programacion\Python\resultados.txt

C:\Documents and Settings\n\Programacion\Python>Python
Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win 32
Type "help", "copyright", "credits" or "license" for more information.

>>> import hashlib

>>> def sabersiya(archivo):
...    archi = open(archivo)
...    cabeceramd5 = hashlib.md5(archi.read()).hexdigest()
...    archi.close()
...    return cabeceramd5
...
>>> sabersiya('resultados.txt')
'88e75f1675fba32f982f3ce11eb29d5c'

>>> def sabersiya2(archivo):
...    archi = open(archivo, 'rb')
...    cabeceramd5 = hashlib.md5(archi.read()).hexdigest()
...    archi.close()
...    return cabeceramd5
...
>>> sabersiya2('resultados.txt')
'679b1f3244e3d285bf134ff0de4770fd'

Para empezar he comprobado el hash con una utilidad conocida 'Md5deep' sobre un archivo
luego he definido la función sabersiya() y he comprobado el resultado, como se puede ver es erróneo, para finalizar he definido la función sabersiya2() con la opción de apertura modificada y la he comprobado sobre el mismo 'sufrido' archivo que ha hecho de conejillo de indias y en esta ocasión se ve que el resultado es correcto.

Un saludo,
Nacho

10
Python / Re:Eliminar archivos duplicados del sistema
« en: Sábado 4 de Agosto de 2012, 19:31 »
aquí hay uno:

Código: [Seleccionar]
http://radicalpython.blogspot.com.es/2009/05/eliminar-archivos-duplicados-en-el-pc.html

11
Python / Re:Eliminar archivos duplicados del sistema
« en: Jueves 2 de Agosto de 2012, 20:16 »
hola,

se que estoy rescatando un tema antiguo, pero cada vez que busco código para "eliminar archivos duplicados" en python me sale este programa.

que ha sido diseminado por la red y se hace referencia a el en distintos blogs y foros.

pues bien, el código básicamente pretende eliminar archivos duplicados y dejar una sola copia de cada archivo, y básicamente "Falla" en el propósito para el que fue creado. Esto es uno de esos errores lógicos de los que tanto se habla en los libros, uno de esos que no tira advertencias y que hace que el resultado del programa no cumpla con el cometido para el que fue creado.

en primer lugar se define una función que devuelve el hash md5 de cada uno de los archivos en el árbol de directorios, luego se crea un diccionario con los nombres de los archivos como claves y con las sumas md5 como valores, y ahora se pretende comparar los archivos unos con otros y borrar los que tengan el mismo valor pero distinta clave. Y es aquí donde esta el error, estamos comparando las entradas del diccionario con 2 bucles anidados, y estamos borrando archivos en el árbol de directorios, las entradas del diccionario no se borran, así que básicamente un archivo que haya sido borrado mantiene su entrada en el diccionario y tarde o temprano se comparara con otro de los duplicados, dando como resultado el borrado de este también.

en resumen, lo que pasará es que se borrarán "todos" los archivos, incluso los originales

Páginas: [1]