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: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...
Ultima modifica effettuata da ermak 16/01/11 14:45
aaa