Correction de C12.
This commit is contained in:
parent
faf8027312
commit
d1b5fd2430
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,3 +12,4 @@ levallois.jpg
|
|||||||
*.synctex.gz
|
*.synctex.gz
|
||||||
*.toc
|
*.toc
|
||||||
*.ent
|
*.ent
|
||||||
|
*.test
|
||||||
|
|||||||
25
C12.1.c
25
C12.1.c
@ -20,16 +20,23 @@ void description(personne* p){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int scanfs(char** dest, int length){
|
int scanfs(char* dest, int length){
|
||||||
|
|
||||||
if(fgets(*dest, length, stdin)==NULL){
|
if(fgets(dest, length-1, stdin)==NULL){
|
||||||
return 1;// Une erreur est survenue lors de la lecture (trop long ?)
|
return 1;// Une erreur est survenue lors de la lecture (trop long ?)
|
||||||
}
|
}
|
||||||
|
|
||||||
// On doit supprimer le retour à la ligne qu'a capturé fgets.
|
// On doit supprimer le retour à la ligne qu'a capturé fgets.
|
||||||
int i;
|
int i;
|
||||||
for(i=0;i<length && (*dest)[i]!='\n';i++){}
|
for(i=0;i<length && (dest)[i]!='\n';i++){}
|
||||||
(*dest)[i] = '\0';
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,13 +48,15 @@ void demander(personne* p){
|
|||||||
char* num = malloc(NumLength*sizeof(char));
|
char* num = malloc(NumLength*sizeof(char));
|
||||||
if(num==NULL){free(initiales);return;}
|
if(num==NULL){free(initiales);return;}
|
||||||
printf("Création d'une nouvelle personne : \n");
|
printf("Création d'une nouvelle personne : \n");
|
||||||
printf("Initiales : ");
|
do{
|
||||||
while(scanfs(&initiales,IntLength)){};
|
printf("Initiales : ");
|
||||||
|
} while(scanfs(initiales,IntLength));
|
||||||
printf("Âge : ");
|
printf("Âge : ");
|
||||||
scanf("%d", &age);
|
scanf("%d", &age);
|
||||||
getchar();
|
getchar();
|
||||||
printf("Numéro de téléphone : ");
|
do {
|
||||||
while(scanfs(&num, NumLength)){};
|
printf("Numéro de téléphone : ");
|
||||||
|
} while(scanfs(num, NumLength));
|
||||||
|
|
||||||
p->initiales = initiales;
|
p->initiales = initiales;
|
||||||
p->age = age;
|
p->age = age;
|
||||||
|
|||||||
150
C12.2.c
150
C12.2.c
@ -2,6 +2,8 @@
|
|||||||
#include<stdio.h>
|
#include<stdio.h>
|
||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
|
|
||||||
|
#define NameLength 16
|
||||||
|
|
||||||
/* 1 */
|
/* 1 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -56,6 +58,8 @@ struct personnage{
|
|||||||
struct personnage* premierEnfant;
|
struct personnage* premierEnfant;
|
||||||
struct personnage* chaineGlobale;
|
struct personnage* chaineGlobale;
|
||||||
|
|
||||||
|
char shouldFreeNom;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 6 */
|
/* 6 */
|
||||||
@ -71,23 +75,27 @@ struct personnage* getByName(struct personnage* origin, char* name){
|
|||||||
|
|
||||||
/* 7 */
|
/* 7 */
|
||||||
|
|
||||||
struct personnage* newUnrelated(struct personnage* origin, char* name){
|
struct personnage* newUnrelatedM(struct personnage** originp, char* name, char shouldFreeNom){
|
||||||
|
if(name==NULL)return NULL;
|
||||||
struct personnage* dest = (struct personnage*) malloc(sizeof(struct personnage));
|
struct personnage* dest = (struct personnage*) malloc(sizeof(struct personnage));
|
||||||
dest->nom = name;
|
dest->nom = name;
|
||||||
|
dest->shouldFreeNom = shouldFreeNom;
|
||||||
dest->frereSuivantPapa = dest->frereSuivantMaman = dest;
|
dest->frereSuivantPapa = dest->frereSuivantMaman = dest;
|
||||||
dest->pere = dest->mere = dest->premierEnfant = NULL;
|
dest->pere = dest->mere = dest->premierEnfant = NULL;
|
||||||
if(origin!=NULL){
|
|
||||||
while(origin->chaineGlobale!=NULL)origin = origin->chaineGlobale;
|
dest->chaineGlobale = *originp;
|
||||||
origin->chaineGlobale = dest;
|
*originp = dest;
|
||||||
}
|
|
||||||
dest->chaineGlobale = NULL;
|
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 8 */
|
struct personnage* newUnrelated(struct personnage** originp, char* name){
|
||||||
void papounet(struct personnage* pere, struct personnage* enfant){
|
return newUnrelatedM(originp, name, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 8 */
|
||||||
|
int papounet(struct personnage* pere, struct personnage* enfant){
|
||||||
|
if(pere==NULL || enfant==NULL)return 1;
|
||||||
enfant->pere = pere;
|
enfant->pere = pere;
|
||||||
if(pere->premierEnfant==NULL){
|
if(pere->premierEnfant==NULL){
|
||||||
pere->premierEnfant = enfant;
|
pere->premierEnfant = enfant;
|
||||||
@ -98,11 +106,12 @@ void papounet(struct personnage* pere, struct personnage* enfant){
|
|||||||
fraterie->frereSuivantPapa = enfant;
|
fraterie->frereSuivantPapa = enfant;
|
||||||
}
|
}
|
||||||
enfant->frereSuivantPapa = pere->premierEnfant;
|
enfant->frereSuivantPapa = pere->premierEnfant;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 9 */
|
/* 9 */
|
||||||
void mamounette(struct personnage* mere, struct personnage* enfant){
|
int mamounette(struct personnage* mere, struct personnage* enfant){
|
||||||
|
if(mere==NULL || enfant==NULL)return 1;
|
||||||
enfant->mere = mere;
|
enfant->mere = mere;
|
||||||
if(mere->premierEnfant==NULL){
|
if(mere->premierEnfant==NULL){
|
||||||
mere->premierEnfant = enfant;
|
mere->premierEnfant = enfant;
|
||||||
@ -113,6 +122,7 @@ void mamounette(struct personnage* mere, struct personnage* enfant){
|
|||||||
fraterie->frereSuivantMaman = enfant;
|
fraterie->frereSuivantMaman = enfant;
|
||||||
}
|
}
|
||||||
enfant->frereSuivantMaman = mere->premierEnfant;
|
enfant->frereSuivantMaman = mere->premierEnfant;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 10 */
|
/* 10 */
|
||||||
@ -139,22 +149,40 @@ void dumpState(struct personnage* liste){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 11 */
|
/* 11 */
|
||||||
struct personnage* addRegistryEntry(struct personnage* liste, char* enfantN, char* pereN, char* mereN){
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct personnage* addRegistryEntryM(struct personnage** liste, char* enfantN, char* pereN, char* mereN, char shouldFreeNoms){
|
||||||
|
if(enfantN==NULL) return NULL;
|
||||||
struct personnage *enfant, *pere, *mere;
|
struct personnage *enfant, *pere, *mere;
|
||||||
if(liste==NULL)
|
|
||||||
liste = newUnrelated(NULL, enfantN);
|
|
||||||
|
|
||||||
enfant = getByName(liste, enfantN);
|
enfant = getByName(*liste, enfantN);
|
||||||
if(enfant==NULL)enfant = newUnrelated(liste, enfantN);
|
if(enfant==NULL)enfant = newUnrelatedM(liste, enfantN, shouldFreeNoms&0b100);
|
||||||
if(pereN!=NULL){
|
if(pereN!=NULL){
|
||||||
pere = getByName(liste, pereN);
|
pere = getByName(*liste, pereN);
|
||||||
if(pere==NULL)pere = newUnrelated(liste, pereN);
|
if(pere==NULL)pere = newUnrelatedM(liste, pereN, shouldFreeNoms&0b010);
|
||||||
papounet(pere, enfant);
|
papounet(pere, enfant);
|
||||||
}
|
}
|
||||||
if(mereN!=NULL){
|
if(mereN!=NULL){
|
||||||
mere = getByName(liste, mereN);
|
mere = getByName(*liste, mereN);
|
||||||
if(mere==NULL)mere = newUnrelated(liste, mereN);
|
if(mere==NULL)mere = newUnrelatedM(liste, mereN, shouldFreeNoms&0b001);
|
||||||
mamounette(mere, enfant);
|
mamounette(mere, enfant);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,13 +190,43 @@ struct personnage* addRegistryEntry(struct personnage* liste, char* enfantN, cha
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct personnage* addRegistryEntry(struct personnage** liste, char* enfantN, char* pereN, char* mereN){
|
||||||
|
return addRegistryEntryM(liste, enfantN, pereN, mereN, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct personnage* askRegistryEntry(struct personnage** liste){
|
||||||
|
char* enfantN = malloc(NameLength*sizeof(char));
|
||||||
|
if(enfantN==NULL)return NULL;
|
||||||
|
char* pereN = malloc(NameLength*sizeof(char));
|
||||||
|
if(pereN==NULL){free(enfantN);return NULL;}
|
||||||
|
char* mereN = malloc(NameLength*sizeof(char));
|
||||||
|
if(mereN==NULL){free(pereN),free(enfantN);return NULL;}
|
||||||
|
|
||||||
|
do{
|
||||||
|
printf("Nom de l'enfant : ");
|
||||||
|
} while(scanfs(enfantN,NameLength));
|
||||||
|
do{
|
||||||
|
printf("Nom du père (vide pour non renseigné) : ");
|
||||||
|
} while(scanfs(pereN,NameLength));
|
||||||
|
do{
|
||||||
|
printf("Nom de la mère (vide pour non renseigné) : ");
|
||||||
|
} while(scanfs(mereN,NameLength));
|
||||||
|
|
||||||
|
// La chaine vide est représentée par un pointeur vers '\0' (la fin de la chaine)
|
||||||
|
if(*pereN=='\0'){free(pereN);pereN = NULL;}
|
||||||
|
if(*mereN=='\0'){free(mereN);mereN = NULL;}
|
||||||
|
|
||||||
|
return addRegistryEntryM(liste,enfantN, pereN, mereN, 0b111);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* 12 */
|
/* 12 */
|
||||||
// Voir le main à la fin du code.
|
// Voir le main à la fin du code.
|
||||||
|
|
||||||
/* 13 */
|
/* 13 */
|
||||||
|
|
||||||
void paspapa(struct personnage* batard){
|
void paspapa(struct personnage* batard){
|
||||||
|
if(batard==NULL)return;// On n'enleve aucun lien
|
||||||
if(batard->frereSuivantPapa != batard){
|
if(batard->frereSuivantPapa != batard){
|
||||||
if(batard->pere->premierEnfant == batard)batard->pere->premierEnfant = batard->frereSuivantPapa;
|
if(batard->pere->premierEnfant == batard)batard->pere->premierEnfant = batard->frereSuivantPapa;
|
||||||
struct personnage* fraterie = batard;
|
struct personnage* fraterie = batard;
|
||||||
@ -186,7 +244,7 @@ void paspapa(struct personnage* batard){
|
|||||||
/* 14 */
|
/* 14 */
|
||||||
|
|
||||||
void pasmaman(struct personnage* batard){
|
void pasmaman(struct personnage* batard){
|
||||||
|
if(batard==NULL)return;
|
||||||
if(batard->frereSuivantMaman != batard){
|
if(batard->frereSuivantMaman != batard){
|
||||||
if(batard->mere->premierEnfant == batard)batard->mere->premierEnfant = batard->frereSuivantMaman;
|
if(batard->mere->premierEnfant == batard)batard->mere->premierEnfant = batard->frereSuivantMaman;
|
||||||
struct personnage* fraterie = batard;
|
struct personnage* fraterie = batard;
|
||||||
@ -250,7 +308,15 @@ struct personnage* orderPersos(struct personnage* liste){
|
|||||||
|
|
||||||
/* 16 */
|
/* 16 */
|
||||||
|
|
||||||
|
|
||||||
|
// L'objectif était de faire une sortie illisible, surtout lorsqu'il y a beaucoup de générations.
|
||||||
|
// Mais je peux mettre des parentheses
|
||||||
|
#define ParenthesesVraiNom 1
|
||||||
void printVraiNom(struct personnage* perso){
|
void printVraiNom(struct personnage* perso){
|
||||||
|
if(perso==NULL){
|
||||||
|
printf("personne");return;
|
||||||
|
}
|
||||||
|
if(ParenthesesVraiNom)printf("(");
|
||||||
printf("%s", perso->nom);
|
printf("%s", perso->nom);
|
||||||
if(perso->mere !=NULL){
|
if(perso->mere !=NULL){
|
||||||
printf(", enfant de ");
|
printf(", enfant de ");
|
||||||
@ -263,9 +329,11 @@ void printVraiNom(struct personnage* perso){
|
|||||||
printf(", enfant de ");
|
printf(", enfant de ");
|
||||||
printVraiNom(perso->pere);
|
printVraiNom(perso->pere);
|
||||||
}
|
}
|
||||||
|
if(ParenthesesVraiNom)printf(")");
|
||||||
}
|
}
|
||||||
|
|
||||||
int printNthGP(struct personnage* racine, int hauteur, int dejafait){
|
int printNthGP(struct personnage* racine, int hauteur, int dejafait){
|
||||||
|
if(racine==NULL)return 0;
|
||||||
if(hauteur==0){
|
if(hauteur==0){
|
||||||
printf(dejafait?", %s":"%s", racine->nom);
|
printf(dejafait?", %s":"%s", racine->nom);
|
||||||
return dejafait+1;
|
return dejafait+1;
|
||||||
@ -283,6 +351,7 @@ int printNthGP(struct personnage* racine, int hauteur, int dejafait){
|
|||||||
|
|
||||||
|
|
||||||
void dumpAncetres(struct personnage* racine){
|
void dumpAncetres(struct personnage* racine){
|
||||||
|
if(racine==NULL)return;
|
||||||
printf("Ancêtres de %s\n", racine->nom);
|
printf("Ancêtres de %s\n", racine->nom);
|
||||||
|
|
||||||
printf("Parents connus: ");
|
printf("Parents connus: ");
|
||||||
@ -306,7 +375,7 @@ void dumpAncetres(struct personnage* racine){
|
|||||||
|
|
||||||
/* 17 */
|
/* 17 */
|
||||||
int dumpNthDescendents(struct personnage* vieux, int gen){
|
int dumpNthDescendents(struct personnage* vieux, int gen){
|
||||||
|
if(vieux==NULL)return 0;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
if(vieux->premierEnfant == NULL)return 0;
|
if(vieux->premierEnfant == NULL)return 0;
|
||||||
int sexe = vieux->premierEnfant->pere != vieux;// 1 si femme
|
int sexe = vieux->premierEnfant->pere != vieux;// 1 si femme
|
||||||
@ -331,6 +400,8 @@ int dumpNthDescendents(struct personnage* vieux, int gen){
|
|||||||
/* 18 */
|
/* 18 */
|
||||||
void dumpDescendenceUntil(struct personnage* vieux, int maxh){
|
void dumpDescendenceUntil(struct personnage* vieux, int maxh){
|
||||||
|
|
||||||
|
if(vieux==NULL)return;
|
||||||
|
|
||||||
printf("Déscendence de %s\n", vieux->nom);
|
printf("Déscendence de %s\n", vieux->nom);
|
||||||
|
|
||||||
printf("Enfants connus: ");
|
printf("Enfants connus: ");
|
||||||
@ -355,7 +426,7 @@ void dumpDescendenceUntil(struct personnage* vieux, int maxh){
|
|||||||
|
|
||||||
/* 19 */
|
/* 19 */
|
||||||
int estSMoinsGeneration(struct personnage* moi, struct personnage* autre, int limit){
|
int estSMoinsGeneration(struct personnage* moi, struct personnage* autre, int limit){
|
||||||
|
if(moi==NULL || autre==NULL)return 0;
|
||||||
if(limit==0)return 1;// On a fait trop de tours de récursivité ! Forcément une problème.
|
if(limit==0)return 1;// On a fait trop de tours de récursivité ! Forcément une problème.
|
||||||
if(moi->premierEnfant == NULL)return 0;
|
if(moi->premierEnfant == NULL)return 0;
|
||||||
int sexe = moi->premierEnfant->pere != moi;// 1 si femme
|
int sexe = moi->premierEnfant->pere != moi;// 1 si femme
|
||||||
@ -402,6 +473,7 @@ void freeListe(struct personnage* origin){
|
|||||||
struct personnage* ori2 = origin;
|
struct personnage* ori2 = origin;
|
||||||
while(ori2!=NULL){
|
while(ori2!=NULL){
|
||||||
origin = ori2->chaineGlobale;
|
origin = ori2->chaineGlobale;
|
||||||
|
if(ori2->shouldFreeNom)free(ori2->nom);
|
||||||
free(ori2);
|
free(ori2);
|
||||||
ori2 = origin;
|
ori2 = origin;
|
||||||
}
|
}
|
||||||
@ -413,21 +485,21 @@ void freeListe(struct personnage* origin){
|
|||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
|
|
||||||
struct personnage* liste;
|
struct personnage* liste = NULL;
|
||||||
|
|
||||||
liste =
|
|
||||||
addRegistryEntry(NULL ,"Brandon","Jihair","Saoul-Helene");
|
addRegistryEntry(&liste ,"Brandon","Jihair","Saoul-Helene");
|
||||||
addRegistryEntry(liste,"Jessica","Jihair","Saoul-Helene");
|
addRegistryEntry(&liste,"Jessica","Jihair","Saoul-Helene");
|
||||||
//addRegistryEntry(liste,"Jessica","Jihair","Pamella"); // Jessica est déjà enregistrée pourtant ...
|
addRegistryEntry(&liste,"Jennifer","Jihair","Saoul-Helene");
|
||||||
addRegistryEntry(liste,"Jonatan","Huggy","Pamella");
|
addRegistryEntry(&liste,"Jonatan","Huggy","Pamella");
|
||||||
addRegistryEntry(liste,"Brenda","Huggy","Saoul-Helene");
|
addRegistryEntry(&liste,"Brenda","Huggy","Pamella");
|
||||||
addRegistryEntry(liste,"Jennifer","Jihair","Pamella");
|
addRegistryEntry(&liste,"Kevin","Huggy", "Pamella");
|
||||||
addRegistryEntry(liste,"Kevin","Huggy", NULL);
|
addRegistryEntry(&liste,"Jacques",NULL, NULL);
|
||||||
addRegistryEntry(liste,"Jacques",NULL, NULL);
|
addRegistryEntry(&liste,"Valery","Jonathan","Jennifer");
|
||||||
addRegistryEntry(liste,"Valery","Jonathan","Jennifer");
|
addRegistryEntry(&liste,"Georges","Jonathan","Jennifer");
|
||||||
addRegistryEntry(liste,"Georges","Jonathan","Jennifer");
|
addRegistryEntry(&liste,"François","Jonathan","Jessica");
|
||||||
addRegistryEntry(liste,"François","Jonathan","Jessica");
|
addRegistryEntry(&liste,"Charles","Kevin","Jessica");
|
||||||
addRegistryEntry(liste,"Charles","Kevin","Jessica");
|
askRegistryEntry(&liste);
|
||||||
// Entrée rendant la structure incohérente.
|
// Entrée rendant la structure incohérente.
|
||||||
//addRegistryEntry(liste,"Kevin","Charles","Jessica");
|
//addRegistryEntry(liste,"Kevin","Charles","Jessica");
|
||||||
|
|
||||||
@ -442,7 +514,7 @@ int main(){
|
|||||||
printVraiNom(liste->chaineGlobale->chaineGlobale);
|
printVraiNom(liste->chaineGlobale->chaineGlobale);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
dumpAncetres(liste->chaineGlobale->chaineGlobale);
|
dumpAncetres(liste->chaineGlobale->chaineGlobale);
|
||||||
dumpDescendence(getByName(liste, "Jihair"));
|
dumpDescendenceUntil(getByName(liste, "Jihair"),3);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
dumpState(liste);
|
dumpState(liste);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user