22.10.2014 Views

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

encontrado, o que, evident<strong>em</strong>ente, vai prejudicar a performance do programa. Isto pode ser contornado pois<br />

os compiladores C permit<strong>em</strong> que uma variável de controle de um comando for tenha o seu conteúdo alterado<br />

dentro do próprio comando. Com isto, o programa acima ficaria da seguinte forma.<br />

#include <br />

main()<br />

{<br />

int Num, i, Divisor;<br />

printf("Digite um número inteiro: ");<br />

scanf("%d", &Num);<br />

Divisor = 0;<br />

for (i = 2; i < Num; i = i + 1)<br />

if (Num % i == 0)<br />

{<br />

Divisor = i;<br />

i = Num;<br />

}<br />

if (Divisor != 0)<br />

printf("%d e' divisor próprio de %d \n", Divisor, Num);<br />

else<br />

printf("%d não t<strong>em</strong> divisores próprios \n", Num);<br />

}<br />

Nesta versão, quando o primeiro divisor próprio é encontrado, o comando i = Num; faz com que a<br />

execução do comando for seja interrompida. A prática de encerrar um comando for através da alteração do<br />

conteúdo da variável de controle não será aqui incentivada pelo fato de que isto desestrutura o programa,<br />

dificultando sua legibilidade. Além disso, há situações <strong>em</strong> que não se pode conhecer o número máximo de<br />

repetições de uma estrutura de repetição. Na verdade, a questão central é que o comando for deve ser<br />

utilizado quando o número de repetições de execução de uma sequência de comandos é conhecido a priori.<br />

Quando isto não acontece (que é o caso do ex<strong>em</strong>plo anterior: não se sabe a priori se e quando um divisor<br />

próprio vai ser encontrado), deve-se usar o comando while, que possui a seguinte sintaxe:<br />

while (Expressão)<br />

{<br />

Sequência de comandos<br />

}<br />

sendo os delimitadores opcionais se a sequência possui um só comando (como acontece nas outras<br />

estruturas de repetição).<br />

A s<strong>em</strong>ântica deste comando é óbvia: a sequência de comandos é executada enquanto o valor da<br />

Expressão for diferente de zero. Naturalmente, pode ocorrer que a sequência de comandos não seja<br />

executada nenhuma vez, isto ocorrendo se o valor da Expressão for igual a zero quando da "primeira"<br />

execução do comando (o teste é feito antes da execução da sequência de comandos). Por outro lado, é<br />

necessário que um dos comandos da sequência de comandos altere conteúdos de variáveis que aparec<strong>em</strong> na<br />

Expressão de modo que <strong>em</strong> algum instante ela se torne igual a zero. Do contrário, a sequência de comandos<br />

terá sua execução repetida indefinidamente, o programa nunca termina e, evident<strong>em</strong>ente, não executa a tarefa<br />

para a qual foi desenvolvido. Quando isto acontece é comum se dizer que o programa está <strong>em</strong> looping.<br />

Com o comando while as questões levantadas acima sobre o programa para determinar um divisor<br />

próprio de um inteiro dado são resolvidas e t<strong>em</strong>os o seguinte programa:<br />

/*Programa que determina o menor divisor próprio de um inteiro */<br />

#include <br />

#include <br />

main()<br />

{<br />

int Num, d, Met;<br />

printf("Digite o numero: ");<br />

scanf("%d", &Num);<br />

Met = Num/2;<br />

d = 2;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!