mercredi 26 novembre 2014

Réalisation d'un programme permettant la création d’un fichier ou répertoire, sa suppression son affichage et sa recherche

INTRODUCTION

               L’objectif de cet article est la réalisation d’un programme ayant pour but  la création d’un fichier ou répertoire, sa suppression son affichage et sa recherche (les mêmes fonctionnalité de poste de travail  de système d’exploitation Windows). 

I- ETAPES DE REALISATION

Etape 1

Le menu général  de ce programme se présente comme suit:

1- Création;
2- Suppression;
3- Affichage;
4- Recherche;
5- Dir ;
6- Renommer ;
8- Quitter.
        

Etape 2

D'abord il y a création de la racine  C par la fonction creation_rac
   
void creation_rac (void)
  {
            rac=(ptr) malloc (sizeof(noeud));
            rac->nom[1]='\x0';
            rac->nom[0]='c';
            rac->type='R';
            rac->fils=NULL;
            rac->classe=NULL
}
  

Etape 3

Le contrôle de l’existence du chemin se fait à l’aide de la fonction extract qui reçoit comme paramètre la racine (frep) et le chemin (gch) qui sera pointé par  l :

            printf("donner le chemin:\n");
            scanf("%s",gch);
            l=&gch[0];
            frep=rac;
            frep=Extract(frep,l);

      

Etape 4

La fonction extract retourne un pointeur qui peut être soit :

1.     Vide dans ce cas le chemin n’existe pas problème de chemin
2.     Un pointeur non vide qui soit vers un fichier soit vers un répertoire avec :
·       un chemin non achevé ce qui implique que ce chemin contient un fichier qui contient autre chose  ce qui représente une contradiction.
·       un chemin  achevé ce qui signifie que le chemin bel et bien existe

            La structure de la  fonction Extract est divisée en trois parties :
3.     le remplissage de la première tranche du chemin dans un chaîne niv  jusqu au /
4.     la recherche de ce nom niv dans un niveau donné ensemble de frère (classe)
5.     la sortie ou l’appel récursive de la fonction Extract.
  
ptr Extract(ptr frep,refch &p)
{
            refch w,l,q,comp;
            char ch[1],pch[20];
            int i,trouve;

            for (i=0;i<20;i++)
                         niv[i]='\x0';
            ch[1]='/';
            i=0;
            w=p;
            while ((*w!='\x0') && (*w!=ch[1]))
              {
                niv[i]=*w;
                w++;
                i++;
              }
            if (*w!='\x0')
              {
                  w++;
                  p=w;
              }
            else
                  p=NULL;

            q=&niv[0];
            trouve=0;
            while ((frep!=NULL)&&(trouve==0))
              {
                comp=q;
                w=&frep->nom[0];
                while ((comp!=NULL)&&(w!=NULL)&&(*w==*q))
                  {
                        comp++;
                        w++;
                  }
                if ((*comp=='\x0')&&(*w=='\x0'))
                        trouve=1;
                else
                        frep=frep->classe;
            }
   if (frep==NULL)
                return frep;
   else
                {
                  if (p==NULL)
                                   return  frep;
                  if (frep->type=='R')
                                   Extract(frep->fils,p);
                          else
                                   return frep ;
                }
 }

   

Etape 5

La création de nouvel élément à laide de la fonction création  qui s’occupe de la réservation de la place mémoire nécessaire au pointeur.

void Creation (ptr &f)
{
       ptr w,p1;
       if (f->type=='R')
             {
                 Saisie_nm_t();
                 p1=(ptr) malloc (sizeof(noeud));
                 strcpy(p1->nom,nm);
                 p1->type=ty;
                 p1->classe=NULL;
                 p1->fils=NULL;
                 if (f->fils!=NULL)
                   {
                          w=f->fils;
                          while (w->classe!=NULL)
                                    w=w->classe;
                          w->classe=p1;

                        }
                 else
                         f->fils=p1;
               }
       else
                 printf("vous ne pouvez pas creer dans un fichier:\n");
}

Etape 6

La fonction  afficher permet d’afficher d’une manière récursive le contenue de l’arborescence.

void Affiche(ptr &P)
 {
    ptr H,G,D;
    int v;

    gotoxy(m,n);
    printf("ÀÄÄÄÄÄ%s",P->nom);

    if (P->fils!=NULL)
            {
               n=n+1;m=m+4;
               G=P->fils;
               H=P;
               Affiche(G);
               H=H->fils->classe;
               while(H!=NULL)
               {
                 n=n+1;
                 D=H;
                 H=D->classe;
                 Affiche(D);
               }
               if(H==NULL)
                        m=m-4;
            }
}

Etape 7

La fonction de suppression est composée essentiellement de deux parties :

**La partie principale suppression : consiste à localiser d’abord le père de l’élément à supprimer, deux cas peuvent alors se présenter
  1. L’élément à supprimer n’existe pas ;
  2. L’élément à supprimer existe, on distingue deus cas et  dans tous les cas il faut appeler la fonction supprimer qui supprime récursivement :
    • Il est le premier du niveau dans ce cas modifier le lien de parenté et le chaînage;
    • Au milieu il faut modifier uniquement le chaînage interne entre les frères du même niveau                   
        
**La  partie secondaire supprimer :
            C’est la suppression et la libéralisation de la place mémoire



void supprimer(noeud* ar)
{
            //printf(" =%s",ar->nom);
            if(ar->fils)
                        supprimer(ar->fils);
            if(ar->classe){
                        supprimer(ar->classe);}
            free (ar);
}




void suppression(ptr P)//P resulat de extract avant voir ref
{

   ptr temp,prec;
   prec=temp=P;
   P=P->fils;


   Saisie_nm_t();
  while(((strcmp(P->nom,nm)!=0)||(P->type!=ty))&&(P!=NULL))
             { prec=P;
              P=P->classe;
              }
   if(P==NULL)

             printf("Le repertoire  ou le fichier <%s>  n'existe pas dans le ce chemin\n",nm);


   else if(prec->fils==P)
              {
                //printf("voulez vous vraiment supprimer le sous arbre (1 si ou)");
                prec->fils=P->classe;
                P->classe=NULL;
                supprimer(P);
              }
             else
              {
                 if(P!=prec)
                           {
                           prec->classe=P->classe;
                           P->classe=NULL;
                           supprimer(P);
                           }
              }
      }

II- ECRAN DE SAISIE

Menu général


Création du fich1 dans c/rep1


Fich11 : un fichier a créer


Affichage


Suppression de fich11 qui un fichier 


Affichage on remarque bien que le fichier est supprimé


Affichage du contenu de c


Dir


Recherche du fiche234 qui  n’existe pas (voir affichage de C)


Recherche du fich1131 qui existe (voir affichage de C)


Renommer


Renommer: rep113 en REP111