Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Introdução à Programação: Conceitos Básicos e Estruturas de Controle, Manuais, Projetos, Pesquisas de Interface entre Ciência da Computação e Economia

Introdução a logica e desenvolvimento de programação

Tipologia: Manuais, Projetos, Pesquisas

2019

Compartilhado em 01/10/2019

vitorbzerra
vitorbzerra 🇧🇷

1 documento

1 / 107

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Bruno Jefferson de Sousa
José Jorge Lima Dias Júnior
Andrei de Araújo Formiga
Introdução a Programação
Editora da UFPB
João Pessoa
2014
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Introdução à Programação: Conceitos Básicos e Estruturas de Controle e outras Manuais, Projetos, Pesquisas em PDF para Interface entre Ciência da Computação e Economia, somente na Docsity!

Bruno Jefferson de Sousa

José Jorge Lima Dias Júnior

Andrei de Araújo Formiga

Introdução a Programação

Editora da UFPB João Pessoa 2014

Introdução à Programação ii

HISTÓRICO DE REVISÕES

VERSÃO DATA MODIFICAÇÕES NOME

v1.0.2 30/10/2014 cap5 Correção no título do código de troca_main.c; cap5 Remoção de título do código no exercício 4; Revisão geral do Livro; Impressão de mini-sumário por capítulo;

Eduardo

v1.0.1 24/9/2014 cap1: Correção da unidade da altura que estava 1,80 cm; Adição de links no histórico de revisão; Solicitando feedback ao final de cada capítulo;

Eduardo

v1.0.0 11/2013 Primeira versão do livro para impressão. Bruno, Jorge, Andrei

Introdução à Programação iii

  • 1 Algoritmos Sumário
    • 1.1 Introdução
    • 1.2 O que é um algoritmo?
    • 1.3 Características de um algoritmo
    • 1.4 Formas de representação
      • 1.4.1 Descrição Narrativa
      • 1.4.2 Fluxograma
      • 1.4.3 Linguagem Algorítmica
    • 1.5 Recapitulando
    • 1.6 Exercícios Propostos
  • 2 Introdução à Programação
    • 2.1 Introdução
    • 2.2 Níveis das Linguagens de Programação
    • 2.3 Tradutores e Interpretadores
    • 2.4 Paradigmas de Programação
    • 2.5 Linguagem C
    • 2.6 Núcleo de um programa
    • 2.7 Memória e Variáveis
      • 2.7.1 Identificadores
      • 2.7.2 Tipos de dados primitivos
      • 2.7.3 Declaração de variáveis
      • 2.7.4 Constantes simbólicas
    • 2.8 Comentários e indentação
    • 2.9 Matemática Básica
    • 2.10 Entrada e saída de dados
      • 2.10.1 Função printf()
      • 2.10.2 Função scanf()
    • 2.11 Recapitulando
    • 2.12 Exercícios Propostos
  • 3 Estruturas de Controle Introdução à Programação iv
    • 3.1 Introdução
    • 3.2 Estrutura Sequencial
    • 3.3 Estrutura de Decisão
      • 3.3.1 Decisão simples
        • 3.3.1.1 Expressões lógicas
        • 3.3.1.2 Exercício resolvido
        • 3.3.1.3 Verificação da condição com expressões aritméticas na Linguagem C
      • 3.3.2 Decisão composta
        • 3.3.2.1 Exercício resolvido
      • 3.3.3 Comando de decisão múltipla
    • 3.4 Estrutura de Repetição
      • 3.4.1 Comando while
        • 3.4.1.1 Exercício resolvido
      • 3.4.2 Comando do-while
      • 3.4.3 Comando for
      • 3.4.4 Laço infinito
      • 3.4.5 Exercício Resolvido
      • 3.4.6 Comandos de desvio
        • 3.4.6.1 Comando break
        • 3.4.6.2 Comando continue
    • 3.5 Recapitulando
    • 3.6 Exercícios Propostos
  • 4 Arranjos
    • 4.1 Introdução
    • 4.2 Vetores
      • 4.2.1 Declaração de Vetores
      • 4.2.2 Acessando os elementos de um vetor
      • 4.2.3 Exercício resolvido
    • 4.3 Strings
      • 4.3.1 Lendo e imprimindo Strings
      • 4.3.2 Manipulando strings
      • 4.3.3 Exercício resolvido
    • 4.4 Matrizes
    • 4.5 Recapitulando
    • 4.6 Exercícios Propostos
  • 5 Funções Introdução à Programação v
    • 5.1 O que são funções?
      • 5.1.1 Um exemplo
    • 5.2 Parâmetros
    • 5.3 Retorno de Valores com Funções
      • 5.3.1 Funções, Procedimentos e o Tipo void
    • 5.4 Um Exemplo Matemático: Equação de Segundo Grau
    • 5.5 Escopo de Variáveis
      • 5.5.1 Escopo dos Parâmetros
      • 5.5.2 Sombreamento e Sobreposição de Escopos
    • 5.6 Passagem de Parâmetros
      • 5.6.1 Passagem por Valor
      • 5.6.2 Passagem por Referência
        • 5.6.2.1 Realizando troca de valores com variáveis globais
    • 5.7 Protótipos e Declaração de Funções
    • 5.8 Funções Recursivas
    • 5.9 Recapitulando
    • 5.10 Exercícios Propostos
  • 6 Índice Remissivo

Introdução à Programação vi

Prefácio

BAIXANDO A VERSÃO MAIS NOVA DESTE LIVRO

Acesse https://github.com/edusantana/introducao-a-programacao-livro/releases para ve- rificar se há uma versão mais nova deste livro (versão atual: v1.0.2). Você pode consultar o Histórico de revisões, na início do livro, para verificar o que mudou entre uma versão e outra.

Este livro é destinado a alunos de cursos como Ciência da Computação, Sistemas de Informação, Engenharia da Computação e, sobretudo, Licenciatura em Computação. Ele tem o objetivo de apre- sentar os principais conceitos da programação de computadores, de modo que sua utilização é mais adequado a disciplinas introdutórias como a de Introdução à Programação. De forma alguma o pre- sente livro tem a pretensão de cobrir todos os assuntos relacionados à área de programação. Sua principal finalidade é a de servir como guia para os alunos que estão dando os primeiros passos nessa área que é tão importante para a ciência da computação.

A disciplina de Introdução à Programação é a primeira de uma sequência de disciplinas que têm o ob- jetivo de tornar os alunos capazes dominar os fundamentos e as técnicas relacionadas à programação de computadores. Durante o curso de Licenciatura em Computação, especificamente, os alunos terão a chance de conhecer em detalhes algumas das linguagens de programação mais utilizadas atualmente e estarão habilitados a ministrar cursos de programação para diversos públicos.

Mais importante do que conhecer as peculiaridades das linguagens de programação é aprender como funciona a lógica aplicada na elaboração de soluções desenvolvidas a partir de algoritmos compu- tacionais. Sendo assim, o principal objetivo deste livro é ensiná-los a resolver problemas com base nos comandos e mecanismos presentes nas linguagens de programação, desenvolvendo assim o que chamamos de lógica de programação. No decorrer do livro, o leitor aprenderá gradativamente a dar instruções ao computador através de programas que ele próprio será capaz de criar. Para isso, conhe- cerá a linguagem de programação C, uma das mais utilizadas e mais importantes linguagens na área de Ciência da Computação.

No Capítulo 1 será abordado o conceito de algoritmo, e suas principais formas de representação serão apresentadas. No Capítulo 2, descrevemos todo o processo de tradução de um programa escrito em linguagem de alto nível para um programa equivalente em código de máquina, isto é, a linguagem que os computadores conhecem. Além disso, será apresentado ao leitor a estrutura de um programa na linguagem C, o que o habilitará o leitor a desenvolver seu primeiro programa. O Capítulo 3 consiste no conteúdo do livro que mais desenvolve a lógica de programação. É nele que se encontram as principais instruções de uma linguagem de programação: as estruturas de controle. No Capítulo 4 será apresentado o conceito de arranjos e, por fim, no Capítulo 5, explicaremos como programas complexos podem ser divididos em programas menores, mais fáceis de serem solucionados, através da utilização das funções.

Recomendamos ao aluno, iniciante na programação de computadores, que não se limite à leitura e ao conteúdo deste livro. Pesquise na internet outros materiais, leia outros livros e faça todos os exercícios

Introdução à Programação viii

Importante Esta caixa é utilizada para chamar atenção sobre algo importante.

Cuidado Esta caixa é utilizada para alertar sobre algo que exige cautela.

Atenção Esta caixa é utilizada para alertar sobre algo potencialmente perigoso.

Os significados das caixas são apenas uma referência, podendo ser adaptados conforme as intenções dos autores.

Vídeos

Os vídeos são apresentados da seguinte forma:

Figura 1: Como baixar os códigos fontes: http://youtu.be/Od90rVXJV

Nota Na versão impressa irá aparecer uma imagem quadriculada. Isto é o qrcode (http://pt.wikipedia.org/wiki/C%C3%B3digo_QR) contendo o link do vídeo. Caso você tenha um celular com acesso a internet poderá acionar um programa de leitura de qrcode para acessar o vídeo. Na versão digital você poderá assistir o vídeo clicando diretamente sobre o link.

Introdução à Programação ix

Compreendendo as referências

As referências são apresentadas conforme o elemento que está sendo referenciado:

Referências a capítulos Prefácio [vi]

Referências a seções “Como você deve estudar cada capítulo” [vii], “Caixas de diálogo” [vii].

Referências a imagens Figura 2 [x]

Nota Na versão impressa , o número que aparece entre chaves “[ ]” corresponde ao número da página onde está o conteúdo referenciado. Na versão digital do livro você poderá clicar no link da referência.

Feedback

Você pode contribuir com a atualização e correção deste livro. Ao final de cada capítulo você será convidado a fazê-lo, enviando um feedback como a seguir:

Feedback sobre o capítulo Você pode contribuir para melhoria dos nossos livros. Encontrou algum erro? Gostaria de submeter uma sugestão ou crítica? Acesse https://github.com/edusantana/introducao-a-programacao-livro/issues/new para rea- lizar seu feedback. Lembre-se de incluir na mensagem a seção, capítulo ( prefacio ) e a versão do livro ( v1.0.2 ) alvo de sua contribuição. Você receberá notificações sobre os en- caminhamentos que serão dados a partir do seu feedback. Para compreender melhor como feedbacks funcionam consulte o guia do curso.

Nota A seção sobre o feedback, no guia do curso, pode ser acessado em: https://github.com/- edusantana/guia-geral-ead-computacao-ufpb/blob/master/livro/capitulos/livros- contribuicao.adoc.

Introdução à Programação 1 / 92

Capítulo 1

Algoritmos

OBJETIVOS DO CAPÍTULO

Ao final deste capítulo você deverá ser capaz de:

  • Definir algoritmo
  • Descrever suas principais características
  • Criar algoritmos utilizando diferentes formas de representação

Sumário

1.1 Introdução...................................... 1 1.2 O que é um algoritmo?............................... 2 1.3 Características de um algoritmo.......................... 4 1.4 Formas de representação.............................. 4 1.4.1 Descrição Narrativa.............................. 5 1.4.2 Fluxograma.................................. 5 1.4.3 Linguagem Algorítmica........................... 6 1.5 Recapitulando.................................... 8 1.6 Exercícios Propostos................................. 9

É comum pensarmos em uma estratégia para executar uma tarefa do nosso dia a dia, mesmo que ela seja muito simples. Ao escovar os dentes, por exemplo, nós seguimos diferentes estratégias. Uns começam com a escovação dos molares e depois partem para os dentes da frente, outros fazem o inverso. Enfim, existem várias formas de escovarmos os dentes, assim como existem várias maneiras de realizarmos diversas atividades. Você sabia que o conjunto de passos para resolver um certo problema ou realizar determinada tarefa chama-se algoritmo? E que eles são importantíssimos para a programação de computadores?

Neste capítulo estudaremos as características dos algoritmos, suas formas de representação e, sobre- tudo, a relação entre eles e a programação de computadores.

Introdução à Programação 2 / 92

1.1 Introdução

Fonte inspiradora de livros e filmes, o americano Monty Roberts (Figura 1.1 [2]), conhecido como o “encantador de cavalos”, revolucionou a forma de domar cavalos. Ao estudar o comportamento de cavalos selvagens, percebeu que existe entre eles uma linguagem corporal compartilhada. Enten- dendo tal linguagem, conseguiu rapidamente ganhar a confiança de cavalos arredios e instruí-los a se comportarem como desejava. Além de não usar de violência, essencial no emprego dos métodos convencionais, seu método é capaz de domar cavalos em poucos dias, ao contrário da maioria, que normalmente necessita de várias semanas.

Figura 1.1: Monty Roberts.

Assim como os cavalos, os computadores também são instruídos por meio de uma linguagem par- ticular. Para que eles se comportem como desejamos, basta que sejam comandados a partir de uma linguagem que sejam capazes de entender.

Diferentemente do que ensina o senso o comum, os computadores não possuem inteligência. Seu único trabalho é processar dados, conforme uma sequência de instruções que fazem parte do voca- bulário da linguagem que eles conseguem compreender. A ilusão de que eles realizam tarefas de forma inteligente é proporcionada através desse conjunto ordenado de instruções, que é denominado de algoritmo. Neste caso, o “domador” do computador, responsável por elaborar o algoritmo que vai orientá-lo na execução de uma determinada tarefa, é chamado de programador de computadores.

1.2 O que é um algoritmo?

A palavra “algoritmo” é derivada do nome Mohammed ibn Musa Al-Khowarizmique, que foi um matemático, astrólogo, astrônomo e autor persa. Ele fez parte de um centro acadêmico conhecido como a Casa da Sabedoria, em Bagdá, por volta de 800 d.C. Seus trabalhos introduziram o cálculo hindu aos árabes e, a partir daí, ao resto da Europa.

Não obstante os algoritmos representam um conceito central na Ciência da Computação, sua atuação não se limita a essa área do conhecimento. Rotineiramente, lidamos com algoritmos na realização das mais variadas tarefas. Eles podem ser utilizados para lavar um carro, preparar um bolo, tomar banho, montar um guarda-roupa, etc. Perceba que os algoritmos não devem ser confundidos com as atividades. Eles se referem aos passos seguidos para que estas sejam realizadas. Como exemplo de algoritmos, podemos citar as instruções para montagem de equipamentos, para utilização de cosmé- ticos como shampoos e condicionadores, para saída de emergência em meios de transporte, receitas culinárias, manuais de uso, entre outros.

A partir do que foi exposto, podemos definir algoritmo como uma sequência finita, ordenada e não ambígua de passos para solucionar determinado problema ou realizar uma tarefa.

Introdução à Programação 4 / 92

Uma solução para o problema pode ser alcançada a partir do seguinte algoritmo:

ALGORITMO PARA ENCHER VASILHAS

  1. Encha a vasilha de nove litros.
  2. Usando a vasilha de nove litros, encha a de quatro.
  3. Coloque a quantidade que sobrou (cinco litros) na terceira vasilha (v3 = 5).
  4. Esvazie a vasilha de quatro litros.
  5. Encha novamente a vasilha de nove litros.
  6. Usando a vasilha de nove litros, encha a de quatro.
  7. Esvazie a de quatro litros.
  8. Usando a sobra da de nove litros (cinco litros), encha novamente a de quatro litros.
  9. Coloque a sobra da de nove litros (agora um litro) na terceira vasilha (v3 = 5 + 1 = 6).

1.3 Características de um algoritmo

Todo algoritmo, seja ele computacional ou não, recebe uma entrada, processa-a e gera uma saída segundo seu conjunto de passos. No caso do algoritmo para fritar ovo, a entrada corresponde à frigideira, ao ovo e ao óleo. O processamento ocorre com a execução de seus passos, gerando como saída o ovo frito.

Os algoritmos computacionais, especificamente, possuem as seguintes características:

Definição Os passos de um algoritmo devem ser bem definidos, objetivando a clareza e evitando ambigui- dades.

Finitude Um algoritmo deve chegar ao seu fim após um número finito de passos.

Efetividade Um algoritmo deve ser efetivo, ou seja, suas operações devem ser básicas o suficiente para que possam, em princípio, serem executadas de maneira exata e em um tempo finito.

Entradas Um algoritmo deve possuir zero ou mais entradas. Estas são insumos ou quantidades que são processados pelos algoritmos durante a execução de seus passos.

Saídas Um algoritmo deve possuir uma ou mais saídas. Elas representam o resultado do trabalhado realizado pelos algoritmos.

Introdução à Programação 5 / 92

1.4 Formas de representação

As formas mais comumente utilizadas para representar algoritmos são as seguintes:

  • Descrição narrativa
  • Fluxograma
  • Linguagem Algorítmica

Todas elas apresentam pontos fortes e fracos, não existindo consenso entre os especialistas sobre a melhor forma de representação. Apresentaremos as nuances de cada uma nas próximas seções.

1.4.1 Descrição Narrativa

Os algoritmos são expressos em linguagem natural (português, inglês, francês, espanhol, etc.). Sua principal desvantagem se encontra no fato da linguagem natural estar bem distante da linguagem utilizada pelos computadores. Logo, a tradução de uma para a outra se torna uma atividade bastante dispendiosa. Além disso, linguagens naturais são mais propensas a ambiguidades. Muitas vezes uma palavra pode ter vários significados, dependendo do contexto no qual são utilizadas. Em contrapartida, é bem mais fácil elaborar um algoritmo por meio de uma linguagem com a qual já temos uma certa familiaridade, do que através de linguagens que não são utilizadas com frequência no dia a dia.

Os exemplos de algoritmos mostrados anteriormente (Algoritmo para fritar um ovo [2] e Algoritmo para encher vasilhas [3]) refletem esta forma de representação.

1.4.2 Fluxograma

Consiste em usar formas geométricas padronizadas para descrever os passos a serem executados pelos algoritmos. As formas apresentadas na Figura 1.3 são as mais comumente utilizadas em fluxogramas.

Processamento.

Sentido do fluxo de execução do algoritmo.

Ponto de decisão.

Início/Fim.

Entrada de dados.

Saída de dados.

Figura 1.3: Formas geométricas utilizadas em fluxogramas

A vantagem de se fazer uso dos fluxogramas está na facilidade de compreendê-los. Descrições de algoritmos mediante formas gráficas são mais facilmente compreendidas do que descrições que en- volvem apenas textos. Além do mais, os fluxogramas possuem um padrão mundial no que se refere à sua simbologia, tornando sua utilização independente das peculiaridades das linguagens naturais.

Introdução à Programação 7 / 92

Figura 1.5: John von Neumann

Para esclarecer como funciona a execução de um algoritmo baseado no ciclo de execução mencio- nado, considere uma memória com 32 posições para armazenamento, organizada conforme Figura 1. [7].

x = 2 y = 3 z=x.y

2 3 6

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

16 17 18 19

20 21 22 23

24 25 26 27

28 29 30 31

Figura 1.6: Representação de uma memória com 32 posições para armazenamento.

Os números do canto superior direito de cada célula indicam os endereços de memória correspon- dentes a cada posição da memória representada. Nas três primeiras células constam as instruções que serão executadas e, da oitava à décima, constam valores armazenados nas posições de memória nomeadas por x, y e z, respectivamente.

Supondo que a execução do algoritmo em questão inicia-se com a busca da instrução no endereço 0 (zero), o ciclo de execução continua com a decodificação da instrução x = 2, que, após sua realização, resulta no armazenamento do valor 2 na posição de memória de número 8, nomeada de x. O passo 4 então é executado, dando início à busca da próxima instrução. Com isso, a instrução y = 3 é encontrada e decodificada, gerando como resultado o armazenamento do valor 3 na posição de número 9, nomeada de y. O mesmo ocorre com a instrução z = x.y, que, após sua decodificação, armazena o valor 6 (produto de x por y) na posição de endereço 10 e rotulada de z. O algoritmo em descrição narrativa para a execução das instruções anteriores encontra-se logo abaixo:

ALGORITMO PARA MULTIPLICAR DOIS NÚMEROS

Introdução à Programação 8 / 92

  1. Escreva 2 na posição de memória nomeada de x.
  2. Escreva 3 na posição de memória nomeada de y.
  3. Multiplique x e y e o resultado escreva em z.

Modelos como o mencionado anteriormente não apenas definem a forma como os dados são processa- dos pelo computador, mas também a linguagem que eles são capazes de compreender. Assim sendo, a linguagem utilizada pelos computadores está restrita a um conjunto limitado de instruções, cujo funcionamento depende de sua arquitetura de hardware. As linguagens de programação imperativas (Pascal, C, Cobol etc), por exemplo, foram criadas em função da arquitetura de von Neumman. A linguagem algorítmica, também chamada de pseudocódigo ou pseudo-linguagem, por sua vez, consiste no emprego de uma linguagem intermediária entre a linguagem natural e uma linguagem de programação. Esse meio termo resulta em uma linguagem que se aproxima das construções de uma linguagem de programação, sem exigir, no entanto, rigidez na definição das regras para utilização de suas instruções. Geralmente, essa forma de representação de algoritmos é uma versão reduzida de linguagens de alto nível como C e Pascal. Segue abaixo o algoritmo da Figura 1.4 [6] em pseudocó- digo: 1 ALGORITMO 2 DECLARE nota1, nota2, M : NUMÉRICO 3 LEIA nota 4 LEIA nota 5 M ← (nota1 + nota2) / 2 6 SE M >= 7.0 ENTÃO 7 ESCREVA “Aprovado” 8 SENÃO 9 ESCREVA “Reprovado” 10 FIM-SE 11 FIM_ALGORITMO.

As palavras em letras maiúsculas correspondem a palavras reservadas que fazem parte do conjunto de regras que a linguagem algorítmica deve seguir. Embora sejam mais flexíveis do que as linguagens de programação em relação ao seu uso (a instrução LEIA, por exemplo, muitas vezes é substituída por LER, OBTER, etc.), algumas palavras são necessá- rias, pois facilitam o entendimento e aproximam o pseudocódigo de um programa de computador. As palavras INÍCIO e FIM, por exemplo, indicam onde começa e termina o algoritmo. Já as instruções LEIA e ESCREVA referem-se a operações de entrada e saída de dados (ex.: ler dados do teclado ou exibir uma frase no monitor), presentes na maioria das linguagens de programação. Seguindo com a explicação do algoritmo, perceba que a linha com a instrução M ← (nota1 + nota2) /2 contém dois símbolos ainda não apresentados. O símbolo / diz respeito à operação aritmética da divisão, ao passo que o símbolo ← expressa uma operação de atribuição, que pode ser lida da seguinte forma: A posição de memória, representada simbolicamente por M, recebe o valor da soma de nota1 e nota2, dividido por dois. Para finalizar, a linha 6 apresenta uma estrutura de controle condicional essencial para as linguagens de programação. Operações de atribuição, expres- sões e estruturas de controle fazem parte do núcleo das linguagens de programação imperativas e são, portanto, fundamentais para o aprendizado da programação. Todos esses assuntos serão abordados de forma mais aprofundada em capítulos posteriores. A principal vantagem da forma de representação em linguagem algorítmica está na facilidade com a qual um pseudocódigo pode ser transcrito para uma linguagem de programação. Assim como os