|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2005
Città: Lingua di terra che taglia il Tirreno
Messaggi: 699
|
[C] un'occhiata al listato thanks
Un processo P conta il numero di servizi che ogni utente gli invia. Il processo P preleva le richieste da una stack, le elabora ed inserisce i risultati in una lista dinamica. Le richieste nello stack e gli elementi nella lista hanno le seguenti strutture:
struct richiesta { int codice_servizio; char cognome [20]; } struct elemento { char cognome [20]; int num_servizi; } Il processo P gestisce le richieste nel seguente modo: - verifica che il codice_servizio della richiesta abbia un valore compreso tra 1 e 1024, altrimenti scarta la richiesta; - verifica che nella lista, che è ordinata rispetto al campo cognome esista un elemento con lo stesso cognome presente nella richiesta.ùSe tale elemento è presente, ne incrementa di 1 unità la variabile num_servizi, altrimenti inserisce un nuovo elemento nella lista in maniera ordinata con il valore di num_servizi pari a 1. Ecco come ci ho messo mano.... Codice:
#include <stdio.h> #include <string.h> #include <stdlib.h> struct richiesta { int codice_servizio; char cognome [20]; struct richiesta *next; }; struct elemento { char cognome[20]; int num_servizi; struct elemento *next; }; PROTOTIPI DI FUNZIONE struct elemento * preleva_richiesta_da_stack(struct richiesta **, struct richiesta **); int elabora_elemento_stack (struct richiesta *); void in_lista_ordinata (struct elemento **, struct elemento **); int main () { struct richiesta * testa_stack=NULL; struct elemento *testa_lista=NULL; struct elemento *elem=NULL; struct richiesta * y=NULL; int codice, esci; while(!esci) { esci=1; elem= preleva_richiesta_da_stack(&testa_stack, &y); codice= elabora_elemento_stack(y); if (codice >=1 && codice <= 1024) { esci=0; in_lista_ordinata(&testa_lista, &elem); } } retrurn 0; } DEFINIZIONE DELLE FUNZIONI struct elemento * preleva_richiesta_da_stack(struct richiesta **head, struct richiesta ** query) { struct elemento *new; new= (struct elemento *)malloc(sizeof(struct elemento)); if (*head ==NULL) printf("Errore stack vuota!\n"); else { *query=*head; *head= (*head)-> next; } strcpy(new->cognome, (*query)->cognome); new->num_servizi= (*query)->codice_servizio; return new; } int elabora_elemento_stack(struct richiesta *punt) { return (punt->codice_servizio); } void in_lista_ordinata(struct elemento **head, struct elemento ** element) { struct elemento *prec, *curr, *new; new=(struct elemento *)malloc(sizeof(struct elemento)); strcpy (new->cognome, (*element)->cognome); new->num_servizi= (*element)->num_servizi; prec=NULL; curr=*head; while(curr != NULL && strcmp( curr->cognome, new->cognome)<=0) { [ho bisogno di allocare lo spazio per il puntatore new e ricopiare li dentro il tutto, oppure confronto direttamente *element con curr? io eviterei di usare new, voi che dite?] if(strcmp(curr->cognome, new->cognome)==0) (curr->num_servizi)++; else { prec=curr; curr=curr->next; } } if(prec==NULL) { new-<next=*head; *head=new; new->num_servizi =1; } else { prec->next=new; new->next=curr; new->num_servizi =1; } }
__________________
Il Paradiso lo preferisco per il clima, l'Inferno per la compagnia [Mark Twain] [Romantico Inside][Thread prof. gnocche] Ultima modifica di danny2005 : 28-06-2007 alle 10:21. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Dec 2005
Città: Lingua di terra che taglia il Tirreno
Messaggi: 699
|
up
nessuno che si sbilancia?
__________________
Il Paradiso lo preferisco per il clima, l'Inferno per la compagnia [Mark Twain] [Romantico Inside][Thread prof. gnocche] |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2005
Città: Lingua di terra che taglia il Tirreno
Messaggi: 699
|
up up up
__________________
Il Paradiso lo preferisco per il clima, l'Inferno per la compagnia [Mark Twain] [Romantico Inside][Thread prof. gnocche] |
![]() |
![]() |
![]() |
#4 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Faresti bene a usare il tag "code" e a sfruttare l'indentazione.
Codice:
struct elemento * preleva_richiesta_da_stack(struct richiesta **head, struct richiesta ** query) { struct elemento *new; new= (struct elemento *)malloc(sizeof(struct elemento)); if (*head ==NULL) printf("Errore stack vuota!\n"); else { *query=*head; *head= (*head)-> next; } strcpy(new->cognome, (*query)->cognome); new->num_servizi= (*query)->codice_servizio; return new; } Nella parte successiva puoi fare i confronti direttamente, senza bisogno di creare una copia. Codice:
void in_lista_ordinata(struct elemento **head, struct elemento ** element) { struct elemento *prec, *curr, *new; new=(struct elemento *)malloc(sizeof(struct elemento)); strcpy (new->cognome, (*element)->cognome); new->num_servizi= (*element)->num_servizi; prec=NULL; curr=*head; while(curr != NULL && strcmp( curr->cognome, new->cognome)<=0) { if(strcmp(curr->cognome, new->cognome)==0 Codice:
(curr->num_servizi)++; else { prec=curr; curr=curr->next; } } if(prec==NULL) { new-<next=*head; *head=new; new->num_servizi =1; } else { prec->next=new; new->next=curr; new->num_servizi =1; } }
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 25-06-2007 alle 14:24. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prima di tutto dai una bella indentata a tutto il codice seguendo uno dei metodi classici del C...
Ad esempio: Codice:
int pippo(int pluto, int paperino) { if(pluto = paperino) { return 1; } else { return 0; } } |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ancora non ci siamo...ti faccio vedere il main come lo farei io:
Codice:
int main () { struct richiesta * testa_stack = NULL; struct elemento *testa_lista = NULL; struct elemento *elem = NULL; struct richiesta * y = NULL; int codice, esci; while(!esci) { esci = 1; elem = preleva_richiesta_da_stack(&testa_stack, &y); codice = elabora_elemento_stack(y); if(codice >= 1 && codice <= 1024) { esci = 0; in_lista_ordinata(&testa_lista, &elem); } } return 0; } Ultima modifica di cionci : 28-06-2007 alle 10:02. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ancora no...i blocchi che sono allo stesso livello devono essere allineati...
Che editor usi per scrivere il codice ? Molti editor permettono di usare il tab per indentare il codice, tab che viene poi convertito in un numero di spazi impostabile a piacere (solitamente 3 o 4)... |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Dec 2005
Città: Lingua di terra che taglia il Tirreno
Messaggi: 699
|
Quote:
![]() cmq se puoi fare uno sforzo......(per stavolta) ![]() Non lo faccio più...giuro......
__________________
Il Paradiso lo preferisco per il clima, l'Inferno per la compagnia [Mark Twain] [Romantico Inside][Thread prof. gnocche] |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Tanto gli editor la fanno da soli la formattazione
![]() Codice:
#include <stdio.h> #include <string.h> #include <stdlib.h> struct richiesta { int codice_servizio; char cognome[20]; struct richiesta *next; }; struct elemento { char cognome[20]; int num_servizi; struct elemento *next; }; /*PROTOTIPI DI FUNZIONE*/ struct elemento *preleva_richiesta_da_stack (struct richiesta **, struct richiesta **); int elabora_elemento_stack (struct richiesta *); void in_lista_ordinata (struct elemento **, struct elemento **); int main () { struct richiesta *testa_stack = NULL; struct elemento *testa_lista = NULL; struct elemento *elem = NULL; struct richiesta *y = NULL; int codice, esci; while (!esci) { esci = 1; elem = preleva_richiesta_da_stack (&testa_stack, &y); codice = elabora_elemento_stack (y); if (codice >= 1 && codice <= 1024) { esci = 0; in_lista_ordinata (&testa_lista, &elem); } } retrurn 0; } /*DEFINIZIONE DELLE FUNZIONI */ struct elemento * preleva_richiesta_da_stack (struct richiesta **head, struct richiesta **query) { struct elemento *new; new = (struct elemento *) malloc (sizeof (struct elemento)); if (*head == NULL) printf ("Errore stack vuota!\n"); else { *query = *head; *head = (*head)->next; } strcpy (new->cognome, (*query)->cognome); new->num_servizi = (*query)->codice_servizio; return new; } int elabora_elemento_stack (struct richiesta *punt) { return (punt->codice_servizio); } void in_lista_ordinata (struct elemento **head, struct elemento **element) { struct elemento *prec, *curr, *new; new = (struct elemento *) malloc (sizeof (struct elemento)); strcpy (new->cognome, (*element)->cognome); new->num_servizi = (*element)->num_servizi; prec = NULL; curr = *head; while (curr != NULL && strcmp (curr->cognome, new->cognome) <= 0) { /*[ho bisogno di allocare lo spazio per il puntatore new e * ricopiare li dentro il tutto, * oppure confronto direttamente * * element con curr ? io eviterei di usare new, * voi che dite ?] */ if (strcmp (curr->cognome, new->cognome) == 0) (curr->num_servizi)++; else { prec = curr; curr = curr->next; } } if (prec == NULL) { new - <next = *head; *head = new; new->num_servizi = 1; } else { prec->next = new; new->next = curr; new->num_servizi = 1; } } |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2005
Città: Lingua di terra che taglia il Tirreno
Messaggi: 699
|
ok ma...va bene? non parlo dell'indentazione ma di ciò che è indentato........
__________________
Il Paradiso lo preferisco per il clima, l'Inferno per la compagnia [Mark Twain] [Romantico Inside][Thread prof. gnocche] |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se funziona va bene
![]() L'hai provato ? |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Dec 2005
Città: Lingua di terra che taglia il Tirreno
Messaggi: 699
|
ancora no......
è che volevo un parere da uno esperto; per essere sicuro di non aver scritto cose strane.........
__________________
Il Paradiso lo preferisco per il clima, l'Inferno per la compagnia [Mark Twain] [Romantico Inside][Thread prof. gnocche] Ultima modifica di danny2005 : 28-06-2007 alle 11:20. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Tanto l'insegnante migliore è il compilatore...
Se non l'avessi scritto tutto insieme ora avresti potuto fare varie prove prima di terminarlo per vedere se quello che stavi facendo era corretto ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:27.