Pour avoir une immunité collective contre le virus COVID19, le Maroc a lancé un  programme pour la vaccination d’un grand nombre de citoyens, ce qui nécessite une 
gestion efficace pour l’opération de vaccination et le suivi de citoyens vaccinés. Les types  des vaccins adoptés sont : Astrazeneca et Sinopharm. L’immunité d’un citoyen contre le  virus COVID19  nécessite deux doses pour le vaccin utilisé, la deuxième dose doit être  programmée après une période précise par rapport à la première dose, sachant que la  période varie entre deux à quatre semaines. 
La gestion des citoyens concernés par la vaccination est réalisée via un tableau de structures, où chaque structure représente un citoyen. Les informations qui concernent  un citoyen sont : le numéro de la carte d’identité nationale (cin) , le nom (nom), le  prénom(prenom), le type du vaccin (type), la date de la première dose (date_prem)  et le  nombre de jours entre la première et la deuxième dose (nbj).
On considère les structures  suivantes :

typedef struct 
int jour ; 
int mois ; 
int annee ; 
Date ;

typedef struct   
char type[30] ; 
Date date_prem  ; 
int  nbj ;
Vaccin ;

typedef struct 
char cin[30]  ; 
char nom [30] ;  
char prenom[30];  
Vaccin vac ; 
Citoyen  ;

#define max 100


=>Les fonctions à rédiger sont les  suivantes :

1) void  lecture (Citoyen C[max] , int N)  qui  permet de saisir les informations des citoyens concernés par la vaccination. N représente le nombre total de citoyens.  
 
2) void affichage (Citoyen C[max] , int N)  qui  permet d’afficher les informations des 
citoyens concernés par la vaccination. N représente le nombre total de citoyens.   

3) void  totalVaccin (Citoyen C[max] , int N)  qui  permet de calculer et afficher le nombre de citoyens qui vont prendre un type du vaccin, sachant que C un tableau contenant les  citoyens concernés par la vaccination. N représente le nombre total de citoyens.  
   
4) void   CitoyenVac (Citoyen C[max] , int N, char type[30],Citoyen tab[max], int * k)  qui  permet de remplir un tableau des citoyens ( tab)  contenant les citoyens qui vont  prendre le vaccin spécifié par le type (type). C  représente un tableau de citoyens et N représente le nombre total de citoyens et  k  sert à mémoriser la taille du tableau (tab). 

5) Date  *  deuxDose (Citoyen C[max] , int N, char type[30])  qui  permet de retourne un  tableau de type Date ( un pointeur sur Date) contenant les dates de la deuxième dose  pour les citoyens concernés par un type de vaccin spécifié par le troisième argument de la  fonction. C  représente un tableau de citoyens et N  représente le nombre total de  citoyens. 

6) void AfficheDate(Citoyen C[max] , int N, char cin[20] )  qui  permet d’afficher les dates  des deux doses programmées pour un citoyen identifié par le CIN.  C  représente un  tableau de citoyens et  N représente le nombre total de  citoyens.

                                               Correction
       
                                                
1)

void Lecture(Citoyen C[max],int N){
 int i;
  for ( i=0; i<N ; i++)
   { printf("Entrer Le CIN :"); scanf("%s",C[i].cin);
     printf("Entrer Le nom :"); scanf("%s",C[i].nom);
     printf("Entrer Le prenom :"); scanf("%s",C[i].prenom);
     printf("Entrer le type de vaccin :");  scanf("%s",C[i].vac.type);
     printf("Entrer la date de vaccin \n");
     printf("  Entrer le jour :"); scanf("%d",&C[i].vac.date_prem.jour);
     printf("  Entrer le mois :"); scanf("%d",&C[i].vac.date_prem.mois);
     printf("  Entrer l'annee :"); scanf("%d",&C[i].vac.date_prem.annee);
     printf("Entrer Le nombre de jours entre les deux doses :"); 
     scanf("%d",&C[i].vac.nbj);
      printf("******************************\n");
   }
}
2)

void Affichage(Citoyen C[max],int N){
 int i ;
 
 for ( i=0; i<N ; i++)
   { printf("Le CIN : %s\n",C[i].cin);
     printf("Le nom : %s\n",C[i].nom); 
     printf("Le prenom :%s\n",C[i].prenom); 
     printf("Le type de vaccin : %s\n",C[i].vac.type); 
     printf("La date de vaccin: %d/%d/%d\n ", C[i].vac.date_prem.jour , C[i].vac.date_prem.mois, C[i].vac.date_prem.annee);
     printf("Le nombre de jours entre les deux doses : %d\n",C[i].vac.nbj); 
     printf("******************************\n");
    }                                  
}

3)

void  totalVaccin (Citoyen  C[max] , int N) 
 { int i,Nb_Astra=0,Nb_Sino=0 ;
   for ( i=0; i<N ; i++)
    {  if(strcmp(C[i].vac.type,"Astrazeneca")==0)
           Nb_Astra++;
       else  Nb_Sino++;
     } 
     printf("Le nombre de citoyens qui vont Astrazenica %d\n",Nb_Astra);
     printf("Le nombre de citoyens qui vont Sinopharme %d\n",Nb_Sino);
 }


4)

void  CitoyenVac (Citoyen C[max],int N,char type[30],Citoyen tab[max],int * k)
{ Citoyen tab[max];
  int i;
 *k =0;
  for ( i=0; i<N ; i++)
    { if(strcmp(C[i].vac.type,type)==0)
       {   tab[*k] = C[i];
             (*k)++;
       }
    } 
  
}


5)

Date * deuxDose(Citoyen C[max],int N ,char type[30])
{ int i,j=0;
  Date dates[max];
  for ( i=0; i<N ; i++)
    { if(strcmp(C[i].vac.type,type)==0)
       { dates[i].jour = ( C[i].vac.date_prem.jour + C[i].vac.nbj )%30; 
         dates[i].mois = ( C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)%12; 
         dates[i].annee = C[i].vac.date_prem.annee +(C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)/12;
       }
     }
     return dates;
}

6)

void AfficheDate(Citoyen C[max],int N,char cin[20])
{ int i,j=0;
  Date d;
  for ( i=0; i<N ; i++)
    { if( strcmp(C[i].cin,cin)==0)
      {
       d.jour =(C[i].vac.date_prem.jour + C[i].vac.nbj )%30; 
       d.mois = ( C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)%12; 
       d.annee = C[i].vac.date_prem.annee +(C[i].vac.date_prem.mois +(C[i].vac.date_prem.jour + C[i].vac.nbj)/30)/12;
       printf(" %s  %s  %s \n",C[i].nom,C[i].prenom,cin);
       printf("La date de la premiere dose: %d/%d/%d\n",C[i].vac.date_prem.jour,C[i].vac.date_prem.mois,C[i].vac.date_prem.annee);
       printf("La date de la deuxieme dose: %d/%d/%d",d.jour,d.mois,d.annee);
      }    
    }
}