const int tamanho = 50; string alfabeto; string codigoCompletoAFD; string estadosFinais; int qtdLinhas; int qtdColunas; int matrizTransicoes[tamanho][tamanho]; //Prototipação void lerAlfabeto(); void lerEstados(); void criarCodigoAFD(); void printMatriz(); void preencherFuncaoDeTransicao(); int verificaEstadoFinal(int); void gravarArquivo(); string AddHeader(); string AddMain(); string AddPrototipos(); //Leitura do Alfabeto void lerAlfabeto(){ printf("\nAlfabeto: "); getline(cin,alfabeto); qtdColunas = alfabeto.size(); //verificação se não há letras repetidas no alfabeto for (int i=0; i<qtdColunas;i++){ for(int j=1+i;j<qtdColunas;j++){ if(alfabeto[j]==alfabeto[i]){ printf("Atencao: O alfabeto nao deve conter letrar repetidas .\n\n"); system("PAUSE"); system("CLS"); lerAlfabeto(); } } } } //Leitura da quantidade de estados void lerEstados(){ printf("\nQuantidade de Estados: "); scanf("%d",&qtdLinhas); //Verificação se não há qtd negativa ou nula if(qtdLinhas<=0){ printf("Atencao: A quantidade de estados nao pode ser negativa ou nula\n \n"); system("PAUSE"); system("CLS"); lerEstados(); } printf("\nO estado inicial: %d\n", 0); printf("\nDigite o conjunto de estados finais: "); cin >> estadosFinais; } //Leitura das transições de estados void lerMatrizTransicoes(){ printf("\n"); for(int i = 0 ; i < qtdLinhas; i++) { for(int j = 0 ; j < qtdColunas ; j++ ) { int transicao; printf("Digite a transicao para o estado e%d, simbolo %c : ", i, alfabeto[j]); scanf("%d", &transicao); matrizTransicoes[i][j]=transicao; } } printMatriz(); printf("\n\n"); system("PAUSE"); } //Impressao da matriz de transicoes preenchida void printMatriz(){ printf("\n############## Matriz de Transicoes ##############\n\n"); for(int j = 0 ; j < qtdColunas ; j++) { printf("\t%c",alfabeto[j]); } for(int i = 0 ; i < qtdLinhas; i++) { printf("\ne%d",i); for(int j = 0 ; j < qtdColunas ; j++ ) { printf("\te%d",matrizTransicoes[i][j]); } } } //criacao do codigo do AFD void criarCodigoAFD(){ //string que contem todo o corpo do codigo, isto e, os metodos string body; for (int i = 0; i < qtdLinhas; i++) { //adicionando as funcoes void e body+="void e"; char cNumEstado[10]; //converte o numero i em string itoa (i,cNumEstado,10); //adiciona o numero i em formato de string ao corpo do c odigo body+=cNumEstado; body+="()\n{\n"; for(int j = 0 ; j < qtdColunas ; j++) { /*condicao que garante que apenas uma funcao sucesso será adicionado ao corpo, pois especifica que todos os estados serão procurados - variavel i varia numero de estados (qtdLinhas), e a variável j garante que a pesquisa só sera feita uma vez para cada numero de estado (variavel i). */ if(verificaEstadoFinal(i) >= 0 && j==0) { body+="\tif (linha[p] == '\\0')\n\t{\n\t \t sucesso();\n\t}\n"; } if(j==0) { if(verificaEstadoFinal(i) >= 0) { body+="\telse if (linha[p] == '"; } else { body+="\tif (linha[p] == '"; } } else { body+="\telse if (linha[p] == '"; } body+=alfabeto[j]; if(matrizTransicoes[i][j] == -1) { body+="')\n\t{\n\t\terro();\n\t}\n"; } else { body+="')\n\t {\n\t\tp++;\n\t\te"; char cNumEstado[5]; itoa (matrizTransicoes[i][j],cNumEstado, 10); body+=cNumEstado; body+="();\n\t}\n"; } } body+="\telse\ if(linha[p] != '\\0')\n\t{\n\t\terroAlfabeto(linha[p] );\n\t}\n \telse erro();\n"; body+="}\n"; } //adiciona todas partes do programa codigoCompletoAFD+=AddHeader(); codigoCompletoAFD+=AddPrototipos(); codigoCompletoAFD+=AddMain(); codigoCompletoAFD+=body; } //adiciona prototipos string AddPrototipos(){ string prototipos; for(int i = 0 ; i < qtdLinhas; i++) { prototipos+="void e"; char numEstado[10]; itoa(i,numEstado, 10); prototipos+=numEstado; prototipos+="();\n"; } prototipos+="\n\n"; return prototipos; } //adiciona o cabecalho string AddHeader(){ string header =""; header +="#include <stdio.h>\n"; header +="#include <conio.h>\n\n"; header +="int p;\n"; header +="char linha[255];\n"; header +="void sucesso();\n"; header +="void erro();\n"; header +="void erroAlfabeto(char letra);\n"; return header; } //adiciona o codigo principal a uma string string AddMain(){ string main=""; main+="int main(int argc, char * argv[])\n"; main+="{\n"; main+="\tsystem(\"CLS\");\n"; main+="\tprintf(\"######### Automato Finito Deterministico #########\"); \n"; main+="\tprintf(\"\\n\");\n"; main+="\tp=0;\n"; main+="\tprintf(\"Digite a palavra:\");\n"; main+="\tgets(linha);\n"; main+="\te0();\n"; main+="\tsystem(\"PAUSE\");\n"; main+="\treturn 0;\n"; main+="}\n\n"; main+="void sucesso()\n"; main+="{\n"; main+="\tprintf(\"Aceito\");\n"; main+="\tprintf(\"\\n\");\n"; main+="}\n"; main+="void erro()\n"; main+="{\n"; main+="\tprintf(\"Erro\");\n"; main+="\tprintf(\"\\n\");\n"; main+="}\n\n"; main+="void erroAlfabeto(char letra)\n"; main+="{\n"; main+="\tprintf(\"Erro: a letra '%c' nao pertence ao alfabeto.\",letra);\n"; main+="\tprintf(\"\\n\");\n"; main+="}\n"; return main; } /*verifica se o estado (numero) i da funcao criarCodigoAFD é um estado final, se for, retorna um valor maior que zero, senão, retorna um valor menor*/ int verificaEstadoFinal(int numeroEstadoFinal){ int flagEstadoFinal; char comparaEstadoFinal[5]; //converte o numeroEstadoFinal para a string comparaEstadoFinal itoa (numeroEstadoFinal,comparaEstadoFinal,10); //procura dentro da string que contém os EstadosFinais o "numero" contido em compara flagEstadoFinal = estadosFinais.find(comparaEstadoFinal); //armazena o retorno da busca: >0, se ok, <=0 se fail return flagEstadoFinal; ; } //grava a string codigoCompletoAFD no arquivo .c void gravarArquivo(){ ofstream codigoFonte; codigoFonte.open("AFDSolution.c"); codigoFonte<<codigoCompletoAFD; codigoFonte.flush(); codigoFonte.close(); } int main(int argc, char *argv[]){ lerAlfabeto(); lerEstados(); lerMatrizTransicoes(); criarCodigoAFD(); gravarArquivo(); return EXIT_SUCCESS; }