IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Automate fini non déterministe


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    FACULTé
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : FACULTé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Automate fini non déterministe
    Bonjour ;
    je dois ecrire un programme en c qui permet de implementer une automate fini non deterministe mais avec les structures de données !!!
    mercii d'avance

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Points : 718
    Points
    718
    Par défaut
    Bon courage.

    Où est votre code ?

  3. #3
    Futur Membre du Club
    Femme Profil pro
    FACULTé
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : FACULTé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Bayard Voir le message
    Bon courage.

    Où est votre code ?
    salut;
    le probleme c'est on doit utilisé les structures de données voici la structure donnée par le prof :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct etat{
                                              int e;//e est le numero de etat enter 
                                              etat*next;//pointeur vers l'etat suivante
                                              };
                                          etat*tr[][];//un tableau de pointeur sur la structure
    par exemple tr[0][0].e = 1
    tr[0][0].e = 2

    voici ce que j'ai fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    liste construire()
    {
            char condition1 [4],condition2 [4];
            etat* T=NULL;
    		int l=0;
    		int netats, nfinales,nsymboles;
         int f[10];
         int i,j;
         printf("enter le nombre des etats \n");
         scanf("%d",&netats);
         printf("enter le nombre des symboles \n");
         scanf("%d",&nsymboles);
         printf("\nenter les symbols\t");
     
         for(i=0; i<nsymboles; i++) 
         {
               printf("\n\n %d \t", i+1);
               printf("%c",c[i]=getch());
         }
     
         printf("\n\nenter le number des etats finaux\t");
         scanf("%d",&nfinales);
     
         for(i=0;i<nfinales;i++)
         {
              printf("\n\netat final %d : ",i+1);
              scanf("%d",&f[i]);
         }
     
         printf("-----------------------------------------------------------------------");
         printf("\n\ndefine transition rule as (initial state, input symbol ) = final state\n");
         tr=(int **) malloc(nsymboles*sizeof(int*)); 
         for (i=0; i<nsymboles; i++) 
          tr[i]=(int *) malloc(netats*sizeof(int)); 
       do{
         for(i=0; i<nsymboles; i++)
        {
              for(j=0; j<netats; j++){
                        while(l=0);
                   {printf("\n donner un etat");
                   scanf("%d",(tr[i][j])->e));
                     if(tr[i][j]->e==-1) return 0;
                   tr[i][j]->next=*T;
                   *T=tr[i][j];
                   printf("Voulez vous ajouter d'autres etats pour cette transition ? (oui/non)\n");
    			   scanf("%s",condition1);
    		    	l=strcmp(condition1,"non");
    		    }
        }}
              while(l=0);      
        for(i=0; i<nsymboles; i++)
              for(j=0; j<netats; j++)
                      tr[i][j]=T;
               do
    			{
          for(i=0; i<nsymboles; i++)
           {
              for(j=0; j<netats; j++)
                   {printf("\n(%d , %c ) = ",j,c[i]);
                   scanf("%d",tr[i][j]->e);
    			   tr[i][j]=tr[i][j]->next;
    				if ((next==NULL)||(tr[i][j] !=next->T)) l=1;
    				else l=0;
    			    }}}
    			while ((tr[i][j]!= 0) &&  l!=0);
    			return (liste)T;}}}
    int main()
    {
        char rep[3];
    			int finale[1],i,nb;
    			//liste k=construire();
    			do
    			{
                      liste k=construire();
     
    	         }
    		while(strcmp(rep,"non")!=0);
    			return 0;
    }

  4. #4
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Points : 718
    Points
    718
    Par défaut
    1) J'ai vu des malloc mais je n'ai pas vu de free. Il faut prévoir cela même si c'est dans une fonction à part.

    2) Si le prof demande d'utiliser cette structure, il ne demande pas forcément de l'utiliser avec une gestion dynamique de mémoire (malloc).
    Pourquoi ne pas avoir un tableau en dur (const) qui contienne les états ?
    Cela s'appelle de la gestion statique de mémoire.
    Ce serait beaucoup plus simple. Ensuite faire des fonctions qui utilisent ce tableau de structure est assez facile...

  5. #5
    Futur Membre du Club
    Femme Profil pro
    FACULTé
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : FACULTé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Salut, premièrement merci de votre réponse
    bon j'ai essayé de changer un peu algorithme mais toujours il y a des problèmes dans cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {printf("\n donner un etat");
                   scanf("%d",&((tr[i][j])->e));
                    // if(tr[i][j]->e==-1) return 0;
                     ((tr[i][j]))->next=*T;
                     *T=tr[i][j]
    voici tout le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    #include<stddef.h>
    #include<string.h>
    #include<stdlib.h>
    char c[10];
    struct etat
    {
       int e;
       struct etat* next;
    };
    typedef struct etat etat;
     
    typedef etat* liste;   
     
      void  construire(liste *T)
    {
            char condition1 [4],condition2 [4];
            //etat* T=NULL;
    		int l=0;
    		int netats, nfinales,nsymboles;
    		etat*tr[10][10];
         int f[10];
         int i,j;
        // int tr[10][10];
         printf("enter le nombre des etats \n");
         scanf("%d",&netats);
         printf("enter le nombre des symboles \n");
         scanf("%d",&nsymboles);
         printf("\nenter les symbols\t");
     
         for(i=0; i<nsymboles; i++) 
         {
               printf("\n\n %d \t", i+1);
               printf("%c",c[i]=getch());
         }
     
         printf("\n\nenter le number des etats finaux\t");
         scanf("%d",&nfinales);
     
         for(i=0;i<nfinales;i++)
         {
              printf("\n\netat final %d : ",i+1);
              scanf("%d",&f[i]);
         }
     
         printf("-----------------------------------------------------------------------");
         printf("\n\ndefine transition rule as (initial state, input symbol ) = final state\n");
     
         for(i=0; i<nsymboles; i++)
        {
              for(j=0; j<netats; j++){
                      { printf("donner les etats:");
                       scanf("%d",&tr[i][j]);}}
         for(i=0; i<nsymboles; i++)
        {
              for(j=0; j<netats; j++){  
                        while(l=0);
                   {printf("\n donner un etat");
                   scanf("%d",&((tr[i][j])->e));
                    // if(tr[i][j]->e==-1) return 0;
                     ((tr[i][j]))->next=*T;
                     *T=tr[i][j];
                   printf("Voulez vous ajouter d'autres etats pour cette transition ? (oui/non)\n");
    			   scanf("%s",condition1);
    		    	l=strcmp(condition1,"non");
    		    }
        }}
              while(l=0);  }    }
       /* for(i=0; i<nsymboles; i++)
              for(j=0; j<netats; j++)
                      tr[i][j]=T;
               do
    			{
          for(i=0; i<nsymboles; i++)
           {
              for(j=0; j<netats; j++)
                   {printf("\n(%d , %c ) = ",j,c[i]);
                   scanf("%d",tr[i][j]->e);
    			   tr[i][j]=tr[i][j]->next;
    			    }}}
    			while ((tr[i][j]!= 0) &&  l!=0);
    			return (liste)T;}}*/
    int main()
    {
        char rep[3];
    			int finale[1],i,nb;
    			//liste k=construire();
    			liste T=NULL;
    			do
    			{
                      construire(&T);
     
    	         }
    		while(strcmp(rep,"non")!=0);
    			return 0;
    }

  6. #6
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Points : 718
    Points
    718
    Par défaut
    1) Ma remarque 2 n'est pas prise en compte, il n'y a pas de tableaux de structure en dur (const).

    2)La variable
    est une variable locale. Elle sera donc perdue en sortant de la fonction.
    Donc tout pointeur qui y réfère sera cassé.

    3) S'il y a un tableaux structure déjà construit "en dur" (const), il n'y a pas besoin de fonction qui s'appelle construire.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ça me paraît bizarre de gérer les états par une liste chaînée, surtout avec un tableau 2D de pointeurs pour les transitions.

    Pour moi, dans un AFN, on gérerait plutôt un tableau fixe d'états, et un tableau de Booléens pour chaque transition (et donc, un tableau 2D de Booléens pour la liste de transitions un tableau 3D de Booléens pour chaque transition vu qu'il y a NB_ETATS*NB_SYMBOLES transitions).

  8. #8
    Futur Membre du Club
    Femme Profil pro
    FACULTé
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : FACULTé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Salut,
    merci pour les remarques ,mais je vais essayer les listes chainées multiple voici les structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct etat{
                      int e;
                      char s;
                      etat*next;
                      EA*suivant;
                      };
    struct EA{
                 int ea;
                 EA * suivant;
                 };
    si vous avez des remarques n'hésitez pas pour m'aider à résoudre ce problème
    cordialement .

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Que signifie "EA" ?

  10. #10
    Futur Membre du Club
    Femme Profil pro
    FACULTé
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : FACULTé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Que signifie "EA" ?
    EA est une structure des états arrivés pour que structure etat qui contient etat et le symbole pointe sur une liste des etats arrive par exemple :
    [1|a|.]-->[1|.]->[2|.]->null et ainsi de suite

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Si ta structure contient un état et un symbole, elle devrait s'appeler transition, pas etat.

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yonna Voir le message
    merci pour les remarques ,mais je vais essayer les listes chainées multiple
    Bonjour

    Je sens que c'est pas super maitrisé...

    Citation Envoyé par yonna Voir le message
    voici la structure donnée par le prof :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct etat{
                                              int e;//e est le numero de etat enter 
                                              etat*next;//pointeur vers l'etat suivante
                                              };
                                          etat*tr[][];//un tableau de pointeur sur la structure
    Ca m'étonnerait qu'un prof ait pu pondre ça. Ou alors c'était un prof de chimie, physique, français, maths, histoire, sport, biologie, bref tout sauf de C. Déjà d'une part parce que "etat" ce n'est pas un nom de type donc "etat*next" ça ne compilera pas (faudrait écrire struct etat *next) et un tableau de pointeurs n'a pas besoin d'être en deux dimensions (et cette ligne non plus ne compilera pas). Et je vois mal un prof conseiller une variable globale... et en plus avec un nom aussi peu représentatif !!!

    Citation Envoyé par yonna Voir le message
    voici les structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct etat{
                      int e;
                      char s;
                      etat*next;
                      EA*suivant;
                      };
    struct EA{
                 int ea;
                 EA * suivant;
                 };
    si vous avez des remarques n'hésitez pas pour m'aider à résoudre ce problème
    Ben déjà, en dehors du problème de syntaxe, le compilo ne peut pas connaitre "EA*suivant" si la structure EA n'a pas été déclarée .
    Ensuite si tu veux être à l'aise il te faut commencer par être méthodique et rigoureux et poser les bases avec des noms appropriés et ne pas mettre des noms comme "ea" d'un coté et "EA" de l'autre ou "next" d'un coté et "suivant" de l'autre (super la relecture !!!).
    Donc déjà les noms tout en majuscules sont réservés aux macros. Ensuite, une structure se préfixe par un "s_" et un type par un "t_". Et certains vont même jusqu'à préfixer leurs pointeur par autant de "p" qu'il y a d'étoile (char ***pppTruc) mais bon perso je ne le fais pas donc je ne peux pas te dire de le faire...

    Ainsi, tes structures pourraient être
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct s_etatFini {
        int valeur;
        struct s_etatFini *next;
    } t_etatFini;
     
    typedef struct s_transition {
        int valeur;
        char symbole;
        struct s_transition *next;
        t_etatFini *etat;
    } t_transition;

    Maintenant tu as maintenant deux beaux types "t_etatFini" et "t_transition" disponibles pour tes variables "etatFini" et "transition" si tu as envie de les nommer ainsi. Ensuite donc poser tes algos, faire des dessins de tes listes sur papier, schématiser l'insertion et la suppression puis une fois tout ça bien carré, le découpage de ton code en fonctions te viendra bien plus facilement...

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/12/2013, 11h24
  2. Transformer un automate fini non déterministe en automate fini déterministe
    Par souheyeb dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 06/04/2008, 02h56
  3. [Etat-Transition] diagramme etat transition = automate fini deterministe ou non deterministe ou les 2 ?
    Par fasfousba dans le forum Autres Diagrammes
    Réponses: 3
    Dernier message: 02/01/2008, 09h12
  4. automate non déterministe.
    Par naniate dans le forum C
    Réponses: 4
    Dernier message: 02/12/2007, 09h25
  5. automate fini non déterministe
    Par lastrecrue dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 14/11/2006, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo