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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  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 ... 86
61  Programación / Programación C/C++ / Re: No Imprime en: 23 Noviembre 2020, 23:20 pm
Me marca error en quicksort, tengo la idea pero no se si me falte otra libreria o asi algo por el estilo
Efectivamente, como dice Eternal Idol, lo que te falta es el código; es decir, la función. La función:
Código
  1. quicksort(int[], int, int);
no existe por lo que tienes que implementarla tú.
Eso es lo que pasa cuando se copia el código tal cual de Github.

PD: Espero por tu propio bien que ese programa no sea una tarea que tengas que entregar pues ya ves lo fácil que ha sido encontrar el código original.
62  Programación / Programación C/C++ / Re: Código de inventario en C en: 21 Noviembre 2020, 21:20 pm
Cuando tengas un error, explícalo para poder saber de qué tipo de error se trata.

  • Las líneas 30 - 32 van fuera de ese for(). Así estás haciendo un intercambio en cada iteración de dentro y muchas veces será entre un mismo elemento, lo que equivale a no hacer nada.
  • Elimina las declaraciones de i y de j en la línea 5. Las estás declarando nuevamente en el for().
  • Utiliza otro nombre de variable en el for() de la línea 36. Puedes tener conflictos entre una i y la otra. Aparte supongo que ese último for lo tendrás para hacer las pruebas porque sino no tiene mucho sentido que muestres todos los productos en cada movimiento.

Si el error no es por ninguna de esas cosas, adjunta el error.

PD: No es recomendable utilizar system() para hacer una pausa. Esta función realiza una llamada al sistema lo que conlleva mayor gasto de recursos. La mejor alternativa para C es utilizar getchar() (que pertenece a <stdio.h>).
63  Programación / Java / Re: Procesos en: 19 Noviembre 2020, 06:41 am
Hola buenas.
Me ha surgido una duda de como programar procesos en java.
Poniendo un ejemplo, ¿como se podría crear un proceso que ejerza como proceso padre y pida una frase por teclado y uno que ejerza como hijo y haga algo con esa frase como invertirla y la muestre?
He visto mucha documentación y no me llega a quedar claro.
Espero que alguien me ayude.
Un saludo.
El funcionamiento es mucho más sencillo de lo que parece. A continuación te explico los pasos de lo que tienes que hacer:
PD: No te voy a dar el programa hecho. Solo te voy a dar un ejemplo de conexión de procesos en Java (que no es poco) y tú tendrás que hacer el resto.

  • Crear las dos clases ejecutables de manera independiente. Ambas clases deben tener su método main() y la clase hija (independiente) debe poder ejecutarse por si sola y funcionar correctamente. Esta última la vamos a crear con un BufferedReader para obtener los datos de la entrada estándar:
Código
  1. public class Independent {
  2.  public static void main(String[] args) {
  3.    try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { // try-with-resources para cerrar automaticamente el br
  4.      System.out.println("Introduce un numero: ");
  5.      int numero = Integer.parseInt(br.readLine());
  6.      System.out.println(numero * 2);
  7.    } catch(Exception e) {}
  8.  }
  9. }

Ahora tienes que hacer una clase dependiente que lo que hará será ejecutar la clase independiente y mandarle la entrada como si la hubiésemos introducido directamente desde el teclado, después recibirá su salida y la mostrará:
Código
  1. public class Dependent {
  2.  public static void main(String[] args){
  3.    ProcessBuilder pb = new ProcessBuilder("java", "Independent"); // comando para lanzar la otra clase como si se hiciese desde linea de comandos
  4.    try {
  5.      Process p = pb.start(); // iniciamos el proceso
  6.      OutputStream os = p.getOutputStream(); // redireccionamos su ENTRADA a os. Se utiliza output porque se entiende que es la salida del padre
  7.      BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); // redireccionamos su SALIDA (que es la entrada para el padre)
  8.      os.write((4 + "\n").getBytes()); // Simulamos que hemos introducido un 4 por teclado y le hemos dado al enter
  9.      os.flush(); // hacemos que los bytes anteriores se escriban en el flujo. Si no hacemos esto se quedaran en un buffer temporal y no continuara
  10.      // Ahora el programa hijo que ha sido lanzado hace un rato acaba de recibir el flujo anterior como si lo hubiesemos introducido por teclado
  11.      // Ahora "ha mostrado" el resultado (8). Tenemos que recoger su salida mediante br:
  12.      br.readLine(); // Leemos la primera linea de su salida que no interesa (porque es: "Introduce un numero: \n")
  13.      int doble = Integer.parseInt(br.readLine()); // Guardamos el 8 que se habria mostrado por pantalla
  14.      System.out.println("El resultado es: " + doble);
  15.    } catch(Exception e){}
  16.    // ...ahora habria que cerrar flujos y demas...
  17.  }
  18. }

  • Si trabajas desde un IDE es posible que tengas problemas con la instanciación del ProcessBuilder pues tendrás que utilizar un comando de ejecución algo más complejo.
  • Si trabajas en Windows y tu IDE está configurado en UTF-8 tendrás que añadir la codificación a la instrucción.

A partir de aquí te toca continuar a ti y si tienes algún otro problema siempre puedes preguntar pero adjunta lo que tengas hecho. :-X
64  Programación / Programación C/C++ / Re: Código de inventario en C en: 19 Noviembre 2020, 05:55 am
POR FAVOR, CUALQUIER AYUDA O COMENTARIO ES BIENVENIDO  :(  :-(
ESPERO NO ME IGNOREN...
Un consejo para que no te ignoren: no pongas un código de 990 líneas. Y más cuando es innecesario. El código en un vistazo general parece que está bien estructurado por lo que es más que suficiente con que pongas las funciones involucradas en la parte del error.

-Muestra el laboratorio de un producto buscándolo por su descripción, en este ya hice unos cambios que de hecho están en el menú "buscarDescripcion"; pero no me da el resultado que espero :(

El problema lo tienes en la función existeProducto2():
Código
  1. char existeProducto2(char descripcionProducto, Producto *producto)//
  2. {
  3. FILE *archivo;
  4. char existe;
  5.  
  6. /* Abre el archivo en modo lectura */
  7. archivo = fopen("productos.dat", "rb");
  8.  
  9. if (archivo == NULL) { /* Si no se pudo abrir el archivo, el valor de archivo es NULL */
  10. existe = 0;
  11.  
  12. } else {
  13. existe = 0;
  14.  
  15. /* Se busca el producto cuyo código coincida con codigoProducto */
  16. fread(&(*producto), sizeof(*producto), 1, archivo);
  17. while (!feof(archivo)) {
  18. if ((*producto).descripcion == descripcionProducto) {
  19. existe = 1;
  20. break;
  21. }
  22. fread(&(*producto), sizeof(*producto), 1, archivo);
  23. }
  24.  
  25. /* Cierra el archivo */
  26. fclose(archivo);
  27. }
  28.  
  29. return existe;
  30. }

Estás comparando dos cadenas de caracteres char[] utilizando el operador ==. Para esto tienes que utilizar la función strcmp(). A juzgar por el comentario de la línea anterior (15), has cambiado código por descripción (siendo código un int y descripción un char[]) y se te ha olvidado cambiar la función de comparación.

Un par de consejos extra:
  • La función fread() la puedes meter en la condición del while()
  • La nomenglatura: (*puntero).valor se puede sustituir por: puntero->valor.
  • Los operadores & y * se anulan. Utilizar: &(*p) es lo mismo que utilizar: p.
-Ordenar alfabéticamente los productos por su descripción, utilizando método de selección
-Ordenar alfabéticamente los productos por laboratorio, utilizando método de inserción
Especifica qué problemas tienes con esas funciones. Lo único que tienes que hacer es cargar todos los productos en un Producto[], ordenarlos por cualquiera de los métodos y volver a guardarlos en el fichero.
No es muy eficiente estar continuamente accediendo al fichero para cada operación. Por eso es mejor cargar los datos en memoria y trabajar con ellos desde un array.

65  Programación / Programación General / Re: ayuda con programa en: 17 Noviembre 2020, 15:00 pm
Para lo que quieres hacer tienes que ver los procesos del sistema. Para eso está el comando: ps.
Puedes buscar las opciones que tiene mediante argumentos adicionales.
66  Programación / Programación C/C++ / Re: herencia : funcion virtual no se ejecuta.. en: 15 Noviembre 2020, 02:52 am
Para llamar a la función de la clase base tienes que usar ::.
Código
  1. struct Base {
  2.  virtual void show(){
  3.    cout << "Base" << endl;
  4.  }
  5. };
  6.  
  7. struct Derived : Base {
  8.  void show(){
  9.    Base::show();
  10.    cout << "Derived" << endl;
  11.  }
  12. };
  13.  
  14. int main(){
  15.  Derived d;
  16.  Base *p = &d;
  17.  p->show();
  18. }

SALIDA:
Código:
Base
Derived
67  Programación / Programación C/C++ / Re: herencia : funcion virtual no se ejecuta.. en: 15 Noviembre 2020, 02:31 am
Claro.

En este caso en concreto no se ejecuta por 2 motivos:
  • La variable creada es del tipo de la struct derivada. Entonces se llama a la función definida ahí.
  • Una función virtual se define así para eso, para poder llamar a la función más adecuada en tiempo de ejecución

Si creas las funciones sin usar virtual, se decide en tiempo de compilación a qué función llamar:
Código
  1. struct Base {
  2.  void show(){
  3.    cout << "Base" << endl;
  4.  }
  5. };
  6.  
  7. struct Derived : Base {
  8.  void show(){
  9.    cout << "Derived" << endl;
  10.  }
  11. };
  12.  
  13. int main(){
  14.  Base b;
  15.  b.show(); // b es de tipo Base, se muestra: Base
  16.  Derived d;
  17.  d.show(); // d es de tipo Derived, se muestra: Derived
  18.  // LA DIFERENCIA ESTA AQUI:
  19.  Base *p = &b;
  20.  p->show(); // El puntero es de tipo Base, se muestra: Base
  21.  p = &d;
  22.  p->show(); // El puntero sigue siendo de tipo Base, se muestra: Base
  23. }

En cambio, si definimos la función como virtual:
Código
  1. struct Base {
  2.  virtual void show(){
  3.    cout << "Base" << endl;
  4.  }
  5. };
  6.  
  7. struct Derived : Base {
  8.  void show(){
  9.    cout << "Derived" << endl;
  10.  }
  11. };
  12.  
  13. int main(){
  14.  Base b;
  15.  b.show(); // b es de tipo Base, se muestra: Base
  16.  Derived d;
  17.  d.show(); // d es de tipo Derived, se muestra: Derived
  18.  // LA DIFERENCIA ESTA AQUI:
  19.  Base *p = &b;
  20.  p->show(); // La variable a la que apunta es de tipo base, se muestra: Base
  21.  p = &d;
  22.  p->show(); // La variable a la que apunta es de tipo derived, se muestra: Derived
  23. }

No sé si se ve bien. La diferencia es que si la función es virtual, en tiempo de ejecución se comprueba de qué tipo es la variable a la que está apuntando un puntero y se utiliza su función correspondiente. Si no se usa virtual, el compilador coge el tipo del puntero y llama a la función de su clase sin importarle de qué clase es la variable a la que apunta.
68  Programación / Programación C/C++ / Re: modificacion de codigo en C en: 12 Noviembre 2020, 18:11 pm
Entiendo que lo que quieres hacer es encontrar el valor del elemento más grande del primer array y la posición del elemento más grande del segundo array, no?

Tienes algunos problemas que son los siguientes:
  • Empiezas a rellenar el array en la posición 1 y acabas en la 5 (incluida). Los arrays tienen longitud 5 y como en C/C++, el primer índice es el 0, deberías recorrer desde 0 hasta 4 (incluido). {0,1,2,3,4} -> 5 posiciones. La posición 5 queda fuera del array.
  • En la función EncuentraMayor() no buscas los índices en los que se encuentre el elemento más grande sino cuántas veces aparece el elemento más grande. Esto es porque incrementas la variable cont cada vez que lo encuentras.

Además como consejo te recomiendo utilizar constantes para los tamaños y cuando trabajes con arrays como parámetros, pasa como parámetro también la longitud de este, así haces las funciones más genéricas y las puedes reutilizar más veces:
Código
  1. #include <stdio.h>
  2.  
  3. const int MAX_SIZE = 5;
  4.  
  5. int main(){
  6.  int v1[MAX_SIZE], v2[MAX_SIZE];
  7.  // Guardar los valores en los arrays. Recuerda: desde el 0 hasta el MAX_SIZE-1.
  8.  for(int i = 0; i < MAX_SIZE; ++i){
  9.    printf("Introduce el valor %d: ", i+1);
  10.    scanf("%d", &v1[i]);
  11.  }
  12.  //...
  13.  int valorMaximo = buscarMayor(v1, MAX_SIZE);
  14.  mostrarIndices(v2, valorMaximo);
  15. }

Como ves, la función buscarMayor() es igual solo que recibes la longitud como argumento. Su definición deberá ser:
Código
  1. int buscarMayor(int v[], int size);

En el caso de la segunda función, como puede ser que más de un elemento tenga el valor buscado, no podemos devolver el índice como un <int>. Se puede hacer devolviendo un array o modificando un array pasado como argumento pero como supongo que estás empezando, también puedes mostrarlo directamente en la función.
Código
  1. void mostrarIndices(int v[], int valorBuscado);
En esta función lo que tienes que hacer es cada vez que un elemento del array sea igual a <valorBuscado> muestras un mensaje con el índice que tiene tu iterador del bucle en ese momento.

Inténtalo y si tienes algún problema coméntalo. :-X
69  Programación / Programación General / [Android Studio] Alternativas de IDE y/o AVD en: 11 Noviembre 2020, 03:10 am
Estoy empezando a programar en Android por medio de Android Studio y se me está haciendo desesperante. Es por temas de estudios y tengo que desarrollar aplicaciones Android usando Java desde este IDE.

Principalmente, los problemas que tengo con este IDE son:
  • Los tiempos de carga cuando abro un proyecto no son pequeños que digamos y eso que son proyectos muy sencillos.
  • Cada vez que ejecuto una aplicación, es bastante lento construyendo el proyecto también. Además los proyectos aumentan mucho de tamaño al ser construidos. No sé si será por la plataforma (Android) o por el IDE pero nunca me ha pasado esto con proyectos de escritorio de Eclipse (Java) o Visual Studio (C#).
  • Los AVDs no son muy de fiar. He tenido problemas para ejecutar algunos intents implícitos en estos porque no se lanzan y al final he tenido que probar las aplicaciones en mi dispositivo (lo cual también es una pesadilla tener que estar siempre con el móvil conectado).
  • La vista de Diseño de los xml tampoco es muy de fiar. En ocasiones los componentes no se actualizan correctamente hasta después de ejecutar la aplicación.

He intentado utilizar el plugin de Genymotion para virtualizar los dispositivos Android pero este sólo está disponible hasta la versión 4.0 de AS. Ahora mismo que la última versión estable es la 4.1, no se puede instalar este plugin.

Quería saber si hay alguna forma o alternativa de solucionar al máximo estos inconvenientes pues se me está haciendo, como ya digo, desesperante desarrollar en Android.
70  Programación / Programación C/C++ / Re: Muy buenas ,C:\Users\matia\Desktop\c++\collect2.exe[Error] ld returned 1 exit status en: 10 Noviembre 2020, 09:37 am
Esta parte me llama la atención:
cout<<"proceso"<<x+1<<"

proceso es un string y lo estás intentando unir con un tipo int por lo que eso dará error, no se en C++ pero al menos en Python hay que pasar de int a string, es decir hacer el cálculo el int, luego pasarlo a string y después unirlo, también podes usar la función eval() para hacer el cálculo y unir con cadenas string.

Saludos
En C/C++ no es necesario castear esos valores.
Ese código es válido.
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 86
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines