codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max_name 25+1
#define db 1
#define year 366
#define inARG 7+1
/*+++++++++++++STRUTTURA DATI+++++++++++++*/
typedef struct PostiLiberi{
//---STAMPA---//
int tmpA,J;
//------------//
//-ASSEGNAZIONE-//
int ON;
//--------------//
int bed,Year[year];
char osp[Max_name],rep[Max_name];
}B_Free;
/*++++++++++++++++++++++++++++++++++++++++*/
B_Free* Alloca(B_Free *,int);
void Make_DB(B_Free *,FILE *);
void db_PRINT(B_Free *,int);
int cerco(B_Free *,char *,int);
void bsy_PRINT(B_Free *,int,int,int);
int main(){
printf("\n Esempio file di imput ");
printf("\n*************************");
printf("\n6\ncto cardiologia 1\nmolinette cardiologia 1\ncto chirurgia 31\nmondovi chirurgia 3\nfossano neurologia 56\nverona orbitorio 15");
printf("\n*************************\n");
B_Free *strt;
strt==NULL;
FILE *fin1;
char in1[inARG];
int M_R,day,I;
printf("Nome file: ");
scanf("%s",in1);
if((fin1=fopen(in1,"r"))==NULL){
fprintf(stderr,"\nERROR!: I can't open your file %s ",in1);
exit(EXIT_FAILURE);
}
fscanf(fin1,"%d",&M_R);
if(db==1)
fprintf(stdout,"\nDim struct:%d:",M_R );
strt=Alloca(strt,M_R);
//Leggo il file.
Make_DB(strt,fin1);
//Terminata la fase di acquisizione lo chiudi.
fclose(fin1);
if(db==1)
db_PRINT(strt,M_R);
//GESTIONE DEL MENU DI RICHIESTA DATI:
printf("\nComando: ");
scanf("%s %d",in1,&day);
if(day<0)
printf("\nPRENOTAZIONE NON EFFETTUATA");
else{
//INIZIA RICERCA DISPONIBILITA LETTO-GIORNI CONSECUTIVI. devi ritornare i del candidato prescelto. Se la ricerca fallsice I=-1.
I=candida(strt,in1,M_R);
if(I==-1)
printf("\nPRENOTAZIONE NON EFFETTUATA");
else{
//PRINTA' in modo definitivo il vettore Year della struct, Parametri da passare-> (strt,dim,n).
}
}
return 0;
}
B_Free* Alloca(B_Free *ptr,int dim){
ptr=(B_Free*)malloc(dim*sizeof(B_Free));
if(ptr==NULL){
fprintf(stderr,"MALLOC FAILURE");
exit (EXIT_FAILURE);
}
if(db==1)
fprintf(stdout,"Memory request ok!");
return(ptr);
}
void Make_DB(B_Free *ptr,FILE *dati){
int i=0;
while(fscanf(dati,"%s %s %d",ptr[i].osp,ptr[i].rep,&ptr[i].bed)!=EOF)
i++;
}
void db_PRINT(B_Free *ptr,int dim){
printf("\n*********DEBUG FUNCTIONS*********");
int i=0;
for(;i<dim;i++)
printf("\n%s %s %d",ptr[i].osp,ptr[i].rep,ptr[i].bed);
printf("\n------AND OF DEBUG FUNCTIONS-----");
}
/* FUNZIONE PRESENTA LO STESSO PROBLEMA.....NON ARRIVA A STAMPARE IL PRIMO IF
int candida(B_Free *ptr,char *repa,int dim){
int x=0,tmpX=-1,c,j=0;
if(db==1)
fprintf(stdout,"Parametri ricevuti: reparto : %s dim struct:%d \n",repa,dim);
while(x!=dim){
if(strcmp(repa,ptr[x].rep)==0 && ptr[x].bed>0){
if(db==1)
fprintf(stdout,"\n TROVATO REPARTO, LETTO FREE. next step [giorni liberi consecutivi].\n Salvo l'indice in di x in tmpX ");
tmpX=x;
//ricerco consecutivi..
//j fa scorrere tutto l'anno
j=0;
c=0;
while(c!=dim){
if(ptr[x].Year[j]==0){
c++;
}else
c=0;
j++;
if(j==365)
j=0;
}//QUANDO QUESTO CICLO TERMINA C CONTIENE IL GIORNO FINALE DELLA PRENOTAZIONE
}else
ptr[x].ON=-1;
x++;
}
if(tmpX!=-1)
return -1;
else
return tmpX;
}
*/
//LA SEGUENTE FUZNIONE E' IDENTICA ALLA FUNZIONE DI PRINT DEBUG...MA NON FUNZIONA.
int candida(B_Free *ptr,char *repa,int dim){
int tmpX=-1;
int i=0;
for(;i<dim;i++)
printf("\n%s %s %d",ptr[i].osp,ptr[i].rep,ptr[i].bed);
return tmpX;
}
void bsy_PRINT(B_Free *ptr,int dim,int I,int n){
int J,x,tmp;
//I indice ospedale da occupare.
//J contine l'ultimo giorno occupato
//n il n° di giorni di decenza. risalgo a quello inziale decrementandoli entrambi.
for(x=0;x<dim;x++){
if(ptr[x].tmpA==1){
J=ptr[x].J;
}
}
tmp=J;
while(n!=0){
ptr[I].Year[J]=1;
J--;
n--;
}
printf("Prenotazione effettuata in: %s dal:%d al:%d lettoNUMERO:%d",ptr[I].osp,J,tmp,ptr[I].bed);
}
Link dell'sercizio ->