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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Programación C/C++ / Bottom up en: 26 Septiembre 2022, 03:09 am
Buenas noches, tengo un problema en el que basicamente se me pide encontrar la cadena mas larga de vecinos que esten ordenados en donde los elementos adyacentes de una matriz NXN tienen una diferencia de +1.

Ejemplo:  

10  16  15  12
9     8    7   13
2     5    6   14
3     4    1   11

Para la anterior matriz la solucion seria  S = <2,3,4,5,6,7,8,9,10>, se me pide basicamente desarrollar el backtracking pero para llegar al bactracking debo seguir una serie de pasos:
1) Sol recursiva ingenua
2) Memoizacion
3) Bottom-up
4) Backtracking


Mi problema es a la hora de implementar el bottom-up, se supone que debo quitar las recursiones por ciclos para que sea de forma iterativa, sin embargo, no he podido implementarlo de esa forma.

No se si porfa me puedan dar alguna idea para solucionarlo con Bottom-up.

Código
  1. unsigned int naive(vec T, unsigned int i, unsigned int j) {
  2.  unsigned int _max = 0;
  3.  if (T.empty())
  4.    return 0;
  5.  else {
  6.    if (i < T.size() - 1 and T[i][j] == T[i + 1][j] + 1)
  7.      _max = max(_max, naive(T, i + 1, j));
  8.    if (j < T.size() - 1 and T[i][j] == T[i][j + 1] + 1)
  9.      _max = max(_max, naive(T, i, j + 1));
  10.    if (i > 0 and T[i][j] - 1 == T[i - 1][j])
  11.      _max = max(_max, naive(T, i - 1, j));
  12.    if (j > 0 and T[i][j] - 1 == T[i][j - 1])
  13.      _max = max(_max, naive(T, i, j - 1));
  14.  }
  15.  return _max + 1;
  16. }
  17.  

Código
  1. unsigned int memo(vec T, vec &M, unsigned int i, unsigned int j) {
  2.  unsigned int _max = 0;
  3.  if (T.empty())
  4.    return 0;
  5.  if (M[i][j] != 0)
  6.    return M[i][j];
  7.  else {
  8.    if (i < T.size() - 1 and T[i][j] == T[i + 1][j] + 1)
  9.      _max = max(_max, memo(T, M, i + 1, j));
  10.    if (j < T.size() - 1 and T[i][j] == T[i][j + 1] + 1)
  11.      _max = max(_max, memo(T, M, i, j + 1));
  12.    if (i > 0 and T[i][j] - 1 == T[i - 1][j])
  13.      _max = max(_max, memo(T, M, i - 1, j));
  14.    if (j > 0 and T[i][j] - 1 == T[i][j - 1])
  15.      _max = max(_max, memo(T, M, i, j - 1));
  16.    M[i][j] = _max + 1;
  17.  }
  18.  
  19.  return M[i][j];
  20. }
  21.  
  22.  

Las dos implementaciones anteriores son las que hice ingenuamente y con memoizacion
2  Programación / Programación C/C++ / Sincronización de procesos en: 24 Mayo 2021, 04:11 am
Código
  1. static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  2. static pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
  3.  

Routinas
Código
  1. void *routineRead(void *val)
  2. {
  3.    pthread_mutex_lock(&mutex);
  4.    int fg = 0, fd;
  5.    void *buf = malloc(MAX_SIZE * 2);
  6.    do
  7.    {
  8.        fd = open(val, O_RDONLY);
  9.        if (fd == -1)
  10.        {
  11.            perror("pipe");
  12.            printf(" Se volvera a intentar despues\n");
  13.            sleep(5);
  14.        }
  15.        else
  16.            fg = 1;
  17.    } while (fg == 0);
  18.    read(fd, buf, MAX_SIZE * 2);
  19.    close(fd);
  20.    pthread_mutex_unlock(&mutex);
  21.    return buf;
  22. }
  23. void *routineWrite(void *val)
  24. {
  25.    pthread_mutex_lock(&mutex1);
  26.    int fg = 0, fd;
  27.    int *time = malloc(sizeof(int));
  28.    *time = bh.current_time;
  29.    do
  30.    {
  31.        fd = open(val, O_WRONLY);
  32.        if (fd == -1)
  33.        {
  34.            perror("pipe");
  35.            printf(" Se volvera a intentar despues\n");
  36.            sleep(5);
  37.        }
  38.        else
  39.            fg = 1;
  40.    } while (fg == 0);
  41.    write(fd, time, MAX_SIZE);
  42.    close(fd);
  43.    pthread_mutex_unlock(&mutex1);
  44. }
  45.  

Mi proyecto consiste en conectar  dos procesos mediante pipes, un proceso es el controlador y el otro es agente. El controlador basicamente  se encarga de leer del pipe y enviar una respuesta, el punto es que estoy leyendo del pipe a través de un hilo, sin embargo,cada vez que se conecta un agente, el controlador lee el nombre del agente enviado por el agente y luego se crea un fifo que es el fd por donde se comunicaran ellos dos. Vale, el punto es que si llegan el agente1 y el agente2 al mismo tiempo no estoy seguro de lo que pasa pero creo que ambos entra a la sección critica y no me crea el fifo para cada agente sino  que la variable se concatena.

No supe montar la imagen aqui pero en el link pueden ver que es lo que pasa
https://ibb.co/JsgfTp5


Entonces no se  si me puedan ayudar a garantizar que si dos agente o mas se conectan a la vez atienda primero a uno y luego si siga con el otro.

Código
  1.    pthread_t p_read, p_write, p_time;
  2.    sem_init(&sem, 0, 1);
  3.    sem_init(&sem1, 0, 1);
  4.    clean_fifo(pipe);
  5.    int seconds = atoi(argv[6]);
  6.    pthread_create(&p_time, NULL, routineTime, &seconds);
  7.    do
  8.    {
  9.        int cont = 0;
  10.        //p_read get the agent name from the pipe
  11.        pthread_create(&p_read, NULL, routineRead, pipe);
  12.        pthread_join(p_read, (void **)&agent_name);
  13.        printf("Agente:%s\t", agent_name);
  14.        clean_fifo(agent_name);
  15.        //send current time
  16.        pthread_create(&p_write, NULL, routineWrite, pipe);
  17.        pthread_join(p_write, NULL);
  18.        printf("pipe: %s\n", agent_name);
  19.        //Read all the requests by an agent
  20.        do
  21.        {
  22.            pthread_create(&p_read, NULL, routineRead, agent_name);
  23.            pthread_join(p_read, (void **)&data[cont].re);
  24.            if (data[cont].re->amount_people != 0)
  25.                answer_request(&tree, data[cont].re, &bh);
  26.            else
  27.                break;
  28.            write_pipe(fd, (struct Reserva *)data[cont].re, sizeof(Reserva), agent_name, O_WRONLY);
  29.            cont++;
  30.        } while (1);
  31.  
  32.    } while (1);
  33.  

3  Programación / Programación C/C++ / Re: nesecito ayuda con recusividad por favor no entiendo. en: 24 Mayo 2021, 02:52 am
Código
  1.  
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. void recursive(int number, int *arr, int *i)
  5. {
  6.    arr[*i] = number % 10;
  7.    *i += 1;
  8.    if (number >= 10)
  9.        recursive(number / 10, arr, i);
  10.    else
  11.    {
  12.        //Ordenas el arreglo y corres las posiciones
  13.    }
  14. }
  15. int main(void)
  16. {
  17.    int num = 382731, arr[10], size = 0;
  18.    recursive(num, arr, &size);
  19.    for (int i = size - 1; i >= 0; i--)
  20.        printf("%d", arr[i]);
  21. }
  22.  

Esta es una implementación recursiva, estas obteniendo digito a digito guardandolo en arr , en el else solo debes obtener el mayor e intercambiar posiciones deberias usar un arreglo auxiliar para correr las posiciones.

Espero te sea util  :D
4  Programación / Programación C/C++ / Re: Juego en: 18 Mayo 2021, 23:54 pm
Para colocar un jugador en cualquier posición solo debes hacer lo siguiente:
Código
  1. tablero[i][j]='v'; //v representa cualquier letra que quieras ponerle
  2. /*
  3. i, representa la fila
  4. j, representa la columna
  5. */
  6.  


Ten en cuenta que el cero cuenta es decir que la posición tablero[0][0] seria tu primer valor en la matriz.

Otra cosa si J1 y J2 pueden tener una cadena de caracteres,un nombre o algo asi te recomiendo  crear una estructura aparte para facilidad.

Código
  1. typedef struct string
  2. {
  3.     char cadena[1024];
  4. } string;
  5.  

En caso de que en la matriz pueden haber cadenas de caracteres, ya tu matriz no seria de tipo char sino de tipo  struct string.Sin embargo, es más fácil que cada jugador lo representes con una letra para asi diferenciarlos.
5  Programación / Programación C/C++ / Re: ‚Cómo manipular arreglos de estructuras? en: 18 Mayo 2021, 04:14 am
Te anexo aqui la solución
Código
  1. #include <iostream>
  2. using namespace std;
  3. #define MAXCHAR 50
  4. struct Grupo
  5. {
  6.    char clave_grupo[50];
  7. };
  8. struct Profesor
  9. {
  10.    struct Grupo lista_grupos[8];
  11. };
  12. int main()
  13. {
  14.    Profesor profesores;
  15.    int num_grup;
  16.    cout << "\nNumero de grupos: ";
  17.    cin >> num_grup;
  18.    cin.ignore();
  19.    for (int i = 0; i < num_grup; i++)
  20.    {
  21.        cout << "Clave del grupo " << i + 1 << ": ";
  22.        cin.getline(profesores.lista_grupos[i].clave_grupo, MAXCHAR);
  23.    }
  24.    return 0;
  25. }
  26.  
        cin.getline(profesores.lista_grupos.clave_grupo,MAXCHAR);
En esta linea no estarias almacenando para cada grupo la clave del grupo.

El cin.ignore() se usa para ignorar lo que hay en el bufffer y no salte la lectura de datos .
6  Programación / Programación C/C++ / Semaforos en c en: 16 Mayo 2021, 02:03 am
Hola buenas noches a todos, estoy empezando en el tema de sincronización de procesos a través de semaforos basicamente lo que me piden hacer es que apartir de tres procesos A,B y C tenga como salida ABC ABC ABC utilizando semaforos.

Código
  1. #include <stdlib.h>
  2. #include <pthread.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <semaphore.h>
  6. sem_t semaphore;
  7. void *routine(void *routine)
  8. {
  9.     for (int i = 0; i < 3; i++)
  10.     {
  11.          sem_wait(&semaphore);
  12.          printf("%s\n", (char *)routine);
  13.          sleep(1);
  14.          sem_post(&semaphore);
  15.     }
  16. }
  17. int main(void)
  18. {
  19.     sem_init(&semaphore, 0, 1);
  20.     pthread_t thread[3];
  21.     pthread_create(&thread[0], NULL, routine, "A");
  22.     pthread_create(&thread[1], NULL, routine, "B");
  23.     pthread_create(&thread[2], NULL, routine, "C");
  24.     for (int i = 0; i < 3; i++)
  25.     {
  26.          pthread_join(thread[i], NULL);
  27.          sleep(1);
  28.     }
  29. }
  30.  

Esa es la implementación que llevo hasta el momento, sin embargo,la salida me es erronea

Esta es mi salida:
AAA BBB CCC

Les agredezco si me pueden ayudar  ;D
7  Programación / Programación C/C++ / Re: cast Void pointer en c en: 19 Abril 2021, 16:14 pm
Código
  1. GeneralNode *tmp =(GeneralNode *)*((size_t*)aux->data);

Intenta recordar a que exactamente apuntan tus punteros en cada momento dado mientras programas. Si no te toparas con problemas.
Saludos.

