codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct car{
char *targa;
char *modello;
int ingresso;
int uscita;
struct car *next;
};
/*variabili globali*/
const int DIM =30;
struct car *parcheggio;
/*prototipi*/
int posteggio();
int ritiro(char *targa);
struct car *cercaTarga(char *targa);
struct car *cercaModello(char *modello);
int numAutoPerModelloEtarga(int ingresso);
int letturaOrario(int ora, int minuti);
void printCar(struct car *p);
main(){
char risp, targa[DIM], modello[DIM];
struct car *p;
while(risp!='q'){
printf("cosa si desidera fare\n");
printf("selezionare 'p' per posteggio\n");
printf("selezionare 'r' per ritiro auto\n");
printf("selezionare 't' per ricerca targa\n");
printf("selezionare 'n' per numero macchine di un certo modello in un dato intervallo");
printf("inserire il codice: ");
scanf("%c", &risp);
fflush(stdin);
switch(risp){
case 'p': if(posteggio())
printf("operazione riuscita\n");
else
printf("operazione non riuscita\n");
break;
case 'r': printf("inserire targa auto da ritirare\n");
fgets(targa, sizeof(targa),stdin);
if(ritiro(targa)){
printf("rimozione auto effettuata con successo\n");
}
else
printf("operazione non riuscita\n");
break;
case 't': printf("inserire targa da ricercare");
fgets(targa, sizeof(targa), stdin);
p=cercaTarga(targa);
if(p){
printCar(p);
}
else{
printf("auto non presente\n");
}
case 'n': printf("inserisci modello: ");
fgets(modello, sizeof(modello), stdin);
case 'q': break;
default: printf("comando non riconosciuto\n");
}
}
}
/*parcheggio: inserisce un auto nel posteggio;
1)verifica se vi è spazio per poter ospitare nuove auto;
2)segnala se l'auto è già presente negli archivi
3)verifica la consecutio temporum del posteggio
*/
int posteggio(void){
int i=0; /*tentativi*/
int tempoU;
struct car *a, *cur;
char targa[DIM], modello[DIM];
int ora, minuti;
a=malloc(sizeof(struct car));
if (a == NULL){
printf("il posteggio è pieno; non è possibile ospitare altre auto\n");
return 0;
}
printf("inserisci targa: ");
fgets(targa, sizeof(targa), stdin);
a->targa=malloc((strlen(targa)+1)*sizeof(char));
strcpy(a->targa,targa);
/*verifico la presenza dell'auto*/
for (cur=parcheggio; cur!=NULL && strcmp(cur->targa,targa)!=0; cur=cur->next)
;
if(cur!= NULL && strcmp(cur->targa,targa)==0){
printf("auto già presente nel posteggio\n");
return 0;
}
/*proseguo con l'ottenimento dati*/
printf("inserisci modello: ");
fgets(modello, sizeof(modello), stdin);
a->modello=malloc((strlen(modello)+1)*sizeof(char));
strcpy(a->modello, modello);
printf("inserisci ora e minuti ingresso hh:mm: ");
scanf("%d:%d",&ora, &minuti);
fflush(stdin);
a->ingresso=letturaOrario(ora, minuti);
printf("inserisci ora e minuti uscita hh:mm: " );
scanf("%d:%d", &ora, &minuti);
fflush(stdin);
tempoU = letturaOrario(ora, minuti);
while (i<2 && tempoU < a->ingresso){
printf("orario d'uscita precedente a quello d'ingresso; reimmetti\n");
scanf("%d:%d", &ora, &minuti);
fflush(stdin);
tempoU = letturaOrario(ora, minuti);
i++;
}
if(i >= 2){
printf("tentativi di immissione esauriti; abbandono posteggio\n");
return 0;
}
a->uscita = tempoU;
a->next = parcheggio;
parcheggio=a;
return 1;
}
/*converto i minuti e l'ora in secondi dalla mezzanotte*/
int letturaOrario(int ora, int minuti){
int tempo;
tempo=minuti+ora*60;
return tempo;
}
int ritiro(char *targa){
struct car *c, *prev, *cur;
if (parcheggio==NULL)
return 0;
for(cur=parcheggio, prev=NULL; cur!=NULL && strcmp(cur->targa, targa)!=0;
cur=cur->next)
;
if(cur!=NULL && strcmp(cur->targa, targa)==0){
if (prev==NULL)
parcheggio=parcheggio->next;
else{
prev->next=cur->next;
free(cur);
}
return 1;
}
else {
printf("auto non trovata\n");
return 0;
}
}
struct car *cercaTarga(char *targa){
struct car *p;
for (p=parcheggio; p!=NULL && strcmp(p->targa,targa)!=0; p=p->next )
;
return p;
}
struct car *cercaModello(char *modello){
struct car *p;
for (p=parcheggio; p!=NULL && strcmp(p->modello,modello)!=0; p=p->next)
;
return p;
}
/*restituisce la prima auto che rientra nell'intervallo indicato*/
struct car *cercaIntervallo(){
int h,m, t1, t2;
struct car *p;
printf("inserisci primo orario: hh:mm");
scanf("%d:%d",&h,&m);
t1=letturaOrario(h,m);
printf("inserisci secondo orario: hh:mm");/*successivamente è possibile aggiungere controllo*/
scanf("%d:%d",&h,&m);
t2=letturaOrario(h,m);
for (p=parcheggio; p!=NULL && p->ingresso < t1 &&p->uscita > t2;
p=p->next)
;
return p;
}
/*stampa i membri di una singola macchina*/
void printCar(struct car *p){
printf("targa: %s\n",p->targa);
printf("modello: %s\n",p->modello);
printf("orario ingresso: %d:%d\n", (p->ingresso)/60, p->ingresso%60);
printf("orario uscita: %d:%d\n", (p->uscita)/60, p->uscita%60);
}
il mio problema deriva dalla realizzazione della ricerca sia del modello, sia della fascia oraria; la funzione dovrebbe restituire un numero di auto che rientrano in tali range, ossia quelle che appartengono sia al modello, sia alla fascia oraria di parcheggio presa in considerazione.