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
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
salut;
le probleme c'est on doit utilisé les structures de données voici la structure donnée par le prof :
par exemple tr[0][0].e = 1
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
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; }
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 structureest assez facile...
Code : Sélectionner tout - Visualiser dans une fenêtre à part struct etat
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 partievoici tout le programme
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]
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; }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part etat*tr[10][10]
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.
Partager