Gracias ya esta solucionado, ese era el error, sin embargo, no entiendo porque es (GeneralNode *)*((size_t*)aux->data especificamente del size_t.

8  Programación / Programación C/C++ / cast Void pointer en c en: 19 Abril 2021, 06:56 am
Buenas noches comunidad, estoy realizando un arbol general en c que cuenta con una lista génerica para guardar los descendientes(hijos) que hice  en c de forma génerica usando void pointer pero estoy teniendo problemas  :-(.

El problema que me surge ya lo tengo identificado, sin embargo, no se como solucionarlo, lo que pasa es que cuando quiero imprimir un dato del nodo general que se encuentra dentro de la lista me esta saliendo basura, el problema debe ser que estoy realizando mal el cast pero ya intente de varias formas y sigue sin funcionar.

Estructura de la lista
Código
  1. typedef struct node
  2. {
  3.    void *data;
  4.    struct node *next;
  5. } node, Node;
  6. typedef struct list
  7. {
  8.    struct node *head;
  9.  
  10. } list, List;
  11.  
  12.  

Estructura del arbol
Código
  1. typedef struct NodeGeneral
  2. {
  3.    void *data;
  4.    list *dec;
  5. } GeneralNode;
  6. typedef struct GeneralTree
  7. {
  8.    GeneralNode *root;
  9. } GeneralTree;
  10.  



main
En el siguiente código se encuentra el fragmento donde estoy realizando el cast(Linea 12).
Código
  1. int main(void)
  2. {
  3.  
  4.  List *list;
  5.  GeneralNode *proof;
  6.  int x = 5;
  7.  proof = init_GeneralNode((int *)&x);
  8.  init_list(&list, &proof);
  9.  Node *aux = list->head;
  10.  while (aux != NULL)
  11.  {
  12.    GeneralNode *tmp =(GeneralNode *)aux->data; //Aqui estoy realizando el casteo
  13.    printf("::%d\n", *((int *)tmp->data));
  14.    aux = aux->next;
  15.  
  16.  }
  17.  
  18. }
  19. //Las funciones init crean la memoria y establecen los datos
  20.  
Anexó las funciones con las que inicialice la lista y establezco la cabeza(Ya la he probado con diferentes tipos de datos(int,float... datos nativos) y funciona bien la lista)
Código
  1. node *newNode(void *value)
  2. {
  3.    node *newNode = (node *)malloc(sizeof(node));
  4.    newNode->data = value;
  5.    newNode->next = NULL;
  6.    return newNode;
  7. }
  8. void init_list(list **lista, void *value)
  9. {
  10.    list *aux = *lista;
  11.    aux = (list *)malloc(sizeof(list));
  12.    aux->head = newNode(value);
  13.    *lista = aux;
  14. }
  15. //************************************
  16. GeneralNode *init_GeneralNode(void *data)
  17. {
  18.    GeneralNode *newNode = (GeneralNode *)malloc(sizeof(GeneralNode));
  19.    newNode->data = data;
  20.    newNode->dec = NULL;
  21.    return newNode;
  22. }
  23.  

En el NodoGeneral que tengo,en el caso de la lista de descendiente cada dato de la lista representa un NodoGeneral.El next, el puntero al siguiente hijo.

Les agradezco si me pueden ayudar.
9  Programación / Programación C/C++ / Re: Genericos en c pipes (void*) en: 10 Abril 2021, 21:08 pm
Deberias depurar tu programa, asi sabrias en que linea/instruccion esta fallando exactamente.

Asi leyendo el codigo rapidamente sizeof(buf) no tiene sentido ya que es el tamaño de un puntero y no de la estructura que pasas, lo logico seria que pasaras tambien el tamaño del buffer a las funciones.

Solucionado

Gracias efectivamente ese era el error lo unico que hice fue agregar un parametro para el tamaño y ese lo pasa para el pipe.
Código
  1. void read_pipe(int fd, void *buf, size_t size, char *pipe);
  2. /*
  3.    Reserva msm;
  4.     read_pipe(fd[0], (Reserva *)&msm, sizeof(msm), pipe);
  5. */
  6.  
10  Programación / Programación C/C++ / Genericos en c pipes (void*) en: 10 Abril 2021, 18:14 pm
Buenos dias , soy nuevo en el lenguaje de c y estoy teniendo problemas a la hora de crear un función génerico para escribir o enviar el pipe.La función  funciona perfectamente sin el génerico pero con el genérico me esta pasando basura y me salta un error Segmentation Fault.
Código
  1. void write_pipe(int fd, void *buf, char *pipe)
  2. {
  3.    int flag = 0, bytes;
  4.    do
  5.    {
  6.        fd = open(pipe, O_WRONLY);
  7.        if (fd == -1)
  8.        {
  9.            perror("pipe");
  10.            printf(" Se volvera a intentar despues\n");
  11.            sleep(5);
  12.        }
  13.        else
  14.            flag = 1;
  15.    } while (flag == 0);
  16.    bytes = write(fd, buf, sizeof(buf));
  17.    printf("Sent it:%d\n", bytes);
  18.    close(fd);
  19. }
  20. void read_pipe(int fd, void *buf, char *pipe)
  21. {
  22.    int flag = 0, bytes;
  23.    do
  24.    {
  25.        fd = open(pipe, O_RDONLY);
  26.        if (fd == -1)
  27.        {
  28.            perror("pipe");
  29.            printf(" Se volvera a intentar despues\n");
  30.            sleep(5);
  31.        }
  32.        else
  33.            flag = 1;
  34.    } while (flag == 0);
  35.    bytes = read(fd, buf, sizeof(buf));
  36.    printf("Received it:%d\n", bytes);
  37.    close(fd);
  38. }
  39.  
>

Y asi llamo la función en el main
Código
  1. struct data dt;
  2. write_pipe(fd[0],(struct data*)&dt, argv[8]);
  3.  

Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines