Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - K-YreX

#341
Bases de Datos / Re: Ejer Alg relacional
15 Abril 2020, 22:01 PM
No es correcta esa solución. Te pongo un ejemplo para que lo veas:

PROVEEDORES:
P1 NombreP1 CiudadP1 ...
P2 NombreP2 CiudadP2 ...
P3 NombreP3 CiudadP3 ...


ARTICULOS:
A1 NombreA1 Rojo ...
A2 NombreA2 Verde ...
A3 NombreA3 Azul ...


Con el supuesto de los registros descritos arriba, tu primera parte de la intersección obtiene 3 registros (filas) cogiendo el artículo A1 y pegándole cada uno de los proveedores.

RESULTADO R1 = (Proveedores * Sigma(Color = 'Rojo')(Articulos)):
P1 NombreP1 ... A1 NombreA1 Rojo ...
P2 NombreP2 ... A1 NombreA1 Rojo ...
P3 NombreP3 ... A1 NombreA1 Rojo ...


Luego coges el nombre de cada proveedor:

RESULTADO R2 = PI(nombre)(R1):
NombreP1
NombreP2
NombreP3

Es decir que tus operaciones siempre devuelven el nombre de todos los proveedores. En ningún momento compruebas que ese proveedor haya solicitado ese artículo. Para hacer esto es para lo que tienes la relación PEDIDOS que relaciona los proveedores con los artículos. Es fácil ver esto porque es la relación que relaciona los códigos de una con los códigos de la otra y debes usar esta condición para filtrar los productos.

Lo que tienes que hacer es coger los artículos de color Rojo:

R1 = Sigma(color = 'Rojo')(Artículos)

Relacionarlo con la tabla/relación PEDIDOS con el fin de obtener los Cod_prov de los proveedores que tengan algún pedido con esos artículos:

R2 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(PEDIDOS x R1)

Y ahora relacionar este resultado R2 con la tabla PROVEEDORES para sacar los nombres asociados a cada Cod_prov que tenemos:

R3 = Sigma(Proveedores.Cod_prov = R2.Cod_prov)(Proveedores x R2)

Y ahora nos quedamos solo con los nombres:

R4 = PI(Nombre)(R3)


Con eso ya tienes los nombres de los proveedores que han suministrado artículos de color rojo. Te quedaría hacer lo mismo para los de color verde. Es más fácil si lo vas haciendo por partes como te he puesto yo aquí porque te quedan consultas más cortas.

Hazlo detenidamente y en caso de duda siempre puedes ponerte un ejemplo pequeño con 3 tablas y ver lo que va saliendo. Cualquier duda que tengas no dudes en comentar.
PD: Si utilizas tablas de ejemplo que sean pequeñas porque cada vez que multiplicas dos tablas A y B con un número de filas #A = n y #B = m, tendrás una tabla resultado C con un número de filas #C = m*n por lo que las tablas crecerán muy rápido de número de filas.
#342
Cita de: rub'n en 12 Abril 2020, 14:00 PM

* Intenta ejecutarlo desde la consola, e imprime la salida da ver que tal, y pegala aquí.
El problema lo tengo en la interfaz de WindowBuilder dentro de Eclipse, lo que es el programa se ejecuta bien pero con el descuadre ese que se ve en la ventana de edición de la imagen que puse en el primer mensaje.

Cita de: rub'n en 12 Abril 2020, 14:00 PM
* con la Jdk 8 ? (o sea, tu proyecto usando la Jdk 1.8)
Otra cosa, ve acostumbrandote con la openJdk LMAOO.
Normalmente utilizo la openjdk pero por si el problema estaba ahí probé a usar también la otra. Al final ha resultado que con Jdk 8 se ve correctamente. Es un problema ya que tengo que utilizar el 11 pero al menos he encontrado el problema ya que no encontraba nada por Internet sobre esto.

Muchas gracias por la idea. :-X

PD: Dejaré otra imagen con el problema corregido para que se vea la diferencia y por si le sirve a alguien más.
#343
El tema es que he instalado WindowBuilder en Eclipse para trabajar de forma gráfica y a la hora de utilizar la pestaña Design (que muestra la ventana con sus componentes), ésta aparece cortada. El lateral derecho se corta y no llegan a verse los botones de minimizar, maximizar y cerrar.
Además si agrando la ventana, los botones desaparecen completamente mientras que si la reduzco de tamaño se ven parcialmente.

He probado también a añadir un botón para ver si eso afecta al posicionamiento de los elementos y de momento parece que no pero de todas formas resulta molesto y me gustaría poder arreglarlo. Dejo una imagen para que se vea más claro lo que explico.


He probado varias versiones de Eclipse (4.15.0 2020-03 y 4.14.0 2019-12), varias versiones de WindowBuilder (la última y una anterior) y varios sistemas operativos (Ubuntu 18.04 y Windows 10) y el problema es el mismo siempre. También cambié los valores de xms y xmx del fichero eclipse.ini porque aparecía cierto lag al trabajar con ello y actualmente los tengo como estaban por defecto:

-Xms256m
-Xmx2048m


PD: Todo ello utilizando jdk-11.
#344
Bueno, lo primero es ver las posibles ramas del problema:

SI mes actual > mes nacimiento ENTONCES
    edad = año actual - año nacimiento
SINO SI mes actual < mes nacimiento ENTONCES
    edad = año actual - año nacimiento - 1
SINO
    SI dia actual >= dia nacimiento ENTONCES
        edad = año actual - año nacimiento
    SINO
        edad = año actual - año nacimiento - 1
    FIN SI
FIN SI

Ahora para cumplir con las restricciones podríamos establecer un valor por defecto, por ejemplo: año actual - año nacimiento y en caso de que sea necesario, restarle 1.

Sin embargo, una forma de eliminar ramas es trabajar con días directamente. La idea sería calcular los días que han pasado del inicio del año de nacimiento al día de nacimiento y del inicio del año actual al día actual y dependiendo de cual sea mayor, ya se habrán cumplido los años correspondientes del año actual o no. Como estamos trabajando con la misma referencia podemos establecer 30 días/mes para hacer los cálculos más sencillos (recuerda guardar ese 30 como una constante ya que ver números sueltos por el programa lo hace más difícil de entender).

edad = añoActual - añoNacimiento

diasAñoActual = 30 * (mesActual - 1) + diaActual
diasAñoNacimiento = 30 * (mesNacimiento - 1) + diaNacimiento

SI diasAñoActual < diasAñoNacimiento ENTONCES
    edad = edad - 1
FIN SI
#345
Estás llamando a funciones que no están en el código... Además tienes errores en el formato de algún scanf().
Y para otras consultas: no utilices mayúsculas (eso no va a hacer que te contesten antes) y pon tu código entre etiquetas de Código GeSHi. No hay manera de ver el código. Aparte de eso, utilizar nombres de variables más descriptivos ayudaría bastante a seguir el funcionamiento.
PD: Puedes estar accediendo a posiciones inválidas del array.
Y las etiquetas son una mala opción de programación, su uso debería limitarse a los switch-case.
:-X
#346
Cita de: Diesan Romero en 29 Marzo 2020, 07:25 AM
Algo de eso había visto. Y no me quedaba claro. A ver si entendí ¿Las funciones de esa biblioteca válida los caracteres de un string?
Exacto. Son funciones que permiten validar caracteres y por lo tanto permiten recorrer un string y validar los caracteres uno a uno. Por ejemplo:
Código (cpp) [Seleccionar]

#include <iostream>
#include <cstring>
#include <cctype>

using namespace std;

int main(){
    string frase = "3ST4 ES UNA FRA5E P4R4 BU5C4R NUM3R0S";
    int contadorNumeros = 0;
   
    // Recorremos el string caracter a caracter...
    for(int i = 0; i < frase.length(); ++i){
        if(isdigit(frase[i])){  // ...y si el caracter actual es un numero (decimal), incrementamos el contador
            ++contadorNumeros;
        }
    }
    cout << "La frase tiene: " << contadorNumeros << " numeros" << endl;
}


El resto de funciones puedes verlas en el enlace del mensaje anterior. Lo vuelvo a poner aquí: http://www.cplusplus.com/reference/cctype/
#347
Utiliza las etiquetas de Código GeSHi para insertar tu código. Las puedes seleccionar encima del cuadro de texto en el desplegable que dice Código GeSHi (selecciona las del lenguaje de programación apropiado, en tu caso C). Si te fijas has creado listas y tachados en tu código por utilizar letras entre corchetes sin ponerlo dentro de etiquetas de Código GeSHi. Así es muy complicado poder ver bien tu código.

Veo varias cosas importantes:
  • Deberías utilizar nombres de variables descriptivos. Así no hay manera de acordarse de qué representa cada variable.
  • Primero muestras el mensaje para introducir los valores de A y después compruebas que las matrices sean válidas. Hazlo mejor en el orden inverso.
  • Utiliza constantes para guardar los números sueltos que aparezcan en el programa. Harán tu código más fácil de modificar.

    #include <stdio.h>
    //...
    #define MAX_SIZE 20
    //...
    int main(){ // LA FUNCION MAIN RETORNA UN VALOR ENTERO (INT) NORMALMENTE 0 CUANDO TODO VA BIEN
        //...
        int matriz1[MAX_SIZE][MAX_SIZE]; // Uso de la constante para los tamaños
        //...
        return 0;
    }


  • Los índices en C/C++ (y en otros lenguajes de programación) empiezan en 0. El primer elemento de un array o de una matriz es el elemento 0, no el 1.
  • Con respecto al anterior punto, el último elemento de un array de longitud n, no es array[n] sino array[n-1]. En tus bucles estás accediendo a posiciones fuera de memoria.

    Ejemplo de programa con matriz:

    #include <stdio.h>

    #define MAX_SIZE 20

    int main(){
        int matriz[MAX_SIZE][MAX_SIZE];
        int filasUtiles = 10, columnasUtiles = 10; // Lo defino aqui aunque lo suyo seria pedirlo por teclado ya que se presupone que no conocemos la longitud util de la matriz aun
        // Si se pide por teclado seria conveniente comprobar que dichos valores no son superiores a MAX_SIZE ya que sino tendriamos un problema

        for(int i = 0; i < filasUtiles; ++i){
            for(int j = 0; j < columnasUtiles; ++j){
                printf("Introduce el valor del elemento [" + i + "][" + j + "]: ");
                scanf("%d", &matriz[i][j]);
            }
        }

        printf("\n***** Matriz resultante: *****\n");
        for(int i = 0; i < filasUtiles; ++i){
            for(int j = 0; j < columnasUtiles; ++j){
                printf("%d\t", matriz[i][j]); // \t indica un tabulador. Tambien puedes usar un espacio simplemente
            }
            printf("\n");
        }

        return 0; // Si esta linea no se pone, se pondra implicitamente. Pero la funcion main() siempre devolvera un int.
    }
#348
Programación C/C++ / Re: Duda Makefile
26 Marzo 2020, 21:42 PM
Los makefiles tienen la siguiente característica. Cuando tú ejecutas: make, sin nada más, el makefile busca la etiqueta "all:" y crea los archivos que se indican ahí siguiendo las dependencias necesarias para ello (crear primero los códigos objeto *.o y enlazar las librerías).
En cambio si escribes otra palabra después de "make" buscará y realizará las instrucciones que se indiquen en esa etiqueta. Si escribes: make clean, irá a la etiqueta "clean" y lo que hará en tu caso es eliminar todos los códigos objeto: rm -f *.o

Entonces lo que tienes que hacer es otra etiqueta, por ejemplo:

# El resto del makefile
# ...
info:
    echo "Se pueden construir los ejecutables ejer1 y ejer2"

Esta sería una versión simple en la que escribes a mano el nombre de los ejecutables. Si cambias el nombre de alguno de ellos, tendrías que cambiarlo ahí también.

Una opción sería utilizar variables (como lo son CC, CFLAGS, LIBS, EJ1, EJ2,...) para guardar los nombres de los ficheros y así podrías tener por ejemplo las variables: SRCS, OBJS, BINS,...
Y solo tendrías que cambiar el nombre en BINS para que el makefile esté completamente actualizado.

PD: Te recomendaría usar subdirectorios para los ficheros. Por convención se suelen crear dentro de tu directorio con el proyecto, los subdirectorios: src (contendrá los .cpp o .c), include (contendrá los .hpp o .h), obj (contendrá los .o), bin (contendrá los ejecutables) y doc (contendrá la documentación de tu proyecto en caso de que la quieras generar).
Así en el propio makefile puedes hacer que cada fichero se cree en su lugar correspondiente.
#349
Programación C/C++ / Re: Duda Makefile
26 Marzo 2020, 21:01 PM
Lo suyo sería que crearas unas variables para guardar los nombres de los ficheros fuente, objeto y ejecutables y así podrías mostrar luego la variable que guarda los ejecutables cuando ejecutes: make info
#350
Cita de: fary en 26 Marzo 2020, 16:10 PM
Sin ser ningún lince...

Lees de un archivo sin previa apertura del mismo. Además donde esta la función isalnum?
El "archivo" del que lee es stdin, es decir, la entrada estándar (teclado) y la función isalnum() está en la librería <ctype.h>
Sin ser un lince tampoco... :rolleyes: :rolleyes:

El problema como ya dijo @ThunderCls es que sobra el else de ese condicional para que siempre se pueda ingresar un nuevo carácter al finalizar cada vuelta.