jueves, 17 de septiembre de 2020

Código de Barbero Dormilon (C++)

Utilizando libreria thread y semaphore.
Se considera lo siguiente:
- las sillas disponibles que tiene la barberia, si estas estan llenas ya no se puede admitir clientes.
- el barbero empieza durmiendo y quien lo despierte sera el primero en atender; se tomara en cuenta el orden de llegada 

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <semaphore.h>
#include <pthread.h>
#include <windows.h>
#include <math.h>
using namespace std;
typedef enum {LLENO, CORTADO} respuesta;

#define NUM_CLIENTES 4 // Numero de clientes
#define N 3 // Numero max de clientes en la barberia

int clientes = 0; // Numero de clientes en la barberia
int quien = -1; // Cliente que esta siendo atendido

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; //para excl mutua ops monitor
pthread_cond_t silla, sillon, sube_sillon, dormir;

void pcliente(int i, char *s){printf("Cliente: %d -> %s\n",i,s);}

void pbarbero (char *s) {printf("Barbero: -> %s\n", s);}

//———————————– inicio monitor
int entra_barberia(int i) {

    pcliente(i,"ENTRO en la barberia");
    pthread_mutex_lock( &m );

    if (clientes >= N){
        pthread_mutex_unlock(&m ); return LLENO; // No cabe
    }else{
        clientes++;
        if (clientes==1) {
            pcliente(i,"DESPIERTO al barbero");
            pthread_cond_signal(&dormir);
        }else {
            pcliente(i,"ESPERO mi turno");
            pthread_cond_wait(&silla, &m );
            pthread_cond_signal(&sube_sillon);
        }
        quien = i;
        pthread_cond_wait (&sillon, &m ); /* Esperar a que acabe el corte.*/
        pcliente(i,"Se fue satisfactoriamente \n");
        pthread_mutex_unlock(&m );
        return CORTADO;
    }
}

void espera_cliente() {
    pthread_mutex_lock( &m );
    if (!clientes) {
        pbarbero("Me voy a dormir");
        pthread_cond_wait(&dormir,&m);
        pbarbero("Ya voy!!");
    }
    else {
        pbarbero("Que pase el siguiente...");
        pthread_cond_signal(&silla );
        pthread_cond_wait(&sube_sillon,&m);
    }
    pthread_mutex_unlock( &m);
}

void fin_corte() {
    pthread_mutex_lock(&m);
    pthread_cond_signal(&sillon); clientes--; pbarbero("FIN CORTE");
    pthread_mutex_unlock(&m);
}

void corta_pelo() {
    int r=rand()%10000;
    //usleep(10); (con sube_sillon, ya no es necesario)
    pthread_mutex_lock(&m ); // Protege el acceso a la variable “quien”
    pbarbero("Cortando el pelo.....");
    printf(" al cliente %d (%d useg.)\n",quien,r);
    pthread_mutex_unlock(&m );
    Sleep(r);
}

void da_una_vuelta(int i, int t) {
    pcliente(i,"Voy a dar una vuelta");
    printf(" durante (%d useg.)\n",t);
    Sleep(t);
    pcliente(i,"Vengo de dar una vuelta");
}
// ——————————- fin monitor

void *cliente(void *arg) {
    int i=(intptr_t) arg;
    do {
        da_una_vuelta(i,rand()%10000);
    } while (entra_barberia(i)==LLENO);
}

void *barbero(void *arg) {
    while (1) {
        espera_cliente();
        corta_pelo();
        fin_corte();
    }
}

int main(void) {
    int i;
    pthread_t id_clientes[NUM_CLIENTES], id_barbero;
    srand( (unsigned)time( NULL ) );

    pthread_cond_init(&silla, 0);
    pthread_cond_init(&sillon, 0);
    pthread_cond_init(&sube_sillon, 0);
    pthread_cond_init(&dormir, 0);

    pthread_create(&id_barbero, NULL, barbero, NULL); Sleep(1);
    for (i=0; i<NUM_CLIENTES; i++) pthread_create(&id_clientes[i], NULL, cliente, (void *) i);
    for (i=0; i<NUM_CLIENTES; i++) pthread_join(id_clientes[i], NULL);
}

Ejecución del programa:



lunes, 31 de agosto de 2020

Superficies Cuadricas

Resumen:

Teoría, problemas y ejercicios con solución:

Sobre:

  • Esfera
  • Elipsoide
  • Cilindros
  • Hiperboloides
  • Paraboloides
  • Conos

Descargar PDF: http://www.mediafire.com/file/191irj88nhg90mt/file

Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/

Compartir el post y visitar la pagina de facebook.

Problema de escritor y lector (SEMAPHORE) CASO PRIORIDAD LECTOR

El problema de los lectores y escritores tiene distintas versiones, depende a quien le damos prioridad.

Prioridad al Lector:

Recursos a utilizar

  • Variable entera nl = 0
  • Un semáforo mutex inicializado a 1
  • Un semáforo write inicializado a 1 // este semáforo es compartido para los dos procesos

Diagrama de flujo:


Nota: cuando el semáforo write tenga el valor 0, va ha impedir que el escritor pueda acceder al recurso dando una solución para priorizar al lector. Pero en este caso no garantiza la equitativamente ni exclucion mutua, ya que lleguen continuamente lectores y no dejan al escritor acceder al recurso.

Si estas leyendo.... comparte esta publicación para que los demás le puedan llegar la información también... ellos te agradecerán.

Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/

miércoles, 26 de agosto de 2020

viernes, 21 de agosto de 2020

Separar una Lista en c++

El ejercicio plantea que los nodos de la lista se separen en dos listas, en la cual los nodos pares deben ingresar a una nueva lista y los nodos impares también deben ingresar a una nueva lista.



Descargar Solución:


Nota: El código esta hecho con POO, en el cual es una de las soluciones posibles, encuentre otra solución.

Eliminar Datos Repetidos de una Lista en C++

 El ejercicio es simple solo debe eliminar los datos repetidos de una lista sin que este pierda los enlaces con los nodos siguiente.

Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/


Descargar Solución:

Código: http://raboninco.com/1qiNa


Cubo Mágico en C++

El ejercicio del Cubo Mágico debe dar como resultado que las lineas horizontales, verticales y diagonales su suma deben ser iguales, tambien debe contar que la matriz debe ser con dimensión impar.

Solución presentada en C++ en el código hay comentarios que te pueden hacer de guía como funciona el código. Cabe recalcar que el código es una de las tantas soluciones que puede haber para solucionar el problema.

Código: http://raboninco.com/1qhEt

Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/


Matriz en espiral

Solución presentada en C++; el recorrido empieza desde el centro de la matriz y el recorrido debe ser en forma de espiral, tomando en cuenta que la dimension de la matriz debe ser impar y no debe tomar encuenta las dimensiones negativas. Cabe recalcar que el codigo es una de las tantas soluciones que puede haber para solucionar el problema.

Código: http://raboninco.com/1qgsb

Pagina Facebook: https://www.facebook.com/GuiaEstudiantil-105852247904393/


lunes, 17 de agosto de 2020

Ejemplo de Máximos y Mínimo en función de dos variables

Para hallar los máximos y mínimos en función de dos variables, Debes seguir los siguientes pasos:

  1. Encontrar la primera derivada parcial de x e y.
  2. Lo igualamos a 0, para encontrar los respectivos valores de x e y.
  3. Luego reemplazamos los valores de x e y en la función original, para hallar el punto crítico
  4. Encontrar la segunda derivada parcial de x e y.
  5. Encontrar la derivada de x con respecto a y
  6. Ultimo lo evaluamos con la Determinante
En el cual si la determinante es positivo y ademas las segundas derivadas son positivas entonces hablamos de un mínimo.
Si la determinante es positivo y ademas las segundas derivadas son negativas entonces hablamos de un máximo.
Si la determinante es menor a cero entonces hablamos del punto silla.

Ejemplo:

Solución: