Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

hpt

Afd

Recommended Posts

Pessoal, estou na 4ª fase de sistemas de informação e o professor começou a explicar sobre AFD e pediu que a gente faça um AFD em qualquer linguagem de programação,ele pediu um que reconheça {x E {0,1,2,3,4,5,6,7,8,9}*| x representa um numero decimal divisivel por 3}, mas nao quero o programa exatamente pronto pois quero aprender( mas se quiserem dar ele pronto tambem aceito porque depois te um muito mais dificil), ou podem mandar um de numeros multiplos de qualquer numero, sei la, mas gostaria de um exemplo por que nao tenho nem ideia de como começar, ja que ele nao deu exemplo nenhum, desde ja eu agradeço.

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, se você não quer o programa pronto, então você não quer exemplos. Se você quer, você quer exemplos. Me parece que você está pedindo pelo programa pronto, ou foi só impressão minha?

 

Anyway, eu não entendi o que você quer fazer, eu não sou (e ninguém é) obrigado a conhecer o que é um AFD. Poderia nos explicar para que possamos te ajudar melhor?

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza, entao quero um exemplo sim de AFD(autonato finito deterministico), pra mim ver em funcionamento por que nao tenho nenhuma ideia de como funciona na pratica, pode ser em C ou em Java.

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Primeiro, não faremos seu dever de casa, não vamos te dar um programa pronto. Segundo, você não respondeu minha segunda pergunta, como podemos te ajudar?

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

o trabalho de casa é um programa especifico e nao um qualquer, eu quero um qualquer pra mim ver o funcionamento de um AFD(aumato finito deterministico).

Definição. Um Autômato Finito Determinístico (afd) M, sobre um alfabeto S é um

sistema (K, S, d, i, F), onde

K é um conjunto de estados finito, não vazio;

S é um alfabeto de entrada (finito)

d: K´S ® K é a função de transição

iÎK é o estado inicial

FÍK é o conjunto de estados finais.

O nome determinístico faz referência ao fato de que d é uma função (também

chamada função próximo-estado), que determina precisamente o próximo estado a ser

assumido quando a máquina M se encontra no estado q e lê da entrada o símbolo a: o

estado d(q, a).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é complicado. Parece que seu professor não especificou como a entrada deve ser feita, então você pode muito bem usar tipos inteiros pra representar 1, 2, 3, 4, 5, 6, 7, 8 e 9.

 

x E {1, 2, 3, 4, 5, 6, 7, 8, 9}*, ou o "fecho" de {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, são todas as cadeias que se pode formar com seus elementos, mais a cadeia vazia. A restrição de que o número representado pela cadeia seja divisível por três é facilmente checada em C, se a entrada puder ser representada com um tipo inteiro qualquer (como unsigned char, unsigned short, unsigned int, unsigned long int, unsigned long long int). Se ela tiver que ser lida em forma textual, você pode usar strtol.

 

Note que o conjunto definido de cadeias é infinito, portanto é impossível criar um programa que realmente reconheça qualquer cadeia pertencente a ele. Usando unsigned long long int, é garantido que você conseguirá representar até 2^64 - 1 (no mínimo). Daí, como eu disse anteriormente, basta usar o operador de módulo.

 

Se precisar trabalhar com valores maiores, use um array de char, lendo os dígitos byte a byte e usando o fato de que a divisibilidade por 3 se dá se e somente se a soma dos números formados por cada algarismo que compõe a representação de cada uma das ordens de grandeza do número divisível for, também, divisível por 3. Você pode converter cada dígito lido e somá-lo a um total, que deve, ele mesmo, ser divisível por 3.

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso, ele falou que a implementação é livre,mas que temos que fazer a maquina de estados para mostrar todos os estados, mas nao tenho nem ideia de como isso funcionara em C ou Java.

 

ele pediu um que mostre um numero divisivel por 3, mas se tiver um que reconheça numeros pares tambem pode ser, só pra mim ter uma ideia de como começar {0,1,2,3,4,5,6,7,8,9}, sao as entradas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A seguinte rotina retorna um valor diferente de 0 se seu argumento (inteiro) é divisível por 3:

 

int div3(int numero)
{
   return !(numero % 3);
}

/* Exemplo de uso:

if (div3(15))
{
   puts("15 % 3 == 0");
}

*/

 

Seu autômato pode ser representado de diversas formas. Os estados e transições podem ser implícitos ou explícitos. Se quiser deixar mais claras suas intenções, defina estruturas de dados e rotinas que as manipulem explicitamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse que você fez foi em C++ né? tipo aquele que o professor pediu era pra ler digito por digito e dependendo se fosse divisivel ou nao, ele passaria para um determinado estado, mas esse que você ja deu uma ideia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Sim e não.

 

Foi código escrito em C++. Mas também foi escrito em C. A parte de funções, na maioria dos recursos disponíveis, pode ser implementado igualmente para as duas linguagens. No caso, é um código em C que pode ser usado em C++.

 

A função que o guidjos passou retornava {nº diferente de 0} se o número era divisível por 3 e 0 se ele não era. Não era isso o que queria?

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim,mas por exemplo, se for digitado 568726, tem que verificar digito por digito e ir trocando de estado na maquina de estados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você sabe como verificar dígito por dígito? Divida o número como inteiro por 10, você vai ter 1 dígito a menos. Então, se, por exemplo, testar o número 4506, é só dividir ele como inteiro por 1000, aí o resultado vai ser 4, que pode testar com a função do guidjos. Enton divida por 100 e subtraia o dígito anterior multiplicado por 10, e continue assim, até conseguir todos...

 

Deve ter modos mais fáceis, se não estou enganado tem uma função da standard para isso e, se não, pode usar uma função da standard que converte o número para caracteres, aí fica mais fácil de checar dígito por dígito.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu professor provavelmente quer que a verificação da divisibilidade seja explicitada nos estados do autômato. Sugiro, então, que primeiro concentre-se em representar os conceitos necessários a todos os autômatos, pra depois focar na funcionalidade deste em específico. Modele estruturas de dados para representação de um estado, de um terminal de entrada e de uma regra de transição.

 

Sempre que estiver modelando qualquer tipo de dados, sugiro que pense primeiro nas operações que ele suportará. Isso lhe permitirá estruturar a abstração de modo que as operações possam ser feitas de forma intuitiva (com respeito à linguagem de programação em si). Você precisará, por exemplo, ler um terminal e aplicar uma regra de transição (usualmente modelado como uma função, e usualmente com nome 'lambda').

 

Apresente sua modelagem aqui, pra que possamos aconselhá-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

caramba, quanto mais eu tento entende, mais dificil fica, mas beleza, vo tenta desenvolve alguma coisa aqui, pra ver se consigo, mas to vendo que vai ser complicado, nem eu entendi o que ele tava pedindo no enunciado do exercicio. :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.