Title: Cap
1Capítulo IV Comandos de Controle de Fluxo
- 4.1 Comandos compostos
- 4.2 Comandos condicionais
- 4.3 Expressões condicionais
- 4.4 Comandos repetitivos
- 4.5 Comandos de escape
- 4.6 Comandos de seleção
- 4.7 Introdução à metodologia top-down
24.6 Comandos de Seleção
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
- 4.6.1 Importante estrutura algoritmica
3switch (Expressao) V11, V12, ... , V1i Lista
de Comandos V21, V22, ... , V2j Lista de
Comandos . . . . . . Vn1, Vn2, ... , Vnp
Lista de Comandos default Lista de Comandos
4- switch (Expressao)
- case V11 case V12 ... case V1i
- Lista de comandos break
- case V21 case V22 ... case V2j
- Lista de comandos break
- .
- .
- case Vn1 case Vn2 ... case Vnp
- Lista de comandos break
- default
- Lista de comandos
Em C
O comando break é necessário para que somente uma
lista de comandos seja executada
switch (Expressao) V11, V12, ... , V1i
Lista de Comandos V21, V22, ... , V2j Lista
de Comandos . . . . . . Vn1, Vn2, ... , Vnp
Lista de Comandos default Lista de
Comandos
Obs. o ramo default é opcional
5- include ltstdio.hgt
- include ltconio.hgt
- void main ( )
- char c int n
- printf ("Levantar o astral? (s/n) ") c
getche() - while (c 's' c 'S')
- printf ("\n\n\tDigite um numero de 1 a 7 ")
scanf ("d", n) - switch (n)
- case 1 printf ("\n\tVoce eh inteligente")
break - case 2 printf ("\n\tVoce eh campeao") break
- case 3 printf ("\n\tVoce estah com tudo")
break - case 4 printf ("\n\tSeu destino eh vencer")
break - case 5 printf ("\n\tTudo coopera para seu
sucesso") break - case 6 printf ("\n\tA vida sorri para voce")
break - case 7 printf ("\n\tNada pode impedir sua
vitoria") break - default printf ("\n\tO numero deve ser de 1 a
7") -
- printf ("\n\nLevantar o astral? (s/n) ") c
getche () -
Exemplo seja o seguinte programa
6- include ltstdio.hgt
- include ltconio.hgt
- void main ( )
- char c int n
- printf ("Levantar o astral? (s/n) ") c
getche() - while (c 's' c 'S')
- printf ("\n\n\tDigite um numero de 1 a 7 ")
scanf ("d", n) - switch (n)
- case 1 printf ("\n\tVoce eh inteligente")
- case 2 printf ("\n\tVoce eh campeao")
- case 3 printf ("\n\tVoce estah com tudo")
- case 4 printf ("\n\tSeu destino eh vencer")
- case 5 printf ("\n\tTudo coopera para seu
sucesso") - case 6 printf ("\n\tA vida sorri para voce")
- case 7 printf ("\n\tNada pode impedir sua
vitoria") - default printf ("\n\tO numero deve ser de 1 a
7") -
- printf ("\n\nLevantar o astral? (s/n) ") c
getche () -
Retirando-se os comandos break
7- Fluxograma do switch sem usar break
8- Exemplo programa para contar diversos tipos de
caracteres - Digitar uma frase, guardando-a no buffer do
teclado - Ler cada caractere da frase, classificando-o
- Acrescentar 1 ao contador da classe do caractere
- No final, escrever no vídeo o valor do contador
de cada classe
1) A ou a 2) E ou e 3) I ou i 4) O ou o 5) U ou
u 6) W ou w 7) Y ou y 8) Consoantes 9) Dígitos
decimais 10) Outros caracteres
Classes
9- include ltstdio.hgt
- include ltstdlib.hgt
- / Cabecalho e declaracoes /
- int main ( )
- char c
- int ct_a, ct_e, ct_i, ct_o, ct_u, ct_w, ct_y,
- ct_cons, ct_dig, ct_outros
- / Zerar todos os contadores /
- ct_a ct_e ct_i ct_o ct_u ct_w
- ct_y ct_cons ct_dig ct_outros 0
10- / Ler e classificar cada caractere /
- printf ("Digite uma frase\n\n\t") scanf ("c",
c) - while (c ! '\n')
- switch (c)
- case 'a' case 'A' ct_a break
- case 'e' case 'E' ct_e break
- case 'i' case 'I' ct_i break
- case 'o' case 'O' ct_o break
- case 'u' case 'U' ct_u break
- case 'w' case 'W' ct_w break
- case 'y' case 'Y' ct_y break
- default
- if (c gt '0' c lt '9') ct_dig
- else if (c gt 'B' c lt 'Z' c gt 'b'
c lt 'z') - ct_cons
- else ct_outros
-
- scanf ("c", c)
11- / Imprimir os contadores e fechar a tela/
- printf ("\nLetra A 3d\nLetra E 3d",
ct_a, ct_e) - printf ("\nLetra I 3d\nLetra O 3d",
ct_i, ct_o) - printf ("\nLetra U 3d\nLetra W 3d",
ct_u, ct_w) - printf ("\nLetra Y 3d\nConsoantes 3d",
ct_y, ct_cons) - printf ("\nDigitos 3d\nOutros 3d",
ct_dig, ct_outros) - printf ("\n\n") system ("pause") return 0
-
Resultado
Digite uma frase hberoçh 9g59y9
)_Y(HHU 3_at_UDFUYapok Letra A 1 Letra E
1 Letra I 0 Letra O 2 Letra U
3 Letra W 0 Letra Y 3 Consoantes
11 Digitos 5 Outros 14 Pressione . .
.
12- Exercícios 4.6
- Dizer que características uma frase digitada deve
ter para que o programa do próximo slide a
considere correta
13- include ltstdio.hgt
- include ltstdlib.hgt
- int main ( )
- char c, erro int c1, c2, c3, c4, c5, c6
- c1 c2 c3 c4 c5 c6 0 erro 0
printf ("Digite uma frase ") - do
- scanf ("c", c)
- if (c ! '\n')
- switch (c)
- case ' ( ' c1 break case ' ) '
c2 break - case ' ' c3 break case ' '
c4 break - case ' ' c5 break case ' '
c6 break -
- if (c2 gt c1 c4 gt c3 c6 gt c5)
erro 1 -
- while (c ! ' \n ' erro 0)
- if (erro 0 c1 c2 c3 c4
c5 c6) printf ("Frase correta") - else printf ("Frase com erros")
- printf ("\n\n") system ("pause") return 0
14Capítulo IV Comandos de Controle de Fluxo
- 4.1 Comandos compostos
- 4.2 Comandos condicionais
- 4.3 Expressões condicionais
- 4.4 Comandos repetitivos
- 4.5 Comandos de escape
- 4.6 Comandos de seleção
- 4.7 Introdução à metodologia top-down
154.7 Introdução à Metodologia Top-down
- 4.7.1 Conceito
- É a decomposição de uma grande tarefa numa
coleção de tarefas menores interligadas - Cada uma dessas tarefas menores pode ser
decomposta da mesma forma - No final, chega-se a uma coleção de tarefas
triviais interligadas - Cada uma delas poderá ser resolvida por um
comando típico dos algoritmos
16- 4.7.2 Desenvolvimento de um algoritmo para
encontrar os n primeiros números naturais primos - Método
- Por definição, 1 não é primo
- Percorrer o campo dos naturais, do no 2 em
diante, até encontrar n números primos
17- 4.7.2 Desenvolvimento de um algoritmo para
encontrar os n primeiros números naturais primos - Método
- Para ver se um número num é primo
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
18- Desenvolvimento do algoritmo por top-down
- 1ª Etapa
- N_PrimeirosNúmerosPrimos
- Escrever o título da tarefa
- Pedir e ler o valor de n
- Se (n lt 0) Escrever mensagem de erro
- Senão
- Encontrar e Escrever os n 1os números primos
-
19- N_PrimeirosNúmerosPrimos
- Escrever o título da tarefa
- Pedir e ler o valor de n
- Se (n lt 0) Escrever mensagem de erro
- Senão
- Encontrar e Escrever os n 1os números primos
-
2ª Etapa
20- N_PrimeirosNúmerosPrimos
- write (Relacao dos n primeiros numeros
primos) - write (Digite o valor de n) read (n)
- Se (n lt 0) Escrever mensagem de erro
- Senão
- Encontrar e Escrever os n 1os números primos
-
2ª Etapa
21- N_PrimeirosNúmerosPrimos
- write (Relacao dos n primeiros numeros
primos) - write (Digite o valor de n) read (n)
- Se (n lt 0) Escrever mensagem de erro
- Senão
- Encontrar e Escrever os n 1os números primos
-
2ª Etapa
22- N_PrimeirosNúmerosPrimos
- write (Relacao dos n primeiros numeros
primos) - write (Digite o valor de n) read (n)
- if (n lt 0) write (n, - valor improprio para
n) - else
- Encontrar e Escrever os n 1os números primos
-
2ª Etapa
23- N_PrimeirosNúmerosPrimos
- write (Relacao dos n primeiros numeros
primos) - write (Digite o valor de n) read (n)
- if (n lt 0) write (n, - valor improprio para
n) - else
- Encontrar e Escrever os n 1os números primos
-
2ª Etapa
24- N_PrimeirosNúmerosPrimos
- write (Relacao dos n primeiros numeros
primos) - write (Digite o valor de n) read (n)
- if (n lt 0) write (n, - valor improprio para
n) - else
- num 2 cont 0
- do
- Testar se num é primo
- if (num é primo)
- write (num) cont
-
- num
- while (cont lt n)
-
-
2ª Etapa
num número a ser testado cont contador de
números primos encontrados
Faltam detalhes
25- Desenvolvimento de
-
- Testar se num é primo
- if (num é primo)
- Procurar divisor para num, no intervalo 2, ?
? - if (não encontrar divisor para num)
3ª Etapa
26- Desenvolvimento de
-
- Procurar divisor para num, no intervalo 2, ?
? - if (não encontrar divisor para num)
- div 2
- while ((não encontrar divisor) (div2 lt num))
- Testar div
- if (div é divisor de num)
- Encontrou divisor
- else div
-
- if (não encontrar divisor para num)
4ª Etapa
27- div 2
- while ((não encontrar divisor) (div2 lt num))
- Testar div
- if (div é divisor de num)
- Encontrou divisor
- else div
-
- if (não encontrar divisor para num)
5ª e última Etapa
28- div 2 achou False
- while ((achou False) (div2 lt num))
- Testar div
- if (div é divisor de num)
- Encontrou divisor
- else div
-
- if (achou False)
5ª e última Etapa
29- div 2 achou False
- while ((achou False) (div2 lt num))
- Testar div
- if (div é divisor de num)
- Encontrou divisor
- else div
-
- if (achou False)
5ª e última Etapa
30- div 2 achou False
- while ((achou False) (div2 lt num))
- resto num div
- if (resto 0)
- achou True
- else div
-
- if (achou False)
5ª e última Etapa
Copia-se este trecho no resultado da 2ª Etapa
31- N_PrimeirosNúmerosPrimos
- write (Relacao dos n primeiros numeros
primos) - write (Digite o valor de n) read (n)
- if (n lt 0) write (n, - valor improprio para
n) - else
- num 2 cont 0
- do
- Testar se num é primo
- if (num é primo)
- write (num) cont
-
- num
- while (cont lt n)
-
-
Faltam detalhes
32- N_PrimeirosNúmerosPrimos
- int n, num, cont, div, resto logic achou
- write (Relacao dos n primeiros numeros
primos) - write (Digite o valor de n) read (n)
- if (n lt 0) write (n, - valor improprio para
n) - else
- num 2 cont 0
- do
- div 2 achou False
- while ((achou False) (div2 lt num))
- resto num div
- if (resto 0) achou True
- else div
-
- if (achou False)
- write (num) cont
- num
- while (cont lt n)
-
Obs. todos os comandos resolvem problemas
triviais e já podem ser traduzidos para a
Linguagem C
33- include ltstdio.hgt
- include ltstdlib.hgt
- / Declaracao do tipo e das constantes logicas
/ - typedef char logic
- const logic True 1, False 0
- / Cabecalho e declaracoes das variaveis locais
/ - int main ()
- int n, num, cont, div, resto logic achou
34- / Escrita do titulo e leitura de n /
- printf ("Relacao dos n primeiros numeros
primos") - printf ("\n\n\tDigite o valor de n ") scanf
("d", n) - printf ("\n")
- / Caso de valor improprio para n /
- if (n lt 0) printf ("d - valor improprio para
n", n) - / Caso de valor correto para n
- Procura dos n primeiros numeros primos /
- else
- num 2 cont 0
- do
35- / Procura de divisor para um numero /
- div 2 achou False
- while ((achou False) (divdiv lt num))
- resto num div
- if (resto 0) achou True
- else div
-
- / Escrita de cada numero primo encontrado
- 10 numeros em cada linha /
- if (achou False)
- printf ("5d", num) cont
- if (cont 10 0) printf ("\n")
-
Não será usado for, pois o último comando do
while é um if
36- / Preparando para testar o proximo numero,
- ate que os n primeiros numeros primos sejam
encontrados / - num
- while (cont lt n)
-
- / Fechamento da tela de execucao /
- 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
37- 4.7.3 Desenvolvimento de um algoritmo para
encontrar os fatores primos de números lidos - Requisitos para o
- programa
- Gerar relatórios do
- tipo
FATORES PRIMOS DE NUMEROS INTEIROS Fatorar
numero? (s/n) s Digite o numero 504
Fatores primos de 504 23 32
71 Fatorar numero? (s/n) s Digite o
numero 348 Fatores primos de 348 22
31 291 Fatorar numero? (s/n) s
Digite o numero 750 Fatores primos de
750 21 31 53 Fatorar numero? (s/n)
n Pressione qualquer tecla para continuar. . .
38- Método ilustrado com os fatores primos de 504,
348 e 750
504
2
348
2
750
2
252
2
174
2
375
3
126
2
87
3
125
5
63
3
29
29
25
5
21
3
1
5
5
7
7
1
1
Encontrar o próximo primo como divisor é de
programação trabalhosa Mais fácil é testar
divisores consecutivos a partir de 2
39- Desenvolvimento do algoritmo por top-down
- 1ª Etapa
- FatoresPrimos
- Escrever o título da tarefa
- Perguntar se quer fatorar número
- Aguardar a resposta
- Enquanto a resposta for sim
- Perguntar qual o número
- Aguardar o número
- Fatorar o número e escrever seus fatores
- Perguntar se quer fatorar outro número
- Aguardar a resposta
-
-
40- FatoresPrimos
- Escrever o título da tarefa
- Perguntar se quer fatorar número
- Aguardar a resposta
- Enquanto a resposta for sim
- Perguntar qual o número
- Aguardar o número
- Fatorar o número e escrever seus fatores
- Perguntar se quer fatorar outro número
- Aguardar a resposta
-
-
2ª Etapa
41- FatoresPrimos
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) )
- read (resposta)
- Enquanto a resposta for sim
- Perguntar qual o número
- Aguardar o número
- Fatorar o número e escrever seus fatores
- Perguntar se quer fatorar outro número
- Aguardar a resposta
-
-
2ª Etapa
char resposta
42- FatoresPrimos
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) )
- read (resposta)
- Enquanto a resposta for sim
- Perguntar qual o número
- Aguardar o número
- Fatorar o número e escrever seus fatores
- Perguntar se quer fatorar outro número
- Aguardar a resposta
-
-
2ª Etapa
char resposta
43- FatoresPrimos
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) )
- read (resposta)
- while (resposta s resposta S)
- Perguntar qual o número
- Aguardar o número
- Fatorar o número e escrever seus fatores
- Perguntar se quer fatorar outro número
- Aguardar a resposta
-
-
2ª Etapa
char resposta
44- FatoresPrimos
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) )
- read (resposta)
- while (resposta s resposta S)
- Perguntar qual o número
- Aguardar o número
- Fatorar o número e escrever seus fatores
- Perguntar se quer fatorar outro número
- Aguardar a resposta
-
-
2ª Etapa
char resposta
45- FatoresPrimos
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) )
- read (resposta)
- while (resposta s resposta S)
- write (Digite o numero)
- read (num)
- Fatorar o número e escrever seus fatores
- write (Fatorar numero? (s/n) )
- read (resposta)
-
-
2ª Etapa
char resposta int num
46- FatoresPrimos
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) )
- read (resposta)
- while (resposta s resposta S)
- write (Digite o numero)
- read (num)
- Fatorar o número e escrever seus fatores
- write (Fatorar numero? (s/n) )
- read (resposta)
-
-
2ª Etapa
A ser desenvolvido na próxima etapa
char resposta int num
47- Desenvolvimento de Fatorar num e escrever seus
fatores
504
504 2 0
2
2 2 504
252
252 2 0
2
3x
126
126 2 0
2
aux
63
3
63 2 ? 0
3 3 63
63 3 0
2x
21
3
21 3 0
1x
7
7
4 4 gt 7
7 3 ? 0
1
Copiar num numa variável aux Dividir aux
pelos fatores encontrados
Aqui, aux é primo
504 23 32 71
3ª Etapa
48- Desenvolvimento de Fatorar num e escrever seus
fatores
348
348 2 0
2
2 2 348
2x
174
174 2 0
2
1x
87
3
87 2 ? 0
3 3 87
87 3 0
1x
aux
29
29
4 4 29
29 3 ? 0
29 4 ? 0
5 5 29
29 5 ? 0
6 6 gt 29
1
Aqui, aux é primo
348 22 31 291
3ª Etapa
49- Desenvolvimento de Fatorar num e escrever seus
fatores
750
750 2 0
2
2 2 750
1x
375
375 2 ? 0
3
375 3 0
3 3 375
1x
125
5
125 3 ? 0
125 4 ? 0
125 5 0
4 4 125
5 5 125
aux
25
5
3x
25 5 0
5
5
5 5 0
1
Aqui, aux não é primo
750 21 31 53
3ª Etapa
50- Desenvolvimento de Fatorar num e escrever seus
fatores - write (Fatores primos de , num, )
- aux num
- Procurar fatores para aux no intervalo 2, ?
? - Atualizando o valor de aux, ou seja
- Dividindo aux pelos fatores encontrados
- Imprimindo cada fator ao lado de seu expoente
- Testar se aux restante é um fator
char resposta int num, aux
3ª Etapa
51- write (Fatores primos de , num, )
- aux num
- Procurar fatores para aux no intervalo 2, ?
? - Atualizando o valor de aux, ou seja
- Dividindo aux pelos fatores encontrados
- imprimindo cada fator ao lado de seu expoente
- Testar se aux restante é um fator
char resposta int num, aux
4ª Etapa
52- write (Fatores primos de , num, )
- aux num
- fat 2
- while (fat2 lt aux )
- Calcular expoente de fat e atualizar aux
- se expoente de fat gt 0
- Escrever fat ao lado do expoente
- fat
-
- Testar se aux restante é um fator
char resposta int num, aux, fat
4ª Etapa
53- write (Fatores primos de , num, )
- aux num
- fat 2
- while (fat2 lt aux )
- Calcular expoente de fat e atualizar aux
- se expoente de fat gt 0
- Escrever fat ao lado do expoente
- fat
-
- Testar se aux restante é um fator
char resposta int num, aux, fat
4ª Etapa
54- write (Fatores primos de , num, )
- aux num
- fat 2
- while (fat2 lt aux )
- Calcular expoente de fat e atualizar aux
- se expoente de fat gt 0
- Escrever fat ao lado do expoente
- fat
-
- if (aux gt 1 num 1)
- write (aux, 1)
char resposta int num, aux, fat
4ª Etapa
55- write (Fatores primos de , num, )
- aux num
- fat 2
- while (fat2 lt aux )
- Calcular expoente de fat e atualizar aux
- se expoente de fat gt 0
- Escrever fat ao lado do expoente
- fat
-
- if (aux gt 1 num 1)
- write (aux, 1)
5ª Etapa
char resposta int num, aux, fat
56- fat 2
- while (fat2 lt aux )
- Calcular expoente de fat e atualizar aux
- se expoente de fat gt 0
- Escrever fat ao lado do expoente
- fat
5ª Etapa
char resposta int num, aux, fat
57- fat 2
- while (fat2 lt aux )
- expo 0
- while (aux fat 0)
- expo
- aux / fat
-
- if (expo gt 0)
- write (fat, , expo)
- fat
5ª Etapa
char resposta int num, aux, fat, expo
58- FatoresPrimos
- char resposta int num, aux, fat, expo
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) ) read
(resposta) - while (resposta s resposta S)
- write (Digite o numero) read (num)
- write (Fatores primos de , num, )
- aux num fat 2
- while (fatfat lt aux )
- expo 0
- while (aux fat 0)
- expo aux / fat
-
- if (expo gt 0) write (fat, , expo)
- fat
-
- if (aux gt 1 num 1) write (aux, 1)
- write (Fatorar numero? (s/n) ) read
(resposta) -
Algoritmo final
59- FatoresPrimos
- char resposta int num, aux, fat, expo
- write (FATORES PRIMOS DE NUMEROS INTEIROS)
- write (Fatorar numero? (s/n) ) read
(resposta) - while (resposta s resposta S)
- write (Digite o numero) read (num)
- write (Fatores primos de , num, )
- aux num
- for (fat 2 fatfat lt aux fat )
- for (expo 0 aux fat 0 expo, aux /
fat) - if (expo gt 0) write (fat, , expo)
-
- if (aux gt 1 num 1) write (aux, 1)
- write (Fatorar numero? (s/n) ) read
(resposta) -
Algoritmo final, usando comandos for
60- include ltstdio.hgt
- include ltstdlib.hgt
- / Cabecalho e declaracoes /
- int main ()
- char resposta, lixo int num, aux, fat, expo
- / Escrita do titulo da tarefa e oferecimento de
servico ao operador / - printf ("FATORES PRIMOS DE NUMEROS INTEIROS")
- printf ("\n\nFatorar numero? (s/n) ") scanf
("c", resposta) - while (resposta 's' resposta 'S')
- / Solicitacao do numero a fatorar /
- printf ("\n\tDigite o numero ") scanf ("dc",
num, lixo) - printf ("\n\tFatores primos de d ", num)
Programa em C
61- / Pesquisa por fatores primos no intervalo 2,
sqrt(aux) / - aux num
- for (fat 2 fatfat lt aux fat)
- / Calculo do expoente de um fator /
- for (expo 0 aux fat 0 expo, aux /
fat) - / Escrita de um fator ao lado de seu expoente /
- if (expo gt 0) printf ("dd ", fat, expo)
-
62- / Testando se o ultimo aux eh fator primo /
- if (aux gt 1 num 1) printf ("d1", aux)
- / Novo oferecimento de servico ao operador /
- printf ("\n\nFatorar numero? (s/n) ") scanf
("c", resposta) -
- / Fechamento da tela /
- printf ("\n\n") system ("pause") return 0
-