Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by Jean-Pierre ( 3 years ago )
#include <stdio.h>
#include<stdarg.h>
#include<string.h>

#define MAX_CAR 200
#define AUDEBUT 3
#define ALAFIN  4
#define AUMILIEU 5

int QTDEBUG= 1;
char *fich= "toto.titi";

//char *qtchoix= "124653S0"; // test des fonction 1, 2, 3, 4 (5 et 6 sut QT)
char *qtchoix= "R0"; // test des fonction 0, 1, 2, 3, 4 (5 et 6 sut QT)


typedef struct Livres Livres;
struct Livres
{
    char *titre, *auteur;
    unsigned int annee;
    Livres *suiv, *prec;
};

Livres *initListe(Livres *, char *, char *, unsigned int );
Livres *ajoutFin(Livres *, Livres *, char *, char *, unsigned int );
void saisie(char *, char *, unsigned int *, int);
Livres *ajoutOrd(Livres *, Livres *, char *, char *, unsigned int);

int lectureEnr(FILE *, char *, char *, unsigned *);

void videBuf(void);

int main(int argc, char *argv[])
{    
    int l_exist= 0, qti=0;
    unsigned int annee;
    char choix, titre[MAX_CAR], auteur[MAX_CAR], buf[MAX_CAR];
    Livres *livre, *ptr, *ptrPrec;
    FILE *desc;

    printf("\n argc %d\n", argc);


    if(argc < 2)
    {
        printf("Définition de QTDEBUG");
        QTDEBUG= 1;

    }
    else
    {
        printf("Suppression de la définition de QTDEBUG");
        QTDEBUG= 0;
    }

    do
    {
        printf("\n0 - Sortir\n");
        printf("1 - Initialisation\n");
        printf("2 - Ajout\n");
        printf("3 - Lister\n");
        printf("4 - Ajout Alphabétique\n");
        printf("S - Sauvegarde dans le fichier toto.titi\n");
        printf("R - Récupération dans le fichier toto.titi\n");

        if(!QTDEBUG)
        {
            //choix= getchar();
            scanf("%c", &choix);
            //getchar();
        }
        else
        {
            choix= qtchoix[qti++];
            //printf("\n------->Choix= %c - ", choix);
            //printf(" qti= %d -", qti);
            //printf(" qtchoix %s -", qtchoix);
            //printf(" qtchoix[qti] %c\n", qtchoix[qti]);
        }

        switch(choix)
        {
            case '0':
                printf("\n----------- Exit ------------\n");
            break;

            case '1':
                printf("\n----------- Initialisation de la liste ------------\n");
                if(!l_exist)
                {
                    l_exist= 1;

                    saisie(auteur, titre, &annee, 1);

                    livre= initListe(livre, auteur, titre, annee);

                }
                else
                {
                    printf("\nERREUR LA LISTE EXISTE DEJA\n");
                }

            break;

            case '2':
                printf("\n----------- Ajout en fin de liste ------------\n");
                if(l_exist)
                {

                    saisie(auteur, titre, &annee, 2);

                    for(ptr= livre; ptr!= NULL; ptr= ptr->suiv)
                    {
                        //printf("\n-----> Recherche fin de liste: ptr= %p, ptr->suiv= %p", ptr, ptr->suiv);
                        ptrPrec= ptr;
                    }

                    ptr= ajoutFin(ptr, ptrPrec, auteur, titre, annee);

                }

                else
                {
                    printf("ERREUR LA LISTE DOIT ETRE INITIALISEE....\n");
                }
            break;

            case '3':
                printf("\n----------- Liste des Livres ------------\n");
                if(l_exist)
                {

                    ptr= livre;
                    do
                    {
                        printf("--------\nAuteur %s\n", ptr->auteur);
                        printf("Titre : %s\n", ptr->titre);
                        printf("Annee : %u\n", ptr->annee);

                        printf("Pointeur : %p\n", ptr);
                        printf("Precedent : %p\n", ptr->prec);
                        printf("Suivant : %p\n", ptr->suiv);

                        ptr= ptr->suiv;
                    }while(ptr!= NULL);
                }
                else
                {
                    printf("Rien encore à lister....\n");
                }

                break;

            case '4':
                printf("\n----------- Ajout ordre alphabétique au debut ------------\n");
                if(l_exist)
                {
                    //printf("Avant appel origin= %p, livre= %p", livre);
                    saisie(auteur, titre, &annee, AUDEBUT);
                    livre= ajoutOrd(livre, ptr, auteur, titre, annee);
                    //printf("\nAprés appel origin= %p, livre= %p", livre);
                }

                else
                {
                    printf("ERREUR LA LISTE DOIT ETRE INITIALISEE....\n");
                }

            break;

            case '5': // Ne sert qu'au test sous QTeditor
                printf("\n----------- Ajout ordre alphabétique au milieu ------------\n");
                if(l_exist)
                {
                    saisie(auteur, titre, &annee, AUMILIEU);
                    livre= ajoutOrd(livre, ptr, auteur, titre, annee);
                }

                else
                {
                    printf("ERREUR LA LISTE DOIT ETRE INITIALISEE....\n");
                }

            break;

            case '6':  // Ne sert qu'au test sous QTeditor
                printf("\n----------- Ajout ordre alphabétique à la fin------------\n");
                if(l_exist)
                {
                    saisie(auteur, titre, &annee, ALAFIN);
                    livre= ajoutOrd(livre, ptr, auteur, titre, annee);
                }

                else
                {
                    printf("ERREUR LA LISTE DOIT ETRE INITIALISEE....\n");
                }

            break;

            case 'S':
                printf("\n----------- Sauvegarde dans un fichier ------------\n");
                if(l_exist)
                {
                    if( (desc= fopen(fich, "w+"))!= NULL)
                    {
                        for(Livres *p= livre; p!= NULL; p= p->suiv)
                        {
                            //printf("boucle for... %s\n%s\n%u\n%p\n%p\n",p->auteur, p->titre, p->annee,p->suiv,p->prec);
                            fprintf(desc, "%s\n%s\n%u\n%p\n%p\n",p->auteur, p->titre, p->annee, p->suiv, p->prec);
                        }
                        fclose(desc);
                    }
                    else printf("\nERREUR OUVERTURE DU FICHIER\n");
                }

                else
                {
                    printf("ERREUR LA LISTE DOIT ETRE NON VIDE....\n");
                }

            break;

            case 'R':
                printf("\n----------- Recharge depuis un fichier ------------\n");
                if(!l_exist)
                {
                    if( (desc= fopen(fich, "r"))!= NULL)
                    {
                        if(lectureEnr(desc, auteur, titre, &annee)== -1)
                        {
                            printf("\nPLANTAGE LECTURE ENREGISTREMENT");
                            return -1;
                        }
                        printf("\nboucle for... \n%s\n%s\n%u\n%p\n%p\n",auteur, titre, annee);

                        while(!feof(desc) )
                        {
                            if(lectureEnr(desc, auteur, titre, &annee)== -1)
                            {
                                printf("\nPLANTAGE LECTURE ENREGISTREMENT");
                                return -1;
                            }
                            printf("\nboucle for dans le while... \n%s\n%s\n%u\n%p\n%p\n",auteur, titre, annee);

                        }
                        //livre= initListe(livre, auteur, titre, annee);

                        //ptrPrec= livre;
                        //ptr= NULL;
                        fclose(desc);
                    }
                    else printf("\nERREUR OUVERTURE DU FICHIER\n");
                }

                else
                {
                    printf("ERREUR LA LISTE PRESENTE EN MEMOIRE DOIT ETRE SUPPRIMEE AVANT ....\n");
                }

            break;

            case '\n':
                printf("\n----------- '\\n' ------------\n");
            break;

            default:
                printf("\n------------ La commande '%c' est inconnue --------------\n", choix);
            }


    }while(choix != '0');

    //printf("\n--------> annee de liv %u", livre->annee);
    //printf("\n--------> auteur de liv %s", livre->auteur);
    //printf("\n--------> titre de liv %s", livre->titre);
    //printf("\n--------> suiv %p", livre->suiv);
    //printf("\n--------> prec %p\n", livre->prec);

    return 0;
}

