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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 102
41  Programación / Programación C/C++ / Re: Ayuda con fichero y cadenas en C en: 7 Mayo 2022, 17:56 pm
He investigado un poco el algoritmo Warshall...

Sí, necesitas una matriz. Pero los nombres de las ciudades no tienen que estar en dicha matriz.
Debes utilizar una matriz: float matriz_warshall[][] donde el elemento matriz_warshall[i][j] contiene la distancia para ir de la ciudad i a la ciudad j.

Por lo tanto, soluciones:
  • Si sabes la cantidad y nombre de ciudades que hay, en tiempo de compilación
    En este caso podrías crear otra struct que relacione cada ciudad con un índice (simulando un Map)
Código
  1. typedef struct {
  2.  int indice;
  3.  char *nombre;
  4. } Ciudad;
  5.  
  6. const int NUM_CIUDADES = 3;
  7.  
  8. int main() {
  9.  Ciudad ciudades[NUM_CIUDADES] = { // NUM_CIUDADES aqui es opcional
  10.    {0, "Ciudad 1"},
  11.    {1, "Ciudad 2"},
  12.    {2, "Ciudad 3"}
  13.  };
  14.  
  15.  float matriz_warshall[NUM_CIUDADES][NUM_CIUDADES];
  16.  
  17.  while(fscanf(f, "%s %s %f", ciudad_origen, ciudad_destino, distancia) === 3) {
  18.    // Cada vez que leas una linea, tienes que buscar a que indices corresponden esas ciudades
  19.    int indice_origen = buscarIndice(ciudades, NUM_CIUDADES, ciudad_origen);
  20.    int indice_destino = buscarIndice(ciudades, NUM_CIUDADES, ciudad_destino);
  21.    // Y asi sabras en que posicion tienes que guardar esa distancia
  22.    matriz_warshall[indice_origen][indice_destino] = distancia;
  23.    // Y si el grafo es bidireccional:
  24.    matriz_warshall[indice_destino][indice_origen] = distancia;
  25.  }
  26.  ...
  27. }

  • Si no conoces las ciudades en tiempo de compilación (la cosa se complica un poco más)
    Aquí podrás usar un struct como en el caso anterior pero no podrás inicializar el array ciudades[] estáticamente.
    Cada vez que leas una ciudad, tendrás que ver si ya la tienes guardada en el array y coger su índice correspondiente. En caso de no encontrarla en el array, tendrás que añadirla al final con su índice correspondiente. Hecho esto, la solución es igual al caso anterior.
42  Programación / Programación C/C++ / Re: Ayuda con fichero y cadenas en C en: 4 Mayo 2022, 22:52 pm
El código pegado puede dar lugar a errores de interpretación porque está cortado. Así hay muchas cosas que tenemos que presuponer además de no saber si estás en una función auxiliar, en el main() o cosas por el estilo. Sin embargo, de momento veo algunas cosas "sospechosas"...
  • Línea 4 - No tiene mucho sentido.
  • Líneas 7 y 8 - Extraño... Estás asignando ambas líneas a la misma variables.
  • Líneas 13 y 14 - 'lineaFinal[0]' es un char, no un char*. Estás intentando copiar cadenas enteras ('linea') dentro de chars...

La forma más sencilla es leer cada campo por separado. Ejemplo simple:
Código
  1. const MAX_LONGITUD_CIUDAD= 50;
  2.  
  3. int main() {
  4.    char ciudad1[MAX_LONGITUD_CIUDAD];
  5.    char ciudad2[MAX_LONGITUD_CIUDAD];
  6.    float kms;
  7.  
  8.    FILE *f = fopen("fichero.txt", "r");
  9.    while(fscanf(f, "%s %s %f", ciudad1, ciudad2, &kms) == 3) { // fscanf devuelve el numero de variables que ha asignado correctamente, en este caso 3
  10.        printf("La ciudad 1 es: %s\n", ciudad1);
  11.        printf("La ciudad 2 es: %s\n", ciudad2);
  12.        printf("Los kms entre ellas son: %.2f km\n", kms);
  13.    }
  14.  
  15.    // Si ejecutas este programa directamente haciendo doble click sobre el exe, no te dara tiempo a ver nada antes de que la consola de Windows se cierre. Solucion:
  16.    getchar(); // getchar() espera a que pulses una tecla. Una vez pulsada cualquier tecla, el programa se cerrara
  17. }

Esta solución es suficiente si estás 100% seguro de que ninguna cadena de texto va a superar el límite de longitud de los arrays.
En caso contrario, tendrás que utilizar delimitadores para el ancho y/o otro tipo de comprobaciones.

PD: Yo no guardaría esto en una matriz pues en tal caso todos los datos tienen que ser del mismo tipo y no tiene demasiado sentido guardar kilómetros en formato string.
Lo mejor sería crear un struct más o menos como esto:
Código
  1. struct Ruta {
  2.    char *ciudad1;
  3.    char *ciudad2,
  4.    float distancia;
  5. }
Y utilizar un Ruta[] para guardar todas las líneas del fichero. Más correcto que un char[][].
43  Programación / Programación C/C++ / Re: funcion de modificar en: 4 Mayo 2022, 19:37 pm
Bueeno... Pues aquí hay un cacao bastante grande y se pueden mejorar algunas cosas de diseño.

Por un lado llamas a una función "Modificar_cliente" (línea 5) pero por otro lado llamas a una función miembro / método "Modificar_cliente" (línea 10) que tiene toda la pinta de pertenecer a una clase "Cliente" o algo así. Son 2 funciones totalmente diferentes, a no ser que el trozo de código que has pegado pertenezca a la clase "Cliente" también, en cuyo caso el código tendría un grave problema de estructuración (por lo que daré por hecho que no es el caso).

El segundo trozo de código que muestras, si está declarado fuera de la clase "Cliente", hará referencia a la función llamada en la línea 5 pero si pertenece a un fragmento de la clase, entonces hará referencia a la función llamada en la línea 10.

Voy a darte un ejemplo de cómo quedaría esto mismo con un código un poco más estructurado y haciendo uso de múltiples ficheros (los nombres son opcionales pero tienen que concordar igual que en este ejemplo).
Norma general:
- Fichero .h / .hpp -> Contiene definiciones. Define constantes globales, funciones (tipo de retorno, nombre de la función, parámetros, ...) pero sin implementación (sin contenido en la función)
- Fichero .cpp -> Contiene implementaciones. Implementa las funciones definidas en los ficheros .h o .hpp

Por un lado, como vas a trabajar con una clase Cliente, deberías crear los siguientes ficheros:
Código
  1. // FICHERO Cliente.h
  2. // Aqui definiras la estructura de la clase Cliente, solo la estructura
  3. #ifndef CLIENTE_H
  4. #define CLIENTE_H
  5.  
  6. class Cliente {
  7.  private:
  8.    int codigo;
  9.    // resto de atributos de la clase y funciones privadas
  10.    ...
  11.  
  12.  public:
  13.    Cliente(int); // El constructor. En la definicion de la clase no es necesario indicar el nombre de los argumentos
  14.  
  15.    int getCodigo();
  16.    // Otros metodos publicos de la clase (atributos preferiblemente privados)
  17.    void otraFuncionDeEjemplo();
  18.    ...
  19. }
  20.  
  21. #endif
Código
  1. // FICHERO Cliente.cpp
  2. // Aqui implementas las funciones definidas en el fichero anterior
  3. #include "Cliente.h" // Incluimos la definicion de la clase porque necesitamos conocerla desde aqui
  4.  
  5. Cliente::Cliente(int codigo) {
  6.    this->codigo = codigo;
  7. }
  8.  
  9. int Cliente::getCodigo() {
  10.    return this->codigo;
  11. }
  12.  
  13. void Cliente::otraFuncionDeEjemplo(...) {
  14.    ...
  15. }

Ahora vamos a hacer lo mismo para agrupar todas las utilidades ajenas a la clase. Esto hay muchas maneras de hacerlo: separar las utilidades en varios ficheros, definir todas en el mismo fichero, incluirlas directamente en el main, ...)
Código
  1. // FICHERO Utilidades.h
  2. #ifndef UTILIDADES_H
  3. #define UTILIDADES_H
  4.  
  5. #include "Cliente.h"
  6.  
  7. // Esta funcion devolvera el indice del cliente de la lista cuyo codigo sea el mismo que estamos buscando o -1 si no lo encuentra (lo usaremos mas adelante)
  8. int buscarIndiceCliente(Cliente[] listaClientes, int numClientes, int codigo);
  9.  
  10. #endif
Código
  1. // FICHERO Utilidades.cpp
  2.  
  3. #include "Utilidades.h"
  4. #include "Cliente.h"
  5.  
  6. int buscarIndiceCliente(Cliente[] listaClientes, int numClientes, int codigo) {
  7.    // PD: El array se tiene que recorrer desde la posicion 0 hasta la posicion numClientes (no incluida)
  8.    // En la linea 8 de tu codigo estas recorriendo desde la 1 hasta la posicion numClientes (incluida) y eso generara un error
  9.    ...
  10. }

Para usar todo esto, tenemos que crear una función main() que contiene el código principal de tu programa. Para ello usamos otro fichero
Código
  1. // FICHERO main.cpp
  2. // Basta con incluir los .h para que este fichero "conozca" la clase Cliente y las funciones (no necesita conocer la implementacion de sus funciones del .cpp)
  3. #include "Cliente.h"
  4. #include "Utilidades.h"
  5.  
  6. // ESTE FRAGMENTO se podria incluir aqui o en un fichero main.h e incluirlo al principio de este
  7. const MAX_CLIENTES = 10;
  8. // Prototipos de funciones que vayamos a usar en el main() -> La implementacion de dichas funciones iria en este mismo fichero -> En este caso usaremos Utilidades.h
  9. // FIN FRAGMENTO
  10.  
  11. int main() {
  12.    Cliente listaClientes[MAX_CLIENTES];
  13.    int numClientes = 0; // Este contador lleva el numero real de clientes en la lista
  14.  
  15.    ...
  16.  
  17.    // Ahora llegamos a tu parte:
  18.    case 'b': case 'B': // No necesitas la llave. Ademas puedes convertir la variable a mayuscula/minuscula para no hacer ambas comprobaciones
  19.        cout << "Introduce codigo: ";
  20.        cin >> codigo;
  21.  
  22.        int indiceCliente = buscarIndiceCliente(listaClientes, numClientes, codigo);
  23.        if(indiceCliente != -1) {
  24.            // Aqui ya puedes recuperar el cliente buscado a una variable para trabajar con el
  25.            Cliente c = listaClientes[indiceCliente];
  26.            // O trabajar con el directamente sin usar otra variable
  27.            listaClientes[indiceCliente].otraFuncionDeEjemplo(); // Incluyendo los mismos argumentos que hayas indicado al definir la funcion
  28.        } else {
  29.            // Si entras aqui es porque el codigo no se ha encontrado
  30.            cout << "El codigo no existe..." << endl;
  31.        }
  32.        // El uso que le das a getch() es para pausar el programa hasta que pulses una tecla y entonces limpiar la pantalla
  33.        // getch() pertenece a <conio.h> y no es estandar. En C++ la opcion recomendable es: cin.get() (y es mejor que no asignes el resultado a ninguna variable para evitar posibles errores futuros)
  34.        cin.get();
  35.        system("cls");
  36.        break;
  37.  
  38.    ....
  39. }

Código mejor estructurado y con un poco de todo para que te sirva de ayuda.

PD: Deberías pensar bien cómo quieres modificar un cliente y dónde deberías meter esa funcionalidad...  :silbar: :silbar:
44  Programación / Programación C/C++ / Re: Venta de boletos de un Teatro en lenguaje Dev c++ en: 2 Mayo 2022, 19:49 pm
NO SE HACEN TAREAS

Puedes poner lo que tengas hecho (si tienes algo) y qué parte concreta (no vale decir "todo") es la que te genera problemas para que las personas del foro te orienten.
En caso contrario, nadie te va a hacer la tarea.
45  Programación / Programación C/C++ / Re: Me podrían ayudar con este código. :( en: 2 Mayo 2022, 16:48 pm
Hacer una pregunta no es más que:
1. Escribir por pantalla la pregunta
2. Recoger la respuesta del usuario
3. Comparar la respuesta del usuario con la respuesta correcta

Además dependerá de si es una pregunta abierta (el usuario escribe la respuesta que quiere -> en este caso tendrás que recoger una cadena de texto) o de selección (el usuario elige una de las opciones disponibles -> en este caso podrás hacerlo simplemente con números).

De todo lo anterior, no sé qué es lo que te ocasiona problemas...  :rolleyes:
46  Programación / Scripting / Re: ordenar 3 valores de menor a mayor en: 20 Abril 2022, 22:31 pm
El código publicado en el mensaje original es Python sí, no es C.
Además dicho código funciona correctamente aunque el último 'else' no se va a ejecutar nunca (y por tanto también sobra el último 'elif' pudiendo ser un simple 'else') ya que no existen más casos.

Por otro lado, sí, las combinaciones posibles son 6 (las que tienes espeficadas). No hay más formas de ordenar 3 elementos {a, b, c} más que:
Código:
a - b - c
a - c - b
b - a - c
b - c - a
c - a - b
c - b - a

Lo que me da a entender que quieres hacer lo mismo en C y obviamente no va a ser tan sencillo, esa es la magia de C.
En C las comparaciones tienen que hacerse entre 2 elementos así que...
Código
  1. if (a >= b) {
  2.  if (b >= c) {
  3.    // a - b - c
  4.  } else if (a >= c) {
  5.    // a - c - b
  6.  } else {
  7.    // c - a - b
  8.  }
  9. } else {
  10.  if (c >= b) {
  11.    // c - b - a
  12.  } else if (a >= c) {
  13.    // b - a - c
  14.  } else {
  15.    // b - c - a
  16.  }
  17. }
  18.  
Y ahí tienes tus 6 combinaciones posibles.  :rolleyes:
47  Programación / Programación C/C++ / Re: [Error] expected unqualified-id before '{' token en: 5 Abril 2022, 20:20 pm
El error como tal por el que ese programa no funciona es el "1" que estás poniendo dentro del main().

Unos pequeños retoques a esta cita:
Hola, hay algunos errores en tu codigo.
1. Borra el #include <stdlib.h>, estas en C++
2. Borra el (1) del int main, debe quedar asi: int main()
3. Las variables se declaran fuera del ciclo do..while
4. Para el case 4 no es necesario el else, debes modificar el do..while para que te quede asi: } while((a != 4) || (b == 2));
5. Borra el system("pause") no es estandard.
Salu2.
1. No es borrar pues entonces ya no funcionaría. Es sustituir <stdlib.h> (correspondiente a C) por <cstdlib> (correspondiente a C++). Aunque usando la librería de C, el código compilará igual.
2. Este es el problema más importante y que hay que arreglar sí o sí. La función main puede estar vacía:
Código
  1. int main()
O con argumentos:
Código
  1. int main(int argc, char *argv[])
3. Este problema también es necesario arreglarlo (al menos para la variable 'a' porque la usas fuera del do{}, en el while()).
4. Más importante que eso: Los primeros 'case' no tienen 'break' (selecciones la opción que selecciones, siempre vas a acabar en la 4 pasando por las anteriores también)
5. No es borrar pues cambiaría el funcionamiento. Es sustituir 'system("pause")' por 'cin.get()'. Esta segunda opción se encuentra en <iostream> por lo que ya no es necesario usar la librería <cstdlib>.

PD: Ahora mismo las líneas 44, 45 y 46 no se están ejecutando nunca.
Selecciones la opción que selecciones, siempre acabas en la opción 4 (por el punto 4 anteriormente mencionado) y aquí o sales con el 'return 0' o vuelves a empezar.
No está bien estructurado el programa, tendrías que darle una vuelta para pulirlo un poco más.
48  Programación / Programación C/C++ / Re: elemento de matriz es subindice de otra en: 1 Abril 2022, 21:08 pm
Se tienen dos matrices 1 y 2 de int con igual numero de filas columnas. Un elemento de una matriz puede ser el índice de una fila de la otra matriz. Es válido escribir?
Código:
matriz_1 [ (matriz_2 [i][j]) ] [k]
o habria que buscar otra variable
Código:
int var = matriz_2 [i][j]
y luego referir a
Código:
matriz_1 [var][k]
?

La primera sintaxis que propones es válida, además los paréntesis no son necesarios:
Código
  1. matriz1[matriz2[i][j]][k]
Esto lo puedes anidar tantas veces como quieras, pero ten en cuenta que dificultará mucho su posterior lectura y sobre todo si tienen que leerlo terceras personas.

Por otro lado, quiero recalcar la frase que he marcado de tu cita original:
Que dos matrices tengan el mismo número de filas/columnas no asegura que ese acceso vaya a ser correcto.
La condición necesaria es: que todos los elementos de la matriz2 (interna) sean menores al número de filas/columnas de la matriz1 (externa) o en su defecto hacer esa comprobación antes de intentar acceder a dicho índice.
49  Programación / Bases de Datos / Re: Diseño Conceptual: Entidades Fuertes Y Entidades Débiles en: 15 Marzo 2022, 19:24 pm
Las bases de datos siempre dependen mucho de la lógica de negocio, es decir, las reglas propias que apliques a tu problema concreto. Estas reglas de negocio son las que definen las relaciones.

Yo me haría la siguiente pregunta:
¿En mi base de datos quiero permitir que haya productos que no estén asociados a ningún proveedor?
  • Sí. Entonces Producto no es una entidad débil. Puede existir por sí mismo y no tiene dependencia absoluta.
  • No, si elimino un proveedor, siempre voy a eliminar sus productos. Entonces Producto podría modelarse como una entidad débil.


O lo podemos ver de una forma más práctica todavía. Un mismo producto puede ser proporcionado por más de un proveedor? Si la respuesta es "sí", entonces Producto es una entidad débil. ¿Por qué?

Tenemos fruteros (proveedores) y frutas (productos). Entonces tenemos las siguientes tablas:
Código:
PROVEEDOR (id - nombre)
-----------------------
1 - Proveedor 1
2 - Proveedor 2

PRODUCTO (id - nombre - id_proveedor)
-------------------------------------
1 - Manzanas - 1
2 - Peras - 2
Hasta este punto ambos modelos nos sirven. De momento Producto puede ser fuerte o débil pero...
Ahora quiero meter el siguiente registro en la tabla Producto:
Código:
3 - Manzanas - 2
Ahora la entidad Producto se acaba de volver débil. Para que fuese fuerte, la relación tendría que ser N-M para poder tener un único registro "Manzanas" y tenerlo relacionado con ambos proveedores a la vez. Pero no es el caso.
Entonces para este caso, la entidad Producto debería ser una entidad débil y si borras el "Proveedor 1" de la base de datos, tendrías que borrar sus manzanas pero no las manzanas del "Proveedor 2".
50  Programación / Bases de Datos / Re: Diseño Conceptual: Entidades Fuertes Y Entidades Débiles en: 12 Marzo 2022, 20:22 pm
No, las relaciones 1-N lo que indican es que cada elemento de la primera entidad puede estar relacionado con varios elementos de la segunda pero cada elemento de la segunda sólo puede estar relacionado con uno de la primera.
Sin embargo, remarco los "puede" porque esas entidades también pueden existir sin tener relación con ningún elemento de la otra entidad.

También cabe aclarar que hay diferentes definiciones para "Entidad débil":
  • Entidad que no puede existir sin una entidad fuerte.
  • Entidad que por sí sola no tiene una clave primaria y necesita de algún atributo de una entidad fuerte para conformarla.
  • ...
El resumen es: "dependencia absoluta". Visto de una forma práctica: "Tiene sentido que guarde en mi base de datos el registro 'x' de la entidad A si no está asociado a ningún registro 'y' de la Entidad B? No" -> Entonces A es una entidad débil

Esto como siempre digo depende del diseño que se haga. Hay personas que omiten las entidades débiles y diseñan todas como si de entidades fuertes se trataran o hay quienes no modelan la entidad débil y sus campos los incluyen directamente dentro de la entidad fuerte de la que dependen.

Ej: Tienes una base de datos de un centro educativo y quieres guardar: Clase, Estudiante y Dirección (de residencia del estudiante)
Voy a seguir la siguiente nomenglatura para diseñar las entidades: ENTIDAD (campos..) // Ejemplos...
* Usaré un ID autoincremental como clave primaria (PK) para agilizar las cosas aunque se podrían formar mediante alguno/s de los atributos restantes

Código:
CLASE (id, curso, letra, mascota_de_la_clase)                         // [1, 1, A, El calamar Baltasar] | [2, 1, B, El puercoespín Serafín] | [3, 2, A, La rana Gustavo]
DIRECCION (id, calle, portal, piso, letra, ciudad, pais)              // [1, ...] | [2, ...]
ESTUDIANTE (id, dni, nombre, id_clase (FK), id_direccion (FK))        // [1, 12345678A, Pepe, 1, 1] | [2, 87654321B, Juan, 3, 2]

La relación entre Clase - Estudiante es: 1-N (Cada clase puede tener varios estudiantes pero cada estudiante puede pertenecer a una sola clase)
La relación entre Estudiante - Dirección es: 1-1 (Cada estudiante puede tener una sola dirección y cada dirección tiene que estar asociada a un estudiante)

"¿Y si 2 estudiantes viven en la misma dirección? ¿La relación no sería 1-N?"
Si haces eso y después de un tiempo uno de los estudiantes cambia de dirección, irás a la base de datos buscarás el ID de la dirección de ese estudiante y la actualizarás. Qué habrá pasado? Que el otro estudiante se acaba de mudar también sin darse cuenta :o (porque el ID de sus direcciones son el mismo)

Por eso en un caso como este es preferible que la relación sea 1-1. Además nótese que he dicho "cada dirección tiene que estar asociada a un estudiante" y no "cada dirección puede estar asociada a un estudiante". Tendría sentido que un día haya que borrar a un alumno de la base de datos y se quedase su dirección ahí colgando sin saber cómo ha llegado ahí?? Yo diría que no. Por lo tanto la entidad Dirección tiene todas las papeletas para ser una entidad débil y aplicar las siguientes reglas:
  • "No guardar direcciones en la base de datos si no están asociadas a ningún estudiante"
  • "Si se elimina un Estudiante de la base de datos, se debe eliminar su dirección asociada"

Espero que con esto te haya aclarado un poco tus dudas.  :-X
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines