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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! de elhacker.NET


  Mostrar Mensajes
Páginas: 1 ... 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [18] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ... 88
171  Programación / Programación C/C++ / Re: AYUDA PROBLEMA C++ en: 12 Junio 2020, 02:42 am
Me parecía sospechoso que hubiese dos números que cumpliesen las condiciones cuando tu profesor había dicho que solo habría uno. (Puede ser que se equivocase, pero no lo creo).

Si te fijas, al principio del enunciado hay otro comentario:
Muy buenas a todos, me colocaron a realizar el siguiente problema: El numero, 1406357289, contiene todos los dígitos del 0 al 9.

si d1 es el primer dígito, d2 es el segundo dígito, y así sucesivamente. Encuentre todos los números entre 4130912867 y 4130992867 que cumplen las siguientes condiciones :
Código:
d2d3d4=406 es divisible por 2
d3d4d5=063 es divisible por 3
d4d5d6=635 es divisible por 5
d5d6d7=357 es divisible por 7
d6d7d8=572 es divisible por 11
d7d8d9=728 es divisible por 13
d8d9d10=289 es divisible por 17
Es cierto que hay dos números que cumplen con las condiciones recuadradas y estos son:
Código:
Numero valido: 4130952867
Numero valido: 4130959493
Pero si te fijas bien, solo uno de ellos cumple con la primera frase del enunciado (remarcada en negrita): que tenga todos los dígitos. Y este es el primero de los dos. Por lo tanto me parece que también tiene que darse esa condición y por tanto solo hay un número válido que cumpla todas las condiciones.
172  Sistemas Operativos / GNU/Linux / Re: Crear un lanzador (o acceso directo) en el escritorio de Ubuntu-Desktop en: 11 Junio 2020, 20:45 pm
Gracias #!drvy.

He hecho lo que indicas pero sigue sin funcionar, la única diferencia que hay ahora es que al pinchar dos veces seguidas sobre el “lanzador”, en lugar del mensaje que salía antes, ahora se abre el editor de texto y se carga el contenido del archivo “aplic.desktop”.

Un saludo.


Ahora mismo me has pillado trabajando con Windows y no me acuerdo exactamente dónde era pero sé que Ubuntu tiene una opción que si está marcada permite ejecutar los ficheros al hacer doble click sobre ellos y si está desmarcada, los abre con el editor de texto.
Puede ser en Preferencias de Nautilus. Siento no poder ser más preciso.

Suerte. :-X
173  Programación / Programación C/C++ / Re: AYUDA PROBLEMA C++ en: 11 Junio 2020, 19:28 pm
Ese código que tienes es una locura para lo que quieres controlar.

Mi recomendación es que hagas una función:
Código
  1. int subNumero(int numero, int inicio, int longitud);
Que le pasas el número completo y te devuelve un número que empieza en el dígito <inicio> y con una longitud de <longitud>.

Y para comprobar si un número n es divisible por x, se usa el operador módulo (%):
Código
  1. if(numero % 2 == 0)
  2.  cout << "El numero " << numero << " es divisible por 2" << endl;

Con esos dos consejos deberías poder mejorar bastante ese programa.
Inténtalo y cuando te surja algún problema coméntalo para seguir ayudándote.



PD: Otra opción es guardar cada dígito en una posición del array. Pero utiliza las estructuras del lenguaje para no tener que hacer el estropicio ese de las líneas 11-23:
Código
  1. const int NUM_DIGITOS = 10;
  2.  
  3. int main(){
  4.  int numero = 4130912867;
  5.  int digitos[NUM_DIGITOS];
  6.  
  7.  for(int i = NUM_DIGITOS-1; i >= 0; --i){
  8.    digitos[i] = numero % 10;
  9.    numero /= 10;
  10.  }
  11. }
Esto modifica tu variable número original. Si no quieres que se vea modifica, crea una función a la que le pases el número como parámetro por valor.
174  Programación / Programación C/C++ / Re: Programa que muestra la frecuencia de una lista de compras en: 9 Junio 2020, 20:54 pm
Por comentar algunas cosas del código, diré lo siguiente:

Bibliotecas

  • Si trabajas con C++, utiliza siempre <iostream> para entradas/salidas y no lo mezcles con <stdio.h> que es propia de C.
  • Las biblioteca propias de C (acabadas en .h) tienen su propia versión para C++ (eliminando el .h e incluyendo una c al principio. Ej -> <cstdio>).
  • En C++ el uso de memoria dinámica no se realiza con malloc() / free() sino con new() / delete().
  • La biblioteca <conio.h> no pertenece al estándar y por tanto hay máquinas en las que da problemas. La función típica de esta biblioteca es getch() que puede y debe ser sustituida por cin.get() en C++ (<iostream>) o por getchar() en C (<stdio.h>).


Novedades de C++ frente a C

  • La diferencia fundamental entre C/C++ es la capacidad del segundo de utilizar el paradigma de programación orientado a objetos. Aunque C permite el uso de structs, están son más limitadas que las clases de C++ ya que no permiten utilizar el principio de ocultación (declarar miembros privados). Usando clases con sus miembros privados y métodos o funciones miembro públicas para interactuar con los miembros de la clase, aumentas la seguridad del programa.
  • Además, como curiosidad, me parece que en C++ se puede omitir la palabra struct si no me equivoco cada vez que se hace referencia a ese tipo de dato.
  • Otra ventana de C++ es la aparición de strings. Sobre todo para facilitar el trabajo con memoria dinámica y no tener que desperdiciar espacio reservando los char[] de manera estática. Aprovecho ahora que hablo sobre las cadenas de char para decir que cuando se define una cadena char como parámetro a una función no es necesario aportar su longitud siempre que sea de una dimensión. Son números que no aportan nada al programa y que pueden complicar las labores de modificación del código. Y las longitudes que sí tienen que estar presentes es mejor guardarlas como constantes para facilitar su modificación y mantenimiento.


Organización del Código

  • Normalmente cuando ves un programa en C/C++, si quieres ver lo que hace de un vistazo rápido, buscas la función main(). En este caso esa función no aporta nada a cualquier persona que quiera leer el código. Hay que tener un término medio entre usar funciones y no usarlas. La función menu() debería mostrar las opciones, controlar que la opción es válida (opcional) y devolver la opción elegida. Y en el main() debería llamarse a esa función y a continuación tener el código principal, es decir, el switch con las opciones.
  • Además de eso, otro mal hábito es utilizar variables globales. El uso de variables globales es excepcional y casi siempre son constantes lo que se declaran de esta manera. Las variables deberían ser locales a la función en la que van a ser necesitadas.


No me enrollo más. Esas son algunas, si no todas las cosas que yo mejoraría de ese código.
Por lo demás es un código limpio y con comentarios que explican las cosas que se hacen.

Mucha suerte en otros proyectos. :-X
175  Programación / Programación General / Re: Casos de uso en: 8 Junio 2020, 14:00 pm
En primer lugar, no hagas doble post. Si quieres añadir cualquier información modifica el mensaje original.
Poner otro mensaje pidiendo ayuda de nuevo no va a solucionar nada. Si alguien te contesta lo va a hacer con la misma rapidez si es un mensaje que si son más.

Hola a todos tengo que realizar unos casos de uso según lo siguiente, entiendo que se tendrían que hacer 3, usuario, usuario registrado y administradores, pero no sé como realizarlo, los include y extends no entiendo muy bien como usarlos
Los casos de uso no son esos 3. Esos 3 son los actores que realizan los casos de uso. Para esto tienes que hacer un rectángulo que representa el sistema y dentro del rectángulo dibujar elipses con el nombre de cada caso de uso. Un caso de uso es una operación que puede realizar el sistema. Estos casos de uso se relacionan mediante líneas con el/los actor/es (que se representan fuera del rectángulo) que puede/n realizarlos.

Supón A y B dos casos de uso:
  • A --<extends>--> B significa que la operación del caso de uso B se puede ver complementada en algunas ocasiones por el caso de uso A.
  • A --<include>--> B significa que para completar la operación del caso de uso A siempre será necesario que el sistema ejecute el caso de uso B como parte de la operación principal.

Si necesitas más información, busca en Internet sobre diagramas de casos de uso y encontrarás más información. No es una ciencia muy exacta y menos cuando no se comprueba el resultado final con la ejecución de un sistema como el representado.
176  Programación / Bases de Datos / Re: Trigger complejos MySQL en: 5 Junio 2020, 21:24 pm
Hola de nuevo, el segundo trigger no se puede hacer, basicamente cuando haces un Insert la tabla se queda bloqueada y no podrias hacer otra accion como un delete seguida.
Y del primero no consigo hacer nada.

Trigger para que no permita introducir en Inventario una cantidad mayor que la que tiene ese producto en la tabla Producto:
Código
  1. DELIMITER //
  2. CREATE TRIGGER TR_Inventario BEFORE INSERT ON Inventario FOR EACH ROW BEGIN
  3.  DECLARE producto_stock INT;
  4.  SELECT producto.stock INTO producto_stock FROM producto WHERE producto.id_producto = NEW.id_producto;
  5.  IF(producto_stock < NEW.cantidad) THEN
  6.    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: Inventario';
  7.  END IF;
  8. END//
  9. DELIMITER ;

Trigger que no permita introducir en la tabla Producto cantidades negativas:
Código
  1. DELIMITER //
  2. CREATE TRIGGER TR_Producto BEFORE INSERT ON Producto FOR EACH ROW BEGIN
  3.  IF(NEW.cantidad < 1) THEN
  4.    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: La cantidad tiene que ser mayor que 0';
  5.  END IF;
  6. END//
  7. DELIMITER ;

He probado ambos triggers en una base de datos de prueba y funcionan. :silbar: :silbar:
177  Programación / Programación General / Re: Simbología y elementos de un diagrama de clases en: 5 Junio 2020, 15:01 pm
La flecha de Empleado es una relación de Generalización.

Si has trabajado con programación orientada a objetos es la herencia de toda la vida. Lo que quiere decir es que Cuidador y Guía heredan (se especializan) de Empleado. O dicho al revés que Empleado es una generalización de Cuidador y Guía. Se habla de generalización/especialización según si lo miras en un sentido o en otro.

Esto se usa cuando varias clases tienen aspectos en común para no escribirlos dos veces (una vez en cada clase) se hace una superclase (o clase padre) que engloba estos aspectos comunes. Al final el resultado es que si una clase (hija) hereda/se especializa de una clase (padre), la clase hija contendrá de forma implícita todos los atributos y comportamientos (métodos) de la clase padre.

Prácticamente siempre si no siempre se tiene que poder leer como: <clase hija> ES UN <clase padre>. Ejemplos:
  • Cuidador ES UN Empleado.
  • Guía ES UN Empleado.
178  Programación / Programación C/C++ / Re: problema if anidados (notas) en: 5 Junio 2020, 14:55 pm
El problema está en esos ".9".
En ningún momento aseguras que la nota tenga un solo decimal, entonces qué pasa si tienes un 9.95, 9.995, 9.999995, 6.99999999??? Todas esas notas no están contempladas en ningún caso.

Es por esto que no se usa (<= 9.9) sino que se usa (< 10) que sí contempla cualquier cantidad de decimales. Así que tendrías que sustituirlo en todos los casos y cuando sustituyas (<= 6.9) por (< 7) verás que funciona correctamente. El problema será que aunque tú escribas 6.9, un float (32 bits) maneja una cantidad muy grande de decimales, entonces es posible que se guarde 6.90[...]01 y entonces no se cumple la condición.

Aparte de eso, te doy algún consejo más aunque no te frustres por no haber hecho el mejor programa. Es normal cuando uno está empezando. Poco a poco irás mejorando en la lógica.
  • Para limpiar el buffer no se debe utilizar nunca fflush(stdin). Esta función está definida por el lenguaje para limpiar el buffer de salida (fflush(stdout)) y hasta la propia documentación del lenguaje recoge que el uso con stdin es indeterminado. Puede ser que 1 millón de veces pero no hay fundamentación teórica que diga que va a funcionar 1 millón y 1 vez.
Una alternativa para limpiar el buffer es:
Código
  1. while(getchar() != '\n');
Por si te interesa el funcionamiento: el buffer contiene lo que introduces por teclado para luego usarlo (en una asignación a una variable por ejemplo). Puede ser que queden caracteres que no cabían en la variable y al final como último elemento del buffer el ENTER ('\n'). Con la instrucción anterior vas cogiendo cada caracter que queda en el buffer hasta encontrar el ENTER (que lo coge también). Una vez cogido el ENTER, ese bucle termina y el buffer está vacío.

  • Si ordenas los rangos de los ifs verás que queda un código más simple y con menos condiciones. Además los else-if se suelen encadenar como te muestro acontinuación pues es más fácil de leer y ahorran llaves:
Código
  1. if(nota < 0){
  2.  printf("La nota es menor que 0. Intervalo: (-inf,0)");
  3. } else if(nota < 5){ // Si llegamos a este else, la condicion anterior es falsa por lo tanto ya sabemos que el numero es >= 0. No hay que comprobarlo otra vez
  4.    printf("La nota esta entre 0 y 5 sin llegar al 5. Intervalo: [0,5)");
  5.  } else if(nota < 7){ // Si llegamos aqui ya sabemos que nota >= 0 por el primer if y que nota >= 5 por el segundo. No hay que comprobarlo.
  6.      printf("La nota esta entre 5 y 7 sin llegar al 7. Intervalo: [5,7)");
  7.    } else if(nota < 9){ // Igual que antes. Ya sabemos que la nota es >= 7.
  8.         printf("La nota esta entre 7 y 9 sin llegar al 9. Intervalo: [7,9)");
  9.       } else if(nota < 10){ // Ya sabemos que la nota es >= 9
  10.            printf("La nota esta entre 9 y 10 sin llegar al 10. Intervalo: [9,10)");
  11.          } else if(nota == 10){
  12.               printf("La nota es 10");
  13.             } else { // Igual que antes si ninguno de los ifs anteriores se han cumplido, ya sabemos que la nota es > 10
  14.                  printf("La nota es mayor que 10. Intervalo: (10, +infinito)");
  15.                }

Si has utilizado los intervalos de matemáticas puedes ver la diferencia de usar intervalo abierto o cerrado. En la mitad abierta (con paréntesis) no se incluye ese valor pero en la cerrada (con corchetes), sí. Ese matiz es la diferencia entre usar el < / > o el <= / >=.

Además suele quedar un poco feo eso de que el código se vaya tanto hacia el centro y cuando los bloques (condicionales, bucles,...) están formados por una única línea en su interior se pueden omitir las llaves. Muchas veces lo verás así:
Código
  1. if(nota < 0)
  2.  printf("La nota es menor que 0");
  3. else if(nota < 5)
  4.  printf("La nota esta entre 0 y 5");
  5. else if(nota < 7)
  6.  printf("La nota esta entre 5 y 7");
  7. //...

PD: Por otra parte, muy bien usado el getchar() al final para hacer una pausa en vez de utilizar getch() o system("pause"). ;-)
179  Programación / Programación General / Re: Simbología y elementos de un diagrama de clases en: 5 Junio 2020, 13:20 pm
Los rombos con relleno (los únicos que aparecen en tu diagrama) representan una relación de composición.
La característica de estas relaciones es que determina una entidad débil (Parque) y una entidad fuerte (Zona). La entidad débil no puede existir por sí misma sin la entidad fuerte, es decir, que no puedes guardar los parques de una zona en tu sistema si no tienes guardada esa zona. De igual manera entre Zoo - Parque, no puedes guardar en tu sistema los Zoos de un parque si no tienes guardado ese parque.
Otra característica es que una instancia de la entidad débil no puede ser compartida por varias de la fuerte. Un Zoo no puede pertenecer a varios parques diferentes.
Y una última característica sería que si en algún momento eliminas la instancia de la entidad fuerte, se deberán eliminar todas las instancias de la entidad débil que estuviesen relacionadas con esa instancia de la fuerte. Resumido: Si en tu sistema eliminas un parque, se deberán eliminar primero todos los zoos de ese parque.

Existe otro tipo de rombo que no está relleno y estos representan relaciones de agregación. Son un poco "la otra mitad":
También podemos diferenciar una entidad débil y una fuerte, y que la débil forma parte de la fuerte, pero en este caso no existe una dependencia tan fuerte como en el caso anterior.
En este caso una instancia de la entidad débil puede estar relacionada con más de una instancia de la entidad fuerte.
Si se elimina la instancia de la entidad fuerte, no se eliminan las instancias de la entidad débil con las que tuviese relación.
Por ejemplo: En un taller, Piezas - Vehículos. Tienen unas piezas guardadas en un almacén y esas piezas se usan para reparar unos vehículos. Pero cuando el vehículo sale del sistema, no tiran todas las piezas que valían para ese vehículo, siguen ahí para utilizarlas con otro.
180  Programación / Programación C/C++ / Re: Me pueden explicar como hago estos problemas! por favor. en: 5 Junio 2020, 01:36 am
No sé si estás programando en C o en C++. Te dejo un pseudocódigo para que intentes implementarlo en el lenguaje que uses:
Código:
// Un filtro para pedir el tamaño de la matriz A:
HACER
  PEDIR filasA, columnasA
  valido = filasA < 1 or filasA > 10 or columnasA < 1 or columnasA > 10
  SI !valido ENTONCES
    MOSTRAR "Error: El tamaño de la matriz no es valido"
  FIN SI
MIENTRAS !valido
matrizA[filasA][columnasA]
// Repetir lo mismo para la matriz B pero en este caso tendras que comprobar tambien que se cumpla la segunda condicion

matrizResultado[filasA][columnasB]
matrizResultado = multiplicar(matrizA, matrizB)

Ahora intenta codificar eso hasta donde llegues. Por lo menos hasta la parte de la matrizResultado tienes que poder llegar.
En cualquier caso si tienes algún problema y te estancas, coloca tu código entre etiquetas de Código GeSHi eligiendo el lenguaje adecuado (C/C++) y así viendo cómo lo llevas podremos guiarte mejor.

Suerte. :-X
Páginas: 1 ... 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [18] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ... 88
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines