• Nenhum resultado encontrado

INTRODUÇÃO À PROGRAMAÇÃO

N/A
N/A
Protected

Academic year: 2021

Share "INTRODUÇÃO À PROGRAMAÇÃO"

Copied!
22
0
0

Texto

(1)
(2)
(3)

INTRODUÇÃO

À PROGRAMAÇÃO

(4)

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 © 2015, Elsevier Editora Ltda.

Todos os direitos reservados e protegidos pela Lei no 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 – 16o andar

20050-006 – Centro – Rio de Janeiro – RJ – Brasil Rua Quintana, 753 – 8o 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.

(5)

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 Com-putaçã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 es-pecialmente 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 for-mataçã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 Ta-vares e Rodrigo Biancard Rodrigues Gomes, pelo trabalho de conversão do texto em Latex para Word.

(6)
(7)

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.

(8)
(9)

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 pen-samentos, toda sua vida, embora demasiadamente curta, deveriam estar re-gistrados 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á.

(10)
(11)

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 progra-maçã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á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.

(12)

Introdução à Programação Flávio Miguel Varejão

XII 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 van-tagem 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 neces-sidade 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áti-cas 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 modula-rização a partir de tipos abstratos de dados (classes, na terminologia orientada a

(13)

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 abor-dagem 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 compro-misso, sendo ao mesmo tempo conservadora e inovadora.

(14)

Introdução à Programação Flávio Miguel Varejão

XIV 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ífi-cos 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 é uti-lizada aqui, muitas vezes optando por utilizar técnicas menos eficientes, mas que facilitam o aprendizado do conceito em foco.

(15)

Apresentação XV

(16)
(17)

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

(18)

Introdução à Programação Flávio Miguel Varejão XVIII 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

(19)

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

(20)

Introdução à Programação Flávio Miguel Varejão

XX 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

(21)

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

(22)

Referências

Documentos relacionados

Chegando ao primeiro andar da escola, o grupo se uniu à turma 1801 que também chegava para a aula de Português, mas com a professora Patrícia, da sala em frente..

Uma linguagem de programação define as palavras e símbolos que se pode usar para escrever um programa Uma linguagem de programação emprega um conjunto de regras (sintaxe) que

Para acessar valores da ui ou da função server, cada valor deve ser passado explicitamente aos módulos como argumentos das funções.. Toda função UI de um módulo deve começar

Definição de Linguagens • Gramáticas são utilizadas para definir a sintaxe de linguagens de programação • A linguagem definida por uma gramática é o conjunto de todas as

Use o lema do bombeamento para mostrar que, se uma linguagem L cont´em uma palavra de comprimento maior ou igual a n e ´e aceita por um autˆomato finito determin´ıstico com n

penta deriva da palavra grega 'pente' que significa 'cinco' tera do grego 'téras' que significa 'monstro'.. giga do grego 'gígas' que

Isto acontece porque programas escritos em linguagens de programação são traduzidos para o código de máquina do computador em vez de ser diretamente executado.. Uma meta ambiciosa

a) A execução de um código compilado é mais lenta do que se o mesmo código fosse interpretado. c) Na interpretação temos como resultado a geração de um outro arquivo escrito