-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmenu.c
134 lines (110 loc) · 3.39 KB
/
menu.c
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <stdio.h>
#include <stdlib.h>
#include "menu.h"
#include "sistema.h"
#include "arquivo.h"
// Imprime a logo do program
void imprimir_logo() {
printf(" __ \n"
"(_ o __ | _ _| _ __ _| _ \n"
"__) | ||||_| | (_|(_|(_) | (_|(/_\n\n"
" ___ ____________ \n"
" / _ \\ | ___| _ \\\n"
" / /_\\ \\| |_ | | | |\n"
" | _ || _| | | | |\n"
" | | | || | | |/ / \n"
" \\_| |_/\\_| |___/\n\n");
}
// Lê o arquivo carregado na pasta do programa e guarda as especificações
// Entrada: ponteiro para a estrutura
// Saída: estrutura atualizada
GRAMATICA* ler_arquivo(GRAMATICA *gramatica) {
char arquivo[20];
printf("\nDigite o nome do arquivo.extensao:\n"
"> ");
scanf("%s", &arquivo);
gramatica = formar_gramatica(arquivo);
if(!gramatica) {
printf("\n(Erro na formacao do AFD)\n");
return NULL;
}
return gramatica;
}
// Testa palavras no AFD já carregado
// Entrada: ponteiro para a estrutura de AFD
// Saída: nenhuma
void testar_palavras(GRAMATICA *gramatica) {
int opcao = 1;
char palavra[20];
while(opcao) {
printf("\n1 - Digitar a palavra\n"
"0 - Voltar\n"
"> ");
scanf("%d", &opcao);
switch (opcao) {
case 1:
printf("> ");
scanf("%s", &palavra);
testar_palavra(gramatica, palavra);
break;
case 0:
break;
default:
printf("\n(Digite uma opcao valida)\n");
break;
}
}
}
// Reseta a memória ds estrutura para reutilização
// Entrada: ponteiro para a estrutura
// Saída: nenhuma
void resetar(GRAMATICA *gramatica) {
int tamanho = contar_tamanho_vetor(gramatica->estados);
gramatica->alfabeto = NULL;
gramatica->estados = NULL;
gramatica->finais = NULL;
for(int i = 0; i < tamanho; i++) {
while(gramatica->transicoes[i] != NULL) {
struct no *l = gramatica->transicoes[i]->prox;
free(gramatica->transicoes[i]);
gramatica->transicoes[i] = l;
}
}
free(gramatica->transicoes);
free(gramatica);
gramatica = NULL;
}
// Chama o menu com as opções principais
void menu_principal() {
int opcao = 1;
GRAMATICA *gramatica = NULL;
while(opcao) {
printf("\n1 - Carregar um arquivo contendo especificacoes de um AFD\n"
"2 - Imprimir especificacoes do AFD carregado\n"
"3 - Testar palavras\n"
"4 - Resetar memoria\n"
"0 - Encerrar programa\n"
"> ");
scanf("%d", &opcao);
switch (opcao) {
case 1:
gramatica = ler_arquivo(gramatica);
break;
case 2:
imprimir_gramatica(gramatica);
break;
case 3:
testar_palavras(gramatica);
break;
case 4:
resetar(gramatica);
break;
case 0:
printf("\n(Programa encerrado\n");
break;
default:
printf("\n(Numero invalido)\n");
break;
}
}
}