182 lines
4.3 KiB
C
182 lines
4.3 KiB
C
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define N 5
|
|
#define NumLength (10+4+1)
|
|
#define IntLength (8)
|
|
|
|
|
|
union description
|
|
{
|
|
unsigned char lettresPref[2];
|
|
float taille;
|
|
long long int telephone;
|
|
};
|
|
enum descType {LettresPref, Taille, Telephone};
|
|
typedef struct personne personne;
|
|
struct personne{
|
|
int age;
|
|
char* initiales;
|
|
enum descType descType;
|
|
union description* desc;
|
|
};
|
|
|
|
void description(personne* p){
|
|
|
|
switch(p->descType){
|
|
case LettresPref:
|
|
printf("%s, agé de %d ans a pour lettres préférées le %c et le %c.\n",p->initiales, p->age, p->desc->lettresPref[0], p->desc->lettresPref[1]);
|
|
break;
|
|
case Taille:
|
|
printf("%s, agé de %d ans mesure %f m \n",p->initiales, p->age, p->desc->taille);
|
|
break;
|
|
case Telephone:
|
|
printf("%s, agé de %d ans est joignable au %llu \n",p->initiales, p->age, p->desc->telephone);
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int scanfs(char* dest, int length){
|
|
|
|
if(fgets(dest, length-1, stdin)==NULL){
|
|
return 1;// Une erreur est survenue lors de la lecture (trop long ?)
|
|
}
|
|
|
|
// On doit supprimer le retour à la ligne qu'a capturé fgets.
|
|
int i;
|
|
for(i=0;i<length && (dest)[i]!='\n';i++){}
|
|
if(i>=length){// On a Overflow
|
|
// On nettoie les caracteres ecrits en trop
|
|
while( (!strchr(dest,'\n')) && (!strchr(dest,EOF)))
|
|
if(!fgets(dest, length-1,stdin))
|
|
break;
|
|
return 2;
|
|
}
|
|
dest[i] = '\0';
|
|
return 0;
|
|
}
|
|
|
|
void nextLine(){
|
|
int c;
|
|
while ((c = getchar()) != '\n' && c != EOF) { };
|
|
}
|
|
|
|
void demander(personne* p){
|
|
|
|
int age;
|
|
int descTypeN;
|
|
char* initiales = calloc(IntLength,sizeof(char));
|
|
if(initiales==NULL)return;
|
|
printf("Création d'une nouvelle personne : \n");
|
|
do{
|
|
printf("Initiales : ");
|
|
} while(scanfs(initiales,IntLength));
|
|
|
|
printf("Âge : ");
|
|
if(scanf("%d", &age)!=1){
|
|
printf("Ce n'est pas un nombre, je met 42 dans le doute\n");
|
|
nextLine();
|
|
age = 42;
|
|
} else
|
|
getchar();
|
|
|
|
|
|
printf("Quelle description allez-vous donner (0 pour les lettres, 1 pour la taille, 2 pour le num) ? ");
|
|
if(scanf("%d", &descTypeN)!=1){
|
|
printf("Ce n'est pas un nombre, je met 2$ dans le doute\n");
|
|
nextLine();
|
|
descTypeN = 2;
|
|
} else
|
|
getchar();
|
|
|
|
enum descType descType;
|
|
union description* desc;
|
|
switch(descTypeN){
|
|
case 0:
|
|
desc = malloc(sizeof(unsigned char)*2);
|
|
if(desc==NULL){
|
|
free(initiales);return;
|
|
}
|
|
printf("Quelles sont ses deux lettres préférées ? ");
|
|
desc->lettresPref[0] = getchar();
|
|
desc->lettresPref[1] = getchar();
|
|
nextLine();
|
|
descType = LettresPref;
|
|
break;
|
|
case 1:
|
|
desc = malloc(sizeof(float));
|
|
if(desc==NULL){
|
|
free(initiales);return;
|
|
}
|
|
printf("Quelle est sa taille ? ");
|
|
scanf("%f",&(desc->taille));getchar();
|
|
descType = Taille;
|
|
break;
|
|
case 2:
|
|
desc = malloc(sizeof(long long int));
|
|
if(desc==NULL){
|
|
free(initiales);return;
|
|
}
|
|
printf("Quelle est son num ? ");
|
|
scanf("%llu",&(desc->telephone));getchar();
|
|
descType = Telephone;
|
|
break;
|
|
}
|
|
|
|
p->initiales = initiales;
|
|
p->age = age;
|
|
p->descType = descType;
|
|
p->desc = desc;
|
|
}
|
|
|
|
void freePerso(personne* perso){
|
|
free(perso->initiales);
|
|
free(perso->desc);
|
|
}
|
|
|
|
int lesmeme(personne* p1, personne* p2){
|
|
|
|
if(!((p1->age==p2->age) && (strcmp(p1->initiales, p2->initiales)==0) && (p1->descType==p2->descType)))
|
|
return 0;
|
|
switch(p1->descType){
|
|
case LettresPref:
|
|
return (p1->desc->lettresPref[0])==(p2->desc->lettresPref[0])
|
|
&& (p1->desc->lettresPref[1])==(p2->desc->lettresPref[1]);
|
|
case Taille:
|
|
return (p1->desc->taille)==(p2->desc->taille);
|
|
case Telephone:
|
|
return (p1->desc->telephone)==(p2->desc->telephone);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int main(){
|
|
|
|
personne persos[N];
|
|
|
|
for(int i=0;i<N;i++){
|
|
demander(persos+i);
|
|
description(persos+i);
|
|
}
|
|
|
|
for(int i=1;i<N;i++){
|
|
for(int j=0;j<i;j++){
|
|
if(lesmeme(persos+i,persos+j)){
|
|
printf("Alerte doublon !\n");
|
|
description(persos+i);
|
|
}
|
|
}
|
|
}
|
|
|
|
for(int i=0;i<N;i++)
|
|
freePerso(persos+i);
|
|
|
|
}
|
|
|
|
|