Entrar    Registrar

Do Fluxograma ao Programa (outra vez...)

Para "abobrinhas" use o " Boteco"

Moderadores: aluis-rcastro, guest2003, 51, Renie

  • Autor
    Mensagem

Do Fluxograma ao Programa (outra vez...)

Mensagempor MOR_AL » 09 Fev 2020 11:30

Olá pessoal.

Para quem não quiser ler a história, vá direto para a linha azul....



Em meus projetos com Microcontrolador (MC) pic16F628A, aprendi a usar a linguagem Assembly e costumo obter uma grande redução da memória de programa se comparado a linguagens de mais alto nível. Com 2k de memória de programa se consegue fazer muita coisa com este MC.

Começo com um fluxograma que usa pseudo código, com blocos que contém uma proximidade com a linguagem Assembly. À partir do fluxograma consigo chegar ao programa sem problemas.

Mas a evolução para programas maiores está sendo mais complicada, justamente pelo fato de sempre partir de um fluxograma. 

Explico melhor.

Estou estudando um programa em C de uma apostila, mas o problema não está na linguagem, pois ocorreria em outra linguagem como o Basic do Bascavr.

Basicamente, discordo do programa da apostila.

Passei o programa da apostila para um fluxograma e tentei fazer um programa baseado neste fluxograma (vide figura)

O programa da apostila não seguiu a lógica. No bloco "D" do fluxograma, o programa da apostila continua para o bloco "C". Mas a lógica do PROBLEMA indica que não há necessidade de ir para o bloco "E" e sim retornar ao bloco "B", como no meu fluxograma.

Aí é que vem o MEU problema.

Escuto que não se deve usar a instrução GOTO, porque ela cria confusão no entendimento do programa. Eu concordo, mas se houver um fluxograma disponível, fica bem mais inteligível.

Minha dúvida é a seguinte (demorou, né?).



Como não usar a instrução GOTO, seguindo o fluxograma apresentado?
Você não está autorizado a ver ou baixar esse anexo.
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2829
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor Aquino » 09 Fev 2020 11:56

X deve fazer uma chamada a função que tem o loop:

Código: Selecionar todos

unsigned char loop_do_Mor_al(void*args){


}

// lá no local em que você gostaria de chamar o código
...

while(!loop_do_Mor_al());
...




Supondo que a condição de retorno para voltar a X é a unica condição de continuar no loop, então retornaria um valor diferente de zero....
Se não for isso, iteramos mais uma vez aqui pra tentar te ajudar.
Buscando um coach para me tornar coach em sistemas embarcados.
Avatar do usuário
Aquino
Dword
 
Mensagens: 1932
Registrado em: 12 Out 2006 22:24

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor MOR_AL » 09 Fev 2020 12:35

O problema é o seguinte:
Uma bomba d'água que alimenta uma caixa d'água. Nessa caixa tem duas boias em níveis diferentes. A água não deve ultrapassar a boia superior e nem ficar abaixo da boia inferior.
Tem uma chave que ao fechar vai a zero. Quando esta chave estiver fechada (0) é que ativa o processo. Quando estiver aberta (1) o programa mantém a bomba desligada.
Os blocos:
A = Desliga a bomba.
B = Chave acionada? (0) para Sim e 1 para não.
C = Boia superior com água?
D = Desliga a bomba.
E = Boia inferior sem água?
F = Desliga a bomba
Note que o programa da apostila pergunta se a boia inferior está sem água (item E) ... depois de saber que a boia superior está com água (o programa da apostila liga a saída "D" na entrada "E".

Tirei uma foto do exercício. Meu fluxograma não testa a bomba inferior, sabendo que a superior está com água. Daí é que fiz o meu fluxograma e apareceu o GOTO. O programa fica perguntando se a chave está fechada o tempo todo. Pelo que entendi de sua sugestão, o loop externo cessa. É isso?
Você não está autorizado a ver ou baixar esse anexo.
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2829
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor MOR_AL » 09 Fev 2020 12:54

Basicamente.
Entendi que sua opção sai do loop e para, mas o loop tem que ficar rodando continuamente.
Como não usar o GOTO?
MOR_AL
Você não está autorizado a ver ou baixar esse anexo.
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2829
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor cfreund » 09 Fev 2020 13:07

Não tenha medo do Goto. Esse povo que "torce o nariz" para uma ferramenta, nem deveria ser chamado de programador. Tanto que uma vez compilado, dificilmente um programa não terá um "goto". É uma ferramenta extremamente útil e ajuda bastante na otimização do código.

Enfim, neste caso eu faria da seguinte forma:
Código: Selecionar todos
for (;;)
{
   while (chave_fechada && sensor_superior_ativado)   // Quando chave acionada, espera o sensor superior indicar nível baixo
   {
      if (sensor_inferior_ativado) // Espera nível chegar no sensor inferior
         ligar_bomba();
   }

   desligar_bomba(); // Desliga a bomba quando o nível atingir sensor superior ou abrir a chave
}
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 504
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor MOR_AL » 09 Fev 2020 16:39

cfreund escreveu:Não tenha medo do Goto. Esse povo que "torce o nariz" para uma ferramenta, nem deveria ser chamado de programador. Tanto que uma vez compilado, dificilmente um programa não terá um "goto". É uma ferramenta extremamente útil e ajuda bastante na otimização do código.

Enfim, neste caso eu faria da seguinte forma:
Código: Selecionar todos
for (;;)
{
   while (chave_fechada && sensor_superior_ativado)   // Quando chave acionada, espera o sensor superior indicar nível baixo
   {
      if (sensor_inferior_ativado) // Espera nível chegar no sensor inferior
         ligar_bomba();
   }

   desligar_bomba(); // Desliga a bomba quando o nível atingir sensor superior ou abrir a chave
}


Valeu cfreud. Acho que você fez uma tabela verdade e resolveu o problema da bomba.
Mas a instrução não seria ...
while (chave_fechada && sensor_superior_DESativado) // Só liga a bomba com o sensor superior indicar nível baixo.
Parabéns. O exercício fica resolvido. Bastaria ter feito a tabela verdade para simplificar o problema.
Grato a você e ao Aquino.
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2829
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor xultz » 10 Fev 2020 11:31

Uma vez eu peguei o código fonte do kernel linux e fiz um grep -R goto * e fiquei impressionado a quantidade de vezes que o goto é utilizado.
Em situações apertadas, onde se precisa de velocidade, código enxuto ou ambos, o goto pode ser a melhor solução. Se o Linus Torvalds não xingou a pessoa e aceitou o código usando goto, então usar goto talvez não seja pecado.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2933
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor Aquino » 10 Fev 2020 19:10

xultz escreveu:Uma vez eu peguei o código fonte do kernel linux e fiz um grep -R goto * e fiquei impressionado a quantidade de vezes que o goto é utilizado.
Em situações apertadas, onde se precisa de velocidade, código enxuto ou ambos, o goto pode ser a melhor solução. Se o Linus Torvalds não xingou a pessoa e aceitou o código usando goto, então usar goto talvez não seja pecado.


No código-fonte do Linux o goto é muito utilizado como uma espécie de "exception". São situações em que é necessário desfazer algo, geralmente assim: FAZ A,B,C... depois no "exception", os labels são incrementais e desfaz C,B,A...
Buscando um coach para me tornar coach em sistemas embarcados.
Avatar do usuário
Aquino
Dword
 
Mensagens: 1932
Registrado em: 12 Out 2006 22:24

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor dede » 11 Fev 2020 13:36

Na próxima vez pensa em maquina de estados.
Sua vida vai ficar mais fácil com esses fluxogramas.
dede
Bit
 
Mensagens: 5
Registrado em: 29 Jul 2019 12:01

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor MOR_AL » 13 Fev 2020 19:13

Bom.
Conclusões:
1 - Fazer o fluxograma em pseudo código.
2 - Fazer a tabela verdade.
3 - Fazer a máquina de estados, já que a sequência é necessária.
4 - Partir para um programa tentando evitar o GOTO. Caso fique trabalhoso, azar. E lá vai GOTO. Com o fluxograma do item 1, o programa fica bem claro de se entender.
Pessoal, valeu pelas dicas.
[]'s.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2829
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor cfreund » 14 Fev 2020 22:16

5 - Remover o while do código proposto.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 504
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor MOR_AL » 15 Fev 2020 15:27

cfreund escreveu:5 - Remover o while do código proposto.


Porquê?
Alguém informou que prefere o For(;;) ao While(1), saberia dizer porquê?
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2829
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Do Fluxograma ao Programa (outra vez...)

Mensagempor mastk » 17 Fev 2020 11:48

Não gosto de GOTO, só uso quando realmente é preciso, o problema do goto é quebrar a estrutura do programa, deixando menos legível. Discordo dos amigos de verem o fonte do Linux como exemplo, nenhum de nos está trabalhando em um sistema operacional.

While(1) e for(;;) são equivalentes, até aonde eu sei, o que muda é menos texto, até aonde eu sei, lembro do conceito de código como risco, quanto menos, melhor.

Moral, tabela de verdade teria de vir antes do pseudo código, eu penso assim:

-Texto com o objetivo do código.
-Rascunho de lógica e estruturas. (Tabela de verdade, desenhos, propostas e conceitos).
-Pseudo código.
-Código.

Máquina de estados é uma técnica que pode ser trabalhosa, tem que ver se vale a pena no seu problema.
Avatar do usuário
mastk
Dword
 
Mensagens: 4388
Registrado em: 14 Out 2006 20:43

Voltar para Assuntos Gerais

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante