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

Algoritmos e Logica de Programação, Notas de estudo de Algoritmos e Programação

Scribd is a way to easily put your documents online.

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 11/08/2008

marcelo-pacifico-5
marcelo-pacifico-5 🇧🇷

5

(1)

9 documentos

1 / 16

Toggle sidebar

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

Não perca as partes importantes!

bg1
Sumário
Prefácio xix
1 Introdução 1
1.1 O desenvolvimento de um software . . . . . . . . . . . . . . . . . . . . 1
1.2 Algoritmos e lógica de programação . . . . . . . . . . . . . . . . . . . 3
1.2.1 O significado de um algoritmo . . . . . . . . . . . . . . . . . . 4
1.2.2 Exemplo de algoritmo . . . . . . . . . . . . . . . . . . . . . . 5
1.3 A formalização de um algoritmo . . . . . . . . . . . . . . . . . . . . . 12
1.3.1 A sintaxe de um algoritmo . . . . . . . . . . . . . . . . . . . . 12
1.3.2 Exemplo de sintaxe de um algoritmo . . . . . . . . . . . . . . . 13
1.3.3 A semântica de um algoritmo . . . . . . . . . . . . . . . . . . 15
1.4 Como resolver problemas . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4.1 A análise e a síntese de um problema . . . . . . . . . . . . . . 16
1.4.2 Modelagem de problemas . . . . . . . . . . . . . . . . . . . . 17
1.4.3 O papel da lógica em programação . . . . . . . . . . . . . . . . 19
1.5 Como se portar em um curso de computação . . . . . . . . . . . . . . . 21
1.6 Exercícios................................. 24
2 Conceitos de Computação e Computadores 27
2.1 Origens da computação . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.1.1 A necessidade de calcular . . . . . . . . . . . . . . . . . . . . 27
2.1.2 O desenvolvimento de sistemas de numeração . . . . . . . . . . 28
2.2 A evolução dos computadores . . . . . . . . . . . . . . . . . . . . . . 33
2.2.1 Geração zero Computadores puramente mecânicos . . . . . . 33
2.2.2 Primeira geração Computadores a válvula e relé . . . . . . . . 37
2.2.3 Segunda geração Computadores transistorizados . . . . . . . 43
2.2.4 Terceira geração Computadores com circuitos integrados . . . 44
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Pré-visualização parcial do texto

Baixe Algoritmos e Logica de Programação e outras Notas de estudo em PDF para Algoritmos e Programação, somente na Docsity!

Sumário

  • 1 Introdução Prefácio xix
    • 1.1 O desenvolvimento de um software
    • 1.2 Algoritmos e lógica de programação
      • 1.2.1 O significado de um algoritmo
      • 1.2.2 Exemplo de algoritmo
    • 1.3 A formalização de um algoritmo
      • 1.3.1 A sintaxe de um algoritmo
      • 1.3.2 Exemplo de sintaxe de um algoritmo
      • 1.3.3 A semântica de um algoritmo
    • 1.4 Como resolver problemas
      • 1.4.1 A análise e a síntese de um problema
      • 1.4.2 Modelagem de problemas
      • 1.4.3 O papel da lógica em programação
    • 1.5 Como se portar em um curso de computação
    • 1.6 Exercícios
  • 2 Conceitos de Computação e Computadores
    • 2.1 Origens da computação
      • 2.1.1 A necessidade de calcular
      • 2.1.2 O desenvolvimento de sistemas de numeração
    • 2.2 A evolução dos computadores
      • 2.2.1 Geração zero – Computadores puramente mecânicos
      • 2.2.2 Primeira geração – Computadores a válvula e relé
      • 2.2.3 Segunda geração – Computadores transistorizados
      • 2.2.4 Terceira geração – Computadores com circuitos integrados
      • 2.2.5 Quarta geração – Computadores com chips VLSI viii Algoritmos e Lógica de Programação
    • 2.3 A representação da informação em um computador
      • 2.3.1 A eletrônica digital do computador
      • 2.3.2 Conceitos de bits e seus múltiplos
      • 2.3.3 Caracteres e cadeias de caracteres
      • 2.3.4 Imagens
      • 2.3.5 Sons
    • 2.4 A arquitetura de um computador
    • 2.5 O funcionamento da UCP na execução dos programas
    • 2.6 O projeto lógico na construção de programas
  • 3 Algoritmos e Fluxogramas
    • 3.1 Revisão do conceito de algoritmo
    • 3.2 Aplicabilidade dos algoritmos
      • 3.2.1 Exemplo não computacional de um algoritmo
      • 3.2.2 Exemplo computacional de um algoritmo
    • 3.3 Propriedades de um algoritmo
    • 3.4 Fluxogramas
    • 3.5 Construindo fluxogramas
      • 3.5.1 Fluxograma mínimo
      • 3.5.2 Fluxograma com comandos seqüenciais
      • 3.5.3 Fluxograma com comandos de decisão
      • 3.5.4 Fluxograma com comandos de repetição
      • 3.5.5 Simulação de algoritmos com fluxogramas
    • 3.6 Convenções para tipos de dados
      • 3.6.1 Números
      • 3.6.2 Caracteres e cadeias de caracteres
      • 3.6.3 Valores lógicos
    • 3.7 Convenções para os nomes de variáveis
    • 3.8 Convenções para as expressões
      • 3.8.1 Operação de atribuição
      • 3.8.2 Operações aritméticas
      • 3.8.3 Operações relacionais
      • 3.8.4 Operações lógicas
      • 3.8.5 Expressões
    • 3.9 Sub-rotinas predefinidas
      • 3.9.1 Funções matemáticas
      • 3.9.2 Funções e procedimentos para as cadeias de caracteres
    • 3.10 Exercícios Sumário ix
  • 4 Estruturas de Programação
    • 4.1 Estruturas de programação
    • 4.2 Estruturas seqüenciais
    • 4.3 Estruturas de decisão
      • 4.3.1 Estrutura SE-ENTÃO
      • 4.3.2 Estrutura SE-ENTÃO-SENÃO
      • 4.3.3 Estrutura CASO
      • 4.3.4 Exemplos de estruturas de decisão
    • 4.4 Estruturas de repetição
      • 4.4.1 Estrutura ENQUANTO-FAÇA
      • 4.4.2 Estrutura REPITA-ATÉ
      • 4.4.3 Estrutura PARA-ATÉ-FAÇA
      • 4.4.4 Exemplos de estruturas de repetição
      • 4.4.5 Símbolos específicos para estruturas de repetição (ISO 5807)
    • 4.5 Outras representações de algoritmos
      • 4.5.1 Portugol
      • 4.5.2 Diagramas de Nassi-Schneidermann
    • 4.6 Exercícios
  • 5 Variáveis Indexadas
    • 5.1 Motivação
    • 5.2 Variáveis indexadas unidimensionais
    • 5.3 Representação de vetores na memória do computador
    • 5.4 Utilização de vetores
    • 5.5 Exemplos de fluxogramas com vetores
      • 5.5.1 Localização de um elemento do vetor
      • 5.5.2 Média aritmética dos elementos de um vetor
      • 5.5.3 Localização de elementos de um vetor por algum critério
      • 5.5.4 Determinação do maior e menor elemento de um vetor
      • 5.5.5 Cálculo de um polinômio pelo método de Horner
    • 5.6 Variáveis indexadas bidimensionais
    • 5.7 Exemplos de fluxogramas com matrizes
      • 5.7.1 Leitura de elementos para uma matriz
      • 5.7.2 Produto de um vetor por uma matriz
    • 5.8 Exercícios
  • 6 Técnicas para a Solução de Problemas x Algoritmos e Lógica de Programação
    • 6.1 A técnica top-down
      • 6.1.1 Exemplo de aplicação
    • 6.2 Sub-rotinas
      • 6.2.1 Funções
      • 6.2.2 Exemplos de funções
      • 6.2.3 O mecanismo de chamada de funções
      • 6.2.4 Procedimentos
    • 6.3 Exercícios
  • A Pequeno Histórico da Computação
    • A.1 Linha do tempo
  • B A Norma ISO 5807/1985
    • B.1 Os símbolos
      • B.1.1 Símbolos relativos a dados
      • B.1.2 Símbolos relativos a processos
      • B.1.3 Símbolos de linhas
      • B.1.4 Símbolos especiais
      • B.1.5 Textos internos
  • C Operadores e Funções Predefinidas
    • C.1 Operadores matemáticos
    • C.2 Funções predefinidas
  • Referências Bibliográficas

Prefácio

A quem se destina este livro?

Este livro destina-se a um curso introdutório de lógica de programação, especialmente para aqueles ministrados em escolas de Engenharia. Um dos principais problemas en- contrados pelo estudante de Engenharia em um primeiro curso de lógica de programa- ção é a carência de textos que abordem de forma direta e clara as etapas necessárias para suportar o processo de resolução de problemas (computacionais ou não), a saber: a análise , com a identificação e solução de subproblemas, e a síntese , união das soluções encontradas para compor a solução do problema original. O resultado dessas etapas é sintetizado em passos que devem ser seguidos em determinada ordem e que constituem os algoritmos.

Abordagem empregada

Pretende-se aqui seguir uma apresentação incremental dos tópicos. Inicialmente são pro- postos problemas simples que envolvem raciocínio lógico e que possuem solução livre, de modo a ambientar e a incentivar o estudante na descrição dos passos elementares necessários à resolução de problemas. Isso é fundamental, pois grande parte dos estu- dantes que tem um primeiro contato com lógica de programação apresenta deficiências na organização de suas soluções e em abstrações. Além disso, neste primeiro contato, um processo genérico de solução de problemas é apresentado de maneira a fornecer um conjunto de dicas ou heurísticas que podem ser aplicadas em todos os problemas a serem resolvidos, fortalecendo assim o processo de abstração, essencial em programação. A seguir são apresentados os conceitos de computação e computadores. Embora um primeiro curso de lógica de programação possa ser ministrado sem referências a como um computador é organizado e como funciona, verifica-se na prática que esse en- foque não é adequado. Como se sabe, o grande problema do estudante nesses cursos

Prefácio xxi

arquitetura de Von Neumann. Um computador hipotético com instruções simplificadas é apresentado de forma a proporcionar ao estudante simulações de como as instruções e os dados são realmente processados. Os conceitos de algoritmo e fluxograma são formalizados no Capítulo 3. São dis- cutidos o conceito e as propriedades de um algoritmo, a representação de algoritmos por fluxogramas, como criar um fluxograma utilizando os símbolos básicos da norma ISO 5807/1985, bem como convenções para os tipos de dados, os nomes de variáveis e operadores. Já no Capítulo 4 formalizam-se as estruturas de programação. São apresentados os nomes e as topologias das estruturas típicas de um programa: as estruturas seqüenciais, de decisão e de repetição. Apresentam-se ainda nesse capítulo duas outras formas de re- presentação de algoritmos: os diagramas de Nassi-Schneidermann e a pseudolinguagem Portugol. É apresentado, no Capítulo 5, o conceito de variáveis indexadas e seu uso. As variá- veis indexadas são aquelas que referenciam de forma ordenada uma seqüência de dados homogêneos. Separam-se aqui, para melhor compreensão, o conceito e a utilização de variável indexada unidimensional (ou vetor) do conceito de variável indexada bidi- mensional e multidimensional. Com essa separação, espera-se que o estudante consiga estender os conceitos e operações relacionados a variáveis indexadas unidimensionais para dimensões maiores. Por fim, no Capítulo 6 são discutidas as técnicas para a solução de problemas, mais especificamente as técnicas para modularizar a solução utilizando sub-rotinas. São apon- tados os dois tipos básicos de sub-rotinas (função e procedimento) e como empregá-los de acordo com a técnica top-down de modularização. A Figura da página xxii exibe a organização dos capítulos deste livro.

Convenções tipográficas

Algumas convenções tipográficas foram utilizadas neste livro para tornar mais clara a sua compreensão:

  • Negrito é empregado para destacar os conceitos importantes.
  • Itálico é utilizado para enfatizar os conceitos essenciais e para palavras estrangei- ras.

xxii Algoritmos e Lógica de Programação

Capítulo 1 - Introdução

Capítulo 2 - Conceitos de Computação e Computadores

Capítulo 3 - Algoritmos e Fluxogramas

Capítulo 4 - Estruturas de Programação

Capítulo 6 - Técnicas para a Solução de Problemas

Capítulo 5 - Variáveis Indexadas

  • Nos exercícios existem símbolos para identificar aqueles que são básicos, de re- solução imediata; médios, nos quais o estudante deve pensar um pouco mais na solução; e desafios, a fim de empenhar-se mais na sua solução:  exercício fácil  exercício médio  exercício desafiador

2 Algoritmos e Lógica de Programação

por si só é um valor qualquer armazenado em um computador enquanto a informação representa a interpretação desse dado, ou seja, qual o seu significado. Parte dos dados processados durante a execução de um software é fornecida pelo ser humano (ou outra máquina) e denominada dados de entrada. Por outro lado, os dados de saída são aqueles fornecidos ao ser humano (ou outra máquina) após o processamento dos dados de entrada. De qualquer forma, é importante notar que o objetivo do software é que motiva sua construção. Este pode ser definido como alguma necessidade humana, por exemplo, um programa para simular o funcionamento de um circuito digital, um programa para comandar um robô em uma linha de montagem, um sistema de gerenciamento de in- formações em uma empresa, somente para citar algumas. A Figura 1.1 descreve uma simplificação do processo de desenvolvimento de um software.

Figura 1.1 Simplificação do processo de construção de um software.

Nessa figura, o cliente especifica exatamente o que o software deve conter. Ele sabe o que o software deve conter e realizar, mas regra geral não sabe como. Ele indica o que o software deve contemplar e executar por meio de especificações chamadas requisitos. Entende-se por cliente a entidade que contrata os serviços para a criação de um software, podendo ser uma empresa, pessoa ou ainda uma empresa que, por iniciativa própria, produza e venda seu software livremente (por exemplo, a Microsoft). No desenvolvimento, os requisitos do cliente são traduzidos em especificações téc- nicas de software pelos analistas de sistema ou engenheiros de software. O desenvol- vimento de um software é tipicamente dividido nas seguintes etapas:

  • Análise : criam-se especificações que detalham como o software vai funcionar;
  • Projeto : criam-se especificações que detalham o resultado da análise em termos mais próximos da implementação do software;

Capítulo 1 – Introdução 3

  • Implementação : utilizando-se uma linguagem de programação e as especifica- ções de projeto, o software é construído;
  • Testes : após a construção do software, são realizados testes para conferir sua conformidade com os requisitos iniciais. O software deve satisfazer a todas espe- cificações do cliente.

Por fim, após os testes o software é implantado na empresa. A implantação pode variar desde uma simples instalação via CD-ROM, que dure alguns minutos, até a insta- lação e testes de integração de diversos softwares, que pode levar semanas. De qualquer forma, o fato de o software estar finalizado e testado não significa que esteja totalmente livre de erros, também denominados bugs. Assim, deve-se voltar e tentar identificar a causa dos erros. Pior que erros de programação, é o caso em que pode acontecer de o software funci- onar corretamente, não apresentar erros, mas não realizar o que o cliente esperava. Nesse caso, deve-se retornar à etapa inicial, verificando os requisitos e refazendo todo o ciclo de desenvolvimento novamente. É um fato que grande parte do investimento feito em um software é gasta na correção de erros do que propriamente na sua elaboração. Daí, surge a necessidade de enxergar o software como o produto de um processo bem-definido e controlado, que atue sobre as suas etapas de desenvolvimento, em outras palavras, um processo de engenharia de software.

1.2 Algoritmos e lógica de programação

Como foi brevemente apresentado na Seção 1.1, o software deve ser encarado como um produto de um processo bem-definido e controlado de engenharia. O intuito deste livro não é entrar em detalhes sobre engenharia de software e sim concentrar-se na dissemina- ção de conceitos básicos que viabilizem a especificação correta de softwares, uma etapa imediatamente anterior a sua implementação ou programação. O estudo de algoritmos e de lógica de programação é essencial no contexto do processo de criação de um software. Ele está diretamente relacionado com a etapa de projeto de um software em que, mesmo sem saber qual será a linguagem de programação a ser utilizada, se especifica completamente o software a ponto de na implementação ser possível traduzir diretamente essas especificações em linhas de código em alguma lin- guagem de programação como Pascal, C, Java e outras. Essa tarefa permite verificar, em um nível maior de abstração, se o software está correto ou não. Permite, inclusive, averiguar se o software atenderá às especificações

Capítulo 1 – Introdução 5

Figura 1.3 A tarefa de especificar um algoritmo.

Em primeiro lugar, deve-se saber qual é o problema a ser resolvido pelo software – o seu objetivo. Daí, deve-se extrair todas as informações a respeito desse problema (dados e operações), relacioná-las com o conhecimento atual que se tem do assunto, buscando eventualmente informações de outras fontes. Essa fase representa a modelagem do problema em questão e vai ser detalhada na Seção 1.4.2. A modelagem do problema é resultante de um processo mental de abstração , o qual será discutido na Seção 1.4.

Depois, sabendo como resolver o problema, a tarefa consiste em descrever clara- mente os passos para se chegar à sua solução. Os passos por si só não resolvem o problema; é necessário colocá-los em uma seqüência lógica (veja Seção 1.4.3), que, ao ser seguida, de fato o solucionará. Além disso, é importante que essa descrição possua algum tipo de convenção para que todas as pessoas envolvidas na definição do algoritmo possam entendê-lo (veja a Seção 1.3). Chega-se, então, na especificação do algoritmo.

1.2.2 Exemplo de algoritmo

Considere o problema das Torres de Hanoi. A proposição do problema é a seguinte: inicialmente têm-se três hastes, A, B e C, e na haste A repousam três anéis de diâmetros diferentes, em ordem decrescente por diâmetro (veja a Figura 1.4).

6 Algoritmos e Lógica de Programação

A B C

Situação inicial Situação final

A B C

Figura 1.4 O problema das Torres de Hanoi.

O objetivo é transferir os três anéis da haste A para B, usando C se necessário. As regras de movimento são:

  • deve-se mover um único anel por vez;
  • um anel de diâmetro maior nunca pode repousar sobre algum outro de diâmetro menor.

As únicas informações para se resolver esse problema são as configurações inicial e final dos anéis e as regras de movimento. Uma solução poderia ser a seguinte seqüência de operações (veja o Algoritmo 1.1 e a Figura 1.5).

Algoritmo 1.1 Algoritmo para resolver o problema das Torres de Hanoi.

Início

  1. Mover um anel da haste A para a haste B.
  2. Mover um anel da haste A para a haste C.
  3. Mover um anel da haste B para a haste C.
  4. Mover um anel da haste A para a haste B.
  5. Mover um anel da haste C para a haste A.
  6. Mover um anel da haste C para a haste B.
  7. Mover um anel da haste A para a haste B. Fim

8 Algoritmos e Lógica de Programação

Como se obteve essa solução? Primeiro, é importante entender o enunciado do pro- blema e as regras que foram impostas. Dessa forma, não é possível especificar os mo- vimentos nos quais uma peça que esteja abaixo de outra seja movida e nem mover mais de uma peça por vez. Segundo, é importante verificar a cada passo definido se a solução está se aproximando do objetivo final. O Algoritmo 1.2 define outra seqüência de operações para se solucionar o problema.

Algoritmo 1.2 Outro algoritmo para as Torres de Hanoi.

Início

  1. Mover um anel da haste A para a haste C.
  2. Mover um anel da haste A para a haste B.
  3. Mover um anel da haste C para a haste B.
  4. Mover um anel da haste A para a haste C.
  5. Mover um anel da haste B para a haste C.
  6. Mover um anel da haste B para a haste A.
  7. Mover um anel da haste C para a haste A.
  8. Mover um anel da haste C para a haste B.
  9. Mover um anel da haste A para a haste C.
  10. Mover um anel da haste A para a haste B.
  11. Mover um anel da haste C para a haste B. Fim

Deve-se observar que essa solução é válida e também resolve o caso das Torres de Hanoi. No entanto, leva-se mais tempo para chegar se à solução (onze passos contra sete da solução anterior). Esse exemplo demonstra que uma mesma solução pode ser melhor ou pior que outra. Isso é um conceito importante quando se trata de um programa, pois, dependendo do problema, determinar uma solução mais eficiente pode economizar até horas de processamento. Outras soluções válidas também podem ser propostas, mas não terão menos que sete movimentos. Agora, e se for considerado o mesmo problema, porém, com n anéis postados ini- cialmente na haste A? Como isso afetará a solução? É interessante estudar diversos casos particulares antes de elaborar uma solução genérica.