diff --git a/C12.2.c b/C12.2.c index cae8fe0..5a6b6b1 100644 --- a/C12.2.c +++ b/C12.2.c @@ -227,7 +227,7 @@ struct personnage* askRegistryEntry(struct personnage** liste){ /* 13 */ void paspapa(struct personnage* batard){ - if(batard==NULL)return;// On n'enleve aucun lien + if(batard==NULL || batard->pere==NULL)return;// On n'enleve aucun lien if(batard->frereSuivantPapa != batard){ if(batard->pere->premierEnfant == batard)batard->pere->premierEnfant = batard->frereSuivantPapa; struct personnage* fraterie = batard; @@ -245,7 +245,7 @@ void paspapa(struct personnage* batard){ /* 14 */ void pasmaman(struct personnage* batard){ - if(batard==NULL)return; + if(batard==NULL || batard->mere==NULL)return; if(batard->frereSuivantMaman != batard){ if(batard->mere->premierEnfant == batard)batard->mere->premierEnfant = batard->frereSuivantMaman; struct personnage* fraterie = batard; @@ -290,9 +290,11 @@ struct personnage* removePremierNom(struct personnage** lliste){ return act; } -struct personnage* orderPersos(struct personnage* liste){ +void orderPersos(struct personnage** listeP){ - if(liste==NULL)return NULL; + struct personnage* liste = *listeP; + + if(liste==NULL)return; struct personnage* newList = removePremierNom(&liste); struct personnage* lastAdded = newList; @@ -302,7 +304,7 @@ struct personnage* orderPersos(struct personnage* liste){ lastAdded = toAdd; } - return newList; + *listeP = newList; } // Je ne comprends pas la deuxième partie de la question ... @@ -483,24 +485,25 @@ void freeListe(struct personnage* origin){ ///// Main pour les tests - +void loadTestRegistry(struct personnage** liste){ + addRegistryEntry(liste ,"Brandon","Jihair","Saoul-Helene"); + addRegistryEntry(liste,"Jessica","Jihair","Saoul-Helene"); + addRegistryEntry(liste,"Jennifer","Jihair","Saoul-Helene"); + addRegistryEntry(liste,"Jonatan","Huggy","Pamella"); + addRegistryEntry(liste,"Brenda","Huggy","Pamella"); + addRegistryEntry(liste,"Kevin","Huggy", "Pamella"); + addRegistryEntry(liste,"Jacques",NULL, NULL); + addRegistryEntry(liste,"Valery","Jonathan","Jennifer"); + addRegistryEntry(liste,"Georges","Jonathan","Jennifer"); + addRegistryEntry(liste,"François","Jonathan","Jessica"); + addRegistryEntry(liste,"Charles","Kevin","Jessica"); +} int mainTests(){ struct personnage* liste = NULL; + loadTestRegistry(&liste); - addRegistryEntry(&liste ,"Brandon","Jihair","Saoul-Helene"); - addRegistryEntry(&liste,"Jessica","Jihair","Saoul-Helene"); - addRegistryEntry(&liste,"Jennifer","Jihair","Saoul-Helene"); - addRegistryEntry(&liste,"Jonatan","Huggy","Pamella"); - addRegistryEntry(&liste,"Brenda","Huggy","Pamella"); - addRegistryEntry(&liste,"Kevin","Huggy", "Pamella"); - addRegistryEntry(&liste,"Jacques",NULL, NULL); - addRegistryEntry(&liste,"Valery","Jonathan","Jennifer"); - addRegistryEntry(&liste,"Georges","Jonathan","Jennifer"); - addRegistryEntry(&liste,"François","Jonathan","Jessica"); - addRegistryEntry(&liste,"Charles","Kevin","Jessica"); - askRegistryEntry(&liste); // Entrée rendant la structure incohérente. //addRegistryEntry(liste,"Kevin","Charles","Jessica"); @@ -510,7 +513,7 @@ int mainTests(){ } dumpState(liste); - liste = orderPersos(liste); + orderPersos(&liste); printVraiNom(liste->chaineGlobale->chaineGlobale); printf("\n"); @@ -526,16 +529,8 @@ int mainTests(){ return 0; } -int main(){ - - struct personnage* liste = NULL; - char c; - char p1[NameLength+1], p2[NameLength+1]; - char* newName; - int p3; - // Bon, j'ai mal lu le sujet, j'ai fait des matrices rectangulaires ... - - printf("Bienvenue sur l'interface pour regarder votre série préférée.\n"); +void printHelp(){ + printf("Bienvenue sur l'interface pour regarder votre série préférée.\n"); printf("'n $nom' pour ajouter un personnage;\n"); printf("'p $père' déclare un nouvel enfant à son père;\n"); printf("'m $mère' déclare un nouvel enfant à sa mère;\n"); @@ -550,16 +545,30 @@ int main(){ printf("'d $nom' affiche les déscendants d'une génération donnée d'un personnage\n"); printf("'D $nom' affiche les déscendants jusqu'à une génération donnée d'un personnage;\n"); printf("'x' vérifie la cohérence du graphe généalogique.;\n"); - printf("'q' pour quitter\n"); + printf("'l' charge les données de la fiche;\n"); + printf("'h' pour réavoir ce message;\n"); + printf("'q' pour quitter (vous ne vous amusez pas ?)\n"); +} + +int main(){ + struct personnage* liste = NULL; + char c; + char p1[NameLength+1], p2[NameLength+1]; + struct personnage *pp1, *pp2; + char* newName; + int pg; + + printHelp(); + while(1){ printf("Commande ? "); c = getchar(); - getchar();// On bouffe l'espace + getchar();// On bouffe l'espace ou le retour à la ligne switch(c){ case 'n': - scanf(NameLengthScanf, p1); + scanf(NameLengthScanf, p1);getchar(); p1[NameLength] = '\0'; newName = malloc((strlen(p1)+1)*sizeof(char)); if(newName==NULL) @@ -571,11 +580,205 @@ int main(){ printf("Le personnage %s a été créé.\n", newName); break; + case 'p': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + printf("Qui a la chance d'avoir %s comme papa ? ", p1); + scanf(NameLengthScanf, p2);getchar(); + p2[NameLength] = '\0'; + pp2 = getByName(liste, p2); + if(pp2==NULL){ + printf("Personnne ne répond au nom de %s\n", p2); + break; + } + + + + papounet(pp1, pp2); + printf("%s est l'heureux papounet de %s !\n", p1, p2); + + break; + case 'm': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + printf("Qui a la chance d'avoir %s comme maman ? ", p1); + scanf(NameLengthScanf, p2);getchar(); + p2[NameLength] = '\0'; + pp2 = getByName(liste, p2); + if(pp2==NULL){ + printf("Personnne ne répond au nom de %s\n", p2); + break; + } + + + + mamounette(pp1, pp2); + printf("%s est l'heureuse mamounette de %s !\n", p1, p2); + + break; + case 'c': + dumpState(liste); + break; + case 'e': + askRegistryEntry(&liste); + break; + case 'P': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + + paspapa(pp1); + printf("%s est maintenant orphelin de son pére (vous êtes un monstre).\n", p1); + + break; + + case 'M': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + + pasmaman(pp1); + printf("%s est maintenant orphelin de sa mère (vous êtes un monstre).\n", p1); + + break; + + case 'o': + orderPersos(&liste); + printf("La liste des personnages a été triée.\n"); + break; + + case 'v': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + + printVraiNom(pp1); + printf("\n"); + + break; + case 'a': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + printf("Vous voulez quelle génération ? "); + scanf("%d", &pg);getchar(); + if(pg<0){ + printf("Ce n'est pas un numéro de génération valide\n"); + break; + } + + printf("Ancetres de génération %d : ",pg); + printNthGP(pp1, pg, 0); + printf("\n"); + break; + case 'A': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + + dumpAncetres(pp1); + + + break; + + case 'd': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + printf("Vous voulez quelle génération ? "); + scanf("%d", &pg);getchar(); + pg++; + if(pg<=0){ + printf("Ce n'est pas un numéro de génération valide\n"); + break; + } + + printf("Ses décendants de génération %d sont : ", pg); + dumpNthDescendents(pp1, pg); + printf("\n"); + + break; + case 'D': + scanf(NameLengthScanf, p1);getchar(); + p1[NameLength] = '\0'; + + pp1 = getByName(liste, p1); + if(pp1==NULL){ + printf("Personnne ne répond au nom de %s\n", p1); + break; + } + printf("Vous voulez jusqu'à quelle génération ? "); + scanf("%d", &pg);getchar(); + pg++; + if(pg<=0){ + printf("Ce n'est pas un numéro de génération valide\n"); + break; + } + + + dumpDescendenceUntil(pp1, pg); + break; + + + case 'x': + if(yatilPbGenealogique(liste)) + printf("Il y a un problème dans cet arbre ...\n"); + else + printf("Aucun problème de généalogie détéctée.\n"); + break; + case 'l': + loadTestRegistry(&liste); + printf("La liste par défaut a été chargée.\n"); + break; + case 'h': + printHelp(); + break; case 'q': goto fend; } - getchar(); } diff --git a/C13.1.c b/C13.1.c new file mode 100644 index 0000000..0a9351a --- /dev/null +++ b/C13.1.c @@ -0,0 +1,30 @@ +#include + +typedef int longueur; +typedef int masse; + +typedef int** test; +#define tset int** + +int main(){ + + + int a=2; + int *aa=&a; + int **aaa = &aa; // aaa est un test + + test *pouf1, pif1; + tset *pouf2, pif2; + + pouf1 = &aaa; + pif1 = aaa; + pouf2 = &aaa; + pif2 = a; + + printf("%d %d %d %d", ***pouf1, ***pouf2, **pif1, pif2); + + longueur l; + printf("Quelle longueur ? "); + scanf("%u", &l); + printf("%d, c'est un excellent choix !\n",l); +} diff --git a/C13.3.c b/C13.3.c new file mode 100644 index 0000000..b3df906 --- /dev/null +++ b/C13.3.c @@ -0,0 +1,73 @@ +#include + +enum NIVEAU {TRES_FACILE, FACILE, DIFFICILE, TRES_DIFFICILE, EXPERT, INDEFINI}; + +enum NIVEAU demanderNiveau(){ + char choix; + printf("Bienvenue au Koikecélenombre !\n" + "Sélectionnez votre NIVEAU (je ne comprends pas le SNAKE_CASE)\n" + "1: très facile\n" + "2: facile\n" + "3: difficile\n" + "4: très difficile\n" + "5: expert\n" + "q: quitter l'application\n" + "Votre choix : "); + scanf("%c", &choix);getchar(); + switch(choix){ + case '1': + return TRES_FACILE; + case '2': + return FACILE; + case '3': + return DIFFICILE; + case '4': + return TRES_DIFFICILE; + case '5': + return EXPERT; + default: + return INDEFINI; + } + +} + +int main() { + int nmax; + int ndevine; + int nprop; + + enum NIVEAU niv; + while(1){ + niv = demanderNiveau(); + switch(niv){ + case TRES_FACILE: + nmax=10;break; + case FACILE: + nmax=20;break; + case DIFFICILE: + nmax=50;break; + case TRES_DIFFICILE: + nmax=100;break; + case EXPERT: + nmax=500;break; + default: + return 0; + } + do{ + printf("Ami, donnez votre nombre : "); + scanf("%d", &ndevine); + }while(nmaxndevine); + + //for(int i=0; i<420; i++){printf("\n");} + nprop=0; + printf("\033[2JMaintenant, joueur, faites vos propositions.\n"); + for(int j=1; nprop!=ndevine; j++){ + printf("Je pense que c'est le "); + scanf("%d", &nprop); + if(nprop + + + +union monu +{ + unsigned char a[2]; + float b; + long long int c; +}; + +// Si on essaie d'accéder à un autre champ que celui initialisé, alors la valeur sera simplement lue mais sous l'œil de la variable +// demandée. Ici, le programme affiche la valeur 0.42e-3 convertie en binaire puis reconverti en entier (plus des octets arbitraires «non initialisés» puisquqe long long int est plus grand que float) + +// La taille de l'union est, comme attendu, le max de la taille de ses composantes. +// Ici, sizeof(union monu)=sizeof(long long int)=8 octets. + +int main(){ + union monu v = {}; + + v.b = 0.42e-3; + + printf("%lld\n", v.c); + printf("%ld\n", sizeof(union monu)); +} diff --git a/C13.5.c b/C13.5.c new file mode 100644 index 0000000..5e78295 --- /dev/null +++ b/C13.5.c @@ -0,0 +1,181 @@ + +#include +#include +#include + +#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){// 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