Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Simulare tratto autostradale attraverso i semafori

    Salve a tutti ho un problema coi semafori.
    Questo è il testo del programma che devo svolgere:
    Un tratto autostradale delimitato da una barriera di ingresso (dotata di 3 caselli)
    [Vi sono un certo numero N (maggiore di 10) di auto descritte in un file di testo che viene letto all'inizio. Per ogni auto, nel file viene indicata la sua velocita' media con un valore V compreso tra 50 e 100 (chiaramente, ogni auto ha la propria velocita').

    Vi sara' un generatore delle auto che legge in anticipo tutto il file eche genera tutte le auto descritte.]

    Appena generata, una auto decide in quale dei 3 caselli della barriera di ingresso accodarsi. E si mette in coda a tale casello.
    (Il modo in cui l'auto sceglie il casello e' a vostra scelta).

    Questo è il programma che ho fatto fino adesso:
    codice:
    
    
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct elemento {
       char nome[20];
       int v_media;
       int ticket;
       struct elemento *next;
    }TipoElem; /* Meglio dare un nome diverso al tipo */
    
    typedef TipoElem * TipoLista; /* Questo serve per definire il tipo della lista
                                   (per non commettere errori logici ecc...) e per
                            rendere il codice un po' più semplice da capire */
    
    
    TipoLista crea_lista (){
      /* Questa funzione usa l'inserimento IN TESTA */
       TipoLista listaAuto = NULL;
          TipoElem *nuovo; /* Serve per creare sempre un nuovo nodo */
    
          FILE *catalogo = fopen ("elenco_auto.txt", "r");
          if (!catalogo)
             printf ("Errore in apertura file!");
    
          else {
         /* Se il file non è vuoto inizio ad aggiungere le auto,
           fino a quando non arrivo alla fine del file (EOF),
          in pratica così il programma legge qualsiasi file
          formattato in questo modo e non serve sapere il numero
          di elementi contenuti... */
             while (!feof(catalogo)){
                nuovo = malloc (sizeof(TipoElem)); /* Alloco il nuovo elemento */
                fscanf (catalogo ,"%s\n%d", nuovo->nome, &nuovo->v_media);
                nuovo->ticket =  rand() % 3 + 1;
                nuovo->next = listaAuto; /* Assegno il nodo successivo a questo come l'inizio della "vecchia" lista */
                listaAuto = nuovo; /* E poi assesto la lista sul primo vero nodo, che ora è diventato
               proprio questo! Ecco l'inserimento in testa... */
             }
    
        }
    
    return listaAuto;
    }
    
    typedef struct{
       int valore;
       struct TipoElem *lista;
    }semaforo;
    
    wait (semaforo *s) {
       s->valore--;
       if (s->valore < 0){
          block();
    
       }
    }
    
    void visualizza_lista(TipoLista p)
    {
    
       printf("lista: \n -> ");
    
    
       while(p)
       {
          printf("%s", p->nome);
          printf(": %d\n", p->v_media);
          printf("Num ticket: %d\n", p->ticket);
          printf(" -> ");
          p = p->next;
       }
       printf("NULL");
       return;
    }
    
    
    int main()
    {
    
       TipoLista lista;
       semaforo s;
       lista = crea_lista();
       visualizza_lista(lista);
    
    
       printf ("\n\nFine");
       system ("PAUSE");
    
    
       return 0;
    }

    Dal libro non riesco a capire come devo impostare e gestire il codice dei semafori. Non so se devo usarne uno unico o tre e appunto non so come impostarli.Spero che mi possiate dare una mano.
    Grazie in anticipo e buona giornata

  2. #2
    potresti postare tutto il testo del esercizio!?
    mic

  3. #3
    Quote Originariamente inviata da michele79 Visualizza il messaggio
    potresti postare tutto il testo del esercizio!?
    Questo è il testo completo del progetto:

    Si realizzi un progetto che simuli la seguente situazione:un tratto autostradale delimitato da una barriera di ingresso
    (dotata di 3 caselli) e una barriera di uscita (dotata di 1
    casello). (Per semplicita' consideriamo solo una delle due
    direzioni di marcia).


    [Vi sono un certo numero N (maggiore di 10) di auto descritte in un file
    di testo che viene letto all'inizio. Per ogni auto, nel file viene indicata
    la sua velocita' media con un valore V compreso tra 50 e 100 (chiaramente,
    ogni auto ha la propria velocita').


    Vi sara' un generatore delle auto che legge in anticipo tutto il file e
    che genera tutte le auto descritte.]


    Appena generata, una auto decide in quale dei 3 caselli della barriera di
    ingresso accodarsi. E si mette in coda a tale casello.
    (Il modo in cui l'auto sceglie il casello e' a vostra scelta).


    Quando e' il suo turno l'auto preleva il ticket (supponiamo sia un
    nimero intero univoco, cioe' utilizzato solo una auto), attende che la sbarra
    di alzi e riparte.


    Immaginiamo che l'auto in viaggio percorra il tragitto tra barriera d'ingresso
    e barriera d'uscita in un numero di secondi pari alla sua velocita'
    divisa per 10. Al termine di tale intervallo di tempo l'auto si presenta alla
    barriera d'uscita e si accoda al casello.
    Giunto il suo turno, l'auto partecipa ad un duplice scambio con il casello:
    -- il casello chiede all'auto il ticket;
    -- l'auto consegna il ticket e comunica la sua velocita';
    -- il casello calcola l'ammontare del pedaggio (per semplicita' supponiamo consista
    in tanti euro quanta e' la velocita' dell'auto divisa per 50);
    -- l'auto paga il pedaggio richiesto;
    -- la sbarra si alza e l'auto passa; dopo passata l'auto termina.


    L'intero programma deve terminare correttamente dopo che tutte le auto sono
    uscite dall'autostrada.






    Si deve realizzare il tutto in modo che:
    - si eviti la generazione di processi zombie;
    - si evitino le situazioni di stallo;
    - le comunicazioni possono essere realizzate utilizzando pipe, socket, messaggi, segnali,...
    a vostra scelta, ma in modo opportuno;
    - per tutti i processi che terminano e tutte le
    risorse e le strutture di comunicazione utilizzare dai processi
    devono essere de-allocate; Nessun processo deve essere ucciso
    volontariamente da un altro processo, ma deve eventualmente
    terminare normalmente la sua esecuzione.
    - il codice deve essere indentato in modo chiaro ed debitamente commentato;
    - si richiede una adeguata gestione degli errori (es. fallimento nella
    chiamata ad una system call), con una messaggistica di errore che informi
    l'utente su eventuali anomalie a tempo di esecuzione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.