Oppure

Loading
13/01/11 18:09
ermak
salve a tutti dovrei fare un elaborato in c che abbia le seguenti caratteristiche

Un ponte a corsia unica collega due villaggi: villaggio-Nord e villaggio-Sud. Gli agricoltori dei villaggi
utilizzano il ponte per il trasporto dei prodotti. Il ponte resta bloccato se un contadino diretto a nord e
uno diretto a sud vi salgono contemporaneamente. I contadini sono ostinati: non fanno mai marcia
indietro. Implementare un meccanismo che eviti lo stallo e stabilisca le regole di attraversamento.

si accettano consigli....
aaa
13/01/11 18:17
Alex
metti due sbarre una a nord e una a sud..
quando un contadino comincia ad andare sul ponte scatta una fotucellula che abbassa la sbarra d'allaltra parte..

trsducendolo in c, crei una variabile che tiene traccia se il ponte è occupato o no..
aaa
13/01/11 18:56
ermak
mmm scusa potresti essere un pò + chiaro
aaa
13/01/11 19:03
ramy1989
Implementi una specie di semaforo:
bool nord=false;            //passano quelli diretti a sud
nord=true;                     //adesso passano quelli diretti a nord

aaa
13/01/11 19:15
ermak
il problema è che i semafori nn li abbiamo fatti
e posso usare solo i seguenti argomenti:
- Linguaggio C:

- tipi di dati (cap 6 --> "Linguaggio C McGrawHILL";)

- cicli di selezione e di iterazione

(cap 7-9 --> "Linguaggio C McGrawHILL";)

- operatori (cap 8 --> "Linguaggio C McGrawHILL";)

- array e vettori (cap 10 --> "Linguaggio C McGrawHILL";)

- funzioni (cap 11 --> "Linguaggio C McGrawHILL";)

- stringhe (cap 13 --> "Linguaggio C McGrawHILL";)

- puntatori (cap 14 --> "Linguaggio C McGrawHILL";)

- strutture (cap 16 --> "Linguaggio C McGrawHILL";)

- file (cap 17 --> "Linguaggio C McGrawHILL";)

- tipi derivati (cap 18 - 20 --> "Linguaggio C McGrawHILL";)

- liste e code (cap 21 --> "Linguaggio C McGrawHILL";)
aaa
13/01/11 19:34
Alex
il semaforo è semplicemente una variabile che ti tiene conto dello stato del ponte (occupato,libero);
se hai fatto i tipi derivati puoi farti un enumerazione:
typedef enum {occupato, libero} stato;
...
stato ponte;
ponte=occupato;
ponte=libero;




o se no usi una variabile int..0 vuol dire occupato, 1 vuol dire libero..
aaa
13/01/11 19:48
ermak
mmm potresti gentilmente farmi una bozza di come dovrebbe essere...
cmq io avevo ipotizzato di fare un sistema a scelta dove andavo ad occupare o a liberare il ponte ogni qual volta serviva....

es.
MENU' PONTE.
1- occupa ponte
2- Libera ponte
3- vedi la coda
4- esci dal programma
......
aaa
16/01/11 10:35
ermak
salve in questi giorni ho pensato per implementare il progetto e alla fine sono riuscito a farlo tramite la gestione di una lista ordinata utilizzando una lista lineare per implementare una pila
comunque ecco il codice che ho scritto fino ad oggi



#include <stdio.h>
#include <malloc.h>
struct agricoltore {
    int inf;
    struct agricoltore *pun;
    };
void gestione_lista(void);
struct agricoltore *inserimento(struct agricoltore *);
struct agricoltore *eliminazione(struct agricoltore *);
void visualizzazione(struct agricoltore *);

main() {

     gestione_lista();
     }
void gestione_lista(void) {
    struct agricoltore *punt_lista = NULL;
    int scelta = -1;
    char pausa;
        while(scelta!=0) {
    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    printf("\t\t*********GESTIONE DEL PONTE***********\n");
    printf("\n\n\n\t\t\t 1. Per inserire un agricoltore");
    printf("\n\n\t\t\t 2. Per eliminare un agricoltore");
    printf("\n\n\t\t\t 3. Per visualizzare la coda");
    printf("\n\n\t\t\t 0. Per finire");
    printf("\n\n\n\t\t\t\t Scegliere una opzione: ");
    scanf("%d", &scelta);
    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        switch(scelta) {
            case 1: punt_lista = inserimento(punt_lista);
                break;
            case 2: punt_lista = eliminazione(punt_lista);
                break;
            case 3: visualizzazione(punt_lista);
                    printf("\n\nQualsiasi tasto per continuare...");
                    scanf("%c%c", &pausa, &pausa);
                break;

                }
                    }
                        }
        /* Visualizzazione della lista */
void visualizzazione(struct agricoltore *p) {
    struct agricoltore *paus = p;
        printf("*****LEGENDA*****\n 0 - villaggio nord \n 1 - villaggio sud\n ");
        printf("\npunt_lista---> ");
            while(paus!=NULL) {
                    printf("%d---> ", paus->inf);
                    paus = paus->pun; }
            printf("NULL");
            }
/* Inserimento del valore passato dall'utente nella lista mantenendo l'ordinamento */
struct agricoltore *inserimento(struct agricoltore *p) {
    struct agricoltore *p0, *p1;
    int n,posizione;
        /* Creazione agricoltore */
        p0 = (struct agricoltore *)malloc(sizeof(struct agricoltore));
            do {    printf("\nInserisci il villaggio di appartenenza\n 0 - villaggio nord \n 1 - villaggio sud\n");
                    scanf("%d", &n);
                    } while(n>1);

                p0->inf = n;

               if(p==NULL) {
        /* Se la lista è vuota, l'agricoltore */
                                p = p0; /* diventa il primo e unico della lista */
                                        p->pun = NULL; }
                else {
                        if(p->inf > p0->inf) {
                                     /* Se il valore dell'agricoltore è */
                                         p0->pun = p; /* inferiore al primo l'agricoltore */
                                         p = p0; /* diventa il primo della lista */
                                       }
                else { /* Ricerca della posizione di inserimento */
                        p1 = p; posizione = 0;
                            while(p1->pun!=NULL && posizione!=1) {
                                    if(p1->pun->inf < p0->inf) p1 = p1->pun;
                                        /* Scorre in avanti p1 */
                                        else posizione = 1; /* Interrompe lo scorrimento */
                                            }
    p0->pun = p1->pun; /* Connessione all'agricoltore successivo */
    p1->pun = p0; /* Connessione dall'agricoltore precedente */
        }
            }
                return(p); /* Ritorno del puntatore all'inizio della lista */

                        }
                        /* Eliminazione dell'agricoltore richiesto dalla lista ordinata */
struct agricoltore *eliminazione(struct agricoltore *p) {
    struct agricoltore *paus = p;
    struct agricoltore *p1 = p, *p2;
    struct agricoltore e;
    int posizione = 0;
    char pausa;
             printf("*****LEGENDA*****\n 0 - villaggio nord \n 1 - villaggio sud\n ");
        printf("\npunt_lista---> ");
            while(paus!=NULL) {
                    printf("%d---> ", paus->inf);
                    paus = paus->pun; }
            printf("NULL");

        printf("\n\n\nQuale agricoltore vuoi fare passare?\n ");
        scanf("%d", &e.inf);
            if(p1!=NULL) {
                            /* Se la lista è vuota fine */
                            if(p1->inf == e.inf) {
                                /* Se è il primo da eliminare */
                                p2 = p1; p = p->pun;
                                /* si modifica il puntatore alla testa */
                                free(p2);
                                    return(p);
                                        }
            else { /* Ricerca dell'agricoltore da eliminare */
                    while(p1->pun!=NULL && posizione!=1) {
                                    if(p1->pun->inf!=e.inf) p1 = p1->pun; /* Scorre in avanti p1 */
                                            else { posizione = 1; /* Interrompe lo scorrimento */
                                                    p2 = p1->pun; p1->pun = p1->pun->pun; /* Eliminazione agricoltore */
                                                            free(p2); /* Libera la memoria */
                                                                    return( p );
                    }
                                }
                                            }
                                                        }
if(!posizione) {
        printf("\nElemento non incontrato nella lista ");
        scanf("%c%c", &pausa, &pausa);
            }
            return(p);
                }







adesso vorrei creare una 4 e 5 funzione tipo elimin_nord e elimin_sud, le quali mi scorrono la lista ed eliminano tutti gli elementi uguali
es. tutti gli gli 0 o tutti gli 1.:)
attendo vostri consigli...:hail::hail:

Ultima modifica effettuata da ermak 16/01/11 14:45
aaa