463 45 86MB
Portuguese Pages [337] Year 2016
-
1
José Augusto N. G. Manzano Jayr Figueiredo de Oliveira
Algoritmos Lógica para Desenvolvimento de Programação de Computadores
28ª Edição Revisada e atualizada
C!J ér1ca I Saraiva •
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
2
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
ISBN 978-85-365-1865-7 DADOS INTERNACIONAIS DE CATALOGAÇÃO NA PUBLICAÇÃO (CIP) ANGÉLICA ILACQUA CRB-8fl057
o SOMOS EDUCAÇAO
Editora
Saraiva
Av. das Nações Unidas, 7221, 1°Andar, Setor B Pinheiros - São Paulo - SP - CEP: 05425-902
SAC
0800-0117875 De 2ª a 6ª, das 8h30 às 19h30 www.editorasaraiva.com.br/contato
Vice-presidente Diretor de soluções para ensino técnico Coordenação editorial Assistente editorial Produtora editorial Assistente de produção Produção gráfica
Cláudio Lensing Francisco Carlos D' Emilio Borges Rosiane Ap. Marinho Botelho Raquel F. Abranches Rosana Ap. Alves dos Santos Graziele Liborni Liliane Cristina Gomes
Manzano, José Augusto N. G. Algoritmos : lógica para desenvolvimento de programação de computadores / José Augusto N. G. Manzano, Jayr Figueiredo de Oliveira. - 28. ed. - São Paulo : Érica, 2016. Bibliografia. ISBN 978-85-365-1865-7 1. Algoritmos 2. Dados -Estruturas (Ciência da Computação) 1. Título li. Oliveira, Jayr Figueiredo de 16-0358
Editado também como livro impresso
CDD 005.1 CDU 004.41
Índices para catálogo sistemático: 1. Algorltmos: Computadores: Programação: Processamento de dados
Copyright© José Augusto N. G. Manzano, Jayr Figueiredo de Oliveira 2009 (original) 28ª edição 2016 Saraiva Educação Todos os direitos reservados.
28!! edição
Preparação Carla de Oliveira Morais Revisão Diagramação Capa Impressão e acabamento
Marlene T. Santin Alves LGB Publicações Maurício S. de França Nonono
Os Autores e a Editora acreditam que todas as informações aqui apresentadas estão corretas e podem ser utilizadas para qualquer fim legal. Entretanto, não existe qualquer garantia, explícita ou implícita, de que o uso de tais informações conduzirá sempre ao resultado desejado. Os nomes de sites e empresas, porventura mencionados, foram utilizados apenas para ilustrar os exemplos, não tendo vínculo nenhum com o livro, não garantindo a sua existência nem divulgação. Eventuais erratas estarão disponíveis para download no site da Editora Saraiva. A Ilustração de capa e algumas imagens de miolo foram retiradas de , empresa com a qual se mantém contrato ativo na data de publicação do livro. Outras foram obtidas da Coleção MasterClips/MasterPhotos©da IMSI, 100 Rowland Way, 3rd floor Novato, CA 94945, USA, edo CorelDRAW X5 eX6, Corei Gallery e Corei Corporation Samples. Corei Corporation e seus licenciadores. Todos os direitos reservados. Todos os esforços foram feitos para creditar devidamente os detentores dos direitos das imagens utilizadas neste livro. Eventuais omissões de crédito e copyright não são intencionais e serão devidamente solucionadas nas próximas edições, bastando que seus proprietários contatem os editores. Nenhuma parte desta publicação poderá ser reproduzida por qualquer meio ou forma sem a prévia autorização da Saraiva Educação. A violação dos direitos autorais é crime estabelecido na lei nº 9.610/98 e punido pelo artigo 184 do Código Penal. 280.014.028.001
,
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
3
Dedicatória À minha esposa Sandra, Sol do meu dia, Lua da minha noite, vento que me abraça em seu amor, brisa que refresca minha alma, chuva que acalenta o meu ser. Te amo, te amo, te amo. À minha filha Audrey, encanto de pessoa, flor que enfeita meu caminho e o de minha esposa. Aos meus alunos que, com suas dúvidas, perguntas e questionamentos, fazem com que eu me aprimore cada vez mais. Um grande abraço a todos. Augusto Manzano
Aos meus amores, dedico este trabalho: À minha mãe Dorothy com todo o meu carinho, admiração e respeito. À Marcella pelo companheirismo, paciência e motivação. Aos meus filhos lsabella e Raphael, meus tesouros. Ao meu único e fiel amigo Don. Lembrem-se: minha família é minha vida. Jayr Figueiredo
"Amarás o Senhor teu Deus, com todo teu coração, com toda tua alma e com toda tua mente." Mateus · 22, 37
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
4
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Agradecimentos Ao amigo e editor Antonio Marco, que desde o nosso primeiro contato confiou no meu trabalho, principalmente neste que se concretiza; Aos amigos e professores Wilson Yamatumi, Roberto Affonso, Paulo Giovani, Avelino Bazanela e André Zanin pela constante troca de ideias e discussões técnicas. Augusto Manzano
Aos meus alunos, cujas exigências e anseios cobram um aprofundamento maior do meu universo de conhecimentos. Jayr Figueiredo
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
5
Sumário Capítulo 1 • Abordagem Contextual ............................................................................................................. 13 1.1 Introdução à Computação •••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •••••••••••• 13 1.2 Mercado Computacional •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •••••••••••• 19 1.3 Linguagens de Programação .............................................................................................................. 21 1.4 Paradigmas de Programação .............................................................................................................. 23 Capítulo 2 • Algoritmos e a Lógica de Programação ••••••••••••••••• ••• ••• ••• ••• ••• •••••••••••••••• ••• ••• ••• ••• ••• •••••••••••••••••• 24 2.1 Algoritmos Computacionais................................................................................................................. 24 2.2 Cozinha x Computador........................................................................................................................ 25 2.3 Lógica de Programação de Computadores ......................................................................................... 27 2.4 Compiladores, Interpretadores e Tradutores ••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• 38 2.5 Linguagemde Programação de Computadores •••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• 39 Capítulo 3 • Programação com SE!(ILIE!lll:lél •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 42 3.1 Etapas de Ação de um Computador ................................................................................................... 42 3.2 Tipos de Dados Primitivos ou Dados Básicos ..................................................................................... 43 3.3 O Uso de Variáveis ............................................................................................................................. 44 3.4 O Uso de Constantes .......................................................................................................................... 46 3.5 Os Operadores A.ritméticos ................................................................................................................. 46 3.6 Expressões A.ritmét.icas ....................................................................................................................... 47 3. 7 1nstruções e Comandos ...................................................................................................................... 48 3.8 Exercício de Aprendizagem ................................................................................................................ 49 3.9 Exercícios de Fixação ••• •••• ••• ••• •• •• •• • •• • •• • •• • •• • •• • •• • •• ••••••••••• • •••• •• •••• • •• • ••••• • •• • •• • •• • •• • •••• • ••••• • ••••••• • •• • •• • ••••• ••••••• 55 A
•
Capítulo 4 • Programação com Decisão ••••••••••••• ••• ••• •••••• ••• ••••••••••••••••••• ••• ••• ••• •••••••••••••••••••••• ••• ••• •••••• ••• ••••••••• 58 4.1 Ser Programador ...... •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •••••••••••• 58 4.2 Decisões, Condições e Operadores Relacionais ••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••• 59 4.3 Desvio Condicional Simples .... • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• 60 4.4 Desvio Condicional Composto • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• 62 4.5 Outras Formas de Desvios Condicionais ............................................................................................ 64 4.6 Operadores Lógicos ..... • • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • • • • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •••••••••••• 75 4. 7 Divisibilidade: Múltiplos e Divisores •• •• • •• • •• • ••••••••••••••• ••• ••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••••••••• • •••••••••••• 87 4.8 Exercício de Aprendizagem • • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •••••••••••• 91 4.9 Exercícios de Fixação ••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •••••••••••• 96
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
6
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Capítulo 5 • Programação com Laços ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 100 5.1 Ser Programador •••••••• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • •••• 100 5.2 Laços ou Malhas (Loopings ou Loops) • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •••• 101 5.3 Laço Condicional Pré-Teste • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •••• 101 5.4 Laço Condicional Pós-Teste ••••••• ••• •• •••• ••• • •• • •• • •• • •• • •• • •• • •• • ••••••• • •••• ••• •••••• •••••• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •••• 109 5.5 Laço Condicional Seletivo •••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •••• 117 5.6 Laço Incondicional ................ .. • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••• • •• • •• • •• • •• • •• • •••• 119 5. 7 Considerações entre Tipos de Laços •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••• 121 5.8 Exercício de Aprendizagem ••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •••• 122 5.9 Exercícios de Fixação • •••••••••••• ••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • • 130 Capítulo 6 • Estruturas de Dados Homogêneas de Uma Dimensão ••••• ••• •••••• ••• ••••••••••••••••••••••••• ••• ••• ••• ••• • 132 6.1 Ser Programador •• ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •••••• • •• • •• • •• • •• • •• • •••• 132 6.2 Matrizes de Uma Dimensão ••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •••• 133 6.3 Exercício de Aprendizagem ••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •••• 138 6.4 Exercícios de Fixação • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •••• 143 Capítulo 7 • Aplicações Básicas com Matrizes de Uma Dimensão •••• ••• ••• •••••• ••• •••••••••••••••• ••• ••• ••• ••• •••••••••• 146 7.1 Ser Programador ................ .. •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••• • •• • •• • •• • •• • •• • •••• 146 7.2 Classificação de Elementos •••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• ••• • •• • •• • •• • •••• 147 7.3 Métodos de Pesquisa de Elementos • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •••• 154 7.4 Utilização de Matrizes Dinâmicas •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • • 164 7.5 Exercício de Aprendizagem ••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •••• 165 7.6 Exercícios de Fixação • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •••• 173 Capítulo 8 • Estruturas de Dados Homogêneas de Duas Dimensões ••••• •••••• ••• ••• •••••••••••••••••••••• ••• ••• ••• ••• • 175 8.1 Ser Programador .. ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •••••• • •• • •• • •• • •• • •• • •••• 175 8.2 Matrizes com Mais de Uma Dimensão .............................................................................................. 176 8.3 Matrizes de Duas Dimensões ............................................................................................................ 177 8.4 Exercício de Aprendizagem •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •••• 180 8.5 Exercícios de Fixação • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •••• 187 Capítulo 9 • Estruturas de Dados Heterogêneas •••••••• ••• •••••• ••• ••••••••••••••••••• ••• ••• ••• •••••• •••••••••••••••• ••• ••• ••• ••• •••• 190 9.1 Ser Programador .......... •• •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •••••• • •• • •• • •• • •• • •• • •••• 190 9.2 Tipo de Dado Derivado: Estrutura de Registro.••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••• 191 9.3 Estrutura de Registro de Matriz .. •••• • ••••• • • •••••• •••••• • •• • •• • •• • •• • •••• • ••••• • • •••••• •••••• • •• • •• • •• • •• • •••• • ••••• • • • •• • •• • •• • •• • •• • • 195 9.4 Estrutura de Matriz de Registros ••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • • 199 9.5 Exercício de Aprendizagem ............................................................................................................... 201 9.6 E.xercícios de Fixação ....................................................................................................................... 208
•
Editora Erica - Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
7
Capítulo 10 • Subprogramas ••••••• ••• ••• ••• ••• ••• ••••••••••••••••••• ••• ••• ••• ••• ••••••••••••••••••• ••• •••••• ••• ••• ••••••••••••• ••• ••• ••• ••• ••••••• 209 10.1 Ser Programador • •• • •• • •• • •••••••••••• • •• • • •• •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••• • •• • •• • •••••••••• 209 10.2 Modularidade ................................................................................................................................... 21O 10.3 Métodos Top-Down e Bottom-Up ••••••••• • •• • •• • •• • • •• •• • •• • •• • •••• • •••• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • ••••••• 210 10.4 Procedimentos • •• • •• • •• • •• ••••••••••• • •••• •• •••• • •• • •• • •• • •• • •• • •• • ••• •••• • ••••• • •••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • •••••• • •• • •• • •• • ••••• ••••• 212 10.5 Escopo de Variáveis.......... • • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •••••••••• 219 10.6 Passagens de Parâmetros • •• • ••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• ••••••••••••• • 222 10.7 Funções e Recursividade .... •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •••••••••• 226 10.8 Exercício de Aprendizagem •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• ••••••••••••• • 231 10.9 Exercícios de Fixação •• ••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• • •• • •• • •••••••••• 259 Capítulo 11 • Programação Orientada a Objetos ••••••••••• ••• ••• ••• ••••••••••••••••••• ••• ••• ••• ••• •••••••••••••••• ••• •••••• ••• ••••••• 263 11.1 Origem •••• ••• ••• • •• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • •• • ••••••••• • 263 11.2 PE versus POO ............................................................................................................................... 265 11.3 Fundamentação •• •• • •• • •• • •• • ••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• • •• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •••••••••• 266 11.4 Polimorfismo ou Poliformismo ......................................................................................................... 269 11.5 Resumo dos Termos Empregados na POO .................................................................................... 270 Capítulo 12 • Aplicação Básica de POO ••••••••••••••••••• ••• ••• ••• ••• ••• •••••••••••••••• ••• ••• ••• ••• ••• •••••••••••••••• ••• ••• ••• ••• ••••••• 272 12.1 Fundamentação •• •• • •• • •• • •• • •••••••••••• ••• ••• • •• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •• • •• • •• • •••••••••••• ••• ••• ••• • •• • •• • •••••••••• 272 12.2 Classe e Objeto •• • •• • •• • •• • •• • •••••••••• • • • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••• • • • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••• • •••• • •• • •• • •• • •• • •••••••••• 274 12.3 Método E.xterno ............................................................................................................................... 276 12.4 Método Interno • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •••••••••• 279 12.5 Herança ............ .• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••• • •• • •• • •• • •• • ••••••••• • 282 12.6 Encapsulamento • • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••••••••••••••• • •• • •• • •• • •• • •• • •• • •• • •• • •• • •• • ••• • •• • •• • •••••••••• 289 12. 7 Poliformismo.................................................................................................................................... 295 12.8 Classes e Método A.migas ............................................................................................................... 307 Apêndice A - Resolução de Alguns Exercícios de Fixação ••• ••••••••• ••• •••••• ••• ••••••••••••••••••• ••• ••• ••• ••• ••• ••••••• ••• 312 Apêndice B - Exemplos de Codificação .................................................................................................... 316 Apêndice C - Comparativo de Instruções entre Linguagens de Programação ..................................... 330 Bil:>lio~rélfia................................................................................................................................................... 331
•
Editora Erica - Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
8
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Sobre os Autores José Augusto N. G. Manzano Brasileiro, nascido no Estado de São Paulo, na capital, em 26 de abril de 1965, é professor e mestre, possui formação em Análise de Sistemas e Ciências Econômicas e licenciatura em Matemática. Atua na área de Tecnologia da Informação (desenvolvimento de software, ensino e treinamento) desde 1986. Participou do desenvolvimento de aplicações computacionais para áreas de telecomunicações e comércio. Na carreira docente iniciou sua atividade em cursos livres, trabalhando posteriormente em empresas de treinamento e atuando nos ensinos técnico e superior. Trabalhou em empresas na área como ABAK, SERVIMEC, CEBEL, SPCI, BEPE, ORIGIN, OpenClass, entre outras. Atualmente é professor com dedicação exclusiva no IFSP (Instituto Federal de Educação, Ciência e Tecnologia de São Paulo, antiga Escola Técnica Federal). Em sua carreira docente, possui condições de ministrar componentes curriculares de Lógica de Programação (Algoritmos), Estrutura de Dados, Microinformática, Informática, Linguagens de Programação Estruturada, Linguagens de Programação Orientada a Objetos, Engenharia de Software, Tópicos Avançados em Processamento de Dados, Sistemas de Informação, Engenharia da Informação, Arquitetura de Computadores e Tecnologias Web. Possui conhecimento de uso e aplicação das linguagens de programação BASIC CLASSIC, COMAL Assembly, LOGO, PASCAL, FORTRAN, C, C++, D, JAVA (JSP), MODULA-2, STRUCTURED BASIC, C#, Lua, HTML, XHTML, JavaScript, PHP, VBA e ADA. É autor de mais de 100 obras, além de artigos publicados no Brasil e no exterior.
Jayr Figueiredo de Oliveira Pós-doutorado em Administração na área de Sistemas e Tecnologias da Informação (Universidade de São Paulo - FEA/USP); doutorado em Educação na área de Novas Tecnologias; mestrado em Administração e Planejamento (Pontifícia Universidade Católica - PUC/SP); especializações em Administração de Sistemas (FECAP), Didática do Ensino Superior e Ciência da Computação (Universidade Presbiteriana Mackenzie) e MBA em Inovação, Tecnologia e Conhecimento (FEA/USP); bacharel em Administração de Empresas. Atua desde 1977 como profissional em Administração de Sistemas de Informação e, desde 1985, como docente em Educação Superior, tendo ocupado, em ambas as atividades, inúmeros cargos de chefia. Publicou mais de 15 livros e inúmeros artigos nas áreas de Sistemas e Tecnologias da Informação, Liderança, Gestão Organizacional e Negócios .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
9
Prefácio Este trabalho surgiu da necessidade de conciliar o ensino de técnicas de programação com os programas curriculares das instituições de ensino em que trabalhamos e também eventualmente de outras escolas, principalmente na condução de atividades relacionadas aos cursos técnicos e tecnológicos. No decorrer dos vários anos nesta lida com o ensino, como educadores e professores sentimos falta de um material que atendesse às nossas necessidades e expectativas básicas e também às dos educandos e alunos a nós confiados. Esta obra traz o máximo de detalhes para a aprendizagem do programador iniciante no estudo da lógica de programação de computadores, desde o uso do paradigma da programação estruturada até as principais noções de uso do paradigma da programação orientada a objetos, de tal forma que não necessite buscar, em um primeiro momento, informações complementares em outras obras. Com relação ao estudo de algoritmos, o enfoque central é feito em três etapas: primeiramente a fase de entendimento, descrita muitas vezes em passos numerados, chegando a parecer uma receita culinária; uma segunda forma de algoritmo baseada na representação gráfica do raciocínio lógico por meio de diagrama de blocos a partir do uso da norma ISO 5807:1985; e, por último, o algoritmo textual codificado na forma de português estruturado, considerado uma pseudolinguagem de programação. Este texto está dividido em cinco partes e abrange um programa de estudo de técnicas de programação. A primeira parte traz informações introdutórias e conceituais a respeito de lógica de programação, mercado de trabalho, organização de computadores, entre outros assuntos. A segunda enfatiza a prática do estudo de lógica, começando pelos pontos básicos, passa pelo estudo de técnicas de programação com decisões e laços. A terceira parte apresenta algumas técnicas auxiliares para facilitar a organização de dados em memória. A quarta destaca a programação de forma estruturada, com o uso de sub-rotinas e orientação a objetos. A quinta parte (apêndices) fornece a resolução de alguns exercícios de fixação e também alguns exemplos de codificação de programas escritos nas linguagens formais de programação PASCAL, BASIC (em modo estruturado sintaxe Quick BASIC e Visual Basic .Net), C, C++ e Lua, além da codificação em português estruturado. Esperamos, sinceramente, que este trabalho seja bastante útil não só ao aluno, mas também ao amigo professor, pois foi elaborado com base em experiências adquiridas em sala de aula, que resultou um material bastante didático. Um abraço a todos!
Os autores
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
10
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Carta ao Professor Prezado amigo educador e professor, Não é à toa que uma obra literária chega até a edição que esta contempla, principalmente por se tratar de um livro técnico para a área de desenvolvimento de software. Neste contexto, esta obra pode ser considerada um best-se/ler e, por isso, temos muito a agradecer aos leitores, principalmente ao amigo educador que, nesses anos de jornada, legitimou nosso trabalho, indicando-o a seus educandos e alunos, confiandonos a tarefa de vetores na transmissão deste conhecimento. Quem nos acompanha conhece nossa trajetória e a trajetória de nosso trabalho em relação a esta obra, que se iniciou como uma proposta diminuta no ano de 1996 e, ao longo dos anos de publicação, incorporou diversos conceitos de programação, tanto do paradigma da programação estruturada como do paradigma da programação orientada a objetos. Cabe ressaltar que como livro de algoritmos este trabalho é pioneiro no sentido de apresentar as técnicas de orientação a objetos com aplicação da norma ISO 5807:1985, tema considerado por muitos profissionais da área como impossível de ser tratado. O pioneirismo alcançado por este trabalho não se reflete só no Brasil, mas também em outros países. Os livros tradicionais de algoritmos focam no uso das estruturas básicas de programação, tais como sequências, decisões, laços, matrizes e sub-rotinas; ou no uso das técnicas de estrutura de dados sob a ótica da programação estruturada. Não que esta ótica não seja importante; tanto é importante que é tratada neste livro. O diferencial deste texto é o fato de acrescentar a dinâmica de uso da ótica voltada à orientação a objetos, contextualizada à luz da norma ISO 5807: 1985 em conjunto com os diagramas de classe e objeto da UML. A primeira edição desta obra foi publicada no primeiro semestre de 1996 para atender, principalmente, a uma necessidade particular e foi escrita de uma forma muito simples. No mesmo ano tivemos a surpresa de sair a segunda edição. Este foi o sinal de que a obra teria futuro, e desde então são publicadas cerca de duas ou três edições por ano, até que, no segundo semestre de 2000, surgiu a décima edição, quatro anos depois do lançamento da primeira edição. Só para ter uma ideia, no primeiro semestre de 2000 foram publicadas duas edições, sendo a oitava e a nona. A vigésima edição desta obra foi publicada em 2006, ou seja, seis anos após a décima edição. Apesar da aparente queda na quantidade de edições entre a décima e a vigésima, continuamos otimistas, pois, na verdade, as condições de mercado levaram a essa queda, e não o nosso trabalho. Esse efeito nos fez repensar nosso trabalho, pois até a nona edição a obra amadureceu, foram feitas algumas mudanças, melhorias e correções implementadas. Da sétima para a oitava edição foram acrescentados novos exercícios. Da décima até a décima quinta edição ocorreram alguns novos ajustes. A partir da décima sexta edição, o livro conta com mais de cento e quarenta exercícios de lógica de programação de computador, enquanto a primeira edição traz em torno de setenta exercícios. Entre a décima sexta e até a vigésima primeira edição foram feitos pequenos ajustes e algumas correções necessárias, porém mantendo a obra praticamente com a mesma estrutura, desde a primeira edição. A partir da vigésima segunda edição (2009) este livro sofre grande reforma e atualização na estrutura do texto, saindo de uma fase infantil para sua adolescência. Foram acrescentados novos detalhes técnicos, alguns pontos foram ajustados e realinhados. Foram incluídos dois capítulos de introdução à programação orientada a objetos apresentados de forma inédita; um aborda os conceitos em si e o outro mostra alguns exemplos de aplicação da programação orientada a objetos por meio do uso de diagramas de UML (diagrama de classe e objeto) e de diagramas de blocos, segundo a norma internacional ISO 5807:1985. Acreditamos que elevamos a qualidade da obra, tornando-a mais confortável para o trabalho tanto dos colegas educadores quanto de nossos alunos e educandos.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
11
Depois vieram, entre 2009 e 2010, a vigésima terceira e a vigésima quarta edições, que necessitaram de alguns pequenos ajustes e acertos. A vigésima quarta edição foi apresentada em duas reimpressões, sendo uma no ano de 201 Oe a outra no primeiro semestre de 2011. Ainda em 2011, chegamos à vigésima quinta edição, com algumas mudanças que, apesar de pequenas, foram significativas, principalmente nos capítulos 5 e 10. No capítulo 5, o comando português estruturado continua passa a ser denominado execute, tornando a proposta mais direta e mais clara do ponto de vista do idioma português. No capítulo 1O, os programas de manipulação de pilha e fila foram reescritos para exemplificar melhor o uso de sub-rotinas e passagens de parâmetro. Na vigésima quinta edição foram acrescidos alguns exercícios de fixação em alguns capítulos. Na vigésima sexta edição foram efetuados pequenos ajustes ao longo de todo o texto, como pequenas correções que se fizeram necessárias. A novidade foi acréscimo, no capítulo 12, do tema classes e funções amigas, ajustes de algumas figuras como o diagrama de Venn para o operador de negação, além de deixar mais clara as explicações dos conceitos de orientação a objetos. Alguns pequenos ajustes ocorreram nas três reimpressões da vigésima sexta edição, entre eles algumas melhorias nas figuras do capítulo 12. Com a vigésima sétima edição, publicada em 2014, ocorreram alguns ajustes na obra, sendo o acréscimo do tópico 1.1.4 no capítulo 5, com a definição de dados e informações; algumas melhorias no texto do capítulo 2 e o acréscimo do tópico 2.5 abordando o tema sobre linguagem de programação de computadores; e alguns ajustes leves nos textos dos capítulos 3, 1O e 12, além de alguns ajustes nos códigos dos programas do apêndice B. Com esta vigésima oitava edição, de 2016, que contempla pequenos ajustes ao longo de todo o texto, principalmente nos capítulos 1, 5 e 6, que tiveram como acréscimo a implementação de um exemplo de uso de matriz em estilo dinâmico. Nesta edição foram realizadas mudanças mais radicais no capítulo 12, pois desde a vigésima segunda edição, quando foi introduzido de forma inédita em um livro de algoritmos o uso de princípios do paradigma de programação orientação a objeto, sentimos que seu conteúdo necessitava ser melhorado no quesito simplicidade. Assim, o texto foi revisto e diversos ajustes foram implementados, bem como alguns elementos considerados desnecessários foram retirados, como a definição de herança pública, privada ou protegida usados na linguagem C++ e não necessários em português estruturado. A intenção deste capítulo é apresentar, de forma introdutória, o paradigma de programação orientada a objetos com maior grau de simplicidade possível e, por isso, recebeu maior atenção neste momento. Outro detalhe inserido é o exemplo do programa calculadora, codificado na linguagem de programação D. À medida que as edições deste livro avançam, vemos a necessidade de inserir novos exercícios de fixação e outros detalhes que, em certo momento, não tínhamos notado serem importantes ou que deixamos passar despercebidos. Os ajustes que foram, são e serão feitos futuramente ocorrem da prática do uso do livro em sala de aula e da interação dos alunos com o material. No decorrer da condução das aulas, as perguntas e as dúvidas desses alunos acabam fornecendo um norte, direcionando o livro para este público. Outro fator que interfere nesta prática de atualizações é o fato de este ser um trabalho pioneiro no estudo de algoritmos, com abordagem direcionada à orientação a objetos até então não tratada em obras deste escopo. Sabemos que, em certo momento, quando o trabalho chegar a uma fase mais adulta, essa atitude não mais ocorrerá, pois os espaços existentes para essa estratégia estão sendo preenchidos. Nossa intenção é ampliar ao máximo a possibilidade de o educador selecionar a bateria de exercícios de acordo com o nível do curso ministrado. Como de costume, esperamos que nosso trabalho (por mais simples que seja, por mais básico que possa parecer) facilite a tarefa do amigo educador na preparação e na condução de suas aulas. Cordialmente, um grande abraço! Os autores
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
12
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Carta ao Aluno Prezado aluno, Normalmente, alguns profissionais (a partir da década de 1980) e mesmo alguns alunos dizem que é perda de tempo desenvolver o algoritmo (diagrama de blocos e pseudocódigo) de um programa, que é bem mais prático e rápido desenvolvê-lo diretamente em um computador, porém geralmente não conseguem entregar seus programas ou sistemas nos prazos estipulados. Quando julgam estar com seus programas prontos, acabam por descobrir uma série de erros de lógica e de sintaxe. Esses erros fazem com que o programador fique sentado por horas ou mesmo dias em frente ao computador, tentando localizar o que está errado, e assim acaba ultrapassando os prazos. O excesso de erros de sintaxe denota um "profissional" com pouca experiência na utilização de uma determinada linguagem de programação, enquanto erros de lógica mostram grande despreparo na "arte" de programar um computador. Acreditando que os erros podem ser retirados no momento da compilação de um programa, as pessoas perdem muito mais tempo do que imaginam, e assim entram em um círculo vicioso de querer resolver o problema (erros de sintaxe e de lógica) por tentativa e erro, o que é abominável do ponto de vista profissional. Imagine se outros profissionais, como engenheiros, comandantes de aeronaves, médicos, advogados, entre outros, pensassem desta forma. Certamente a humanidade estaria com sérios problemas, se é que ainda estaria habitando este planeta. Até o final da década de 1970, os programadores e demais profissionais da então denominada área de informática, hoje área de tecnologia da informação, seguiam rigorosos procedimentos para o desenvolvimento de programas e sistemas, o que resultava em produtos de excelente qualidade, dentro dos prazos estabelecidos. Com o surgimento dos microcomputadores e sua popular utilização a partir de meados da década de 1970, alguns novos "profissionais" da área passaram a deixar de lado os procedimentos adequados e adquiriram vícios e defeitos graves. Muitos desses "profissionais", sem o devido preparo, passaram a achar que os conceitos até então utilizados eram ultrapassados e abrir mão deles traria maior velocidade na entrega de trabalhos. Infelizmente essa mentalidade espalhou-se por praticamente todo o mundo, apesar de alguns profissionais verdadeiramente sérios tentarem orientar de forma contrária. Imagine uma prova de maratona com vários corredores. Assim que é dada a largada, alguns saem correndo desesperados para ficar à frente dos demais corredores. Algum tempo depois, sem fôlego, acabam perdendo o ritmo e também sua posição, normalmente chegando nos últimos lugares. Enquanto alguns saem correndo de forma desesperada, outros procuram poupar-se e, quando estão quase no final, usam o fôlego para disputar os primeiros lugares. Assim como um corredor experiente, um programador de computadores precisa saber poupar-se. É melhor ir devagar no início do desenvolvimento do que achar que, ao pular algumas etapas, conseguirá ganhar a corrida. Fazer os algoritmos preliminares de um programa pode parecer demorado, porém essa atitude proporciona uma visão adequada de todo o problema, garantindo ausência de erros de lógica no programa final. Esperamos, sinceramente, que este trabalho seja muito útil ao seu aprendizado e proporcione as condições básicas necessárias para que consiga alçar voos mais altos. Pedimos que preste atenção ao que lhe é ensinado pelo professor em sala de aula e faça todos os exercícios de fixação solicitados, consultando o professor sempre que surgirem dúvidas. Cordialmente, um grande abraço! Os autores
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Abordagem Contextual
Capítulo 1
13
Abordagem Contextual
Este capítulo apresenta os detalhes gerais que norteiam a área da computação. Traz uma introdução aos elementos conceituais da área e de seu desenvolvimento. Mostra a organização de um computador eletrônico e indica as unidades de medidas utilizadas. Aborda detalhes da tabela ASCII, apresenta informações do mercado de computação, das linguagens de programação e sua classificação.
1.1 Introdução à Computação A necessidade de desenvolver ferramentas que facilitassem o uso e o manuseio de operações de cálculos fez com que o ser humano chegasse ao estágio atual de desenvolvimento da área da computação. Esse processo teve início há muito tempo, com o surgimento do primeiro computador denominado ábaco, Figura 1.1, por volta de 3.500 a.e. na região da Mesopotâmia, passando por China e Japão (ALCALDE, GARCIA & PENUELAS, 1991, p. 8) e seu uso estende-se até o século XXI. Não é objetivo desta obra estender-se em méritos históricos ou tecer explanações sobre a arquitetura dos computadores, pois existem trabalhos muito bons sobre este assunto já publi-cados. No entanto, faz-se necessário passar ao iniciante no aprendizado da programação de computadores uma rápida visão da estrutura de um computador e sua funcionalidade. Assim sendo, o primeiro item a ser entendido é o termo computador.
Figura 1.1 · Ábaco japonês.
A palavra computador origina-se do latim computatore, que significa "aquele que efetua cálculos". No contexto desta obra, o termo computador está associado a um equipamento eletrônico capaz de executar algumas etapas de trabalho, como receber, armazenar, processar lógica e aritmeticamente dados com o objetivo principal de resolver problemas.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
14
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
O computador eletrônico como se conhece atualmente origina-se das ideias estabelecidas pelo cientista, matemático e filósofo inglês Charles Babbage, Figura 1.2, que no ano de 1834 apresentou as ideias da máquina analítica, considerada precursora dos computadores eletrônicos mais modernos, apesar de, naquela ocasião, a área de eletrônica ainda não ter sido desenvolvida. Charles Babbage nasceu em 26 de dezembro de 1791 e faleceu em 18 de outubro de 1871. Figura 1.2 • Charles Babbage.
Malvino (1985, p. 6) afirma que: A palavra "computador' é ilusória porque sugere uma máquina que pode resolver somente problemas numéricos. Mas um computador é mais do que uma máquina automática de somar. Ele pode executar jogos, traduzir idiomas, desenhar imagem etc. Para sugerir esta ampla faixa de aplicações, um computador muitas vezes é denominado processador de dados.
1.1.1 Organização de um Computador O computador eletrônico é uma coleção de componentes interligados com o objetivo de efetuar (processar) operações aritméticas e lógicas de grandes quantidades de dados. A Figura 1.3 mostra de forma esquemática os componentes de um computador eletrônico. Memória principal Memória ROM
Memória RAM
'
•
••
.. .... . . ..
.
'•
•
Unidade central de processamento Unidade de entrada
. •
-
~
Unidade lógica e aritmética . . .
Registradories •
l -
--
.
Unidade de
controle
Unidade de
~
-. L
-
saída
'•
' Memória secundária
Figura 1.3 ·Estruturados componentes de um computador eletrônico.
O componente denominado unidade de entrada é responsável pela entrada de dados no computador. Os dados inseridos em um computador podem ser armazenados no componente memória secundária ou processados no componente memória principal, mais precisamente na memória RAM (Random Access Memory - Memória de Acesso Randômico). Esse tipo de componente pode ser representado pelos periféricos teclado, scanner, mouse, câmeras de vídeo, arquivos, sensores de movimento, entre outros componentes. O componente unidade de saída é responsável pela apresentação de dados e/ou informações que tenham sido processados na memória principal ou que estejam armazenados na memória secundária do computador. Esse tipo de componente pode ser representado pelos periféricos monitores de vídeo, impressoras, arquivos, entre outros .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Abordagem Contextual
Capítulo 1
15
O componente denominado unidade central de processamento é responsável pelo controle das operações de entrada e de saída de um computador. Além disso, esse componente é também responsável por todo o controle operacional, sendo o "cérebro" e o "sistema nervoso" de um computador. A unidade central de processamento é, grosso modo, subdividida em três componentes auxiliares, a saber:
~ ~
A unidade lógica e aritmética é responsável por processar operações matemáticas (unidade aritmética) e/ou operações lógicas (unidade lógica). Esse componente é sem dúvida o mais importante da CPU. Os registradores são componentes de memória que apresentam alta performance de velocidade na execução de instruções de processamento aritmético ou lógico. A unidade de controle executa instruções de controle do computador. Dependendo da instrução executada, esse componente faz o desvio do controle para a unidade lógica ou unidade aritmética ou, ainda, envia dados para componentes externos à CPU.
A memória principal é formada principalmente pelos componentes de memórias RAM e ROM (Read Only Memory- Memória Somente de Leitura). ~
A memória RAM é utilizada pela CPU para manter temporariamente dados e instruções que são usados no processamento. O controle operacional da execução de instruções e armazenamento de dados nessa memória é realizado por um conjunto de circuitos lógicos. Por esta razão, esse tipo de operação é muito rápido. Apesar de possuir vantagem na velocidade de execução, essa memória é volátil, ou seja, os dados nela armazenados são perdidos quando o computador é desligado ou tem seu sistema reinicializado. A memória ROM é utilizada pela CPU para inicializar o computador quando é ligado e faz a busca do sistema operacional instalado em memória secundária, a qual gerencia as funções de trabalho e permite usar o computador de forma mais fácil. A memória ROM não pode ser alterada ou regravada como ocorre com os dados e instruções da memória RAM, pois nela estão gravadas as características definidas pelo fabricante do computador em uso.
A memória secundária, também conhecida como memória de massa, tem por finalidade armazenar dados em longo prazo, pois os dados armazenados nesse tipo de memória são preservados mesmo quando o computador estiver desligado. Essa memória possui, normalmente, acesso lento. São exemplos os periféricos de armazenamento: disquetes, discos rígidos (winchesters), pen drives, cartões de memória, entre outros.
1.1.2 Unidades de Medidas Computacionais A menor unidade de dado manipulada por um computador eletrônico chama-se bit (binary digit - dígito binário), o qual é matematicamente representado pelos valores numéricos "1" (um) e "O" (zero). Os valores binários são eletronicamente usados pelo computador para representar estados eletromagnéticos dos circuitos que compõem a sua estrutura funcional e assim possibilitam representar dados do mundo exterior, além de estabelecer as bases de funcionamento da própria máquina. O estado eletrônico "1" representa a ativação (ligamento) de um determinado recurso ou circuito interno, enquanto o estado eletrônico "O" representa a desativação (desligamento) de um determinado recurso ou circuito interno. Note que um computador eletrônico opera com dados binários, ou seja, opera na base dois. O computador tem a capacidade de utilizar dados e informações do mundo exterior e representá-los de forma binária em seus circuitos e memórias. Assim sendo, os dados básicos existentes no mundo exterior,
•
Editora Erica - Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
16
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
como dados numéricos e alfabéticos, incluindo os símbolos de pontuação, possuem um valor binário particular para representá-los no computador. A representação de um dado externo na memória de um computador usa um octeto de bits, denominado, em inglês, byte. Desta forma, um byte (que representa um caractere qualquer) é um conjunto de oito bits. Tomando por base o valor numérico dois referente à base de operação interna de um computador eletrônico (o bit) e elevando esse valor ao expoente oito referente à quantidade de bits de um byte (28), obtém-se o valor 256, que é a quantidade máxima de caracteres que podem ser usados em um computador eletrônico. A estratégia de uso de dígitos binários pelos computadores permite maior armazenamento de dados em memória do que se essa mesma tarefa utilizasse dígitos decimais. Se fossem usados dígitos decimais, haveria a necessidade de operar dez símbolos numéricos, o que seria um desperdício de memória e exigiria processadores mais complexos. Por meio dos dígitos binários, consegue-se fazer uso de 256 caracteres diferentes que são mais do que suficientes para representar caracteres alfabéticos, numéricos e de pontuação que, na prática, utilizam apenas 128 das 256 possibilidades, sobrando ainda um conjunto de 128 bytes para a representação de outros caracteres particulares e de uso específico dos fabricantes de computadores (hardware) e dos desenvolvedores de programas (software). A partir da definição da base binária é estabelecido um padrão de mensuração da quantidade de caracteres que um computador pode usar tanto na memória principal quanto na memória secundária. É também pela quantidade de bits que se determina o padrão de processamento de um computador. Os primeiros microcomputadores Altair 8800 (1975), Apple li (1976) e TRS-80 Model 1 (1977) efetuavam seu processamento à taxa de oito bits. Esses equipamentos conseguiam processar apenas um byte por vez, ou seja, uma palavra por vez, uma word. Em 1980, a empresa IBM, que operava somente no mercado de computadores de grande porte (mainframes), lança seu primeiro microcomputador de 16 bits, chamado IBM-PC. A sigla PC vem de Personal Computer (computador pessoal) e é usada para classificar qualquer computador de pequeno porte. O IBM-PC tinha a capacidade de processar duas palavras por vez, ou seja, processava uma double word (palavra dupla). Depois, em 1984, a empresa Apple lança o microcomputador Macintosh, equipado com um microprocessador que operava à taxa de 32 bits, processava quatro palavras por vez, ou seja, uma quadword (palavra quádrupla). O padrão 32 bits foi seguido pela empresa Intel, a partir de 1985, e depois por seus concorrentes. A partir de 2003 a empresa AMO lança seu microprocessador, que trabalha à taxa de 64 bits, processando assim oito palavras por vez, ou seja, uma double quadword (palavra quádrupla dupla). O volume de dados a ser processado numa memória principal ou armazenado numa memória secundária é medido em relação à quantidade de bytes manipulados. A tabela seguinte apresenta algumas unidades de medida utilizadas. Unidade
Quantidade de caracteres
Bit (b)
Conjunto de dois bits que possibilita a ativação e a desativação de recursos e circuitos eletrônicos.
Byte (8)
Conjunto de oito bits que possibilita a definição e o uso de 256 (28) símbolos para representação de caracteres numéricos, alfabéticos, de pontuação e gráficos (opcional).
Kbyte (KB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária. 1 Kbyte (kilobyte) equivale a 1.024 caracteres, sendo obtido a partir de 210•
Mbyte (MB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária. 1 Mbyte (megabyte) equivale a 1.048.576 caracteres (1.024 Kbytes), sendo obtido a partir de 22º.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 1
Abordagem Contextual
17
Unidade
Quantidade de caracteres
Gbyte (GB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária. 1 Gbyte (gigabyte) equivale a 1.073.741.824 caracteres (1.024 Mbytes), sendo obtido a partir de 23º.
Tbyte (TB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária. 1 Tbyte (terabyte) equivale a 1.099.511.627.776 caracteres (1 .024 Gbytes), sendo obtido a partir de 24º.
Pbyte (PB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária. 1 Pbyte (petabyte) equivale a 1.125.899.906.842.624 caracteres (1.024 Tbytes), sendo obtido a partir de 2so.
Ebyte (EB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária. 1 Ebyte (exabyte) equivale a 1.152.921.504.606.846.976 caracteres (1.024 Pbytes), sendo obtido a partir de 26º.
Zbyte (ZB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária.1 Zbyte (zettabyte) equivale a 1.180.591.620.717.411.303.424 caracteres (1.024 Ebytes), sendo obtido a partir de 210.
Ybyte (YB)
Definição da quantidade de caracteres a ser utilizada e armazenada em memórias: principal e secundária. 1 Ybyte (yottabyte) equivale a 1.208.925.819.614.629.174.706.176 caracteres (1.024 Zbytes), sendo obtido a partir de 280 .
1.1.3 Tabela ASCII A representação dos 256 caracteres utilizados por computadores eletrônicos obedece à estrutura de uma tabela de caracteres oficial chamada ASCII (American Standard Code for lnformation lnterchange - Código Americano Padrão para Intercâmbio de Informações), a qual deve ser pronunciada como asquí e não asqui dois, como algumas pessoas inadvertidamente falam. A tabela ASCII, Figura 1.4, foi desenvolvida entre os anos de 1963 e 1968 com a participação e a colaboração de várias companhias de comunicação norte-americanas, com o objetivo de substituir o até então utilizado código de Baudot, o qual usava apenas cinco bits e possibilitava a obtenção de 32 combinações diferentes. Muito útil para manter a comunicação entre dois teleimpressores (telegrafia), conhecidos no Brasil como rede TELEX, operacionalizada pelos CORREIOS para envio de telegramas. O código de Baudot utilizava apenas os símbolos numéricos e letras maiúsculas, tornando-o impróprio para o intercâmbio de informações entre computadores. O código ASCII padrão permite a utilização de 128 símbolos diferentes (representados pelos códigos decimais de O até 127). Nesse conjunto de símbolos estão previstos o uso de 96 caracteres imprimíveis, como números, letras minúsculas, letras maiúsculas, símbolos de pontuação e caracteres não imprimíveis, como retorno do carro de impressão (carriege return - tecla ), retrocesso (backspace), salto de linha (fine feed), entre outros. Da possibilidade de uso dos 256 caracteres, faz-se uso apenas dos 128 primeiros, o que deixa um espaço para outros 128 caracteres estendidos endereçados pelos códigos decimais de 128 até 255. A parte da tabela endereçada de 128 até 255 é reservada para que os fabricantes de computadores e de programas de computador possam definir seus próprios símbolos .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
m a. ;:::;: o ii3
C") D)
O.
D)
m,
O
::!.
g
D) -,
~
e: D) - a. C") )> 3 CT D> O• a. ~ C") 9: ,, CD
D> ::::!• CC CÕ.
C/) C/)
" .....' .9'
-9? o e:, C/) -
o-,
3
CD• D>
ú
O CJ y
Y , :!:
=
~
o
CD
CI> CD
e:
CD CI>
C/)
C/)
CD
D>• $!?_
"' CX> 3 D)
o
-c,m-D> -,
3 a. o -,
-, CD
CI>
"-> _?)
CJ1 -, D>• _CJ"I CD
o D) _, a. º e: "CC/) a. CD o CD !::!: CD o~ < 3 N. ~ "C CD D> - · D> < o C/) o C") a. D) -, CD -, a D> 3 ;:::?._ :=:J 8 "C CD c: D) e: D) :=, 3 o g- 3 3 iiJ CD
a D)
g
C/)
.......
~-
D)
Q)
CD-,
-
- · ...+-
e: 5· oº
:=,
-g
-
D>
a. D) ÕCDa.O"CCT
3 CD -, CD CD
a. D> CD 3 CX> CD
O
CD CI> - · CI> CD 3 a. :=,
-
D> )>
c-:=:J~~orcn
cn
-· CD
CD
-
D> ..O :=, D>• (") -
CDºCDº Õ' 3 D> C") a. "C -, D> CD D>
~ D>•
x.
3c:ii30. D> 3 o CD• @
§ +
o CD @ iiJ o O CD a. o o o "C 3 C") D) CD O• ,.... - , a.
CC
o
3a.mcoCDCI>
"O CX> {g a. O O CD a. CD :=, CD
D)
Q
o ro a. a.
a> :=, CD
O-- -
~ CD
.
Q. o CD CD D> D>
:=, -· O
o
.
CD'
3
e;;· o -- CD• 3 · ""' CD ~ :=, D) i» "' -.J :=,
O. CD 30-03CD
8
o CD -e -e m 1 D) - , a.m-c ~ CD ........... ~ " ' :::i D> o _,g-o-CD CD _OJ 0J
CI> .J:J CT C: - · CD
S:::
-º
)>
S:::
CD CI>
CD :=, -u e: :=, ~@ (") D) a. -· a. . :=, - · D)
1
.J:J
a. o -g.
~
2
s
"Você entrou o valor · muito alto"
Fim
Figura 4.6 - Exemplo de estrutura de tomada de decisão sequencial.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
68
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Codificação programa DEC I SÃO_ SEQUENCIAL var N : inteiro . , . inicio leia N se ( N = 1 ) então escreva " você en t rou o v al or 1" fim se se (N = 2 ) então escreva " você en t rou o v al or 2 " fim se se ( N < 1 ) então escreva " você en t rou valor mu i to b aixo " fim se se (N > 2 ) então escreva " você en t rou valo r mu i to al t o " fim se fim
Após a indicação da variável de tipo inteiro N, é solicitada a leitura de um valor para ela. Assim que a leitura é realizada e o valor é fornecido para a variável N, ocorre uma de quatro possibilidades. Se for dada a entrada do valor 1, é apresentada a mensagem "você entrou o valor 1". Se for dada a entrada do valor 2, é apresentada a mensagem "você entrou o valor 2". Se for dada a entrada de um valor maior que 2, é apresentada a mensagem "você entrou valor muito alto". Se for dada a entrada de um valor menor que 1, é apresentada a mensagem "você entrou valor muito baixo". O programa apresenta para o usuário uma mensagem informando a ocorrência, não importa o valor fornecido.
4.5.2 Tomada de Decisão Encadeada A tomada de decisão encadeada ocorre quando se utilizam tomadas de decisão simples ou compostas, uma dentro de outra. Uma tomada de decisão depende da outra para ser executada. As Figuras 4.7 (a) e 4.7 (b) mostram de forma simplificada as duas possibilidades básicas de estruturas de tomada de decisão encadeada representadas em seus respectivos diagramas de blocos. A Figura 4.7 (a) apresenta o diagrama de blocos da estrutura de tomada de decisão encadeada com base no uso exclusivo de tomada de decisão simples. No primeiro símbolo decision está a primeira condição (CONDIÇÃO 1) que, se tiver resultado lógico verdadeiro, desvia o fluxo do programa para a linha sinalizada com o rótulo S e executa o primeiro bloco adjacente da primeira condição, que neste caso é a segunda condição (CONDIÇÃO 2). Sendo o resultado lógico da segunda condição verdadeiro, serão executadas as instruções subordinadas à linha de fluxo, sinalizada com o rótulo S de seu bloco adjacente. Em seguida o fluxo do programa é direcionado para o símbolo connector da segunda condição para então ser direcionado para o símbolo connector da primeira condição e assim continuar o programa. Se o resultado lógico da primeira condição for verdadeiro, mas falso para a segunda condição, nada acontece a não ser desviar o fluxo do programa para os símbolos connector da segunda e primeira condições. Se o resultado lógico da primeira condição for falso, o fluxo do programa é desviado para a linha sinalizada com o rótulo N que leva o fluxo para o símbolo connector da primeira condição que dará continuidade ao programa .
•
Editora Erica - Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 4
Programação com Decisão
69
s
N
s
N
Ação para Condição 1 e Condição 2 verdadeiras
Figura 4.7 (a)· Estrutura de tomada de decisão encadeada com decisão simples.
A estrutura de tomada de decisão encadeada baseada em tomada de decisão simples pode ser codificada em português estruturado de acordo com a Figura 4.7 (a) da seguinte forma: se () então se () então [ação para condição 1 e condição 2 verdadeiras] fim se fim se
-
N
Condição 1
s
Ação para Condição 1 fa lsa
Ação para Condição 1 e Condição 2 verdadeiras
s
Condição 2
N
Ação para Condição 1 verdadeira e Condição 2 falsa
Figura 4.7 (b) • Estrutura de tomada de decisão encadeada com decisão composta .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
70
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
A Figura 4.7 (b) mostra o diagrama de blocos da estrutura de tomada de decisão encadeada com base na tomada de decisão composta. No primeiro símbolo decision está a primeira condição (CONDIÇÃO 1) que, se tiver resultado lógico verdadeiro, desvia o fluxo do programa para a linha sinalizada com o rótulo S e executa o primeiro bloco adjacente da primeira condição, que neste caso é a segunda condição (CONDIÇÃO 2). Sendo o resultado lógico da segunda condição verdadeiro, são executadas as instruções subordinadas à linha sinalizada com o rótulo S de seu bloco adjacente. Em seguida o fluxo do programa é direcionado para os símbolos connector da segunda e primeira condições, e assim continua o programa. No entanto, se a primeira condição obtiver resultado lógico verdadeiro e a segunda condição obtiver resultado lógico falso, são executadas as instruções subordinadas ao bloco adjacente sinalizado na linha com o rótulo N da segunda condição. Em seguida o fluxo do programa é direcionado para os símbolos connector da segunda e primeira condições, e assim continua o fluxo do programa. Se o resultado lógico da primeira condição for falso, o fluxo é desviado para a linha sinalizada com o rótulo N e serão executadas as instruções subordinadas ao segundo bloco da primeira condição. Em seguida o fluxo é direcionado para o símbolo connector da primeira condição e assim continua a execução do programa. A estrutura de tomada de decisão encadeada baseada em tomada de decisão composta pode ser codificada em português estruturado de acordo com a Figura 4.7 (b) da seguinte forma: se () então se () então [ação para condição 1 e condição 2 verdadeiras] senão [ação para condição 1 verdadeira e condição 2 falsa] fim se senão [ação para condição 1 falsa] fim se
-
As formas das Figuras 4.7 (a) e 4.7 (b) podem ser combinadas, gerando uma gama maior de possibilidades. Assim, podem existir tomadas de decisão encadeadas utilizando tomada de decisão simples em conjunto com tomadas de decisão compostas. A codificação dessas estruturas segue o formato dos respectivos diagramas de blocos. A título de ilustração de tomada de decisão encadeada em um contexto operacional, considere o problema a seguir, observando detalhadamente as etapas de ação de um programador: entendimento, diagramação e codificação. Desenvolver um programa de computador que calcule o reajuste de salário de um colaborador de uma empresa. Considere que o colaborador deve receber um reajuste de 15% caso seu salário seja menor que 500. Se o salário for maior ou igual a 500, mas menor ou igual a 1000, seu reajuste será de 10%; caso seja ainda maior que 1000, o reajuste deve ser de 5%. Veja a descrição das etapas básicas de entendimento do problema e a representação das ações a serem efetuadas pelo programa na Figura 4.8.
Entendimento 1. 2.
Ler o valor de salário atual (variável SA). Verificar se o valor da variável SA é menor que 500. Se sim, reajustar o valor com mais 15º/o, atribuindo o novo valor à variável NS. Se não, verificar a próxima condição. Note que essa condição estabelece o reajuste de 15% aos salários entre os valores de Oaté 499. O que estiver acima dessa faixa será verificado posteriormente .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 4
Programação com Decisão
71
Verificar se o valor da variável SA é menor ou igual a 1000. Se sim, reajustar o valor com mais 10%, atribuindo o novo valor à variável NS. Essa condição estabelece o reajuste de 1Oo/o aos salários entre 500 (após a condição falsa do passo 3) até 1000. O que estiver fora dessa faixa é automaticamente reajustado com mais 5°/o atribuído à variável NS, pois se trata de valores acima de 1000. 4. Apresentar o valor do novo salário, implicado na variável NS. A referência feita no passo 4 já deixa determinado o reajuste de 5°/o para os salários maiores que 1000, não sendo necessário explicitar esta condição, pois as condições do problema já foram definidas no passo 3 e no próprio passo 4. 3.
Diagramação Início
SA
N
NS
~
SA ® 1.05
NS
SA < 500
~
s
SA ® 1.10
NS
~
SA ® 1.15
NS
Fim
Figura 4.8 • Exemplo da utilização de tomada de decisão encadeada.
Codificação ,
programa REAJUSTA_SALARIO var SA, NS: real
.
,
.
1n1c10
leia SA se (SA < 500) então NS +- SA * 1 . 15 senão se (SA = 500, mas 1000, reajuste será de 5% (multiplicar salário por 1,05).
~ ~
Na montagem do diagrama de blocos e na codificação do programa não é necessário usar explicitamente as três condições. Basta usar duas, uma vez que são utilizadas tomadas de decisão compostas e uma das condições pode ser automaticamente descartada.
4.5.3 Tomada de Decisão por Seleção A tomada de decisão por seleção é uma alternativa mais rápida ao uso de tomadas de decisão sequenciais ou encadeadas. Essa estrutura lógica de condição é útil e pode ser usada em situações em que se possui um grande número de verificações lógicas a serem realizadas. Ela é um tanto limitada, como pode ser percebido mais adiante. A Figura 4.9 mostra o diagrama de blocos da estrutura de tomada de decisão por seleção. Na Figura 4.9, após a verificação de cada condição da estrutura de decisão por seleção ocorre o desvio do fluxo para a ação prevista. Após a ação prevista o fluxo do programa é desviado para o único símbolo connector existente em toda a estrutura. Assim sendo, se a primeira condição (CONDIÇÃO 1) do primeiro símbolo decision possuir resultado lógico verdadeiro, são executadas as instruções subordinadas ao bloco adjacente da primeira condição indicada pela linha sinalizada com o rótulo S. Após a efetivação das instruções o fluxo do programa é desviado para o símbolo connector que dá continuidade à execução. O mesmo raciocínio aplicado à primeira condição se aplica às demais condições previstas na Figura 4.5. Se uma das condições gerar resultado lógico falso, o fluxo do programa é desviado pela linha sinalizada pelo rótulo N para a próxima condição de avaliação. Se nenhuma das condições for satisfeita, executa-se a última ação antes e em cima do símbolo connector.
S
Ação para Condição 1 t ---, verdadeira
S
Ação para Condição 2 ,........+1 verdadeira
S
. Ação para Condição 3 ..-+1
N
N
verdadeira N
Ação para nenhuma condição satisfeita
Figura 4.9 · Estrutura de tomada de decisão por seleção.
A tomada de decisão por seleção do ponto de vista da codificação em português estruturado utiliza os comandos denominados caso, seja, faça, senão e fim_caso na construção da instrução caso/seja ...faça/senão/fim_caso. Essa instrução utiliza uma variável após o comando caso que estabelece de forma indireta sua relação lógica. Após o comando seja definem-se os valores a serem avaliados e que darão a orientação para executar ações após o comando faça. Caso a variável do comando caso possua
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Programação com Decisão
Capítulo 4
73
um valor igual a um dos valores das constantes do comando seja, são executadas as ações previstas em cada comando faça. Se o valor da variável do comando caso for diferente dos valores das constantes do comando seja, são executadas as eventuais instruções entre os comandos senão e fim_caso. Após a instrução casolseja ...façalsenãolfim_caso, são executadas as eventuais instruções existentes após o comando fim_caso. Observe a estrutura sintática seguinte: caso seja faça [ação para condição 1 verdadeira] seja faça [ação para condição 2 verdadeira] seja faça [ação para condição 3 verdadeira] senão [ação para nenhuma condição satisfeita] fim caso
-
Para apresentar a tomada de decisão por seleção em um contexto operacional, considere o problema a seguir observando detalhadamente as etapas de ação de um programador de computador: entendimento, diagramação e codificação. Desenvolver um programa de computador que leia um valor numérico inteiro entre os valores 1 e 12 e apresente por extenso o nome do mês correspondente ao valor entrado. Caso sejam fornecidos valores menores que 1 e maiores que 12, o programa deve apresentar a mensagem "Valor inválido". Observe a seguir a descrição das etapas básicas de entendimento do problema e a representação das ações a serem efetuadas pelo programa na Figura 4.1 O.
Entendimento 1. 2. 3. 4. 5. 6. 7. 8. 9. 1O. 11. 12. 13. 14.
•
Efetuar a leitura de um valor numérico inteiro (variável MÊS). Se a variável MÊS for igual a 1, apresentar a mensagem "Janeiro". Se a variável MÊS for igual a 2, apresentar a mensagem "Fevereiro". Se a variável MÊS for igual a 3, apresentar a mensagem "Março". Se a variável MÊS for igual a 4, apresentar a mensagem "Abril". Se a variável MÊS for igual a 5, apresentar a mensagem "Maio". Se a variável MÊS for igual a 6, apresentar a mensagem "Junho". Se a variável MÊS for igual a 7, apresentar a mensagem "Julho". Se a variável MÊS for igual a 8, apresentar a mensagem "Agosto". Se a variável MÊS for igual a 9, apresentar a mensagem "Setembro". Se a variável MÊS for igual a 10, apresentar a mensagem "Outubro". Se a variável MÊS for igual a 11, apresentar a mensagem "Novembro". Se a variável MÊS for igual a 12, apresentar a mensagem "Dezembro". Se a variável MÊS for menor que 1 ou maior que 12, apresentar a mensagem "Valor inválido" .
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
74
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Diagramação
Codificação A
Início
programa MES POR EXTENSO var MES •• inteiro , • • inicio leia MÊS caso MES • seJa 1 faça escreva "Janeiro " • seJa 2 faça escreva "Fevereiro " • seJa 3 faça escreva "Março " • seJa 4 faça escreva "Abril " • seJa 5 faça escreva "Maio " • seJa 6 faça escreva "Junho " • seJa 7 faça escreva "Julho " • seJa 8 faça escreva "Agosto" • seJa 9 faça escreva "Setembro " • seJa 10 faça escreva "Outubro" • seJa 11 faça escreva "Novembro " • seJa 12 faça escreva "Dezembro " senao escreva "Valor inválido " fim caso fim A
Mês
A
s
"Janeiro"
s
"Fevereiro"
s
"Março"
s
"Abril"
s
"Maio"
s
"Junho"
s
"Julho"
s
"Agosto"
s
"Setembro"
·N
.N
'N
N
•N
N
N
N
N 5- ~ >=-
"Outubro" r--~
N
s N
5>=-
~ "Dezembro··1-·- --11t
N
'Valor Inválido"
Fim
Figura 4.1 O• Exemplo da tomada de decisão por seleção .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 4
Programação com Decisão
75
A instrução caso/seja ... faça/senão/fim_caso é útil apenas nos casos em que há tomadas de decisão sequenciais ou encadeadas utilizando as ações previstas com o operador relacional "igual a". Outro detalhe importante é que o comando senão, na estrutura de tomada de decisão por seleção, é opcional. Ele pode ser omitido quando não se desejar deixar definida uma ação quando as condições gerais não forem satisfeitas.
4.6 Operadores Lógicos Este capítulo apresentou situações que demonstram a tomada de decisão com apenas uma condição. No entanto, o que fazer quando houver necessidade de tomar uma única decisão com várias condições? É nesse momento que se utilizam ferramentas auxiliares chamadas operadores lógicos (não confundir com operadores relacionais). Os operadores lógicos são também referenciados como operadores booleanos, que recebem este nome devido à contribuição do matemático inglês George Boole que, em 1854, criou um sistema de relação lógica, base para o modelo computacional digital utilizado até hoje (MACHADO & MAIA, 2002, p. 5). Os operadores lógicos (ou booleanos) mais comuns, do ponto de vista da programação, são quatro: operador lógico .e. (operador lógico de conjunção), operador lógico .ou. (de disjunção inclusiva), operador lógico .xou. (de disjunção exclusiva) e operador lógico .não. (de negação). Dos quatro operadores, três trabalham diretamente com mais de uma condição, vinculando-as entre si para que seja tomada uma única decisão, sendo os operadores lógicos .e., .ou. e .xou .. O operador lógico .não. pode ser usado sempre à frente de uma condição no sentido de inverter seu resultado lógico. É pertinente salientar que qualquer operador lógico em uso possibilita obter uma de duas respostas lógicas possíveis. A condição avaliada pode ter resultado lógico falso ou verdadeiro. Por questões de conveniência, os exemplos deste tópico usam tomadas de decisão simples, no entanto os operadores lógicos podem ser utilizados com tomadas de decisão compostas, sequenciais e encadeadas sem nenhum problema.
4.6.1 Operador Lógico de Conjunção Do ponto de vista filosófico, a lógica de conjunção é a relação lógica entre duas ou mais proposições (entende-se, na esfera da programação, o termo proposição como sendo condição) que geram um resultado lógico verdadeiro quando todas as proposições forem verdadeiras. Em seguida é apresentada a tabela verdade para o operador lógico .e.: Tabela verdade do operador lógico de conjunção
•
Condição 1
Condição 2
Resultado lógico
Verdadeiro
Verdadeiro
Verdadeiro
Verdadeiro
Falso
Falso
Falso
Verdadeiro
Falso
Falso
Falso
Falso
Editora Erica - Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
76
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
O raciocínio apresentado na tabela verdade para o operador lógico de conjunção pode ser exemplificado de acordo com o diagrama de Venn13, conforme a Figura 4.11 , que mostra que apenas parte da interseção entre a totalidade dos círculos está preenchida. Isso indica que algo é verdadeiro para parte do todo quando é verdadeiro para o todo. O uso de um operador lógico de conjunção em um diagrama de blocos é demonstrado na Figura 4.12, com um exemplo de tomada de decisão simples.
s
Condição 1
.e.
N
Condição 2
Ação para Condição 1 e Condtção 2 verdadeiras
Condição 1
Condição 2
Figura 4.11 • Diagrama de Venn para o operador de conjunção.
Figura 4.12 · Estrutura de tomada de decisão com operador de conjunção.
A codificação em português estruturado do operador de conjunção utilizado na Figura 4.12 é realizada de acordo com o modelo do seguinte trecho de programa: se ( ) .e. () então [ação para condição 1 e condição 2 verdadeiras] fim se
-
O código em português estruturado mostra o uso dos sinais de parênteses para indicar cada condição em separado. Note o uso do operador lógico .e. entre as condições envolvidas na relação lógica de conjunção. Como exemplo da tomada de decisão com operador lógico de conjunção em um contexto operacional, considere o problema a seguir, observando detalhadamente as tarefas de um programador de computador: entendimento, diagramação e codificação. Desenvolver um programa de computador que leia um valor numérico inteiro que esteja na faixa de valores entre 20 e 90. O programa deve apresentar a mensagem "O valor está na faixa permitida", caso o valor informado esteja entre 20 e 90. Se o valor estiver fora da faixa permitida, o programa deve apresentar a mensagem "O valor está fora da faixa permitida". Veja a descrição das etapas básicas de entendimento do problema e a representação das ações a serem efetuadas pelo programa na Figura 4.13.
13
Forma de representação da álgebra booleana em consonância com a teoria de conjuntos apresentada em 1881 pelo padre John Venn, matemático, filósofo e professor inglês, nascido em 4 de agosto de 1834 e falecido em 4 de abril de 1923.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 4
Programação com Decisão
77
Entendimento 1. 2.
Efetuar a leitura de um valor numérico inteiro (variável NÚMERO). Verificar se o valor fornecido é maior ou igual a 20, e se o mesmo valor é menor ou igual a 90. Se esta condição for verdadeira, apresentar a mensagem "O número está na faixa de 20 a 90"; caso contrário, apresentar a mensagem "O número está fora da faixa de 20 a 90".
Diagramação Início
NÚMERO
N
NÚMERO >= 20 .e . NÚMERO= 20) .e. (NÚMERO= 20) .e. (NÚMERO = 20) .e. (NÚMERO 5) então
s
N
C+-A+B
senão c.._A-B
C+-A-B
C+-A+B
fim se escreva fim
e
e Fim
Figura 4.19 • Exemplo de tomada de decisão com operador lógico de negação.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
82
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Se forem informados os valores 5, 1 e 2, respectivamente, para as variáveis A, B e X, resulta para a variável C o valor 6, pois o valor 2 da variável X é controlado pela instrução se .não. (X> 5) então, como sendo verdadeiro, uma vez que não é maior que 5. Os valores 5 e 1 são somados, resultando 6. Mas se forem informados os valores 5, 1 e 6, respectivamente, para as variáveis A, B e X, resulta para a variável C o valor 4, pois o valor 6 da variável X é controlado pela instrução se .não. (X> 5) então como sendo falso. Para os olhos de um novato em programação o operador lógico .não. pode parecer uma ferramenta sem sentido, mas esse operador é de grande valia em várias situações que envolvem principalmente tomadas de decisão do tipo simples. No entanto, existe uma situação em particular que sem dúvida justifica sua existência. Imagine que você deve tomar uma decisão apenas se a condição for falsa, ou seja, se a condição for verdadeira, nada deve ser feito. Esse tipo de ocorrência é muito comum no contexto humano, e por esta razão é de fácil solução, mas no contexto computacional, apesar de ser aceita, essa ocorrência não pode ser programada. Ela se torna um grave problema operacional. A fim de ilustrar esta ocorrência, de certa forma bizarra, imagine uma condição baseada na questão "você está saudável?". Se estiver saudável, não precisa fazer nada, mas caso esteja doente, é necessário procurar acompanhamento médico. Dentro do exposto é possível que o leitor esteja pensando em solucionar o problema com base na estrutura gráfica do diagrama de blocos da Figura 4.20, o que seria uma ótima ideia do ponto de vista humano, mas do ponto de vista computacional não, uma vez que não é possível estruturar essa construção lógica em um computador. O problema computacional em relação à estrutura lógica da Figura 4.19 está no fato de não poder ser codificada em uma linguagem de programação, não sendo exceção o português estruturado.
N
Você está saudâvel
s
Procurar acompanhamento médico
Figura 4.20 • Estrutura de tomada de decisão sem o operador de negação.
Em uma tomada de decisão simples, o bloco adjacente de instruções subordinadas só é executado quando a condição é considerada verdadeira. Assim sendo, não é possível codificar a estrutura lógica da Figura 4.20. Pode ser que venha à mente a possibilidade de manter o desenho do diagrama de blocos como está (no estilo tomada de decisão simples) e então usar o código em português estruturado como se fosse uma tomada de decisão composta, deixando o trecho de código entre os comandos se ... então e senão em branco e colocando a ação desejada no trecho de comandos senão e fim_se. Isso seria errado, uma vez que não pode haver, em hipótese nenhuma, em uma estrutura de tomada de decisão trechos em branco entre os comandos se ... então e senão. De fato o programador está acuado e a solução plausível é o uso do operador lógico de negação para validar a ação lógica desejada na esfera computacional. Observe a solução apresentada na Figura 4.21. Com o operador lógico de negação fica fácil resolver o problema apresentado, de forma que um computador consiga processar a ação, simulando um contexto humano, que não pode ser executado de forma direta por um computador .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 4
Programação com Decisão
83
Pode até parecer que, inicialmente, o operador lógico de negação seja um pouco confuso, mas tudo é uma questão de costume. À medida que os problemas vão surgindo, o programador novato vai se adaptando e passa a usar os recursos que aprendeu de uma forma mais natural.
.não.
s
Você está saudável
N
se .não. (você está saudável) então procurar acompanhamen t o médico fim se
Procuirar
-
acompanhamento méd1co
Figura 4.21 • Estrutura de tomada de decisão com o operador de negação.
Na Figura 4.21 observe o código válido em português estruturado para o problema exposto e solucionado na Figura 4.20. Para a avaliação da questão "não você está saudável?" considere a ação ''procurar acompanhamento médico". A questão "não você está saudável?" pode ser entendida como "você não está saudável?".
4.6.4 Operador Lógico de Disjunção Exclusiva Do ponto de vista filosófico, a lógica de disjunção exclusiva é a relação que avalia duas ou mais proposições, de tal modo que o resultado lógico será verdadeiro quando uma, e apenas uma, das proposições for verdadeira. Ou ainda, em outras palavras, o resultado lógico será verdadeiro quando as condições avaliadas possuírem valores lógicos diferentes entre si. Em seguida é apresentada a tabela verdade para o operador lógico .xou. (podendo ser o operador lógico de disjunção exclusiva referenciado em português estruturado também como .oue.): Tabela verdade do operador lógico de disjunção exclusiva Condição 1
Condição 2
Resultado lógico
Verdadeiro
Verdadeiro
Falso
Verdadeiro
Falso
Verdadeiro
Falso
Verdadeiro
Verdadeiro
Falso
Falso
Falso
O raciocínio apresentado na tabela verdade para o operador lógico de disjunção exclusiva pode ser exemplificado de acordo com o diagrama de Venn na Figura 4.21. Na Figura 4.22 estão preenchidas apenas as partes externas ao ponto de interseção dos círculos. Isso indica que algo é verdadeiro para o todo quando for verdadeiro para uma das partes .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
84
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
A representação de um operador lógico de disjunção exclusiva em um diagrama de blocos está na Figura 4.23 com um exemplo de tomada de decisão simples.
s
Condição 1
.xou.
N
Condição 2
Ação para Condição 1 verdadeira e Condição 2 falsa ou Condição 1 falsa e Condição 2 verdadeira Condição 1
Condição 2
Figura 4.22 • Diagrama de Venn para o operador de disjunção exclusiva.
Figura 4.23 · Estrutura de tomada de decisão com operador de disjunção exclusiva.
A codificação em português estruturado do operador de disjunção exclusiva utilizado na Figura 4.23 é realizada de acordo com o modelo do seguinte trecho de programa: se () .xou. () então [ação para condição 1 verdade i ra e condição 2 falsa ou condição 1 falsa e condição 2 ] [verdadeira ] fim se
-
No código em português estruturado, observe os parênteses para cada condição em separado. Note o uso do operador lógico .xou. entre as condições envolvidas na relação lógica de disjunção exclusiva. A título de ilustração da tomada de decisão com operador lógico de disjunção exclusiva em um contexto operacional, considere o problema a seguir, observando detalhadamente as etapas de ação de um programador de computador: entendimento, diagramação e codificação. Desenvolver um programa de computador que efetue a entrada do nome e respectivo sexo de duas pessoas que pretendem formar um par para participar de uma quadrilha em uma festa junina. Os administradores da festa determinaram que somente serão aceitos pares heterogêneos (formados por pessoas de sexos diferentes). Não serão aceitos casais formados por pessoas do mesmo sexo. Para atender, a este requisito, o programa deve, após a entrada do sexo das duas pessoas, verificar se elas formam par e, no caso, deve apresentar uma mensagem informando a possibilidade. Caso contrário, o programa deve indicar a impossibilidade de formação de par. Veja a descrição das etapas básicas de entendimento do problema e a representação das ações a serem efetuadas pelo programa na Figura 4.24.
Entendimento 1. Efetuar a entrada do nome (variável N1) e do sexo (variável S1) da primeira pessoa. 2. Efetuar a entrada do nome (variável N2) e do sexo (variável S2) da segunda pessoa .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 4
Programação com Decisão
85
3. Verificar se o sexo da primeira pessoa é exclusivamente igual a um determinado sexo e se o sexo da segunda pessoa é exclusivamente igual ao sexo informado exclusivamente para a primeira pessoa. Se um dos sexos for exclusivamente igual a um dos sexos informados e o outro for diferente, o programa apresenta uma mensagem informando que podem ser formados pares. Caso contrário, o programa apresenta uma mensagem informando que o par não pode ser formado.
Diagramação 1nício
N1, S1 , N2 , S2
N
S1 = "M"
.xou. S2 = ''M"
s
N1 ,
N1 ,
"não pode dançar com",
"pode dançar com",
N2
N2
Fim
Figura 4.24 · Exemplo de tomada de decisão com operador lógico de disjunção exclusiva.
Codificação programa TESTA_LOGICA_XOU var Nl, N2: cadeia Sl, S2: caractere . , . 1n1c10 leia Nl, Sl leia N2, S2 se ( Sl = "M") . xou. ( S2 = "M") então escreva Nl, "pode dançar com", N2 senão escreva Nl, "não pode dançar com", N2 fim se fim
No exemplo apresentado, se forem fornecidos sexos diferentes na entrada para os nomes das duas pessoas (masculino e feminino ou feminino e masculino), o programa confirma a possibilidade de formação de par. Se forem fornecidos sexos iguais (masculino e masculino ou feminino e feminino), o programa indica a não possibilidade de formação de par.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
86
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Tome por base a entrada do valor F para o sexo FEMININO da primeira pessoa e do valor M para o sexo MASCULINO da segunda pessoa. Observe que o valor F do sexo da primeira pessoa não é igual ao valor "M" da primeira condição, mas o valor M do sexo da segunda pessoa é igual ao valor "M" da segunda condição. Sendo a condição (SEXO ="M") .xou. (SEXO ="M") verdadeira, será apresentada a mensagem informando que essas pessoas podem formar o par de dança. No entanto, se for dada a entrada dos valores M ou F, respectivamente, para as duas pessoas, a condição (SEXO ="M") .xou. (SEXO ="M") será falsa. O operador lógico de disjunção exclusiva exige que uma das condições da expressão lógica seja verdadeira para que seu resultado lógico seja verdadeiro. A expressão lógica (C1) .xou. (C2), considerando C1 a condição e C2 a condição , pode ser matematicamente representada pela expressão lógica (C1 .e. (.não. C2)) .ou. ((.não. C1) .e. C2). É importante ao futuro programador saber este detalhe, pois há linguagens de programação que não possuem o operador lógico de conjunção exclusiva, como é o caso das linguagens C e Lua, apontadas no início deste tópico na tabela comparativa de operadores lógicos. Neste caso, é necessário conhecer uma forma alternativa para a solução do problema, usando algoritmos.
4.6.5 Precedência de Uso dos Operadores Lógicos Os operadores lógicos (.e., .ou. e .xou.) possibilitam o uso de mais de uma condição para a tomada de uma única decisão. Já o operador lógico .não. tem por finalidade a negação do estado lógico de uma determinada condição. Para usar adequadamente os operadores lógicos em expressões lógicas, é necessário levar em consideração a ordem de precedência desses operadores. A tabela de precedência de operadores lógicos apresenta a ordem hierárquica geral de execução dos operadores lógicos que podem ser utilizados em uma expressão lógica. No entanto, essa ordem pode ser diferente em algumas linguagens de programação formais. Neste caso, é importante estar atento a esta questão para não haver efeitos colaterais indesejáveis. Tabela de precedência de operadores lógicos Operador
Operação
Precedência
.nao.
Negação
1
.e.
Conjunção
2
.ou.
Disjunção inclusiva
3
.xou.
Disjunção exclusiva
3
A tabela de precedência dos operadores lógicos indica a prioridade da ordem de execução em uma expressão lógica. O operador .não. é o que possui maior nível de prioridade, portanto deve ser operacionalizado em primeiro lugar. Num segundo momento tem-se o operador lógico .e. que possui médio nível de prioridade e por último os operadores .ou. e .xou. que possuem baixo nível de prioridade. Por exemplo, a expressão lógica (A = B) .e.. não. (A > 5) deve ser avaliada a partir de .não. (A > 5) e somente depois de saber seu resultado é que pode ser realizada avaliação do restante da expressão lógica. Já na expressão lógica (A = 1) .xou. (A >= 4) .e. (A = 4)) .e. (A 5) Verdadeiro ( )
d)
Falso ( )
Falso ( )
.não. (X> 3) .ou. (C < 7) Verdadeiro ( )
Falso ( )
(A > 8) .ou. (C > 8) Verdadeiro ( )
Falso ( )
(X>= 2) Verdadeiro ( )
Falso ( )
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 4
Programação com Decisão
g) h)
(X< 1) .e. (B >= D) Verdadeiro ( )
Falso ( )
(DS) Verdadeiro ( )
2.
97
Falso ( )
i)
.não. (D > 3) .ou .. não. (B < 7) Verdadeiro ( ) Falso ( )
j)
(A > B) .ou..não. (C > B) Verdadeiro ( )
Falso ( )
Indique na linha de resposta a expressão aritmética a ser calculada a partir da tomada de decisão composta em análise. Considere os seguintes valores: A=2, 8=3, C=S e 0=9. Não é necessário calcular os valores da variável X. a)
Resposta:
- (D> 5) então se .nao. X +- (A + B) * D senao X +- (A - B) / e fim se escreva X b)
Resposta: _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ se (A> 2) .e. (B < 7) então X+- (A+ 2) * (B - 2) senão X +- (A + B) / D * ( C + D) fim se escreva X
c)
Resposta: .ou. (B < 7) então (A + 2) * (B - 2)
se (A = 2) X
+-
X
+-
senao
+ B) / D * (C + D)
(A
fim se escreva X
d)
Resposta: _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ se (A> X +- A senão X +- A fim se escreva
•
2)
.ou . . não. + B - 2
(B < 7) então
- B X
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
98 e)
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Resposta: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ se .não. (A> 2) X +- A + B senão X +- A / B fim se escreva X
f)
.ou . . não.
Resposta: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ se .não. (A> 3) X +- A + D senão X +- D / B fim se escreva X
g)
(B < 7) então
.e . . não.
(B < 5) então
Resposta: _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ se (C >= 2) X
+-
+
(A
.e . D)
/
(B = 2) X
+-
+
(A
(C O- há duas soluções reais e diferentes e delta= O- há apenas uma solução real). Lembre-se de que é completa a equação de segundo grau que possui todos os coeficientes A, B e C diferentes de zero. O programa deve apresentar respostas para todas as condições estabelecidas para delta. Ler três valores inteiros representados pelas variáveis A, B e C e apresentar os valores lidos dispostos em ordem crescente. Dica: utilizar tomada de decisão sequencial e as ideias trabalhadas nos exercícios "g" (propriedade distributiva) e "f' (troca de valores) do capítulo 3. g) Fazer a leitura de quatro valores numéricos inteiros representados pelas variáveis A, B, C e D. Apresentar apenas os valores que sejam divisíveis por 2 e 3. h) Efetuar a leitura de quatro valores numéricos inteiros representados pelas variáveis A, B, C e D. Apresentar apenas os valores que sejam divisíveis por 2 ou 3. i) Ler cinco valores numéricos inteiros (variáveis A, B, C, D e E), identificar e apresentar o maior e o menor valores informados. Não execute a ordenação dos valores como no exercício "f'. j) Ler um valor numérico inteiro e apresentar uma mensagem informando se o valor fornecido é par ou ímpar. k) Efetuar a leitura de um valor numérico inteiro que esteja na faixa de valores de 1 até 9. O programa deve apresentar a mensagem "O valor está na faixa permitida", caso o valor informado esteja entre 1 e 9. Se o valor estiver fora da faixa, o programa deve apresentar a mensagem "O valor está fora da faixa permitida". 1) Fazer a leitura de um valor numérico inteiro qualquer e apresentá-lo caso não seja maior que 3. Dica: para a solução deste problema utilize apenas o operador lógico de negação. m) Efetuar a leitura de um nome (variável NOME) e o sexo (variável SEXO) de uma pessoa e apresentar como saída uma das seguintes mensagens: "llmo. Sr.", caso seja informado o sexo masculino (utilizar como valor o caractere "M"), ou "llma. Sra.", caso seja informado o sexo feminino (utilizar como valor o caractere "F"). Após a mensagem de saudação, apresentar o nome informado. O programa deve, após a entrada do sexo, verificar primeiramente se o sexo fornecido é realmente válido, ou seja, se é igual a "M" ou a "F". Não sendo essa condição verdadeira, o programa deve apresentar a mensagem "Sexo informado inválido". n) Efetuar a leitura de três valores inteiros desconhecidos representados pelas variáveis A, B e C. Somar os valores fornecidos e apresentar o resultado somente se for maior ou igual a 100. o) Ler um número inteiro qualquer e multiplicá-lo por dois. Apresentar o resultado da multiplicação somente se o resultado for maior que 30.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
100
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Programação com Laços
Anteriormente foi estudado como trabalhar com tomadas de decisão nas mais variadas formas. Nesta etapa já é possível escrever a estrutura de programas mais sofisticados. Este capítulo amplia o foco do estudo, apresentando uma técnica de programação que possibilita repetir um trecho de programa, sem que seja necessário escrevê-lo exatamente o número de vezes que se deseja de fato executar. Mostra as técnicas de laços interativos e iterativos, como laço condicional pré-teste (com fluxo verdadeiro e com fluxo falso), laço condicional pós-teste (com fluxo verdadeiro e com fluxo falso), laço condicional seletivo e por fim o laço incondicional iterativo.
5.1 Ser Programador Antes de prosseguir, cabe apresentar mais alguns detalhes sobre a ética e o comportamento do programador de computador. Ser um programador exige alto grau de atenção e cuidado no trabalho executado. Um médico-cirurgião desatento pode matar um paciente numa cirurgia; um programador desatento pode "matar" uma empresa. Na tarefa de programar computadores o programador pode correr três riscos, descritos em seguida: ~
Erro de sintaxe, cometido quando se escrevem comandos e/ou instruções de forma incorreta, sem respeitar as regras gramaticais da linguagem de programação em uso. Esse tipo de erro denota que o programador não possui experiência na escrita de programas naquela linguagem. Isso não significa que não tenha boa lógica, apenas mostra que o programador não sabe escrever o código na linguagem em uso. Para solucionar este problema é necessário aprender a escrever os códigos da linguagem pretendida. O erro de sintaxe é considerado de baixa gravidade, pois é fácil de ser corrigido. Erro de requisito, acontece quando o programador não atende ao que é solicitado. Esse erro denota que o programador não sabe ou não quer ouvir o que lhe é pedido. Para solucionar é necessário ser mais atento. O erro de requisito é considerado de média gravidade, pois é possível corrigi-lo com certa facilidade. Erro de lógica, ocorre quando o programador não consegue entender e atender ao que de fato é necessário fazer com o programa. Denota que o programador não soube pensar a programação de computadores. Para solucionar este problema é necessário mudar o "pensar", o que pode ser tarefa muito trabalhosa. O erro de lógica é considerado de alta gravidade, pois é difícil de ser corrigido, exigindo do programador muita disciplina.
Um programador cuidadoso, que goste de programar, é um profissional que evita correr riscos desnecessários, principalmente os mais comuns, que sabe, por meio de bom senso, ser perseverante, disciplinado e, acima de tudo, humilde em seu trabalho .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Programação com Laços
Capítulo 5
101
Uma forma de evitar erros, principalmente de requisitos e de lógica, é a construção de algoritmos. Entre as formas de algoritmos que podem ser usadas na área da programação de computadores, a gráfica é um instrumento que auxilia os olhos e a mente do programador a enxergar e verificar a sua própria linha de raciocínio, ou de outros programadores. Vale ressaltar as palavras de John Venn (autor dos gráficos utilizados no tópico 4.6 sobre o uso de operadores lógicos): "os diagramas servem para auxiliar os olhos e a mente graças à natureza intuitiva de seu próprio testemunho".
5.2 Laços ou Malhas (Loopings ou Loops) A técnica denominada laços ou ciclos, que pode ser referenciada como malhas, ou pelos termos análogos em inglês loopings ou loops, é uma estrutura de programação que facilita repetir determinados trechos de código. Essa técnica reduz o trabalho de programação, principalmente quando é preciso repetir várias vezes alguma ação importante do programa. Os laços podem ser classificados em duas formas, sendo interativos ou iterativos. São interativos quando necessitam da intervenção de um usuário do programa para repetir a próxima ação um indeterminado número de vezes, e são laços iterativos quando executam as repetições previstas de forma automática um número de vezes. Para executar laços são encontradas nas linguagens de programação instruções que podem ser escritas de até seis formas diferentes. Isso não significa que uma linguagem de programação precise ter o conjunto completo dos seis tipos de laços. A maior parte das linguagens de programação oferece em média três formas de laços. Podem existir linguagens que possuem até menos formas de execução de laços. Dos seis tipos de laços existentes, cinco são condicionais e um é incondicional. Os laços condicionais podem ser classificados em três categorias, sendo controle condicional pré-teste, controle condicional pós-teste e controle condicional seletivo, desenhados em um diagrama de blocos com o símbolo decision. Nessas estruturas não se usa o símbolo connector. Já o laço incondicional é desenhado em um diagrama de blocos com o símbolo preparation. A maior parte das linguagens de programação possui três tipos de laços, sendo oferecidos normalmente um laço com controle condicional pré-teste, um laço com controle condicional pós-teste e um laço incondicional, pois em tese não há necessidade de que uma linguagem de programação possua os seis tipos de laços. Algumas linguagens oferecem ainda a alternativa de execução de laços condicionais seletivos. Já que o assunto são laços, existe uma tradição na construção dos laços, principalmente no que tange ao uso de laços iterativos. Trata-se do nome da variável de controle que executa o laço e permite o seu controle. É hábito entre a maior parte dos programadores usar essa variável com o nome 1, de iteração em português ou iteration em inglês. Respeitando essa tradição, a maior parte dos laços iterativos apresentados nesta obra usa I como variável de controle, mas como é tradição e não uma regra, também serão escritos laços iterativos com outros nomes.
5.3 Laço Condicional Pré-Teste Os laços condicionais com verificação pré-teste têm por finalidade executar as instruções subordinadas de um bloco adjacente após conferir a validade do resultado lógico de uma condição estabelecida. Sendo o resultado lógico da condição válido, são executadas as instruções subordinadas do bloco adjacente. No momento em que o resultado lógico da condição não é mais válido, o laço é automaticamente encerrado. Os laços com controle condicional pré-teste apresentam-se de duas formas, sendo um laço para execução de condição com fluxo verdadeiro e outro laço para execução de condição com fluxo falso .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
102
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
5.3.1 Controle Condicional Verdadeiro O laço com controle condicional pré-teste de fluxo verdadeiro executa as instruções subordinadas de um bloco adjacente no período em que o resultado lógico da condição permanece verdadeiro. No momento em que o resultado lógico da condição se tornar falso, a execução do laço é automaticamente encerrada. Observe na Figura 5.1 um diagrama de blocos com os rótulos S e N para a execução de um laço com controle condicional pré-teste verdadeiro, com base na CONDIÇÃO do símbolo decision. Note uma linha de fluxo que pende do símbolo decision com uma seta apontando para baixo, sinalizada com o rótulo S, e uma segunda linha de fluxo saindo do símbolo decision e sinalizada com o rótulo N, indicando a saída do laço quando a condição se tornar falsa. Além dessas duas linhas de fluxo, há também uma terceira que mostra uma ação de retorno para o próprio símbolo decision, indicando a ação real do laço. O laço com controle condicional pré-teste verdadeiro, do ponto de vista da codificação em português estruturado, utiliza os comandos enquanto, faça e fim_enquanto para realizar a construção da instrução enquanto...faça/fim_enquanto. Nesse trecho de instrução são executadas as instruções subordinadas ao bloco adjacente (entre os comandos enquanto...faça e fim_enquanto) no período em que o resultado lógico da condição permanecer verdadeiro entre os comandos enquanto e faça. No momento em que o resultado lógico for falso, são executadas as eventuais instruções que estiverem após o comando fim_enquanto. Observe a estrutura sintática seguinte:
N
s Instruções executadas no periodo em que a condição permanece verdadeira
Figura 5.1 · Estrutura de laço com controle condicional pré-teste verdadeiro.
enquanto () faça [instruções executadas durante o período em que a condição é verdadeira] fim enquanto
-
Atente para o detalhe da indentação para sinalizar as instruções subordinadas ao bloco adjacente da instrução enquanto...faça/fim_enquanto. A indicação entre parênteses deve ser substituída pela expressão lógica da condição a ser utilizada. Os trechos sinalizados entre colchetes representam as instruções a serem executadas pelo programa. A título de ilustração de uso do laço com controle condicional pré-teste verdadeiro em um contexto operacional, considere os problemas a seguir, observando detalhadamente as etapas de ação de um programador de computador: entendimento, diagramação e codificação. Os programas demonstram os laços nas formas iterativa e interativa.
Exemplo com laço iterativo Elaborar um programa que efetue a entrada de um valor numérico inteiro qualquer, em seguida processe o cálculo do valor de entrada, multiplicando-o por 3 e apresentando seu resultado. Proceder à execução dos passos anteriores cinco vezes. Observe a seguir a descrição das etapas básicas de entendimento do problema e a representação das ações do programa na Figura 5.2.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 5
Programação com Laços
Diagramação
103
Codificação ,
Início '
programa LAÇO_ PRE TESTE_VERDADEIRO_VA var I, N, R: inteiro . , . 1n1c10 I - 1 enquanto (I 5 ) R
fim
+-
N
-
R
l,c- 1+ 1
N
1>
5
s Ftm
Figura 5.8 · Exemplo de laço repita/até_que iterativa.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
112
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
O bloco adjacente de instruções subordinadas entre os comandos repita e até_que se repete até que o resultado lógico da condição se torne verdadeiro, ou seja, quando a variável I que foi iniciada com valor 1 tiver um valor maior que 5. Quando o resultado lógico da condição for verdadeiro, o laço é encerrado, enviando o fluxo do programa para a primeira instrução após a instrução até_que.
Exemplo com laço interativo Elaborar um programa que efetue a entrada de um valor numérico inteiro qualquer, em seguida calcule o valor de entrada, multiplicando-o por 3 e apresentando seu resultado. Ao final o programa deve perguntar ao usuário se ele deseja novo cálculo. Se a resposta for sim, deve executar novamente as instruções subordinadas ao bloco adjacente. Se a resposta for não, o programa deve parar a execução. Observe a seguir a descrição das etapas básicas de entendimento do problema e a representação das ações do programa na Figura 5.9.
Entendimento Por ser um problema semelhante a uma situação já exposta, basta escolher um laço que vai satisfazer a vontade do usuário do programa. Assim sendo, não é possível saber quantas vezes o laço será executado. Atente para os passos descritos em seguida: 1. 2. 3. 4. 5. 6.
Criar uma variável de controle para ser utilizada como resposta (variável RESP). Ler um valor inteiro qualquer (variável N). Efetuar a multiplicação do valor de N por 3, colocando o resultado na variável R. Apresentar o valor calculado, que está armazenado na variável R. Perguntar para o usuário se ele deseja continuar o programa. Caso o valor da variável RESP seja diferente de "S", executar os passos 2, 3 e 4; caso contrário, ir para o passo 7. Encerrar o programa.
7.
O bloco adjacente de instruções subordinadas entre os comandos repita e até_que é repetido até que o resultado lógico da condição se torne verdadeiro, ou seja, quando a variável RESP iniciada com o valor "S" estiver com um valor diferente de "S". Quando o resultado lógico da condição for verdadeiro, o laço é encerrado, enviando o fluxo do programa para a primeira instrução após a instrução até_que. O laço com controle condicional pós-teste falso é encontrado, por exemplo, nas linguagens PASCAL e BASIC. Essa forma de laço com controle condicional pós-teste não é muito encontrada nas linguagens de programação.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 5
Programação com Laços
Diagramação
113
Codificação Inicio
R'ESP t- "S"
programa LAÇO_ PÓS TESTE_FALSO_VB var N, R: inteiro RESP: caractere . , . 1n1c10 RESP .._ "S"
repita leia N
N
*
3 escreva R R
Rt- N ® 3
R
+-
N
escreva "Deseja cont i nuar?" leia RESP até que (RESP "s li) fim
"Deseja continuar?"
RES'P
N
s Fim
Figura 5.9 • Exemplo da instrução repita/até_que interativa.
5.4.2 Controle Condicional Verdadeiro O laço com controle condicional pós-teste com fluxo verdadeiro executa no mínimo uma vez as instruções subordinadas de um bloco adjacente e mantém a execução no período em que o resultado lógico da condição permanece verdadeiro. No momento em que o resultado lógico da condição se tornar falso, o laço é automaticamente encerrado.
Instruções executadas no período em que a
condição permanece verdadeira
s
Observe na Figura 5.1 O um diagrama de blocos com o N rótulo S para a execução de um laço com controle condicional pós-teste verdadeiro com base na Figura 5.1 O• Estrutura de laço CONDIÇÃO do símbolo decision. com controle condicional pós-teste verdadeiro .
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
114
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
A linha de fluxo do rótulo S indica o retorno para um determinado trecho, configurando assim o laço. Já o rótulo N indica a saída do laço. A título de ilustração de uso do laço com controle condicional pós-teste verdadeiro em um contexto operacional, considere o problema a seguir, observando detalhadamente as etapas de ação de um programador de computador: entendimento, diagramação e codificação. Os programas demonstram os laços nas formas iterativa e interativa. O laço com controle condicional pós-teste verdadeiro, do ponto de vista da codificação em português estruturado, utiliza os comandos execute e enquanto_for na construção da instrução execute/enquanto_for. Nesse trecho de instrução são executadas as instruções subordinadas ao bloco adjacente (entre os comandos execute e enquanto_for) durante o período em que o resultado lógico da condição permanecer verdadeiro. No momento em que o resultado lógico for falso, serão executadas as eventuais instruções que estiverem após o comando enquanto_for. Observe a estrutura sintática seguinte: execute [instruções executadas durante o período em que a condição é verdadeira] enquanto for ()
-
Atente para o detalhe da indentação para sinalizar as instruções subordinadas ao bloco adjacente da instrução execute/enquanto_for. A indicação entre parênteses deve ser substituída pela expressão lógica da condição a ser utilizada. Os trechos sinalizados entre colchetes representam as instruções a serem executadas pelo programa.
Exemplo com laço iterativo Elaborar um programa que efetue a entrada de um valor numérico inteiro qualquer, em seguida calcule o valor de entrada, multiplicando-o por 3 e apresentando seu resultado. Proceder à execução dos passos anteriores cinco vezes. Observe a seguir a descrição das etapas básicas de entendimento do problema e a representação das ações a serem efetuadas pelo programa na Figura 5.11.
Entendimento O problema exposto é o mesmo apresentado nas páginas anteriores deste capítulo. A diferença é a forma de construir e executar o laço. Atente para os passos descritos em seguida: 1. 2. 3. 4. 5. 6.
Criar uma variável de controle para servir como contador com valor inicial 1 (variável 1). Ler um valor inteiro qualquer (variável N). Efetuar a multiplicação do valor de N por 3, colocando o resultado na variável R. Apresentar o valor calculado que está armazenado na variável R. Acrescentar o valor 1 ao valor existente da variável 1, definida no passo 1. Verificar se a variável contador é menor ou igual a 5; sendo, executar os passos 2, 3 e 4; caso contrário, desviar a execução do programa para o passo 7. Encerrar o programa .
7.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 5
Programação com Laços
Diagramação
115
Codificação programa LAÇO_ PÓS TESTE_VERDADEIRO_VA var I, N, R: inteiro . , . inicio I +- 1 execute leia N
1nício
1~
1
N
R
R ~ N €> 3
+-
N
*
3
escreva R I +- I + 1 enquanto for (I 4 ) I +- I + 1 fim laço fim R
s
1> 4
N l ] faça
[] fim_para
A título de ilustração de uso do laço incondicional em um contexto operacional, considere o problema a seguir, observando detalhadamente as etapas de ação de um programador de computador: entendimento, diagramação e codificação. Elaborar um programa que efetue a entrada de um valor numérico inteiro qualquer, em seguida calcule o valor de entrada, multiplicando-o por 3 e apresentando seu resultado. Proceder à execução dos passos anteriores cinco vezes. Observe a seguir a descrição das etapas básicas de entendimento do problema e a representação das ações do programa na Figura 5.16.
Diagramação
Codificação Inicio
1~1. 5, 1
programa LAÇO_INCONDICIONAL var I, N, R: inteiro . , . 1n1c10 para Ide 1 até 5 passo 1 faça leia N R
N
+-
N
*
3
escreva R fim_para fim
R~ N® 3
R
Fim
Figura 5.16 · Exemplo de laço para ...de... até ... passo...faça ...fim_para.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Programação com Laços
Capítulo 5
121
Entendimento O problema exposto já é conhecido, mas desta vez sua operação será mais dinâmica. Atente para os passos descritos em seguida: 1. 2. 3. 4. 5. 6.
Definir uma variável do tipo contador (variável 1), variando de 1 a 5, de 1 em 1. Ler um valor inteiro qualquer (variável N). Efetuar a multiplicação do valor de N por 3, colocando o resultado na variável R. Apresentar o valor calculado, que está armazenado na variável R. Repetir os passos 2, 3, 4 e 5 até o valor da variável chegar a 5. Encerrar a execução do programa.
O conjunto de instruções subordinadas ao bloco adjacente é executado entre os comandos para e fim_para, sendo a variável / (variável de controle) inicializada com valor 1 e incrementada de mais 1 por meio do comando passo até a variável / atingir o valor 5. Esse tipo de estrutura pode ser utilizado todas as vezes que houver a necessidade de repetir trechos finitos, em que se conhecem os valores do laço: inicial, final e incremento.
5.7 Considerações entre Tipos de Laços No decorrer deste capítulo, foram apresentadas seis estruturas de controle de laços existentes: ~
enquanto/fim_enquanto (laço condicional); ~ até_seja/fim_até_seja (laço condicional); ~ repita/até_que (laço condicional); ~ execute/enquanto_for (laço condicional); ~ laço/fim_laço (laço condicional); ~ para/fim_para (laço incondicional). Cada laço possui uma característica de processamento. Neste aspecto, deve-se notar que os laços mais versáteis são os condicionais, exceto o laço condicional seletivo, pois podem ser substituídos uns pelos outros, tanto que é comum encontrar uma ou outra forma nas linguagens de programação existentes. Outro detalhe a ser considerado é que os laços condicionais podem ser utilizados na construção de laços interativos e iterativos, ressalva já considerada em relação ao laço condicional seletivo. O laço condicional pode substituir a ação de um laço incondicional, mas o contrário não é verdadeiro. No capítulo 4, foi comentado o fato de ocorrer o encadeamento das estruturas de tomadas de decisão, o que se estende às estruturas de laços. Neste ponto pode ocorrer o encadeamento de uma estrutura de laço com outra. Essas ocorrências vão depender do problema a ser solucionado. Outro fato a ser lembrado é com relação às variáveis de ação e de controle, como comentado no tópico 3.3. Nos exemplos deste capítulo, esses dois conceitos ficam muito evidentes. Observe as variáveis / e RESP, que nos vários exemplos efetuaram o processamento de controle dos laços, enquanto N e R são as variáveis de ação dos programas apresentados. Os laços representam a etapa de programação mais importante, pois permitem escolher a base para que um programa tenha funcionalidade mais ampla e aplicada. Sem os laços a tarefa de programação seria muito desestimulante.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
122
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
5.8 Exercício de Aprendizagem A seguir encontram-se alguns exemplos das estruturas de laços iterativos apresentadas neste capítulo. Elaborar um programa que efetue o cálculo da fatorial do valor inteiro 5 e apresente o resultado dessa operaçao. Para entender o problema proposto, considere que, do ponto de vista matemático, fatorial é o produto dos números naturais desde 1 até o limite informado, neste caso 5. Assim sendo, a fatorial do valor 5, representada matematicamente como 5!, é a multiplicação de 1 x 2 x 3 x 4 x 5, que resulta no valor 120. Para efetuar essa operação, são necessárias duas variáveis, uma que controla as iterações do laço e outra que calcula a fatorial propriamente dito. Veja em seguida.
Entendimento A descrição do entendimento e da solução do problema proposto é basicamente a mesma para qualquer forma de laço, pois é levado em consideração o uso de laço iterativo. Considere os passos seguintes: 1. 2.
Inicializar as variáveis FAT e CONT, ambas com valor inicial 1. Multiplicar o valor da variável FAT sucessivamente pelo valor da variável CONT, atribuindo o resultado da multiplicação à própria variável FAT. Incrementar mais 1 à variável CONT. Repetir os passos 2 e 3 até o limite de 5 para a variável CONT. Apresentar ao final o valor obtido na variável FAT. Encerrar o programa.
3. 4. 5. 6.
Por ser necessário calcular uma fatorial de 5 (5!), significa que o contador deve variar de 1 a 5, e por este motivo deve ser a variável CONT inicializada com valor 1. Pelo fato de a variável FAT possuir ao final o resultado do cálculo da fatorial pretendida, ela deve ser inicializada também com valor 1. Se a variável FAT fosse inicializada com valor zero, não teria ao final o resultado da fatorial, pois qualquer valor multiplicado por zero resulta zero. Multiplicar sucessivamente implica em multiplicar a variável CONT pelo valor atual da variável FAT por cinco vezes. Observe atentamente as etapas de cálculo indicadas na tabela de cálculo da fatorial de 5 a seguir: Tabela de cálculo da 5! CONT
FAT
FAT ~ FAT*CONT
1
1
1
Valor inicial das variáveis e da fatorial
2
1
2
Cálculo da fatorial com o contador em 2
3
2
6
Cálculo da fatorial com o contador em 3
4
6
24
Cálculo da fatorial com o contador em 4
5
24
120
Cálculo da fatorial com o contador em 5
Comentários
O movimento apresentado na tabela de cálculo da fatorial de 5 é o mesmo que deve ser realizado por um programa que permita ao computador executar a operação e mostrar o resultado esperado .
•
Editora Erica - Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 5
Programação com Laços
123
Observe na tabela a necessidade de dois contadores. O contador para a variável CONT, que inicia a contagem em 1 e termina em 5, será utilizado de duas formas: como variável de controle para manter a execução do laço na frequência estabelecida e como variável de ação para fomentar o cálculo da fatorial em si. O outro contador é a variável FAT, que acumula o resultado de seu valor multiplicado pelo valor de CONT. As variáveis CONT (primeira coluna) e FAT (segunda coluna) são iniciadas com valor 1 (como mostra a primeira linha da tabela), o que resulta no valor de FAT em 1 (terceira coluna). Observe na sequência a segunda linha da tabela, em que a variável CONT está com valor 2 e a variável FAT com valor 1. Após o cálculo da terceira coluna na segunda linha da tabela, a variável FAT passa a possuir o valor 2. Se for seguido o mesmo raciocínio linha a linha, chegar-se-á à quinta e última linha com a variável FAT com 120. Quando a variável CONT estiver com valor 5, a variável FAT estará com o valor 120. A seguir são apresentados seis exemplos de solução do programa de cálculo da fatorial de 6, Figuras 5.17 a 5.22. Cada um dos exemplos usa as formas de laço estudadas neste capítulo e baseia-se no raciocínio descrito na tabela de cálculo da fatorial de 5. Para cada exemplo são indicados diagrama de blocos e codificação correspondente em português estruturado.
1~ Exemplo • Estrutura de laço enquanto/fim_enquanto Diagramação
Codificação programa FATORIAL_EXl var CONT, FAT: inteiro . , . 1n1c10 FAT +- 1 CONT +- 1 enquanto (CONT ara fim
22 Exemplo Desenvolver um programa que leia os nomes de oito alunos e também suas quatro notas bimestrais. Ao final, deve apresentar o nome de cada aluno classificado em ordem alfabética, bem como suas médias e a média geral dos oito alunos.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José A ugusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
Capítulo 8
Estruturas de Dados Homogêneas de Duas Dimensões
185
Entendimento Este exemplo apresenta um problema cuja solução é utilizar três matrizes para a entrada e manipulação de dados. Já é sabido que uma matriz trabalha somente com dados de mesmo tipo (homogêneos). E neste caso, em particular, será necessário usar uma matriz de uma dimensão para armazenar os nomes e outra de duas dimensões para armazenar as notas, uma vez que os tipos de dados são diferentes. Além dessas matrizes, será necessário ainda uma matriz para armazenar os valores das médias a serem apresentadas com os nomes dos alunos. Considere, para tanto, as tabelas da Figura 8.8. Notas 1
1
1
2
3 4 5 6 7 8
1
1
i
No.mes
1
.
2
.
3
Médias
4
1 2 3 4 5 6 7 8
1 .2 3 4 5
6 7
6
Figura 8.8 • Tabelas com os dados escolares.
O programa deve pedir o nome dos oito alunos e, em seguida, as quatro notas bimestrais de cada aluno, calcular a média e armazená-la na terceira matriz de uma dimensão, para ao final apresentar o nome de cada aluno e a respectiva média, bem como a média do grupo. Logo no início, a variável SOMA_MD é inicializada com valor zero. Ela será utilizada para armazenar a soma das médias de cada aluno durante a entrada de dados. Depois a instrução para / de 1 até 8 passo 1 faça inicializa o primeiro laço, que tem por finalidade controlar o posicionamento dos elementos no sentido linear. Neste ponto, a variável SOMA_NT é inicializada com o valor zero para o primeiro aluno. Ela guarda a soma das quatro notas de cada aluno durante a execução do segundo laço. Neste momento, é solicitado antes do segundo laço o nome do aluno. Toda vez que o segundo laço é encerrado, a matriz MÉDIA é alimentada com o valor da variável SOMA_NT dividido por 4. Deste modo, tem-se o resultado da média do aluno cadastrado. Em seguida é efetuada a soma das médias de cada aluno na variável SOMA_MD, que posteriormente servirá para determinar o cálculo da média do grupo. É nesse ponto que o primeiro laço repete o seu processo para o próximo aluno e assim transcorre até o último aluno. Após a disposição dos alunos em ordem alfabética, inicia-se a apresentação dos nomes de cada um deles e suas respectivas médias. Ao final, a variável MEDIA_GP determina o cálculo da média do grupo (média das médias) a partir do valor armazenado na variável SOMA_MD dividido por 8 (total de alunos). A Figura 8.9 demonstra apenas o trecho de ordenação dos nomes e das médias calculadas de cada um dos oito alunos.
•
Editora Erica -Algoritmos Lógica para Desenvolvimento de Programação de Computadores - José Augusto N. G. Manzano e Jayr F. de Oliveira - 28ª Edição
186
Algoritmos - Lógica para Desenvolvimento de Programação de Computadores
Diagramação '• •
.
1~1 . 7, 1 •'
.•
J (- 1+ 1, 8, 1
•'
N
NOME[I] > NOM:E(J]
s ,,
X ~ NOME[I] NOME[I] -----1~
cAL.CULO = escreva senão escreva fim se
fim
+ N2 + N3 + N4) / 4 5) então "Aluno aprovado com méd ia : ", MD
"Aluno reprovado com média : ", MD
-
Fim
Capítulo 5 - Exercício 1c Apresentar o total da soma dos cem primeiros números inteiros (1 +2+3+4+5+6+7+ ...97+98+100). 1
Inicio
'•
SOMA~O '• .•
CONTADOR ~ 1,100,1 '•
SOMA B; cin.ignore(80, '\n'); }
void saida(void) {
cout