int lectureEnr(FILE *d, char *aut, char *tit, unsigned *an)
{
    char buf[MAX_CAR];

    if(feof(d))
    {
        return 1;
    }
    if( fgets(aut, MAX_CAR, d) == NULL)
    {
        printf("\nERREUR LECTURE FICHIER aut\n");
        return -1;
    }
    if( fgets(tit, MAX_CAR, d) == NULL)
    {
        printf("\nERREUR LECTURE FICHIER tit\n");
        return -1;
    }
    if( fgets(buf, MAX_CAR, d) == NULL)
    {
        printf("\nERREUR LECTURE FICHIER buf an\n");
        return -1;
    }
    else
    {
        sscanf(buf,"%u", an);
    }
    if( fgets(buf, MAX_CAR, d) == NULL) // On vide les pointeur enregistrées
    {
        printf("\nERREUR LECTURE FICHIER buf psuiv\n");
        return -1;
    }
    if( fgets(buf, MAX_CAR, d) == NULL)// On vide les pointeur enregistrées
    {
        printf("\nERREUR LECTURE FICHIER buf pprec\n");
        return -1;
    }

    return 1;

}

Livres *initListe(Livres *liv, char *aut, char *tit, unsigned int an)
{
    //printf("\nAuteur : %s", aut);
    //printf("\nTitre : %s", tit);
    //printf("\nAnnee : %u", an);

    //printf("\nsizeof(Livres) %u", sizeof(Livres));

    liv= (Livres *)malloc(sizeof(Livres));
    //printf("\nsizeof(liv) %u", sizeof(liv));


    liv->suiv= NULL;
    liv->prec= NULL;

    liv->auteur= (char *)malloc(sizeof(char) * strlen(aut));
    strcpy(liv->auteur, aut);

    liv->titre= (char *)malloc(sizeof(char) * strlen(tit));
    strcpy(liv->titre, tit);

    liv->annee= an;

    //printf("\nliv.annee %u", liv->annee);
    //printf("\nliv.aute %s", liv->auteur);

    return liv;
}

Livres *ajoutFin(Livres *liv, Livres *livP,char *aut, char *tit, unsigned int an)
{
    liv= initListe(liv, aut, tit, an);
    livP->suiv= liv;
    liv->prec= livP;
    liv->suiv= NULL;
    return liv;
}

Livres *ajoutOrd(Livres *livDebut, Livres *livAIns, char *aut, char *tit, unsigned int an)
{
    Livres *ptr, *precedent;
    livAIns= initListe(livAIns, aut, tit, an);

    for(ptr= precedent= livDebut; ptr; ptr= ptr->suiv)
    {
        int comp= strcmp(ptr->titre, livAIns->titre);
        printf("\n On compare '%s' et '%s' résultat de la comparaison %d", ptr->titre, livAIns->titre, comp);
        if(comp>0)
        {
            printf("\nOn doit ajouter avant !");
            if(ptr->prec== NULL)
            {
                printf("\nOn doit ajouter avant Le premier élément!");
                livAIns->prec= NULL; // C'est maintenant le 1er élément de la liste
                livAIns->suiv= ptr;

                ptr->prec= livAIns;

                livDebut= livAIns; // On change l'origine

            }
            else // On ajoute au milieu de 2 éléments
            {
                printf("On ajoute entre 2 éléments");
            }

            break;
        }
        else if(ptr->suiv== NULL) // On est arrivé en fin de liste, on ajoute ici
        {
            Livres *tmp;
            printf("\nOn doit ajouter à la fin de la liste");
            tmp= ajoutFin(tmp, ptr, aut, tit, an);
            ptr->suiv= tmp;
            tmp->prec= ptr;
            //printf("\n----> tmp->titre: %s", tmp->titre);
            //printf("\n----> precedent->titre: %s", precedent->titre);
            //printf("\n----> ptr->titre: %s", ptr->titre);

            break;
        }
        // Sinon on continue de rechercher la place de l'élément à insérer
        precedent= ptr; // On sauvegarde l'élément précédent
    }

    return livDebut;
}

void saisie(char *aut, char *tit, unsigned int *an, int n)
{
    if(!QTDEBUG)
    {
        videBuf();
        printf("Auteur ?: ");
        fgets(aut, MAX_CAR, stdin);

        //videBuf();
        printf("\nTitre ?: ");
        fgets(tit, MAX_CAR, stdin);

        printf("\nAnnée ?: ");
        scanf("%u", an);
    }
    else
    {
        if(n==1)
        {
            strcpy(tit,"Je n'ai pas le choix");
            strcpy(aut,"Moi même");
            *an= 1965;
        }
        else if(n== 2)
        {
            strcpy(tit,"L'ajout en fin de liste");
            strcpy(aut,"JP Maffre");
            *an= 2023;
        }

        else if(n== AUDEBUT)
        {
            strcpy(tit,"A la claire fontaine !");
            strcpy(aut,"Jesais plus");
            *an= 1950;
        }
        else if(n== ALAFIN)
        {
            strcpy(tit,"Zezette épouse X !");
            strcpy(aut,"Zézette");
            *an= 1975;
        }

        else if(n== AUMILIEU)
        {
            strcpy(tit,"Ici et maintenant !");
            strcpy(aut,"Jean Neymar");
            *an= 2023;
        }

        else
        {
            strcpy(tit,"Y en à plus !");
            strcpy(aut,"Jean Peuplus");
            *an= 2023;
        }


    }

}

void videBuf(void)
{
    char c= 0;

    while( (c!= '\n') && (c!= EOF) )
    {
        c= getchar();
    }

}

 

Revise this Paste

Your Name: Code Language: