capítulo iv – comandos de controle de fluxo 4.1 – comandos compostos 4.2 – comandos...

Post on 22-Apr-2015

234 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Capítulo IV – Comandos Capítulo IV – Comandos de Controle de Fluxode Controle de Fluxo

4.1 – Comandos compostos4.1 – Comandos compostos

4.2 – Comandos condicionais4.2 – Comandos condicionais

4.3 – Expressões condicionais4.3 – Expressões condicionais

4.4 – Comandos repetitivos4.4 – Comandos repetitivos

4.5 – Comandos de escape4.5 – Comandos de escape

4.6 – Comandos de seleção4.6 – Comandos de seleção

4.7 – Introdução à metodologia top-4.7 – Introdução à metodologia top-down down

4.6 – Comandos de Seleção4.6 – Comandos de Seleção

4.6.1 – Importante estrutura 4.6.1 – Importante estrutura algoritmicaalgoritmica

Expressão

Lista de comand

os

Lista de comand

os

Lista de comand

os

Lista de comand

os

V 11, V 12

, ... ,

V 1i

V 21, V

22, .

.. ,

V 2j

Vn1 , V

n2 , ... ,

Vnp

Outros

Escolher um de vários caminhos alternativos, conforme o valor da expressão

A expressão e os valores V11, V12, ... , Vnp são inteiros ou caracteres

Em C Em C

aplainada:aplainada:switch (Expressao) {

V11, V12, ... , V1i : Lista de Comandos;

V21, V22, ... , V2j : Lista de Comandos;

. . . . . .Vn1, Vn2, ... , Vnp : Lista de

Comandos;default: Lista de Comandos;

}

switch (Expressao) {switch (Expressao) {

case Vcase V1111: case V: case V1212: ... case V: ... case V1i1i::

Lista de comandos; break;Lista de comandos; break;

case Vcase V2121: case V: case V2222: ... case V: ... case V2j2j::

Lista de comandos; break;Lista de comandos; break;

..

..

case Vcase Vn1n1: case V: case Vn2n2: ... case V: ... case Vnpnp::

Lista de comandos; break;Lista de comandos; break;

default:default:

Lista de comandos; Lista de comandos;

}}switch (Expressao) {

V11, V12, ... , V1i : Lista de Comandos;

V21, V22, ... , V2j : Lista de Comandos;

. . . . . . Vn1, Vn2, ... , Vnp : Lista de

Comandos; default: Lista de Comandos;

}

Em C

O comando break é necessário para que somente uma lista de comandos seja executada

Obs.: o ramo default é opcional

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

void main ( ) {void main ( ) {

char c; int n;char c; int n;

printf ("Levantar o astral? (s/n): "); c = getche();printf ("Levantar o astral? (s/n): "); c = getche();

while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {

printf ("\n\n\tDigite um numero de 1 a 7: "); scanf ("%d", printf ("\n\n\tDigite um numero de 1 a 7: "); scanf ("%d", &n);&n);

switch (n) {switch (n) {

case 1: printf ("\n\tVoce eh inteligente"); break;case 1: printf ("\n\tVoce eh inteligente"); break;

case 2: printf ("\n\tVoce eh campeao"); break;case 2: printf ("\n\tVoce eh campeao"); break;

case 3: printf ("\n\tVoce estah com tudo"); break;case 3: printf ("\n\tVoce estah com tudo"); break;

case 4: printf ("\n\tSeu destino eh vencer"); break;case 4: printf ("\n\tSeu destino eh vencer"); break;

case 5: printf ("\n\tTudo coopera para seu sucesso"); case 5: printf ("\n\tTudo coopera para seu sucesso"); break;break;

case 6: printf ("\n\tA vida sorri para voce"); break;case 6: printf ("\n\tA vida sorri para voce"); break;

case 7: printf ("\n\tNada pode impedir sua vitoria"); case 7: printf ("\n\tNada pode impedir sua vitoria"); break;break;

default: printf ("\n\tO numero deve ser de 1 a 7");default: printf ("\n\tO numero deve ser de 1 a 7");

}}

printf ("\n\nLevantar o astral? (s/n): "); c = getche ();printf ("\n\nLevantar o astral? (s/n): "); c = getche ();

}}

}}

Exemplo: seja o seguinte programa

Resultado para n = 5 Tudo coopera para seu

sucesso

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

void main ( ) {void main ( ) {

char c; int n;char c; int n;

printf ("Levantar o astral? (s/n): "); c = getche();printf ("Levantar o astral? (s/n): "); c = getche();

while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {

printf ("\n\n\tDigite um numero de 1 a 7: "); scanf ("%d", printf ("\n\n\tDigite um numero de 1 a 7: "); scanf ("%d", &n);&n);

switch (n) {switch (n) {

case 1: printf ("\n\tVoce eh inteligente");case 1: printf ("\n\tVoce eh inteligente");

case 2: printf ("\n\tVoce eh campeao");case 2: printf ("\n\tVoce eh campeao");

case 3: printf ("\n\tVoce estah com tudo");case 3: printf ("\n\tVoce estah com tudo");

case 4: printf ("\n\tSeu destino eh vencer");case 4: printf ("\n\tSeu destino eh vencer");

case 5: printf ("\n\tTudo coopera para seu case 5: printf ("\n\tTudo coopera para seu sucesso");sucesso");

case 6: printf ("\n\tA vida sorri para voce");case 6: printf ("\n\tA vida sorri para voce");

case 7: printf ("\n\tNada pode impedir sua vitoria"); case 7: printf ("\n\tNada pode impedir sua vitoria");

default: printf ("\n\tO numero deve ser de 1 a 7");default: printf ("\n\tO numero deve ser de 1 a 7");

}}

printf ("\n\nLevantar o astral? (s/n): "); c = getche ();printf ("\n\nLevantar o astral? (s/n): "); c = getche ();

}}

}}

Resultado para n = 5 Tudo coopera para seu

sucessoA vida sorri para voceNada pode impedir sua vitoriaO numero deve ser de 1 a 7

Retirando-se os comandos break

Fluxograma do switch sem usar break:Fluxograma do switch sem usar break:

Expressão

Lista de comand

os

Lista de comand

os

Lista de comand

os

Lista de comand

os

V 11, V 12

, ... ,

V 1i V 21

, V22

, ...

,

V 2j

Vn1 , V

n2 , ... ,

Vnp

Outros

Exemplo: programa para contar diversos Exemplo: programa para contar diversos tipos de caracterestipos de caracteres

Digitar uma Digitar uma frasefrase, guardando-a no , guardando-a no bufferbuffer do do tecladoteclado

Ler Ler cada caracterecada caractere da frase, da frase, classificando-oclassificando-o

Acrescentar 1Acrescentar 1 ao contador da classe do ao contador da classe do caracterecaractere

No final, No final, escreverescrever no vídeo o valor do no vídeo o valor do contadorcontador de cada classe de cada classe

Classes:

1) A ou a 2) E ou e3) I ou i 4) O ou o5) U ou u 6) W ou w7) Y ou y 8) Consoantes9) Dígitos decimais 10) Outros

caracteres

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

/* Cabecalho e declaracoes *//* Cabecalho e declaracoes */

int main ( ) {int main ( ) {

char c;char c;

int ct_a, ct_e, ct_i, ct_o, ct_u, ct_w, ct_y,int ct_a, ct_e, ct_i, ct_o, ct_u, ct_w, ct_y,

ct_cons, ct_dig, ct_outros;ct_cons, ct_dig, ct_outros;

/* Zerar todos os contadores *//* Zerar todos os contadores */

ct_a = ct_e = ct_i = ct_o = ct_u = ct_w =ct_a = ct_e = ct_i = ct_o = ct_u = ct_w =

ct_y = ct_cons = ct_dig = ct_outros = 0;ct_y = ct_cons = ct_dig = ct_outros = 0;

/* Ler e classificar cada caractere *//* Ler e classificar cada caractere */

printf ("Digite uma frase:\n\n\t"); scanf ("%c", &c);printf ("Digite uma frase:\n\n\t"); scanf ("%c", &c);

while (c != '\n') {while (c != '\n') {

switch (c) {switch (c) {

case 'a': case 'A': ct_a++; break;case 'a': case 'A': ct_a++; break;

case 'e': case 'E': ct_e++; break;case 'e': case 'E': ct_e++; break;

case 'i': case 'I': ct_i++; break;case 'i': case 'I': ct_i++; break;

case 'o': case 'O': ct_o++; break;case 'o': case 'O': ct_o++; break;

case 'u': case 'U': ct_u++; break;case 'u': case 'U': ct_u++; break;

case 'w': case 'W': ct_w++; break;case 'w': case 'W': ct_w++; break;

case 'y': case 'Y': ct_y++; break;case 'y': case 'Y': ct_y++; break;

default:default:

if (c >= '0' && c <= '9') ct_dig++;if (c >= '0' && c <= '9') ct_dig++;

else if (c >= 'B' && c <= 'Z' || c >= 'b' && c else if (c >= 'B' && c <= 'Z' || c >= 'b' && c <= 'z')<= 'z')

ct_cons++;ct_cons++;

else ct_outros++;else ct_outros++;

}}

scanf ("%c", &c);scanf ("%c", &c);

}}

/* Imprimir os contadores e fechar a tela*//* Imprimir os contadores e fechar a tela*/

printf ("\nLetra A : %3d\nLetra E : %3d", ct_a, ct_e);printf ("\nLetra A : %3d\nLetra E : %3d", ct_a, ct_e);

printf ("\nLetra I : %3d\nLetra O : %3d", ct_i, ct_o);printf ("\nLetra I : %3d\nLetra O : %3d", ct_i, ct_o);

printf ("\nLetra U : %3d\nLetra W : %3d", ct_u, ct_w);printf ("\nLetra U : %3d\nLetra W : %3d", ct_u, ct_w);

printf ("\nLetra Y : %3d\nConsoantes: %3d", ct_y, ct_cons);printf ("\nLetra Y : %3d\nConsoantes: %3d", ct_y, ct_cons);

printf ("\nDigitos : %3d\nOutros : %3d", ct_dig, ct_outros);printf ("\nDigitos : %3d\nOutros : %3d", ct_dig, ct_outros);

printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;

}}Digite uma frase:

hberoçh 9g59y9 )_Y(HHU 3@$%UDFUYapok

Letra A : 1Letra E : 1Letra I : 0Letra O : 2Letra U : 3Letra W : 0Letra Y : 3Consoantes: 11Digitos : 5Outros : 14

Pressione . . .

Resultado

Exercícios 4.6:Exercícios 4.6:

1.1.Dizer que características uma frase digitada Dizer que características uma frase digitada deve ter para que o programa do próximo slide deve ter para que o programa do próximo slide a considere corretaa considere correta

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

intint main ( ) { main ( ) {

charchar c, erro; c, erro; int int c1, c2, c3, c4, c5, c6;c1, c2, c3, c4, c5, c6;

c1 = c2 = c3 = c4 = c5 = c6 = 0; erro = 0; printf ("Digite uma frase: ");c1 = c2 = c3 = c4 = c5 = c6 = 0; erro = 0; printf ("Digite uma frase: ");

dodo { {

scanf ("%c", &c);scanf ("%c", &c);

ifif (c != '\n') { (c != '\n') {

switchswitch (c) { (c) {

case case ' ( ' : c1++; ' ( ' : c1++; break break ;; casecase ' ) ' : c2++; ' ) ' : c2++; break break ;;

casecase ' [ ' : c3++; ' [ ' : c3++; break break ;; case case ' ] ' : c4++; ' ] ' : c4++; break break ;;

casecase ' { ' : c5++; ' { ' : c5++; break break ;; casecase ' } ' : c6++; ' } ' : c6++; break break ;;

}}

if if (c2 > c1 | | c4 > c3 | | c6 > c5) erro = 1; (c2 > c1 | | c4 > c3 | | c6 > c5) erro = 1;

}}

} } whilewhile (c ! = ' \n ' && erro == 0); (c ! = ' \n ' && erro == 0);

if if (erro == 0 && c1 == c2 && c3 == c4 && c5 == c6) printf (erro == 0 && c1 == c2 && c3 == c4 && c5 == c6) printf ("Frase correta");("Frase correta");

elseelse printf ("Frase com erros"); printf ("Frase com erros");

printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;

}}

Capítulo IV – Comandos Capítulo IV – Comandos de Controle de Fluxode Controle de Fluxo

4.1 – Comandos compostos4.1 – Comandos compostos

4.2 – Comandos condicionais4.2 – Comandos condicionais

4.3 – Expressões condicionais4.3 – Expressões condicionais

4.4 – Comandos repetitivos4.4 – Comandos repetitivos

4.5 – Comandos de escape4.5 – Comandos de escape

4.6 – Comandos de seleção4.6 – Comandos de seleção

4.7 – Introdução à metodologia top-4.7 – Introdução à metodologia top-downdown

4.7 – Introdução à 4.7 – Introdução à Metodologia Top-downMetodologia Top-down

4.7.1 – Conceito4.7.1 – Conceito

É a decomposição de uma É a decomposição de uma grande tarefagrande tarefa numa numa coleção de coleção de tarefas menorestarefas menores interligadas interligadas

Cada umaCada uma dessas tarefas menores pode ser dessas tarefas menores pode ser decomposta da mesma formadecomposta da mesma forma

No final, chega-se a uma coleção de No final, chega-se a uma coleção de tarefas tarefas triviaistriviais interligadas interligadas

Cada uma delas poderá ser resolvida por um Cada uma delas poderá ser resolvida por um comando típico dos algoritmoscomando típico dos algoritmos

4.7.2 – Desenvolvimento de um 4.7.2 – Desenvolvimento de um algoritmo para encontrar os n algoritmo para encontrar os n primeiros números naturais primosprimeiros números naturais primos

Método:Método:

Por definição, Por definição, 1 não é primo1 não é primo

Percorrer o campo dos naturais, do nPercorrer o campo dos naturais, do noo 2 em 2 em diante, até encontrar diante, até encontrar n n números primosnúmeros primos

4.7.2 – Desenvolvimento de um 4.7.2 – Desenvolvimento de um algoritmo para encontrar os n algoritmo para encontrar os n primeiros números naturais primosprimeiros números naturais primos

Método:Método:

Para ver se um número Para ver se um número numnum é primo: é primo:

0 1 2 3 num/2 num

A B

num tem divisor na região B se e somente se tem divisor na região A

Então basta procurar divisores para num na região A

Desenvolvimento do algoritmo por “top-Desenvolvimento do algoritmo por “top-down”:down”:

1ª Etapa:1ª Etapa:

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

Escrever o título da tarefa;Escrever o título da tarefa;

Pedir e ler o valor de n;Pedir e ler o valor de n;

Se (n <= 0) Escrever mensagem de erro;Se (n <= 0) Escrever mensagem de erro;

Senão Senão

Encontrar e Escrever os n 1Encontrar e Escrever os n 1osos números números primos;primos;

}}

int n;Declarações

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

Escrever o título da tarefa;Escrever o título da tarefa;

Pedir e ler o valor de n;Pedir e ler o valor de n;

Se (n <= 0) Escrever mensagem de erro;Se (n <= 0) Escrever mensagem de erro;

Senão Senão

Encontrar e Escrever os n 1Encontrar e Escrever os n 1osos números números primos;primos;

}}

2ª Etapa

int n;Declarações

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

write (“Relacao dos n primeiros numeros write (“Relacao dos n primeiros numeros primos”);primos”);

write (“Digite o valor de n:”); read (n);write (“Digite o valor de n:”); read (n);

Se (n <= 0) Escrever mensagem de erro;Se (n <= 0) Escrever mensagem de erro;

Senão Senão

Encontrar e Escrever os n 1Encontrar e Escrever os n 1osos números números primos;primos;

}}

2ª Etapa

int n;Declarações

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

write (“Relacao dos n primeiros numeros write (“Relacao dos n primeiros numeros primos”);primos”);

write (“Digite o valor de n:”); read (n);write (“Digite o valor de n:”); read (n);

Se (n <= 0) Escrever mensagem de erro;Se (n <= 0) Escrever mensagem de erro;

SenãoSenão

Encontrar e Escrever os n 1Encontrar e Escrever os n 1osos números números primos;primos;

}}

2ª Etapa

int n;Declarações

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

write (“Relacao dos n primeiros numeros write (“Relacao dos n primeiros numeros primos”);primos”);

write (“Digite o valor de n:”); read (n);write (“Digite o valor de n:”); read (n);

if (n <= 0) write (n, “ - valor improprio para n”);if (n <= 0) write (n, “ - valor improprio para n”);

elseelse

Encontrar e Escrever os n 1Encontrar e Escrever os n 1osos números números primos;primos;

}}

2ª Etapa

int n;Declarações

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

write (“Relacao dos n primeiros numeros write (“Relacao dos n primeiros numeros primos”);primos”);

write (“Digite o valor de n:”); read (n);write (“Digite o valor de n:”); read (n);

if (n <= 0) write (n, “ - valor improprio para n”);if (n <= 0) write (n, “ - valor improprio para n”);

else else

Encontrar e Escrever os n 1Encontrar e Escrever os n 1osos números números primos;primos;

}}

2ª Etapa

int n;Declarações

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

write (“Relacao dos n primeiros numeros write (“Relacao dos n primeiros numeros primos”);primos”);

write (“Digite o valor de n:”); read (n);write (“Digite o valor de n:”); read (n);

if (n <= 0) write (n, “ - valor improprio para n”);if (n <= 0) write (n, “ - valor improprio para n”);

else else {{

num = 2; cont = 0;num = 2; cont = 0;

do {do {

Testar se num é primo;Testar se num é primo;

if (num é primo) {if (num é primo) {

write (num); cont++;write (num); cont++;

}}

num++;num++;

} while (cont < n);} while (cont < n);

}}

}}

2ª Etapa

num: número a ser testado

cont: contador de números primos encontrados

Faltam detalhes

int n, num, cont;Declarações

Desenvolvimento de:Desenvolvimento de:

Testar se num é primo;Testar se num é primo;

if (num é primo)if (num é primo)

Procurar divisor para num, no intervalo Procurar divisor para num, no intervalo [ 2, [ 2, ]; ];

if (não encontrar divisor para num)if (não encontrar divisor para num)

3ª Etapa

Desenvolvimento de:Desenvolvimento de:

Procurar divisor para num, no intervalo [ 2, Procurar divisor para num, no intervalo [ 2, ]; ];

if (não encontrar divisor para num)if (não encontrar divisor para num)

div = 2;div = 2;

while ((não encontrar divisor) && (divwhile ((não encontrar divisor) && (div22 <= <= num)) {num)) {

Testar div;Testar div;

if (div é divisor de num)if (div é divisor de num)

Encontrou divisor;Encontrou divisor;

else div++;else div++;

}}

if (não encontrar divisor para num)if (não encontrar divisor para num)

4ª Etapa

int n, num, cont, div;Declarações

div = 2;div = 2;

while ((não encontrar divisor) && (divwhile ((não encontrar divisor) && (div22 <= <= num)) {num)) {

Testar div;Testar div;

if (div é divisor de num)if (div é divisor de num)

Encontrou divisor;Encontrou divisor;

else div++;else div++;

}}

if (não encontrar divisor para num)if (não encontrar divisor para num)

5ª e última Etapa

int n, num, cont, div;Declarações

div = 2; achou = False;div = 2; achou = False;

while ((achou == False) && (divwhile ((achou == False) && (div22 <= num)) <= num)) {{

Testar div;Testar div;

if (div é divisor de num)if (div é divisor de num)

Encontrou divisor;Encontrou divisor;

else div++;else div++;

}}

if (achou == False)if (achou == False)

int n, num, cont, div;logic achou;

Declarações

5ª e última Etapa

div = 2; achou = False;div = 2; achou = False;

while ((achou == False) && (divwhile ((achou == False) && (div22 <= num)) <= num)) {{

Testar div;Testar div;

if (div é divisor de num)if (div é divisor de num)

Encontrou divisor;Encontrou divisor;

else div++;else div++;

}}

if (achou == False)if (achou == False)

int n, num, cont, div;logic achou;

Declarações

5ª e última Etapa

div = 2; achou = False;div = 2; achou = False;

while ((achou == False) && (divwhile ((achou == False) && (div22 <= num)) <= num)) {{

resto = num % div;resto = num % div;

if (resto == 0)if (resto == 0)

achou = True;achou = True;

else div++;else div++;

}}

if (achou == False)if (achou == False)

int n, num, cont, div, resto;logic achou;

Declarações

5ª e última Etapa

Copia-se este trecho no resultado da 2ª Etapa

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

write (“Relacao dos n primeiros numeros write (“Relacao dos n primeiros numeros primos”);primos”);

write (“Digite o valor de n:”); read (n);write (“Digite o valor de n:”); read (n);

if (n <= 0) write (n, “ - valor improprio para n”);if (n <= 0) write (n, “ - valor improprio para n”);

else {else {

num = 2; cont = 0;num = 2; cont = 0;

do {do {

Testar se num é primo;Testar se num é primo;

if (num é primo) {if (num é primo) {

write (num); cont++;write (num); cont++;

}}

num++;num++;

} while (cont < n);} while (cont < n);

}}

}}

Faltam detalhes

int n, num, cont;Declarações

N_PrimeirosNúmerosPrimos {N_PrimeirosNúmerosPrimos {

int n, num, cont, div, resto; logic achou;int n, num, cont, div, resto; logic achou;

write (“Relacao dos n primeiros numeros primos”);write (“Relacao dos n primeiros numeros primos”);

write (“Digite o valor de n:”); read (n);write (“Digite o valor de n:”); read (n);

if (n <= 0) write (n, “ - valor improprio para n”);if (n <= 0) write (n, “ - valor improprio para n”);

else {else {

num = 2; cont = 0;num = 2; cont = 0;

do {do {

div = 2; achou = False;div = 2; achou = False;

while ((achou == False) && (divwhile ((achou == False) && (div22 <= num)) { <= num)) {

resto = num % div;resto = num % div;

if (resto == 0) achou = True;if (resto == 0) achou = True;

else div++;else div++;

}}

if (achou == False)if (achou == False)

{ write (num); cont++; }{ write (num); cont++; }

num++;num++;

} while (cont < n);} while (cont < n);

}}

}}

Obs.: todos os comandos resolvem problemas triviais e já podem ser traduzidos para a Linguagem C

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

/*/* Declaracao do tipo e das constantes logicas */Declaracao do tipo e das constantes logicas */

typedef char logic;typedef char logic;

const logic True = 1, False = 0;const logic True = 1, False = 0;

/*/* Cabecalho e declaracoes das variaveis locais */Cabecalho e declaracoes das variaveis locais */

int main () {int main () {

int n, num, cont, div, resto; logic achou; int n, num, cont, div, resto; logic achou;

/*/* Escrita do titulo e leitura de n */Escrita do titulo e leitura de n */

printf ("Relacao dos n primeiros numeros primos");printf ("Relacao dos n primeiros numeros primos");

printf ("\n\n\tDigite o valor de n: "); scanf ("%d", printf ("\n\n\tDigite o valor de n: "); scanf ("%d", &n);&n);

printf ("\n"); printf ("\n");

/*/* Caso de valor improprio para n */Caso de valor improprio para n */

if (n <= 0) printf ("%d - valor improprio para n", n); if (n <= 0) printf ("%d - valor improprio para n", n);

/*/* Caso de valor correto para nCaso de valor correto para n

Procura dos n primeiros numeros primos */Procura dos n primeiros numeros primos */

else {else {

num = 2; cont = 0;num = 2; cont = 0;

do {do {

/*/* Procura de divisor para um numero */Procura de divisor para um numero */

div = 2; achou = False;div = 2; achou = False;

while ((achou == False) && (div*div while ((achou == False) && (div*div <= num)) {<= num)) {

resto = num % div;resto = num % div;

if (resto == 0) achou = True;if (resto == 0) achou = True;

else div++;else div++;

}}

/*/* Escrita de cada numero primo encontrado;Escrita de cada numero primo encontrado;

10 numeros em cada linha10 numeros em cada linha */*/

if (achou == False) {if (achou == False) {

printf ("%5d", num); cont++;printf ("%5d", num); cont++;

if (cont % 10 == 0) printf ("\n");if (cont % 10 == 0) printf ("\n");

}}

Não será usado ‘for’, pois o último comando do ‘while’ é um ‘if’

/*/* Preparando para testar o proximo numero,Preparando para testar o proximo numero,

ate que os n primeiros numeros primos sejam ate que os n primeiros numeros primos sejam encontrados */encontrados */

num++;num++;

} while (cont < n);} while (cont < n);

}}

/*/* Fechamento da tela de execucao */Fechamento da tela de execucao */

printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;

}} Relacao dos n primeiros numeros primos

Digite o valor de n: 26

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101

Digite algo para encerrar:

Resultado para n = 26

4.7.3 – Desenvolvimento de um 4.7.3 – Desenvolvimento de um algoritmo para encontrar os fatores algoritmo para encontrar os fatores primos de números lidosprimos de números lidos

Requisitos para o Requisitos para o

programa:programa:

Gerar relatórios do Gerar relatórios do

tipo:tipo:

FATORES PRIMOS DE NUMEROS INTEIROS

Fatorar numero? (s/n): s

Digite o numero: 504

Fatores primos de 504: 2^3 3^2 7^1

Fatorar numero? (s/n): s

Digite o numero: 348

Fatores primos de 348: 2^2 3^1 29^1

Fatorar numero? (s/n): s

Digite o numero: 750

Fatores primos de 750: 2^1 3^1 5^3

Fatorar numero? (s/n): n

Pressione qualquer tecla para continuar. . .

Método: ilustrado com os fatores primos de Método: ilustrado com os fatores primos de 504, 348 e 750504, 348 e 750

504 2252 2

126 263 3

21 3

7 7

1

348 2174 2

87 329 29

1

750 2375 3

125 525 5

5 5

1

Encontrar o próximo primo como divisor é de programação trabalhosa

Mais fácil é testar divisores consecutivos a partir de 2

Desenvolvimento do algoritmo por “top-Desenvolvimento do algoritmo por “top-down”:down”:

1ª Etapa:1ª Etapa:

FatoresPrimos {FatoresPrimos {

Escrever o título da tarefa;Escrever o título da tarefa;

Perguntar se quer fatorar número;Perguntar se quer fatorar número;

Aguardar a resposta; Aguardar a resposta;

Enquanto a resposta for sim {Enquanto a resposta for sim {

Perguntar qual o número;Perguntar qual o número;

Aguardar o número;Aguardar o número;

Fatorar o número e escrever seus fatores;Fatorar o número e escrever seus fatores;

Perguntar se quer fatorar outro número;Perguntar se quer fatorar outro número;

Aguardar a resposta; Aguardar a resposta;

}}

}}

FatoresPrimos {FatoresPrimos {

Escrever o título da tarefa;Escrever o título da tarefa;

Perguntar se quer fatorar número;Perguntar se quer fatorar número;

Aguardar a resposta; Aguardar a resposta;

Enquanto a resposta for sim {Enquanto a resposta for sim {

Perguntar qual o número;Perguntar qual o número;

Aguardar o número;Aguardar o número;

Fatorar o número e escrever seus fatores;Fatorar o número e escrever seus fatores;

Perguntar se quer fatorar outro número;Perguntar se quer fatorar outro número;

Aguardar a resposta; Aguardar a resposta;

}}

}}

2ª Etapa

FatoresPrimos {FatoresPrimos {

write (“FATORES PRIMOS DE NUMEROS write (“FATORES PRIMOS DE NUMEROS INTEIROS”);INTEIROS”);

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta); read (resposta);

Enquanto a resposta for sim {Enquanto a resposta for sim {

Perguntar qual o número;Perguntar qual o número;

Aguardar o número;Aguardar o número;

Fatorar o número e escrever seus fatores;Fatorar o número e escrever seus fatores;

Perguntar se quer fatorar outro número;Perguntar se quer fatorar outro número;

Aguardar a resposta; Aguardar a resposta;

}}

}}

2ª Etapa

char resposta;

FatoresPrimos {FatoresPrimos {

write (“FATORES PRIMOS DE NUMEROS write (“FATORES PRIMOS DE NUMEROS INTEIROS”);INTEIROS”);

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta);read (resposta);

Enquanto a resposta for sim {Enquanto a resposta for sim {

Perguntar qual o número;Perguntar qual o número;

Aguardar o número;Aguardar o número;

Fatorar o número e escrever seus fatores;Fatorar o número e escrever seus fatores;

Perguntar se quer fatorar outro número;Perguntar se quer fatorar outro número;

Aguardar a resposta; Aguardar a resposta;

}}

}}

2ª Etapa

char resposta;

FatoresPrimos {FatoresPrimos {

write (“FATORES PRIMOS DE NUMEROS write (“FATORES PRIMOS DE NUMEROS INTEIROS”);INTEIROS”);

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta);read (resposta);

while (resposta == ‘s’ || resposta == ‘S’) {while (resposta == ‘s’ || resposta == ‘S’) {

Perguntar qual o número;Perguntar qual o número;

Aguardar o número;Aguardar o número;

Fatorar o número e escrever seus fatores;Fatorar o número e escrever seus fatores;

Perguntar se quer fatorar outro número;Perguntar se quer fatorar outro número;

Aguardar a resposta; Aguardar a resposta;

}}

}}

2ª Etapa

char resposta;

FatoresPrimos {FatoresPrimos {

write (“FATORES PRIMOS DE NUMEROS write (“FATORES PRIMOS DE NUMEROS INTEIROS”);INTEIROS”);

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta);read (resposta);

while (resposta == ‘s’ || resposta == ‘S’) {while (resposta == ‘s’ || resposta == ‘S’) {

Perguntar qual o número;Perguntar qual o número;

Aguardar o número;Aguardar o número;

Fatorar o número e escrever seus fatores;Fatorar o número e escrever seus fatores;

Perguntar se quer fatorar outro número;Perguntar se quer fatorar outro número;

Aguardar a resposta; Aguardar a resposta;

}}

}}

2ª Etapa

char resposta;

FatoresPrimos {FatoresPrimos {

write (“FATORES PRIMOS DE NUMEROS write (“FATORES PRIMOS DE NUMEROS INTEIROS”);INTEIROS”);

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta);read (resposta);

while (resposta == ‘s’ || resposta == ‘S’) {while (resposta == ‘s’ || resposta == ‘S’) {

write (“Digite o numero:”);write (“Digite o numero:”);

read (num);read (num);

Fatorar o número e escrever seus fatores;Fatorar o número e escrever seus fatores;

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta); read (resposta);

}}

}}

2ª Etapa

char resposta;int num;

FatoresPrimos {FatoresPrimos {

write (“FATORES PRIMOS DE NUMEROS write (“FATORES PRIMOS DE NUMEROS INTEIROS”);INTEIROS”);

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta);read (resposta);

while (resposta == ‘s’ || resposta == ‘S’) {while (resposta == ‘s’ || resposta == ‘S’) {

write (“Digite o numero:”);write (“Digite o numero:”);

read (num);read (num);

Fatorar o número e escrever seus fatores; Fatorar o número e escrever seus fatores;

write (“Fatorar numero? (s/n): ”);write (“Fatorar numero? (s/n): ”);

read (resposta); read (resposta);

}}

}}

2ª Etapa

char resposta;int num;

A ser desenvolvido na próxima etapa

Desenvolvimento de Desenvolvimento de Fatorar num e escrever Fatorar num e escrever seus fatoresseus fatores::

504 504 % 2 = 02252 252 % 2 = 02

126 126 % 2 = 02

2 * 2 ≤ 504

63 63 % 2 ≠ 03 * 3 ≤ 63

63 % 3 = 03

21 21 % 3 = 03

7 4 * 4 > 77

1

3x

2x

1x

504 = 23 * 32 * 71

7 % 3 ≠ 0

3ª Etapa

Copiar ‘num’ numa variável ‘aux’

Dividir ‘aux’ pelos fatores encontrados

aux

Fatores devem ser procurados em[2, ]

Aqui, aux é primo

Desenvolvimento de Desenvolvimento de Fatorar num e escrever Fatorar num e escrever seus fatoresseus fatores::

348 348 % 2 = 02174 174 % 2 = 02

87 3

2 * 2 ≤ 348

2987 % 2 ≠ 03 * 3 ≤

8787 % 3 = 0

29

14 * 4 ≤ 29

2x

1x1x

348 = 22 * 31 * 291

29 % 3 ≠ 029 % 4 ≠ 05 * 5 ≤ 29

29 % 5 ≠ 06 * 6 > 29

3ª Etapa

Aqui, aux é primo

aux

Desenvolvimento de Desenvolvimento de Fatorar num e escrever Fatorar num e escrever seus fatoresseus fatores::

750 750 % 2 = 02375 375 % 2 ≠ 03

125

375 % 3 = 0

5

2 * 2 ≤ 750

25125 % 3 ≠ 0

3 * 3 ≤ 375 125 % 4 ≠ 0

5

5

125 % 5 = 0

5

1

4 * 4 ≤ 1253x

1x1x

750 = 21 * 31 * 53

25 % 5 = 0

5 * 5 ≤ 125

5 % 5 = 0

3ª Etapa

Aqui, aux não é primo

Terminada a procura de fatores em [2, ], se aux > 1, então aux é um fator de expoente 1

aux

Desenvolvimento de Desenvolvimento de Fatorar num e escrever Fatorar num e escrever seus fatoresseus fatores::

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num;aux = num;

Procurar fatores para aux no intervalo [2, Procurar fatores para aux no intervalo [2, ]]Atualizando o valor de aux, ou seja Atualizando o valor de aux, ou seja

Dividindo aux pelos fatores encontradosDividindo aux pelos fatores encontrados

Imprimindo cada fator ao lado de seu Imprimindo cada fator ao lado de seu expoenteexpoente

Testar se aux restante é um fator;Testar se aux restante é um fator;

3ª Etapa

char resposta;int num, aux;

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num;aux = num;

Procurar fatores para aux no intervalo [2, Procurar fatores para aux no intervalo [2, ]]Atualizando o valor de aux, ou seja Atualizando o valor de aux, ou seja

Dividindo aux pelos fatores encontradosDividindo aux pelos fatores encontrados

imprimindo cada fator ao lado de seu imprimindo cada fator ao lado de seu expoenteexpoente

Testar se aux restante é um fator;Testar se aux restante é um fator;

4ª Etapa

char resposta;int num, aux;

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num; aux = num;

fat = 2;fat = 2;

while (fatwhile (fat22 <= aux ) { <= aux ) {

Calcular expoente de fat e atualizar aux;Calcular expoente de fat e atualizar aux;

se expoente de fat > 0se expoente de fat > 0

Escrever fat ao lado do expoente;Escrever fat ao lado do expoente;

fat++;fat++;

}}

Testar se aux restante é um fator;Testar se aux restante é um fator;

4ª Etapa

char resposta;int num, aux, fat;

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num; aux = num;

fat = 2;fat = 2;

while (fatwhile (fat22 <= aux ) { <= aux ) {

Calcular expoente de fat e atualizar aux;Calcular expoente de fat e atualizar aux;

se expoente de fat > 0se expoente de fat > 0

Escrever fat ao lado do expoente;Escrever fat ao lado do expoente;

fat++;fat++;

}}

Testar se aux restante é um fator;Testar se aux restante é um fator;

4ª Etapa

char resposta;int num, aux, fat;

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num; aux = num;

fat = 2;fat = 2;

while (fatwhile (fat22 <= aux ) { <= aux ) {

Calcular expoente de fat e atualizar aux;Calcular expoente de fat e atualizar aux;

se expoente de fat > 0se expoente de fat > 0

Escrever fat ao lado do expoente;Escrever fat ao lado do expoente;

fat++;fat++;

}}

if (aux > 1 || num == 1)if (aux > 1 || num == 1)

write (aux, “^1”);write (aux, “^1”);

4ª Etapa

char resposta;int num, aux, fat;

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num; aux = num;

fat = 2;fat = 2;

while (fatwhile (fat22 <= aux ) { <= aux ) {

Calcular expoente de fat e atualizar aux;Calcular expoente de fat e atualizar aux;

se expoente de fat > 0se expoente de fat > 0

Escrever fat ao lado do expoente;Escrever fat ao lado do expoente;

fat++;fat++;

}}

if (aux > 1 || num == 1)if (aux > 1 || num == 1)

write (aux, “^1”);write (aux, “^1”);

5ª Etapa

char resposta;int num, aux, fat;

fat = 2;fat = 2;

while (fatwhile (fat22 <= aux ) { <= aux ) {

Calcular expoente de fat e atualizar aux;Calcular expoente de fat e atualizar aux;

se expoente de fat > 0se expoente de fat > 0

Escrever fat ao lado do expoente;Escrever fat ao lado do expoente;

fat++;fat++;

}}

5ª Etapa

char resposta;int num, aux, fat;

fat = 2;fat = 2;

while (fatwhile (fat22 <= aux ) { <= aux ) {

expo = 0;expo = 0;

while (aux % fat == 0) {while (aux % fat == 0) {

expo++;expo++;

aux /= fat;aux /= fat;

}}

if (expo > 0)if (expo > 0)

write (fat, “^”, expo);write (fat, “^”, expo);

fat++;fat++;

}}

5ª Etapa

char resposta;int num, aux, fat, expo;

FatoresPrimos {FatoresPrimos {

char resposta; int num, aux, fat, expo; char resposta; int num, aux, fat, expo;

write (“FATORES PRIMOS DE NUMEROS INTEIROS”);write (“FATORES PRIMOS DE NUMEROS INTEIROS”);

write (“Fatorar numero? (s/n): ”); read (resposta);write (“Fatorar numero? (s/n): ”); read (resposta);

while (resposta == ‘s’ || resposta == ‘S’) {while (resposta == ‘s’ || resposta == ‘S’) {

write (“Digite o numero:”); read (num);write (“Digite o numero:”); read (num);

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num; fat = 2;aux = num; fat = 2;

while (fat*fat <= aux ) {while (fat*fat <= aux ) {

expo = 0;expo = 0;

while (aux % fat == 0) {while (aux % fat == 0) {

expo++; aux /= fat;expo++; aux /= fat;

}}

if (expo > 0) write (fat, “^”, expo);if (expo > 0) write (fat, “^”, expo);

fat++;fat++;

}}

if (aux > 1 || num == 1) write (aux, “^1”); if (aux > 1 || num == 1) write (aux, “^1”);

write (“Fatorar numero? (s/n): ”); read (resposta); write (“Fatorar numero? (s/n): ”); read (resposta);

}}

}}

Algoritmo final

FatoresPrimos {FatoresPrimos {

char resposta; int num, aux, fat, expo; char resposta; int num, aux, fat, expo;

write (“FATORES PRIMOS DE NUMEROS INTEIROS”);write (“FATORES PRIMOS DE NUMEROS INTEIROS”);

write (“Fatorar numero? (s/n): ”); read (resposta);write (“Fatorar numero? (s/n): ”); read (resposta);

while (resposta == ‘s’ || resposta == ‘S’) {while (resposta == ‘s’ || resposta == ‘S’) {

write (“Digite o numero:”); read (num);write (“Digite o numero:”); read (num);

write (“Fatores primos de ”, num, “:”);write (“Fatores primos de ”, num, “:”);

aux = num; aux = num;

for (fat = 2; fat*fat <= aux; fat++ ) {for (fat = 2; fat*fat <= aux; fat++ ) {

for (expo = 0; aux % fat == 0; expo++, aux /= for (expo = 0; aux % fat == 0; expo++, aux /= fat);fat);

if (expo > 0) write (fat, “^”, expo);if (expo > 0) write (fat, “^”, expo);

}}

if (aux > 1 || num == 1) write (aux, “^1”); if (aux > 1 || num == 1) write (aux, “^1”);

write (“Fatorar numero? (s/n): ”); read (resposta); write (“Fatorar numero? (s/n): ”); read (resposta);

}}

}}

Algoritmo final, usando comandos for

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>

/*/* Cabecalho e declaracoesCabecalho e declaracoes */*/

int main () {int main () {char resposta, lixo; int num, aux, fat, expo;char resposta, lixo; int num, aux, fat, expo;

/*/* Escrita do titulo da tarefa e oferecimento de servico ao Escrita do titulo da tarefa e oferecimento de servico ao operadoroperador */*/

printf ("FATORES PRIMOS DE NUMEROS INTEIROS");printf ("FATORES PRIMOS DE NUMEROS INTEIROS");printf ("\n\nFatorar numero? (s/n): "); scanf ("%c", printf ("\n\nFatorar numero? (s/n): "); scanf ("%c", &resposta);&resposta);while (resposta == 's' || resposta == 'S') {while (resposta == 's' || resposta == 'S') {

/*/* Solicitacao do numero a fatorar */Solicitacao do numero a fatorar */

printf ("\n\tDigite o numero: "); scanf ("%d%c", &num, printf ("\n\tDigite o numero: "); scanf ("%d%c", &num, &lixo);&lixo);printf ("\n\tFatores primos de %d: ", num);printf ("\n\tFatores primos de %d: ", num);

Programa em C

/*/* Pesquisa por fatores primos no intervalo [2, sqrt(aux)]Pesquisa por fatores primos no intervalo [2, sqrt(aux)]*/*/

aux = num;aux = num;

for (fat = 2; fat*fat <= aux; fat++) {for (fat = 2; fat*fat <= aux; fat++) {

/*/* Calculo do expoente de um fatorCalculo do expoente de um fator */*/

for (expo = 0; aux % fat == 0; expo++, for (expo = 0; aux % fat == 0; expo++, aux /= fat);aux /= fat);

/*/* Escrita de um fator ao lado de seu expoenteEscrita de um fator ao lado de seu expoente */*/

if (expo > 0) printf ("%d^%d ", fat, expo);if (expo > 0) printf ("%d^%d ", fat, expo);

}}

/*/* Testando se o ultimo aux eh fator primoTestando se o ultimo aux eh fator primo */*/

if (aux > 1 || num == 1) printf ("%d^1", aux);if (aux > 1 || num == 1) printf ("%d^1", aux);

/*/* Novo oferecimento de servico ao operadorNovo oferecimento de servico ao operador */*/

printf ("\n\nFatorar numero? (s/n): "); scanf printf ("\n\nFatorar numero? (s/n): "); scanf ("%c", &resposta);("%c", &resposta);

}}

/*/* Fechamento da tela */Fechamento da tela */

printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;

}}

top related