INTRODUÇÃO À PROGRAMAÇÃO Introducao_a_Programacao_Livro.indb 1 17/11/2014 10:39:58
Introducao_a_Programacao_Livro.indb 2 17/11/2014 10:39:58
INTRODUÇÃO À PROGRAMAÇÃO Flávio Miguel Varejão Introducao_a_Programacao_Livro.indb 3 17/11/2014 10:39:59
2015, Elsevier Editora Ltda. Todos os direitos reservados e protegidos pela Lei n o 9.610, de 19/02/1998. Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrônicos, mecânicos, fotográficos, gravação ou quaisquer outros. Revisão Gráfica: Georgia Franco Editoração Eletrônica: SBNigri Artes e Textos Ltda. Elsevier Editora Ltda. Conhecimento sem Fronteiras Rua Sete de Setembro, 111 16 o andar 20050-006 Centro Rio de Janeiro RJ Brasil Rua Quintana, 753 8 o andar 04569-011 Brooklin São Paulo SP Brasil Serviço de Atendimento ao Cliente 0800-0265340 atendimento1@elsevier.com ISBN 978-85-352-8011-1 ISBN (versão eletrônica) 978-85-352-7265-9 Nota: Muito zelo e técnica foram empregados na edição desta obra. No entanto, podem ocorrer erros de digitação, impressão ou dúvida conceitual. Em qualquer das hipóteses, solicitamos a comunicação ao nosso Serviço de Atendimento ao Cliente, para que possamos esclarecer ou encaminhar a questão. Nem a editora nem o autor assumem qualquer responsabilidade por eventuais danos ou perdas a pessoas ou bens, originados do uso desta publicação. CIP-Brasil. Catalogação-na-fonte. Sindicato Nacional dos Editores de Livros, RJ V418i Varejão, Flavio Miguel Introdução à programação / Flavio Miguel Varejão. - 1. ed. - Rio de Janeiro: Elsevier, 2015. il. 24 cm. ISBN 978-85-352-8011-1 1. Programação (Computadores). 2. Programação. I. Título. 14-17771. CDD: 005.1 CDU: 004.42 Introducao_a_Programacao_Livro.indb 4 17/11/2014 10:39:59
Agradecimentos À SBC, em nome do professor José Viterbo Filho, diretor de publicações, pelo apoio na edição do livro. Aos tutores do Programa de Educação Tutorial (PET) de Engenharia da Computação da Universidade Federal do Espírito Santo, professores Álvaro César Pereira Barbosa e Roberta Lima Gomes, por acreditarem e apoiarem a elaboração deste livro. Aos coautores dos capítulos deste livro, pelo esforço e dedicação. Agradeço especialmente aos coautores André Ambrósio Boechat e Ivan de Oliveira Nunes,pelo esforço redobrado e pela coordenação dos trabalhos, revisões gerais, edição e formatação dos capítulos na versão original em Latex. Agradeço ainda a Clebson Joel Mendes de Oliveira, Ebenézer Nogueira da Silva, Gilberto Alves Santos Segundo, Ivan de Oliveira Nunes, Marcos Vinicius Caus Couto e Thaylo Xavier de Freitas, pelo apoio na revisão final do livro e na edição final de figuras e fórmulas. Aos alunos André Paris, Cleisson Santos Guterres, Flávio Duarte, Gustavo Tavares e Rodrigo Biancard Rodrigues Gomes, pelo trabalho de conversão do texto em Latex para Word. À Editora Campus-Elsevier, por acreditar no potencial do livro e pelo excelente trabalho da equipe de edição. Introducao_a_Programacao_Livro.indb 5 17/11/2014 10:39:59
Introducao_a_Programacao_Livro.indb 6 17/11/2014 10:39:59
Dedicatória Aos meus filhos Carina e Igor, por encherem de alegria cada dia da minha vida. À minha esposa Jud, pelo carinho e compreensão. Aos meus pais Helder e Glória Maria, pelo amor e apoio incondicional. Introducao_a_Programacao_Livro.indb 7 17/11/2014 10:39:59
Introducao_a_Programacao_Livro.indb 8 17/11/2014 10:39:59
Homenagem in memoriam Este livro homenageia Bruno Pandolfi, um jovem brilhante, ótimo aluno e pessoa humana excepcional que nos deixou tão cedo. Flávio Miguel Varejão Livros são eternos. Por isso mesmo, Bruno, todas suas ideias, seus pensamentos, toda sua vida, embora demasiadamente curta, deveriam estar registrados em um. Dessa forma, todos teriam a oportunidade e o privilégio que seus amigos e familiares tiveram: de te conhecer e aprender com você. Nossa vida na Terra, porém, não é eterna. Resta-nos, então, aceitar sua ida, em paz, e pedir a Deus que a dor diminua com o tempo, já que a saudade sei que permanecerá. Turma de Engenharia de Computação, UFES, 2002. Introducao_a_Programacao_Livro.indb 9 17/11/2014 10:39:59
Introducao_a_Programacao_Livro.indb 10 17/11/2014 10:39:59
Apresentação A computação é um mecanismo essencial para as mais diversas atividades do nosso cotidiano. A programação é a base fundamental para a construção das ferramentas da computação. Aprender a programar é a tarefa mais básica para qualquer pessoa que vá desenvolver as ferramentas da computação, essenciais para as nossas atividades do cotidiano. A introdução à programação não é simples. Em primeiro lugar, porque a programação normalmente não faz parte das disciplinas do ensino básico e fundamental. Mais que isso, os conceitos envolvidos em programação são bem diferentes daqueles ensinados nesses níveis de ensino. Embora haja uma grande relação da matemática com a computação, não é habitual a utilização na matemática do conceito de algoritmo para a descrição de processos para a solução de problemas. Além disso, conceitos básicos na matemática, como variáveis, podem representar um conceito bem diferente na computação. Isso tudo, além de aspectos operacionais importantes da computação, como documentação, legibilidade e manutenção de programas, tornam a introdução à programação uma tarefa complexa e importante. Existem vários livros que se propõem a ensinar (ou apoiar o ensino) de programação. Eles variam em termos do paradigma de programação adotado (imperativo, orientado a objetos ou funcional), nas linguagens que adotam e na ordem de apresentação e profundidade dos assuntos abordados. A maioria desses livros ensina o paradigma imperativo de programação. Uma abordagem comum é usar uma pseudolinguagem especificamente criada para o ensino, sem mesmo ter uma ferramenta computacional associada. Nesse caso, os Introducao_a_Programacao_Livro.indb 11 17/11/2014 10:39:59
XII Introdução à Programação Flávio Miguel Varejão ELSEVIER alunos necessitam aprender a programar sem utilizar o computador para auxiliar o aprendizado. Além disso, posteriormente terão de aprender a traduzir a sintaxe da pseudolinguagem para uma linguagem real de programação. Outra abordagem ainda muito comum é utilizar como ferramenta auxiliar de aprendizado a linguagem de programação Pascal, por sua simplicidade. No entanto, Pascal praticamente não é mais usada nos ambientes profissionais e acadêmicos. Ensinar os alunos uma linguagem nessa condição pode não ser tão produtivo. Frequentemente se ensina programação com a linguagem C. A grande vantagem dessa abordagem é utilizar uma linguagem das mais utilizadas (senão a mais utilizada) na computação. Uma crítica frequente ao ensino de programação usando a linguagem C é a necessidade de introduzir, prematuramente, conceitos relacionados à arquitetura dos computadores, como ponteiros, o que retira o foco do aprendizado dos algoritmos e dificulta o aprendizado de programação. Uma crítica importante é que os livros que adotam essas abordagens citadas deixam a apresentação dos conceitos de modularização por subprogramas e por tipos abstratos de dados para a parte final do curso, normalmente após apresentar conceitos de vetores e matrizes. Na maior parte, o conceito de tipos abstratos de dados não chega a ser introduzido. Isso faz com que o aluno tenha de construir programas de maior porte sem poder utilizar a modularização, o que complica o processo de desenvolvimento dos programas e dificulta o aprendizado. Outra crítica importante é que todas as abordagens discutidas até agora, por serem baseadas em linguagens tipadas estaticamente, impõem aos alunos a necessidade de especificação dos tipos das variáveis utilizadas, aumentando o esforço sintático e cognitivo para construir os programas. Alguns cursos têm utilizado linguagens de script tipadas dinamicamente, como Lua e Python, para ensinar programação. Se, de um lado, essa abordagem permite o desenvolvimento rápido de programas complexos e retira muita complexidade sintática do aprendizado de programação, por outro lado ela acaba deixando, em segundo plano, práticas que alguns consideram importantes para o desenvolvimento confiável e em grande escala de programas. Segundo essa perspectiva, é importante introduzir tais práticas desde o início do ensino de programação para que o programador as carregue em toda a sua vida profissional. Outra abordagem ensina programação pelo paradigma orientado a objetos. A ideia dessa abordagem é habituar o aluno desde cedo com o conceito de modularização a partir de tipos abstratos de dados (classes, na terminologia orientada a Introducao_a_Programacao_Livro.indb 12 17/11/2014 10:39:59
Apresentação XIII objetos) e com a estratégia bottom-up de desenvolvimento de programas. Na visão dos defensores dessa abordagem, há um mapeamento natural entre os objetos dos programas e as entidades reais, o que permite ao programador se concentrar mais na solução do problema, o que facilita o seu raciocínio. Embora essa abordagem focalize o ensino de programação baseada em abstração de dados, ela tem como requisito o aprendizado de programação imperativa para a implementação dos métodos das classes. Focar a orientação a objetos, tornando raso o estudo da programação imperativa, pode resultar em baixa qualidade do aprendizado de programação. Por fim, existe ainda uma vertente que advoga o uso de linguagens funcionais, como Scheme e Haskell, para o ensino de programação. As vantagens dessa abordagem seriam o conceito de variáveis que em linguagens funcionais equivale ao conceito de variáveis (incógnitas) da matemática, a baixa demanda sintática dessas linguagens, a ausência de efeitos colaterais e a elegância na formulação recursiva de algoritmos, propriedades que, em conjunto, facilitam a construção de algoritmos complexos e a verificação formal de programas. Porém, o fato de que linguagens funcionais ainda não são amplamente utilizadas no mercado, e até no ambiente acadêmico, torna essa abordagem ainda pouco atraente para o ensino geral. Se existem tantos livros e tantas abordagens para o ensino de programação, por que mais um livro de introdução à programação? A resposta a essa importante questão é que a abordagem adotada neste livro procura uma solução de compromisso, sendo ao mesmo tempo conservadora e inovadora. A abordagem do livro é conservadora porque usa o paradigma imperativo e a linguagem C (provavelmente, a estratégia mais comum empregada nos cursos de introdução à programação). Essa opção foi feita para não requerer aprender duas vezes uma sintaxe rígida de linguagens de programação (como nos livros que usam pseudolinguagem), não usar uma linguagem que não é mais utilizada academicamente e no mercado (como no caso dos que usam Pascal), já introduzir a noção de declaração de tipos importantes para a confiabilidade de linguagens estaticamente tipadas (em contraste com os livros que usam linguagens dinamicamente tipadas), não usar um paradigma ainda não estabelecido no mercado (funcional) e não avançar para a orientação a objetos sem uma fundamentação dos conceitos de programação imperativa. Introducao_a_Programacao_Livro.indb 13 17/11/2014 10:39:59
XIV Introdução à Programação Flávio Miguel Varejão ELSEVIER A abordagem é inovadora por focar, desde o princípio do livro, as técnicas de modularização por funções (Capítulo 3) e por tipos abstratos de dados (Capítulo 4), por minimizar a necessidade de conhecimento de ponteiros (o que só é apresentado no Capítulo 7) e da arquitetura interna de computadores, por concentrar-se em conceitos emprestados das abordagens funcional (ausência de efeitos colaterais e do uso de variáveis globais, foco na modularização com funções) e orientada a objetos (foco em tipos abstratos de dados). Mais importante, o livro procura passar a mensagem ao leitor de que ele deve pensar e projetar uma solução para o problema de programação antes de efetivamente começar a programar sua solução na linguagem de programação. Esse estímulo é feito mostrando o processo de construção dos programas na solução de exercícios resolvidos, primeiro explicando o que é o problema e qual estrutura de dados será utilizada, depois descrevendo o processo (passos) de solução na própria linguagem natural e, por fim, codificando essa solução na linguagem de programação e testando-a. Os exercícios propostos ao final de cada capítulo foram cuidadosamente elaborados e apresentam um grau de dificuldade adequado para promover o desenvolvimento e o aprendizado dos alunos. Além disso, ao final de cada capítulo é proposto um trabalho de maior porte para que os alunos possam consolidar o conhecimento adquirido no mesmo. É importante ressaltar que este não é um livro de linguagem C. É um livro de ensino de programação que usa a linguagem C. Em outras palavras, embora utilize a linguagem C para o ensino da programação, este livro objetiva primordialmente ensinar a programar e não ensinar a linguagem. Até o Capítulo 6, procurou-se ao máximo, com sucesso substantivo, minimizar a apresentação de conceitos específicos da linguagem C e da arquitetura de computadores. No Capítulo 7 e no Capítulo 8, especialmente, esse propósito não foi alcançado. O conceito de apontadores é bastante vinculado, por si só, à arquitetura de computadores e à linguagem C. Já o conceito de arquivos é comum às diversas linguagens de programação, mas é abordado no Capítulo 8 de forma muito específica à linguagem C. O fato de se evitarem certos recursos da linguagem C, na maior parte do livro, com o intuito de simplificar o aprendizado de programação, pode fazer com que programadores experientes de C até estranhem a forma como a linguagem é utilizada aqui, muitas vezes optando por utilizar técnicas menos eficientes, mas que facilitam o aprendizado do conceito em foco. Introducao_a_Programacao_Livro.indb 14 17/11/2014 10:39:59
Apresentação XV Para finalizar, é interessante descrever como este livro foi gerado. Ele começou a ser escrito em 2005, a partir de uma apostila feita originalmente por mim usando a linguagem de programação Pascal. Naquele ano, iniciei a sua adaptação para a linguagem C, porém outras atividades profissionais me impediram de dedicar o tempo necessário para completar e transformar o texto no livro desejado. No final de 2006, ciente da impossibilidade de concluir o projeto sozinho, propus ao tutor do PET (Programa de Educação Tutorial do Ministério da Educação) do curso de Engenharia de Computação da Universidade Federal do Espírito Santo (UFES) que a redação do livro se tornasse uma das atividades realizadas pelos alunos do programa. Desde então, várias gerações de petianos participaram da redação do livro. Várias versões dos capítulos foram geradas e revisadas, culminando na versão atual. Esta é outra característica diferencial do livro: é um livro escrito por alunos de graduação do curso de Engenharia da Computação sob a minha supervisão e orientação. Introducao_a_Programacao_Livro.indb 15 17/11/2014 10:39:59
Introducao_a_Programacao_Livro.indb 16 17/11/2014 10:40:00
Sumário Apresentação...XI Capítulo 1 Introdução...1 1.1. Algoritmos e programas...1 1.2. Refinamentos sucessivos...3 1.3. Pseudocódigo...4 1.4. Partes de um programa...5 1.5. Exemplo de programa...6 1.6. Desenvolvimento de programas...8 1.7. Resumo...10 1.8. Exercícios propostos...11 Capítulo 2 Conceitos básicos...13 2.1. Variáveis...14 2.2. Identificadores...16 2.3. Comando de atribuição...18 2.4. Tipos de dados...21 2.4.1. Declaração de variáveis...21 2.4.2. Tipo inteiro...22 2.4.3. Tipo ponto flutuante...23 2.4.4. Tipo booleano...24 2.4.5. Tipo caractere...25 2.4.6. Conversão de tipos...25 Introducao_a_Programacao_Livro.indb 17 17/11/2014 10:40:00
XVIII Introdução à Programação Flávio Miguel Varejão ELSEVIER 2.5. Constantes...26 2.6. Expressões...27 2.6.1. Expressões aritméticas...27 2.6.2. Expressões relacionais...29 2.6.3. Expressões lógicas...30 2.7. Comando de entrada de dados...32 2.8. Comando de saída de dados...33 2.9. Comandos de seleção...36 2.9.1. Comando de seleção simples...36 2.9.2. Comando de seleção dupla...39 2.9.3. Comandos de seleção aninhados...41 2.9.4. Comando de seleção múltipla...44 2.10. Comandos de repetição...47 2.10.1. Comando de repetição com precondição...47 2.10.2. Comando de repetição com pós-condição...56 2.10.3. Comando de repetição condensado...58 2.11. Problema dos lotes encaixantes...61 2.12. Exercícios resolvidos...69 2.13. Resumo...76 2.14. Exercícios propostos...77 2.15. Trabalho sugerido...80 Capítulo 3 Modularização...83 3.1. Resolvendo por partes...83 3.2. Subprogramas...85 3.3. Partes de um subprograma...86 3.3.1. Cabeçalho...86 3.3.2. Dicionário de dados...87 3.3.3. Corpo...88 3.3.4. Comentários...89 3.4. Chamada de subprogramas...90 3.5. Passagem de parâmetros...91 3.6. Retorno de dados...94 3.6.1. Encerramento antecipado de execução...98 3.7. Funções sem lista de parâmetros...100 3.8. Funções sem retorno de dados...101 Introducao_a_Programacao_Livro.indb 18 17/11/2014 10:40:00
Sumário XIX 3.9. Recursividade...102 3.9.1. Implementação não recursiva equivalente...104 3.10. Exercícios resolvidos...105 3.11. Resumo...118 3.12. Exercícios propostos...119 3.13. Trabalho sugerido...123 Capítulo 4 Tipos abstratos de dados...125 4.1. Tipos compostos heterogêneos (estruturas)...126 4.1.1. Definição...127 4.1.2. Uso...128 4.1.3. Simplificação na passagem de parâmetros e retorno de função...130 4.2. Tipos abstratos de dados...132 4.2.1. Definição de um TAD...133 4.2.2. Uso de um TAD...136 4.2.3. Tipos de operações de um TAD...138 4.2.4. Tipos de TADs...139 4.3. Exercícios resolvidos...140 4.4. Resumo...146 4.5. Exercícios propostos...147 4.6. Trabalho sugerido...149 Capítulo 5 Vetores...151 5.1. Vetores e sua importância...152 5.2. Representação...154 5.3. Definição...154 5.4. Operações...157 5.5. Strings...161 5.6. O TAD implementacional lista vetorial de inteiros...163 5.6.1. Atributos...163 5.6.2. Operações...164 5.6.3. Uso do TAD tlistavetint...182 5.7. Exercícios resolvidos...184 5.8. Resumo...193 5.9. Exercícios propostos...194 5.10. Trabalho sugerido...199 Introducao_a_Programacao_Livro.indb 19 17/11/2014 10:40:00
XX Introdução à Programação Flávio Miguel Varejão ELSEVIER Capítulo 6 Matrizes...201 6.1. Matrizes e sua importância...202 6.2. Definição e acesso...203 6.2.1. Definição...203 6.2.2. Acesso...204 6.2.3. Definição dinâmica de uma matriz...205 6.3. O TAD implementacional matriz de inteiros...206 6.3.1. Atributos...206 6.3.2. Operações...208 6.3.3. Uso do TAD tmatrizint...218 6.4. Exercícios resolvidos...219 6.5. Resumo...234 6.6. Exercícios propostos...234 6.7. Trabalho sugerido...237 Capítulo 7 Apontadores...239 7.1. Variáveis apontadoras...240 7.2. A sintaxe dos apontadores...242 7.2.1. Operador endereço de memória...243 7.2.2. Acesso à variável por meio de apontadores...243 7.2.3. Acesso a atributos da estrutura por meio de apontadores...245 7.3. Uso de apontadores nas passagens de parâmetros...246 7.4. Alocação dinâmica de memória...249 7.5. Problemas gerados por apontadores...253 7.5.1. Apontadores não inicializados...253 7.5.2. Objetos pendentes...254 7.5.3. Referência pendente...254 7.5.4. Programação macarrônica...255 7.6. TAD implementacional lista encadeada de inteiros...256 7.6.1. Definição do tipo tno...257 7.6.2. Atributos de tlista...259 7.6.3. Operações de tlista...259 7.6.4. Uso...268 Introducao_a_Programacao_Livro.indb 20 17/11/2014 10:40:00
Sumário XXI 7.7. Exercícios resolvidos...270 7.8. Resumo...277 7.9. Exercícios propostos...278 7.10. Trabalho sugerido...280 Capítulo 8 Arquivos...283 8.1. Variáveis transientes variáveis persistentes...283 8.2. Tipos de arquivos...284 8.2.1. Arquivos texto...284 8.2.2. Arquivos binários...285 8.3. Definição de arquivos...287 8.4. Operações sobre arquivos...287 8.4.1. Abertura...287 8.4.2. Fechamento...290 8.5. Operações sobre arquivos texto...291 8.5.1. Leitura...291 8.5.2. Escrita...293 8.6. Operações sobre arquivos binários...295 8.6.1. Leitura...295 8.6.2. Escrita...296 8.7. Outras funções úteis para arquivos...298 8.7.1. feof...298 8.7.2. fseek...300 8.8. Exercícios resolvidos...301 8.9. Resumo...305 8.10. Exercícios propostos...306 8.11. Trabalho sugerido...307 Referências bibliográficas...309 Introducao_a_Programacao_Livro.indb 21 17/11/2014 10:40:00
Introducao_a_Programacao_Livro.indb 22 17/11/2014 10:40:00