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