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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    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
    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
    Par défaut
    Bon courage.

    Où est votre code ?

  3. #3
    Membre actif
    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
    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
    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
    Membre actif
    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
    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
    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.

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