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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 102
31  Programación / Programación C/C++ / Re: Ayuda con implementacion algoritmo warshall en C en: 18 Mayo 2022, 19:50 pm
Hola de nuevo,

porque en lo que me piden en este ejercicio es comprobar que no existen ciudades aisladas o ciudades inalcanzables partiendo desde otra ciudad, y viendo a simple vista el fichero de texto, todas las ciudades estan conectadas. Entonces entiendo que deberia dar todo 1 el resultado del algoritmo no?

Gracias de nuevo!
El algoritmo de Warshall trabaja con grafos dirigidos. Es decir que una conexión: A->B no implica que haya una conexión: B->A.
En el fichero de texto te dan los datos para ir de la 'ciudad_origen' a la 'ciudad_destino' pero no puedes ir en dirección contraria.
De ahí los resultados de tu matriz, que son correctos.

A Cádiz sí puedes llegar desde algunas ciudades (última columna) pero desde Cádiz no puedes ir a ninguna (última fila). Para que pudieras ir desde Cádiz a otra ciudad tendrías que tener al menos una línea del fichero que empezara por Cádiz, y no es así.

Por otro lado:
Citar
Código
  1. int buscarIndice(char *ciudad, char *ciudades[NUM_CIUDADES], int numCiudades)
  2. {
  3.    for(int i=0; i<numCiudades; i++)
  4.    {
  5.        if(strcmp(ciudad,ciudades[i])==0)return i;
  6.    }
  7. }
Está función tiene un pequeño problema... Qué pasa si no encuentras la ciudad entre todas las ciudades??
No tienes un return por defecto por lo que la comprobación que haces en el main de si los índices son distintos de -1 no tiene sentido.
Estas pequeñas cosas son las que hacen que se note que tu código es copiado... :silbar: :rolleyes:
32  Programación / Java / Re: SOCKETS UDP Ayuda!! en: 15 Mayo 2022, 15:55 pm
Citar
El cliente y el servidor se deben de enviar mutuamente ( intercambiando mensajes ) la hora actual en el momento de ejecucion

Qué significa:
Citar
He hecho el codigo del intercambio de hora pero me da error.
:huh: :huh:

En vez de "me da error" sería mejor que explicaras con más detalle el problema que tienes...
- Te da error de compilación o de ejecución? Qué error te muestra exactamente?
- El resultado que muestra no es el que esperas? Qué resultado esperas y qué te muestra el programa?
- ...

PD: El código que muestras no intercambia la fecha/hora actual. Está intercambiando el primer argumento de la ejecución args[0], por lo que...
¿Con qué argumentos estás ejecutando el Cliente?

Y qué quieres decir con esto:
Citar
tambien deben de imprimir el número segundos transcurridos en el intercambio de mensajes
:huh: :huh:

Qué tienes que imprimir y dónde?
- El tiempo que tarda el Servidor desde que arranca hasta que le llega un paquete?
- El tiempo que tarda el Servidor desde que arranca hasta que envía un paquete?
- El tiempo que tarda el Servidor desde que recibe un paquete hasta que envía otro?
- El tiempo que tarda el Cliente desde que arranca hasta que envía un paquete?
- El tiempo que...
- ...

Como puedes ver, puedes medir el tiempo de TODO lo que quieras. Entonces tendrás que especificar más en lo que necesitas.
De todas formas y de forma genérica, te contestaré lo mismo que la vez anterior:
Citar
Para obtener el tiempo transcurrido en una porción de código tienes que seguir los siguientes pasos:
  • Guardar el instante actual al principio de la porción de código a medir
  • Guardar el instante actual al final de la porción de código a medir
  • Obtener la diferencia entre ambos instantes
33  Programación / Java / Re: Sigo un curso que usa NB antiguio y me da problemas. en: 14 Mayo 2022, 21:46 pm
Citar
Como lo puedo solucionar?gracias.
Sin más información: usando la misma versión que el curso.

De todas formas, el entorno de desarrollo que se utilice para programar no hace variar la ejecución de un programa.
Si estás usando opciones propias del entorno puede que tú las tengas que buscar en otro menú o que la opción se llame diferente pero nada más.
34  Programación / Programación C/C++ / Re: Ayuda con implementacion algoritmo warshall en C en: 13 Mayo 2022, 15:56 pm
Al publicar código agrega en la primera etiqueta el lenguaje para facilitar un poco más la lectura. Tal que así:
[code=c]
Aquí pones tu código
[/code]
En los anteriores posts te lo he ido agregando yo pero para futuro.  :rolleyes:

Citar
En la tabla que compartes, el 0 es la ciudad actual, el -1 una ciudad inalcanzable, el 1 supongo que sera una ciudad alcanzable, pero los valores 4, 5 y 6 que aparecen en la tabla que significan.
El valor del elemento [X][Y] es el número de ciudades por las que tienes que moverte para llegar desde la ciudad X hasta la ciudad Y.
Es decir, cuando pone 1 significa que llegas directamente pero cuando pone 2 significa que tienes que pasar por una ciudad intermedia, y así sucesivamente...

Citar
A mi me da como resultado la tabla con todos 1, supongo que no esta bien.
Esto es un problema de concepto. El algoritmo Warshall espera/trabaja con una matriz de entrada que está compuesta por 0s y 1s. El 0 en una casilla significa que no se puede llegar del elemento X al elemento Y y el 1 que sí que se puede.
La implementación interna de la función warshall() parece correcta. El problema está en el input. La matriz que tú le estás haciendo llegar es la matriz 'claves' que no contiene la información esperada sino que contiene una serie de "índices" que has ido guardando tú en la parte final del código.

Te recomiendo empezar resolviendo el problema sin memoria dinámica ya que sí que conoces el número de ciudades y sus nombres de antemano (Solución 1 del otro tema pero más simplificada).
Realmente no necesitas una estructura para guardar cada "arista" del grafo compuesta por: {origen/ciudad1, destino/ciudad2, distancia}.
Lo que sí necesitas es una forma de poder relacionar una ciudad con un número (índice). Ahora te voy a dar una solución más sencilla que la anterior. No necesitas ni crear structs:
Puedes crear un array de cadenas y guardar todas las ciudades. El índice de cada ciudad será ni más ni menos que la posición que tiene esa ciudad en el array.
Código
  1. #define NUM_CIUDADES 17 // Necesitaras usar 'define' en vez de 'const int' para esto si utilizas memoria dinamica
  2.  
  3. int main() {
  4.  char *ciudades[NUM_CIUDADES] = {"Valladolid", "Madrid", "Barcelona", ...};
  5. }
  6.  
El orden en que definas aquí las ciudades es indiferente pero hará variar la posición de los elementos en la matriz (no sus valores).
El orden que usé en la solución mostrada antes fue: [Corunya, Vigo, Valladolid, Bilbao, Madrid, Oviedo, Zaragoza, Barcelona, Gerona, Valencia, Badajoz, Jaen, Albacete, Murcia, Granada, Sevilla, Cadiz]

Ahora teniendo los pasos anteriores, debes crearte la matriz de entrada (la que luego le pasarás a la función warshall() para que trabaje con ella)
Esta matriz contendrá 1s y 0s por lo que debería ser de tipo int (bool también es aceptable pero no deja de ser lo mismo -> 1 = true | 0 = false)
Código
  1. #define NUM_CIUDADES 17 // Necesitaras usar 'define' en vez de 'const int' para esto si utilizas memoria dinamica
  2.  
  3. int main() {
  4.  char *ciudades[NUM_CIUDADES] = {"Valladolid", "Madrid", "Barcelona", ...};
  5.  int matriz_entrada[NUM_CIUDADES][NUM_CIUDADES] = {0}; // Asi inicializas toda la matriz a 0
  6. }
De momento utiliza memoria estática y cuando lo tengas funcionando puedes agregarle la memoria dinámica.

Y ahora lo que queda es recorrer el fichero (no necesitas contar el número de filas) e ir buscando el índice correspondiente que tiene cada una de las ciudades. Una vez hayas encontado ambos índices, guardas un 1 en esa posición porque el 1 significa que puedes llegar desde la ciudad origen hasta la ciudad destino y si has encontrado ambas ciudades en una línea del fichero realmente te da igual la distancia, ya sabes que sí se puede llegar.
Código
  1. #define NUM_CIUDADES 17
  2. const int MAX_NOMBRE_CIUDAD = 20; // En esta si puedes usar 'const int' en vez de 'define'
  3.  
  4. int main() {
  5.  char *ciudades[NUM_CIUDADES] = {"Valladolid", "Madrid", "Barcelona", ...};
  6.  int matriz_entrada[NUM_CIUDADES][NUM_CIUDADES] = {0}; // Asi inicializas toda la matriz a 0
  7.  
  8.  char ciudad_origen[MAX_NOMBRE_CIUDAD];
  9.  char ciudad_destino[MAX_NOMBRE_CIUDAD];
  10.  int distancia; // Estrictamente hablando no necesitas ni guardar la distancia pero bueno, tampoco hacemos mal a nadie por ello
  11.  
  12.  // Otra cosa, al margen: Si al ver que el fichero no se abre, terminas la ejecucion, no necesitas despues poner un else, basta con poner el codigo seguido
  13.  FILE *fichero = fopen("loquesea.txt", "r");
  14.  if(!fichero) { // Lo mismo que decir: fichero == NULL
  15.    printf("...");
  16.    exit(1);
  17.  }
  18.  
  19.  while(fgets(fichero, "%s %s %d", ciudad_origen, ciudad_destino, &distancia) == 3) { // Recordar que 'distancia' no es un puntero -> Necesitas usar & (creo que lo olvide la otra vez)
  20.    printf("La distancia para ir de [%s] a [%s] es: %d\n", ciudad_origen, ciudad_destino, distancia); // Por si no te fias que se este leyendo bien el fichero :)
  21.    // Ahora viene la magia, necesitas saber que indices corresponden a 'ciudad_origen' y 'ciudad_destino'
  22.    int indice_origen = buscarIndice(ciudad_origen, ciudades, NUM_CIUDADES);
  23.    int indice_destino = buscarIndice(ciudad_destino, ciudades, NUM_CIUDADES);
  24.    // Ahora puedes comprobar que ambas ciudades hayan sido encontradas o confiar... cuando programas es mejor desconfiar siempre y en la vida en general :(
  25.    if(indice_origen != -1 && indice_destino != -1)
  26.      matriz_entrada[indice_origen][indice_destino] = 1; // No necesitas guardar la distancia, basta con que pongas un 1 para saber que si se puede llegar
  27.  }
  28.  
  29.  // Y ya estaria, ya tienes tu matriz_entrada con los 0s y 1s que necesita el algoritmo Warshall para trabajar
  30.  warshall(matriz_entrada, NUM_CIUDADES);
  31.  
  32.  // Y como dije, yo dejaria que la funcion warshall() solo haga los calculos y luego ya los muestras cuando quieras
  33.  for(int i = 0; i < NUM_CIUDADES; ++i) {
  34.    for(int j = 0; j < NUM_CIUDADES, ++j)
  35.      printf("%d ", matriz_entrada[i][j]);
  36.    printf("\n");
  37.  }
  38.  
  39. }

Para que el código anterior funcione correctamente te faltaría implementar las funciones:
Código
  1. // Devuelve el indice del elemento 'cadena' dentro del array 'cadenas'. Si no se encuentra, devuelve -1
  2. int buscarIndice(char *cadena, char *cadenas[], int num_cadenas);
  3.  
  4. // Reproduce el algoritmo Warshall contra la 'matriz_entrada' de orden (filas y columnas) indicado
  5. // Y por aclarar dudas, esta linea es la que te obliga a definir NUM_CIUDADES con 'define' y no con 'const int'
  6. void warshall(int matriz_entrada[][NUM_CIUDADES], int orden);


A partir de aquí ya sería agregar algunas mejoras como:
  • Utilizar memoria dinámica.
  • Que la función warshall() no modifique la matriz_entrada sino que genere otra matriz para no perder los valores iniciales.
35  Programación / Programación C/C++ / Re: Ayuda con implementacion algoritmo warshall en C en: 12 Mayo 2022, 22:37 pm
Citar
Ahora estoy que no se como en una matriz dinamica de cadenas de texto, compararla con una cadena de texto que seria una ciudad, y si coincide el campo de la matriz, se le da un valor numerico a esa ciudad
Este problema está ya mencionado en el otro tema que abriste para esto mismo: https://foro.elhacker.net/programacion_cc/ayuda_con_fichero_y_cadenas_en_c-t514770.0.html

Citar
Me ha mostrado una tabla con 1 y 0, aunque no se si acertaba bien en las conexiones de los nodos
Si no me he equivocado, esta matriz representa el número de ciudades por las que tienes que pasar para llegar desde la ciudad i hasta la ciudad j. (Por si te fias y quieres comparar)
(0 = ya estás en esa ciudad | -1 = no se puede llegar de la ciudad i a la ciudad j)
Código:
[INFO ] ---------- NODE LIST ----------
[ 0 - Corunya]
[ 1 - Vigo]
[ 2 - Valladolid]
[ 3 - Bilbao]
[ 4 - Madrid]
[ 5 - Oviedo]
[ 6 - Zaragoza]
[ 7 - Barcelona]
[ 8 - Gerona]
[ 9 - Valencia]
[10 - Badajoz]
[11 - Jaen]
[12 - Albacete]
[13 - Murcia]
[14 - Granada]
[15 - Sevilla]
[16 - Cadiz]


[INFO ] -------------------- WARSHALL MATRIX --------------------
  0   1   1   2   2  -1   3   4   5   4   3   3   3   4   5   4   5
 -1   0   1   2   2  -1   3   4   5   4   3   3   3   4   5   4   5
 -1  -1   0   1   1  -1   2   3   4   3   2   2   2   3   4   3   4
 -1  -1  -1   0   1  -1   1   2   3   3   2   2   2   3   4   3   4
 -1  -1  -1  -1   0  -1   1   2   3   2   1   1   1   2   3   2   3
 -1  -1  -1   1   2   0   2   3   4   4   3   3   3   4   5   4   5
 -1  -1  -1  -1  -1  -1   0   1   2  -1  -1  -1  -1  -1  -1  -1  -1
 -1  -1  -1  -1  -1  -1  -1   0   1  -1  -1  -1  -1  -1  -1  -1  -1
 -1  -1  -1  -1  -1  -1  -1  -1   0  -1  -1  -1  -1  -1  -1  -1  -1
 -1  -1  -1  -1  -1  -1  -1   1   2   0  -1  -1  -1  -1  -1  -1  -1
 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1   0  -1  -1  -1  -1  -1  -1
 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1   0  -1  -1  -1   1   2
 -1  -1  -1  -1  -1  -1  -1   2   3   1  -1   3   0   1   2   3   4
 -1  -1  -1  -1  -1  -1  -1   2   3   1  -1   2  -1   0   1   2   3
 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1   1  -1  -1   0   1   2
 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1   0   1
 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1   0

PD: Está hecho con el método mencionado en el otro tema al que hacía referencia.  :rolleyes:

Y otras cosillas:
  • A la función contar_filas() no necesitas pasarle filas/columnas como parámetros.
    Basta con que pases el nombre del fichero y devuelvas con un return el número de filas. Debería quedar algo así:
    PD: Además debería limitarse a contar filas, no a "contar columnas" (cosa que no hace muy bien pues le has puesto el número de strtok() que tiene que hacer a mano)
Código
  1. int contar_filas(char *nombre_fichero);

  • Las funciones auxiliares no deberían mostrar mensajes por pantalla a no ser que estén diseñadas específicamente para eso.
    En la función contar_filas() por ejemplo, quedaría mejor devolver un -1 si no se puede abrir el fichero sin mostrar ningún mensaje ni salir con un exit()

    Lo mismo para la función warshall(). Deja sólo la primera parte que modifica la matriz y luego muéstrala desde el main() o desde una función mostrar_matriz().
    Los cambios que hagas en la matriz se mantendrán fuera también por lo que ten en cuenta que una vez llamas a warshall() has perdido tu matriz original.
  • De la parte del main() se te simplificaría utilizando la solución del enlace que hay al principio.
    Además:
    • No necesitas declarar filas/columnas como punteros.
    • Utiliza constantes en lugar de número sueltos (ej: 17)
    • Línea 82 -> Cuidado: Las multiplicaciones/divisiones se hacen antes que las sumas/restas (necesitas usar paréntesis)
      Y por qué crear una matriz con 1 columna menos que el número de columnas que has "contado"?? Ahí algo de lógica está fallando
    • Línea 90 -> Cuidado: Estás guardando el valor de 'ciudad2' otra vez
    • La última parte sobra por completo

Con eso yo creo que quedaría todo comentado  :silbar: :silbar:
36  Programación / Java / Re: Necesito AYUDA con un EJERCICIO de MATRICES en JAVA POR FAVOR en: 10 Mayo 2022, 15:07 pm
Para conseguir el nuevo funcionamiento, el procedimiento sería el siguiente:
Código:
minimo = MAX_VALUE
PARA CADA elemento EN matriz.fila(0) HACER
  SI elemento < minimo ENTONCES
    fila = 1
    MIENTRAS fila < matriz.filas Y encontrado HACER
      encontrado = buscarElemento(elemento, matriz.fila(fila))
      fila = fila + 1
    FIN MIENTRAS
    SI encontrado ENTONCES
      minimo = elemento
    FIN SI
  FIN SI
FIN PARA
37  Programación / Java / Re: Necesito AYUDA con un EJERCICIO de MATRICES en JAVA POR FAVOR en: 9 Mayo 2022, 23:22 pm
Un par de cosillas a la hora de publicar mensajes:
  • Coloca el código entre etiquetas de código GeSHi.
    Tan solo tienes que seleccionar todo el código, ir al desplegable que pone "Código GeSHi" y elegir el lenguaje apropiado (en este caso: Java).
    Otra opción es escribir:
    [code=java]
    // Aquí pones tu código
    [/code]
    Para que quede tal que así:
Código
  1. System.out.println("Usando el codigo GeSHi");

  • Concreta todo lo posible el problema que tengas.
    - Si tu código no compila, agrega el mensaje de error que te da el compilador.
    - Si el resultado no es el esperado, indica los valores de entrada que estás usando, el resultado que esperas y el resultado que te da el programa.
    ...

A simple vista, el código parece que hace lo que tiene que hacer.
Se podría simplicar un poco pero el funcionamiento parece válido. Como he dicho antes, explica más en detalle cuál es el problema.
38  Programación / Java / Re: SOCKETS AYUDA URGENTE PORFAVOR!!!! en: 8 Mayo 2022, 21:27 pm
Para obtener el tiempo transcurrido en una porción de código tienes que seguir los siguientes pasos:
  • Guardar el instante actual al principio de la porción de código a medir
  • Guardar el instante actual al final de la porción de código a medir
  • Obtener la diferencia entre ambos instantes

Existen multitud de clases para obtener el instante actual. Pero el mecanismo es ese:
Código
  1. int startTime = System.currentTimeMillis();
  2. // aqui pones el codigo que quieras
  3. ...
  4. int finalTime = System.currentTimeMillis();
  5. int executionTime = finalTime - startTime;
  6. System.out.println("Tiempo transcurrido: " + executionTime + " ms");
39  Programación / Java / Re: SOCKETS SERVIDOR AYUDA PORFAVOR!! en: 7 Mayo 2022, 19:15 pm
El código que has puesto funciona.

He ejecutado el Servidor 1 vez y el Cliente 2 veces (la segunda tras haber terminado la primera) y estos son los resultados de la ejecución:

Del lado del Servidor:
Código:
El servidor de DayTime ha arrancado
Cliente conectado
Cliente desconectado
Cliente conectado
Cliente desconectado

Del lado del Cliente:
Código:
Cliente TCP conectado a: 127.0.0.1 en el puerto: 5000
Fecha y Hora enviadas: Sat May 07 19:09:11 CEST 2022
Mensaje recibido: Fecha y Hora enviadas: Sat May 07 19:09:11 CEST 2022
Mayusculas(8): F * H * S * M * C * E * S * T *
Minusculas(20): e * c * h * a * y * o * r * a * e * n * v * i * a * d * a * s * a * t * a * y *
Numeros(12): 0 * 7 * 1 * 9 * 0 * 9 * 1 * 1 * 2 * 0 * 2 * 2 *
Letras(28): F * e * c * h * a * y * H * o * r * a * e * n * v * i * a * d * a * s * S * a * t * M * a * y * C * E * S * T *
Espacios: 9

Cliente TCP conectado a: 127.0.0.1 en el puerto: 5000
Fecha y Hora enviadas: Sat May 07 19:09:12 CEST 2022
Mensaje recibido: Fecha y Hora enviadas: Sat May 07 19:09:12 CEST 2022
Mayusculas(8): F * H * S * M * C * E * S * T *
Minusculas(20): e * c * h * a * y * o * r * a * e * n * v * i * a * d * a * s * a * t * a * y *
Numeros(12): 0 * 7 * 1 * 9 * 0 * 9 * 1 * 2 * 2 * 0 * 2 * 2 *
Letras(28): F * e * c * h * a * y * H * o * r * a * e * n * v * i * a * d * a * s * S * a * t * M * a * y * C * E * S * T *
Espacios: 9

Si te sigue dando problemas, adjunta el error concreto que te produce y qué situación lo produce (pasos que sigues para que aparezca).
PD: Te puede estar dando un error (ConnectException) si ejecutas el Cliente antes que el Servidor. Eso es normal y es porque el Cliente no puede conectarse si el Servidor no está levantado.
40  Programación / Programación C/C++ / Re: Programa de taquilla de cine. Ayuda porfa en: 7 Mayo 2022, 18:13 pm
Absolutamente: Caótico
No puedes pretender que alguien se lea un código de +800 líneas, mal organizado, con nombres de variables inapropiados y con saltos (goto)...
No se puede trabajar con un código así.

No sé qué combinaciones estarás probando pero esto sí te lo puedo asegurar: Cada vez que llegues a una de las 37 instrucciones goto final, se acabó. Tu programa va a ir a la etiqueta final (línea 827) y va salir con el return 0; sin llegar a escribir nada en el fichero.
Y estoy prácticamente seguro de que todos los casos acaban yendo por ese camino.

Y más importante que la respuesta, este consejo: si de verdad quieres aprender programación, olvídate de este tipo de programas y empieza a estructurar bien tus códigos.
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines