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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 2 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 ... 102
111  Sistemas Operativos / GNU/Linux / Re: AYUDA! NO SE COMO ELIMINAR MI HISTORIAL DE COMANDOS EN KALI D: en: 12 Mayo 2021, 21:07 pm
Hola a todoss, he intentado borrar mi historial de comandos del terminal en kali linux y no he podido, he buscado y encontrado que el comando es " history -c " pero por alguna razon no me funciona... agradezco la ayuda  :-X
Linux tiene digamos como dos historiales: uno en memoria y otro en un fichero (el fichero que ha mencionado el-brujo). Mediante el comando:
Código:
history -c
eliminas el historial en memoria pero no modificas el fichero. Entonces cuando cierras esa consola y abres otra, se carga de nuevo el historial del fichero.
Otra alternativa es:
Código:
history -c && history -w
así consigues eliminar el historial en memoria y guardarlo en el fichero por lo que quedará vacío el fichero del historial.

>> Gracias funciono perfecto  ;D , una ultima pregunta, hay alguna forma para que nunca se guarden los comandos en el historial?? Gracias de antemano
Hasta donde yo sé (desconozco si esto es igual en todas las distros), si añades un espacio antes de un comando, éste no se guarda en el historial.
112  Programación / Programación C/C++ / Re: Petición de ayuda para un problema bastante básico de programación en c++ en: 9 Mayo 2021, 17:56 pm
El código publicado en un mensaje debe estar entre etiquetas de Código GeSHi. Puedes seleccionarlas desde el desplegable que dice Código GeSHi (eligiendo el lenguaje adecuado) o escribiendo directamente:
[code=c]
Tu código aquí
[/code]

Tienes 3 problemas:
  • Al no estar utilizando typedef como indiqué en el primer mensaje, debes utilizar la palabra struct obligatoriamente cada vez que quieras hacer referencia a un struct (struct receta, struct ingredientes,...). Además no utilices el mismo nombre para la struct que para la variable, no es nada recomendable.
  • Al momento de utilizar la función (línea 53) no tienes que indicar el tipo sino una variable que se corresponda con ese tipo.
Código
  1. res = procesarReceta(r[0], tiposIngredientes, numTiposIngredientes);
  • Te has limitado a copiar casi literalmente mi pseudocódigo (y el pseudocódigo es una forma más o menos flexible de diseñar un algoritmo utilizando sintaxis que no tiene que ser de ningún lenguaje concreto). En C las asignaciones no se hacen con := por lo que esa sintaxis no existe. Además hay un par de líneas que te has medio inventado (79-81) y te he indicado en el comentario anterior que tendrías que hacer ciertos cambios que tampoco veo.
Todos esos errores son muy básicos y cualquier compilador que utilices para compilar tu programa seguro que te indicará la línea del error y el motivo.

Si te limitas a copiar la solución sin entenderla, no vas a conseguir nada. El segundo problema demuestra que intentas utilizar una función sin entender su funcionamiento y en general todo demuestra que no quieres entenderlo, sólo conseguir que funcione. Y eso va a ser tu mayor problema.

Igual de fácil que me es a mí saber todo eso sólo viendo tu código, le será a tu profesor/a o a quien tengas que entregar ese programa. Y una simple búsqueda por Internet le servirá para ver de dónde has sacado la solución... :rolleyes: :rolleyes: Intentando engañar a los demás, sólo te engañas a ti mismo.
113  Programación / Programación C/C++ / Re: Petición de ayuda para un problema bastante básico de programación en c++ en: 9 Mayo 2021, 14:30 pm
Primero decir que es verdad que me expliqué mal acerca del ejercicio. El programa devolvería 1 de ser totalmente vegetariana la receta y 0 de encontrar algún alimento animal, pero siempre prevalecería el encontrar un ingrediente desconocido, es decir, de encontrar uno devolvería -1, independientemente ya de que sea vegetal o animal la receta.
En el algoritmo anterior he intercambiado el significado del 1 y el 0 pero puedes corregir eso sin mayor problema.
También deberás cambiar un poco el código para que busque todos los ingredientes por si alguno es desconocido.

Tengo dudas sobre la llamada a la función:
// LLamada a función procesaReceta. Pruebe diferentes recetas anteriores: r[0], r[1] o r[2]
res = procesarReceta(Receta receta, Ingredientes ingredientes[],  numIngredientes);
Eso me da error y no me deja compilar, por lo que me quedo ahí atascado y no puedo compilar e ir probando s editar el código de la función para ver si va funcionando correctamente o no.
Gracias de nuevo por la atención.
Te dará error de compilación porque el prototipo de la función tiene que ser igual que la implementación y no lo habrás cambiado en ambas partes del código.
Si el problema no es ese, añade el prototipo de la función, la implementación y la llamada para ver cómo la utilizas.
114  Programación / Programación C/C++ / Re: Petición de ayuda para un problema bastante básico de programación en c++ en: 9 Mayo 2021, 13:13 pm
El código está bastante bien estructurado (que no es poco decir).
Sin embargo, la función procesarReceta() sí que tiene algunos errores: utilizas dos tipos al mismo tiempo (int y struct...).

Antes de empezar con el problema concreto voy a mencionar un par de consejos para utilizarlos yo mismo a partir de aquí:
Cuando se define una estructura, puedes utilizar la palabra typedef para crear un nuevo tipo y no tener que utilizar siempre la palabra struct.
Los nombres de los structs es mejor que empiecen por mayúscula.
Código
  1. typedef struct {
  2.  char nombre[TAMCAD];
  3.  int numIngredientes;
  4.  int id[MAXING];
  5.  int cantidad[MAXING];
  6. } Receta;
  7. // Ahora puedes utilizar el tipo Receta asi:
  8. Receta miReceta;
  9. // en vez de asi:
  10. struct Receta miReceta;

En primer lugar, tal y como dices en la explicación, la función debe devolver {1, 0, -1} por lo que el tipo de valor de retorno deberá ser int, mejor que float.
Ahora vamos a ver los parámetros... Si tú quieres ver si una receta tiene ingredientes de origen animal necesitarás, para empezar, la receta. ¿Cuántas? 1, la que quieres procesar. No todas las recetas. Por lo que de momento:
Código
  1. int procesarReceta(Receta receta, ...);
Ahora esa receta tiene una lista de ingredientes (concretamente un array con los ids de los ingredientes). Entonces necesitarás recibir una lista con todos los ingredientes para poder buscar según su id. Por lo tanto:
Código
  1. int procesarReceta(Receta receta, Ingrediente ingredientes[], int numeroIngredientes, ...);
* En C/C++, cuando se pasa un array como parámetro suele ser necesario en la mayoría de los casos pasar un parámetro adicional para saber la longitud de ese array.
** En vez de llamar a la struct "Ingredientes" (en plural), la llamaría "Ingrediente" (en singular). Porque cada instancia será un ingrediente y no varios. A diferencia de "Propiedades" que cada instancia engloba varias propiedades.

Y con esos parámetros ya podemos implementar la función, por lo que quedaría así:
Código
  1. int procesarReceta(Receta receta, Ingrediente ingredientes[], int numeroIngredientes) {
  2.  // tu codigo aqui
  3. }

Ahora el algoritmo de tu función:
Teniendo la receta que quieres comprobar, tienes que recorrer todos sus ingredientes mientras que no hayas encontrado uno que sea animal y mientras no se acaben los ingredientes. Por cada uno de esos ingredientes, debes recorrer el array de ingredientes para encontrar el que coincide según su id y mirar si es de tipo animal.
Hay un pequeño detalle que no está bien definido en la explicación: si una receta tiene un ingrediente de origen animal y otro desconocido, qué se debe devolver? 1 o -1? Eso quedará a decisión tuya.
En pseudocódigo sería algo así:
Código:
i := 0 // Indica el indice del ingrediente actual de la receta
resultado := 0 // Indica: 0 (no animal) | 1 (animal) | -1 (desconocido)
MIENTRAS i < receta.numIngredientes && resultado == 0 HACER
  j := 0 // Indica el indice del ingrediente actual entre todos los ingredientes
  MIENTRAS j < numIngredientes && ingredientes[j].id != receta.ingredientes[i] HACER
    j := j +1
  FIN MIENTRAS
  // Aqui llegamos si hemos encontrado el ingrediente correspondiente segun el id o si no existe
  SI j < numIngredientes ENTONCES // lo hemos encontrado en la posicion j
    resultado := (ingredientes[j].tipo == 'A') // Esto sera 1 si la comparacion es true o 0 si es false
  SINO // no lo hemos encontrado
    resultado := -1
  FIN SI
  i := i + 1
FIN MIENTRAS
RETURN resultado
* Este algoritmo devuelve 1 o -1 en función de lo primero que encuentre. Y 0 si no encuentra ninguno de los otros dos casos.
Conviértelo a C (es muy sencillo) y pruébalo. A partir de ahí puedes hacer los cambios que consideres.
115  Programación / Programación C/C++ / Re: switch en: 5 Mayo 2021, 19:33 pm
La sentencia switch(), como bien dices, es una manera de simplificar un tipo concreto de if(). Un switch() sirve para evaluar una expresión de tipo int o char y dependiendo del valor hacer una cosa u otra.
Código utilizando if():
Código
  1. int mes;
  2. printf("Introduce un numero del 1 al 12: ");
  3. scanf("%d", &mes);
  4. if(mes == 1) printf("Enero\n");
  5. else if(mes == 2) printf("Febrero\n");
  6. else if(mes == 3) printf("Marzo\n");
  7. ...
  8. else printf("No has introducido un numero entre 1 y 12\n");

Mismo código utilizando switch():
Código
  1. int mes;
  2. printf("Introduce un numero del 1 al 12: ");
  3. scanf("%d", &mes);
  4. switch(mes) { // Segun el valor de <mes>...
  5.  case 1:  // ...si es 1...
  6.    printf("Enero\n"); // ...haces esto...
  7.    break; // ...y sales del switch
  8.  
  9.  case 2: // ...si es 2...
  10.    printf("Febrero\n"); // ...haces esto...
  11.    break; // ...y sales del switch
  12.  
  13.  ...
  14.  
  15. default: // ...si no era ninguno de los anteriores...
  16.    printf("No has introducido un numero entre 1 y 12\n");
  17.    break; // (este break es opcional porque no hay mas casos)
  18. }

El switch permite hacer comparaciones de igualdad teniendo que escribir menos en la condición. El break es necesario para salir del switch y no ejecutar todos. Si no se pusiera el break, el programa entraría en el primer case que cumpla la condición y ejecutaría el código de todos hasta encontrar un break o hasta terminar. Esto también se puede aprovechar para algo como esto:
Código
  1. char letra = ...;
  2. switch(letra) {
  3.  case 'a': case 'e': case 'i': case 'o': case 'u':
  4.    printf("La letra %c es una vocal minuscula\n", letra);
  5.    break;
  6.  
  7.  case 'A': case 'E': case 'I': case 'O': case 'U':
  8.    printf("La letra %c es una vocal mayuscula\n", letra);
  9.    break;
  10.  
  11.  default:
  12.    printf("La letra %c es una consonante\n", letra);
  13. }

* La claúsula <default> es opcional y siempre debe ir al final porque sino cualquier case que vaya después que <default> no se va a ejecutar nunca (a no ser que no haya breaks).
116  Programación / Programación C/C++ / Re: Colores random en C en: 2 Mayo 2021, 19:15 pm
Aunque está el tema solucionado, ya que se ha mencionado... Agrego unos últimos consejos para el código mostrado:
  • Agregar todas las librerías al principio del fichero. Esto facilita verlas todas de un único vistazo y tenerlas disponibles para todo el código.
  • Eliminar la librería <conio.h>. Esta librería no es estándar por lo que algunos compiladores darán error en esa línea. Su uso más visto sobre todo en personas que están empezando es para poder utilizar la función getch(). Esta función se puede sustituir por getchar() que cumple el mismo propósito y pertenece a <stdio.h>.
  • <bing> y <bong> no son los nombres más descriptivos para esas variables. Cuanto más ayude el nombre de una variable a identificar su función, mejor. Aunque hay que reconocer que tiene su gracia decir sus nombres... :xD
  • La semilla de los números aleatorios srand(...) se suele llamar una única vez en el main() aunque luego se utilice la función rand() en otras partes.
  • Las funciones que utilizas no son muy escalables digamos. Lo bueno de una función es declararla una vez y poder utilizarla múltiples veces. Ahora vamos a analizar la función que genera un número aleatorio:
Código
  1. int RandomMin1Max10() {
  2.    srand(time(NULL));
  3.    int valor;
  4.    valor = (rand()%(10+1-1)+1); // Al ser numero fijos no tiene mucho sentido dejar esas operaciones
  5.    return valor;
  6. }
Una función que genera un número aleatorio entre 1 y 10. Está bien, funciona bien pero... ¿no sería mejor poder decidir tú el límite cada vez que la llamas? Así la función será más reutilizable.
Código
  1. int generarNumeroAleatorio(int minimo, int maximo) {
  2.  return minimo + rand() % (maximo - minimo + 1);
  3. }

Esto mismo con la función CargaNum(). ¿Y si puedes pasar el mensaje que quieras en cada ocasión?
Además puedes dejar el buffer de entrada limpio siempre (lo que te ahorrará muchos quebraderos de cabeza cuando empieces a usar fgets() para pedir cadenas de texto al usuario, espero que os enseñen esta función en vez de gets()  :silbar: :silbar:)
Código
  1. int pedirEntero(char *mensaje) {
  2.  int numero;
  3.  printf(mensaje);
  4.  scanf("%d", &numero);
  5.  while(getchar() != '\n'); // limpiar el buffer de entrada
  6.  return numero;
  7. }

Y con esto ya podemos dar el tema por cerrado para no desviarnos más del tema principal. :-X
117  Programación / .NET (C#, VB.NET, ASP) / Re: Ejercicio básico de combinaciones en: 2 Mayo 2021, 14:28 pm
Yo no veo que 'se complique'... en realidad hay una optimización, que simplemente añade una sola línea de código y modifica ligeramente 2 lineas... esperaba que cuando ejecutara los cambios si los entendía, pudiera él mismo intentarlo (es algo obvio) o al menos preguntar...
No me refería a que se complicase el código (que entiendo que el tuyo es más extenso por haber incluido código de la interfaz) sino a lo de mantener la distancia entre los números y generar números con dígitos que no están entre los introducidos.

Al final ha resultado que yo tampoco lo estaba terminando de entender pero creo que ahora ya sí.
A - ¿El primer grupo solo y siempre puede formar parte en las decenes y el segundo solo y siempre de las unidades (o viceversa, pero solo y siempre)?

B - ¿... o pueden igulamente ser intercambiados mientras el dígito en la unidad sea de un grupo distinto al dígito en la decena?. Esto si sería de verdad 'todas' las permutaciones posibles.
A mí entender, una vez tienes todos los grupos posibles (menores a 49) de 2 dígitos con los dígitos dados, hay que crear digamos filas combinando 6 de esos grupos.

Estando ahora en lo cierto, según mis códigos anteriores ya teníamos en numerosGenerados todos los números menores a 49 generados. Ahora habría que combinar dichos números para crear los nuevos grupos (cada uno formado por 6 números de los generados).
Pongamos el siguiente caso (cogido de uno de los códigos anteriores):
Código:
digitos = { 1, 4, 5, 7, 8, 9 }
numerosGenerados = { 11, 14, 15, 17, 18, 19, 41, 44, 45, 47, 48, 49 }
Ahora queremos crear grupos del tipo: { X1, X2, X3, X4, X5, X6 } donde cada Xi es un número perteneciente a numerosGenerados.
Podemos ver que X1 nunca podrá ser 44 o mayor porque entonces nos faltarían números para completar el grupo.
De la misma manera X2 nunca podrá 11 (porque entonces cuál sería X1??) ni 45 o mayor por lo mismo que antes.
Haciendo el mismo cálculo con cada uno podemos sacar el siguiente código:
Código
  1. List<List<int>> gruposGenerados = new List<List<int>>();
  2. int elementosPorGrupo = 6;
  3.  
  4. for(int i = 0; i < numerosGenerados.Count - elementosPorGrupo + 1; ++i)
  5. for(int j = i + 1; j < numerosGenerados.Count - elementosPorGrupo + 2; ++j)
  6. for(int k = j + 1; k < numerosGenerados.Count - elementosPorGrupo + 3; ++k)
  7. for(int l = k + 1; l < numerosGenerados.Count - elementosPorGrupo + 4; ++l)
  8. for(int m = l + 1; m < numerosGenerados.Count - elementosPorGrupo + 5; ++m)
  9. for(int n = m + 1; n < numerosGenerados.Count - elementosPorGrupo + 6; ++n)
  10. gruposGenerados.Add(new List<int> {numerosGenerados[i], numerosGenerados[j], numerosGenerados[k], numerosGenerados[l], numerosGenerados[m], numerosGenerados[n]});
PD: El código se puede simplificar pero así creo que es más fácil de entender.

SALIDA:
Código:
11 14 15 17 18 19
11 14 15 17 18 41
11 14 15 17 18 44
11 14 15 17 18 45
11 14 15 17 18 47
11 14 15 17 18 48
11 14 15 17 18 49
11 14 15 17 19 41
11 14 15 17 19 44
11 14 15 17 19 45
11 14 15 17 19 47
11 14 15 17 19 48
11 14 15 17 19 49
11 14 15 17 41 44
11 14 15 17 41 45
11 14 15 17 41 47
11 14 15 17 41 48
11 14 15 17 41 49
...
18 44 45 47 48 49
19 41 44 45 47 48
19 41 44 45 47 49
19 41 44 45 48 49
19 41 44 47 48 49
19 41 45 47 48 49
19 44 45 47 48 49
41 44 45 47 48 49
118  Programación / Programación C/C++ / Re: Colores random en C en: 2 Mayo 2021, 13:42 pm
Mmm pues este programita lo hice yo, pero vi que un mod escribió que tengo que poner etiquetas geshi? Te referís a eso?
No, creo que [D]aniel ha sobreentendido, al parecer de forma errónea, el comentario de "código compartido" como que este era un código compartido que has encontrado por ahí.
Lo de las etiquetas de Código GeSHi simplemente es para facilitar la lectura de código al resto de usuarios.

Si con la función system() puedes poner un color a la consola, lo que puedes hacer es llamar varias veces a la función system() con diferentes colores. Si esto se hace de forma seguida no te dará tiempo a ver más que el último color por lo que tendrás que usar la función sleep() entre medias para crear un retardo.

La función sleep(int segundos) para sistemas Unix se encuentra en <unistd.h> mientras que para Windows la función es Sleep(int milisegundos) y se encuentra en <windows.h>. Una forma de que el código funcione en ambos sistemas sería:
Código
  1. #ifdef _WIN32
  2. #include <windows.h>
  3. #else
  4. #include <unistd.h>
  5. #endif
  6.  
  7. void mySleep(int milliseconds) {
  8.  #ifdef _WIN32
  9.  Sleep(milliseconds);
  10.  #else
  11.  sleep(milliseconds / 1000);
  12.  #endif
  13. }

El problema del código anterior es que ocupa el hilo principal del programa. Si quieres una solución más compleja que vaya cambiando el color de la consola mientras, por ejemplo, esperas que el usuario introduzca una tecla para continuar; podrías utilizar hilos para ejecutar el código del cambio de color y el retardo en un hilo secundario mientras tú sigues ejecutando el código principal en el hilo principal. Pero como digo esto ya sería una solución más avanzada.
119  Programación / .NET (C#, VB.NET, ASP) / Re: Ejercicio básico de combinaciones en: 1 Mayo 2021, 21:25 pm
Yo creo que se está complicando demasiado el problema inicial. Y que bastaría con lo que expuse en su momento.

Yo diría que algo así te puede servir:
Código
  1. int numeroMaximo = 49;
  2. int[] digitos = { 1, 4, 5, 7, 8, 9 };
  3. List<int> numerosGenerados = new List<int>();
  4.  
  5. int decenaMaxima = numeroMaximo / 10;
  6. int unidadMaxima = numeroMaximo % 10;
  7.  
  8. for(int i = 0; i < digitos.Length && digitos[i] <= decenaMaxima; ++i)
  9.  for(int j = 0; j < digitos.Length && (digitos[i] < decenaMaxima || digitos[j] <= unidadMaxima); ++j)
  10.    numerosGenerados.Add(digitos[i] * 10 + digitos[j]);
** Para que el algoritmo anterior funcione correctamente el array de dígitos debe estar ordenado.
Las condiciones de los bucles for() no son muy complicadas pero cualquier duda no dudes en comentarla.

Salida:
Código:
11 - 14 - 15 - 17 - 18 - 19
41 - 44 - 45 - 47 - 48 - 49

Entrada 2:
Código
  1. int[] digitos = {2, 3, 5, 7, 8, 9};

Salida 2:
Código:
22 - 23 - 25 - 27 - 28 - 29
32 - 33 - 35 - 37 - 38 - 39

Las únicas diferencias que veo son:
  • El código expuesto está en C# -> Habría que convertirlo a VB.
  • Aparece también la combinación de un dígito consigo mismo. Esto se corrige así:
Código
  1. for(int i = 0; i <digitos.Length && digitos[i] <= decenaMaxima; ++i)
  2.  for(int j = 0; j < digitos.Length && (digitos[i] < decenaMaxima || digitos[j] <= unidadMaxima); ++j)
  3.    if(i != j) numerosGenerados.Add(digitos[i] * 10 + digitos[j]);
120  Programación / Bases de Datos / Re: Ayuda con entidad relación sencillo en: 1 Mayo 2021, 13:47 pm
Desconozco la función que le quieres dar a esas tablas o su estructura...
Pongamos que Carrito es la tabla para guardar los productos que un usuario ha agregado a su carrito pero que no ha comprado todavía.
Una forma sin reestructurar la base de datos es: Carrito (id_usuario, id_producto, cantidad). Es decir, una relación entre Usuarios y Productos.

Páginas: 1 2 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 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines