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 algoritmosalgoritmos, Resumos de Algoritmos

algoritmos algoritmos algoritmos

Tipologia: Resumos

2019

Compartilhado em 29/07/2019

marco-andre-machado
marco-andre-machado 🇧🇷

4.7

(7)

6 documentos

1 / 109

Toggle sidebar

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

Não perca as partes importantes!

bg1
Universidade Regional Integrada do Alto Uruguai e das
Missões
Campus Frederico Westphalen
Departamento de Engenharias e Ciência da Computação
Algoritmos e Estrutura de Dados I
Informática I
Prof. Evandro Preuss
http://www.uri.br/~preuss
1º Semestre/2002
PAGE 2
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 algoritmos algoritmosalgoritmos e outras Resumos em PDF para Algoritmos, somente na Docsity!

Universidade Regional Integrada do Alto Uruguai e das

Missões

Campus Frederico Westphalen

Departamento de Engenharias e Ciência da Computação

Algoritmos e Estrutura de Dados I

Informática I

Prof. Evandro Preuss [email protected] http://www.uri.br/~preuss

1º Semestre/

PAGE 2

Plano de ensino da disciplina: 30-701 Algoritmos e Estrutura de Dados I

Departamento: 03 Engenharias e Ciência da Computação

Carga horária: 90 horas 60 Teor./ 30

Prat.

Créditos: 06

EMENTA:

Estudo das formas para representação do pensamento lógico através de técnicas de desenvolvimento de algoritmos. Representação e manipulação de dados. Construções de algoritmos sequenciais, condicionais e com estruturas de repetição. Manipulação de estruturas de dados homogêneas e heterogêneas e utilização de sub-rotinas.

OBJETIVOS:

Fornecer elementos e técnicas que capacitem o aluno a construir algoritmos, através da identificação dos passos ou ações necessários para transformar um conjunto de dados de entrada em informações de resultado, promovendo dessa forma, um ambiente de prática da lógica de programação.

RELAÇÃO DOS CONTEÚDOS:

F 0 9 5 Abordagem Contextual 1

  • Noções de lógica e conceito de algoritmos.
  • Fatores a serem considerados na construção de algoritmos e importância da programação estruturada
  • Métodos para construção de algoritmos
  • Principais formas de representação de algoritmos (narrativa, pseudo-código e gráfica) F 0 9 5 Tipos de Informações 1 Dados:
  • Tipos primitivos de dados, constantes x variáveis
  • Variáveis: uso, nomenclatura, atribuição e armazenamento na memória
  • Operadores matemáticos e funções matemáticas Instruções básicas ou comandos básicos:
  • Entrada, atribuição e saída de dados
  • Blocos de programas e uso de português estruturado F 0 9 5 Estruturas de Controle do Fluxo de Execução 1
  • Algoritmos sequenciais
  • Algoritmos com seleção – Estruturas de controle:
  • Desvio condicional simples, composto e encadeados, múltiplas opções, operadores lógicos
  • Estruturas de repetição:
  • utilização de contadores e acumuladores F 0 9 5 Estruturas de Dados Homogêneas 1
  • Matrizes de Uma Dimensão ou Vetores:
  • Operações Básicas com Matrizes do Tipo Vetor
  • Matrizes com Mais de Uma Dimensão:
  • Operações Básicas com Matrizes de Duas Dimensões

SUMÁRIO

PAGE 8

parte i – Introdução

1. Abordagem Contextual

O uso de algoritmos é quase tão antigo quanto a matemática. Com o passar do tempo, entretanto, ele foi bastante esquecido pela matemática. Com o advento das máquinas de calcular e mais tarde os computadores, o uso de algoritmos ressurgiu com grande vigor, como uma forma de indicar o caminho para a solução dos mais variados problemas.

Algoritmo não é a solução do problema, pois, se assim fosse, cada problema teria um único algoritmo. Algoritmo é o caminho para a solução de um problema, e em geral, os caminhos que levam a uma solução são muitos.

Ao longo dos anos surgiram muitas formas de representar os algoritmos, alguns utilizando linguagens semelhantes às linguagens de programação e outras utilizando formas gráficas.

O aprendizado de algoritmos não se consegue a não ser através de muitos exercícios.

Algoritmos não se aprendem:

_- Copiando algoritmos

  • Estudando algoritmos Algoritmos só se aprendem:
  • Construindo algoritmos
  • Testando algoritmos_

1.1. Conceito de Algoritmo

A automação é o processo em que uma tarefa deixa de ser desempenhada pelo homem e passa a ser realizada por máquinas, sejam estas dispositivos mecânicos (como as máquinas industriais), eletrônicos (como os computadores), ou de natureza mista (como os robôs).

Para que a automação de uma tarefa seja bem-sucedida é necessário que a máquina que passará a realizá- la seja capaz de desempenhar cada uma das etapas constituintes do processo a ser automatizado com eficiência, de modo a garantir a repetibilidade do mesmo. Assim, é necessário que seja especificado com clareza e exatidão o que deve ser realizado em cada uma das fases do processo a ser automatizado, bem como a seqüência em que estas fases devem ser realizadas.

À especificação da seqüência ordenada de passos que deve ser seguida para a realização de um tarefa, garantindo a sua repetibilidade, dá-se o nome de algoritmo.

Embora esta definição de algoritmo seja correta, podemos definir algoritmo, de maneira informal e completa como:

Algoritmo é um conjunto finito de regras, bem definidas, para a solução de um problema em um tempo finito e com um número finito de passos .”

Informalmente, um algoritmo é qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como saída.

Um algoritmo deve sempre possuir pelo menos um resultado, normalmente chamado de saída , e satisfazer a propriedade da efetividade, isto é, todas as operações especificadas no algoritmo devem ser suficientemente básicas para que possam ser executadas de maneira exata e num tempo finito.

Na prática não é importante ter-se apenas um algoritmo, mas sim, um bom algoritmo. O mais importante de um algoritmo é a sua correção , isto é, se ele resolve realmente o problema proposto e o faz exatamente.

Para se ter um algoritmo, é necessário:

  1. Que se tenha um número finito de passos
  2. Que cada passo esteja precisamente definido, sem possíveis ambigüidades
  3. Que existam zero ou mais entradas tomadas de conjuntos bem definidos
  4. Que existam uma ou mais saídas
  5. Que exista uma condição de fim sempre atingida para quaisquer entradas e num tempo finito.

2. formas de representação de algoritmos

Existem diversas formas de representação de algoritmos, mas não há um consenso com relação à melhor delas.

Algumas formas de representação de algoritmos tratam dos problemas apenas em nível lógico, abstraindo- se de detalhes de implementação muitas vezes relacionados com alguma linguagem de programação específica. Por outro lado, existem formas de representação de algoritmos que possuem uma maior riqueza de detalhes e muitas vezes acabam por obscurescer a idéia principal, o algoritmo, dificultando seu entendimento.

Dentre as formas de representação de algoritmos mais conhecidas, sobressaltam:

a Descrição Narrativa o Fluxograma Convencional o Diagrama de Chapin o Pseudocódigo , também conhecido como Linguagem Estruturada ou Portugol.

1.2. Descrição Narrativa

Nesta forma de representação os algoritmos são expressos diretamente em linguagem natural. Como por exemplo, têm-se os algoritmos seguintes:

  • Troca de um pneu furado:
    • Afrouxar ligeiramente as porcas
    • Suspender o carro
    • Retirar as porcas e o pneu
    • Colocar o pneu reserva
    • Apertar as porcas
    • Abaixar o carro
    • Dar o aperto final nas porcas
  • Cálculo da média de um aluno:
    • Obter as notas da primeira e da segunda prova
    • Calcular a média aritmética entre as duas
    • Se a média for maior ou igual a 7, o aluno foi aprovado, senão ele foi reprovado Esta representação é pouco usada na prática porque o uso de linguagem natural muitas vezes dá oportunidade a más interpretações, ambigüidades e imprecisões.

Por exemplo, a instrução “afrouxar ligeiramente as porcas” no algoritmo da troca de pneus está sujeita a interpretações diferentes por pessoas distintas. Uma instrução mais precisa seria: “afrouxar a porca, girando-a de 30º no sentido anti-horário”.

1.3. Fluxograma Convencional

É uma representação gráfica de algoritmos onde formas geométricas diferentes implicam ações (instruções, comandos) distintos. Tal propriedade facilita o entendimento das idéias contidas nos algoritmos.

Nota-se que os fluxogramas convencionais preocupam-se com detalhes de nível físico da implementação do algoritmo. Por exemplo, figuras geométricas diferentes são adotadas para representar operações de saída de dados realizadas em dispositivos distintos, como uma unidade de armazenamento de dados ou um monitor de vídeo. A figura 2.1 mostra as principais formas geométricas usadas em fluxogramas.

De modo geral, o fluxograma se resume a um único símbolo inicial, por onde a execução do algoritmo começa, e um ou mais símbolos finais, que são pontos onde a execução do algoritmo se encerra. Partindo do símbolo inicial, há sempre um único caminho orientado a ser seguido, representando a existência de uma única seqüência de execução das instruções. Isto pode ser melhor visualizado pelo fato de que, apesar de vários caminhos poderem convergir para uma mesma figura do diagrama, há sempre um único caminho saindo desta. Exceções a esta regra são os símbolos finais, dos quais não há nenhum fluxo saindo, e os símbolos de decisão, de onde pode haver mais de um caminho de saída (normalmente dois caminhos), representando uma bifurcação no fluxo.

A figura 2.2 mostra a representação do algoritmo de cálculo da média de um aluno sob a forma de um fluxograma.

1.4. Diagrama de Chapin

O diagrama foi criado por Ned Chapin a partir de trabalhos de Nassi-Shneiderman, os quais resolveram substituir o fluxograma tradicional por um diagrama que apresenta uma visão hierárquica e estruturada da lógica do programa. A grande vantagem de usar este tipo de diagrama é a representação das estruturas que tem um ponto de entrada e um ponto de saída e são compostas pelas estruturas básicas de controle de seqüência, seleção e repartição. Enquanto é difícil mostrar o embutimento e a recursividade com o fluxograma tradicional, torna-se mais simples mostrá-lo com o diagrama de Chapin, bem como codificá-lo futuramente na conversão de código português estruturado ou pseudocódigos. A figura 2.3 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de cálculo da média de um aluno.

Escreva “Aprovado” Senão Escreva “Reprovado”

Fim.

Parte II - Técnicas Básicas de Programação

4. Variáveis e Constantes

4.1. Armazenamento de Dados na Memória

Para armazenar os dados na memória, imagine que a memória de um computador é um grande arquivo com várias gavetas, onde cada gaveta pode armazenar apenas um único valor (seja ele numérico, caractere ou lógico). Se é um grande arquivo com várias gavetas, é necessário identificar com um nome a gaveta que se pretende utilizar. Desta forma o valor armazenado pode ser utilizado a qualquer momento.

4.2. Conceito e Utilidade de Variáveis

Têm-se como definição de variável tudo aquilo que é sujeito a variações, que é incerto, instável ou inconstante. E quando se fala de computadores, temos que ter em mente que o volume de informações a serem tratadas é grande e diversificado. Desta forma, os dados a serem processados serão bastante variáveis.

Como visto anteriormente, informações correspondentes a diversos tipos de dados são armazenadas nas memórias dos computadores. Para acessar individualmente cada uma destas informações, em princípio, seria necessário saber o tipo de dado desta informação (ou seja, o número de bytes de memória por ela ocupados) e a posição inicial deste conjunto de bytes na memória.

Percebe-se que esta sistemática de acesso a informações na memória é bastante ilegível e difícil de se trabalhar. Para contornar esta situação criou-se o conceito de variável , que é uma entidade destinada a guardar uma informação.

Basicamente, uma variável possui três atributos: um nome , um tipo de dado associado à mesma e a informação por ela guardada.

Toda variável possui um nome que tem a função de diferenciá-la das demais. Cada linguagem de programação estabelece suas próprias regras de formação de nomes de variáveis.

Adotaremos para os algoritmos, as seguintes regras:

um nome de variável deve necessariamente começar com uma letra; um nome de variável não deve conter nenhum símbolo especial, exceto a sublinha ( _ ) e nenhum espaço em branco;

um nome de variável não poderá ser uma palavra reservada a uma instrução de programa.

Exemplos de nomes de variáveis: Salário – correto 1ANO – errado (não começou uma letra) Ano1 – correto a casa – errado (contém o caractere branco) SAL/HORA – errado (contém o caractere “/”) SAL_HORA – correto _DESCONTO – errado (não começou com uma letra)

Obviamente é interessante adotar nomes de variáveis relacionados às funções que serão exercidas pela mesmas dentro de um programa.

Outro atributo característico de uma variável é o tipo de dado que ela pode armazenar. Este atributo define a natureza das informações contidas na variável. Por último há o atributo informação , que nada mais é do que a informação útil contida na variável.

Uma vez definidos, os atributos nome e tipo de dado de uma variável não podem ser alterados e assim permanecem durante toda a sua existência, desde que o programa que a utiliza não seja modificado. Por outro lado, o atributo informação está constantemente sujeito a mudanças de acordo com o fluxo de execução do programa.

Em resumo, o conceito de variável foi criado para facilitar a vida dos programadores, permitindo acessar informações na memória dos computadores por meio de um nome, em vez do endereço de uma célula de memória.

4.3. Definição de Variáveis em Algoritmos

Todas as variáveis utilizadas em algoritmos devem ser definidas antes de serem utilizadas. Isto se faz necessário para permitir que o compilador reserve um espaço na memória para as mesmas.

Mesmo que algumas linguagens de programação (como BASIC e FORTRAN) dispensam esta definição, uma vez que o espaço na memória é reservado à medida que novas variáveis são encontradas no decorrer do programa, nos algoritmos usaremos a definição de variáveis por assemelhar-se com as principais linguagens de programação como Pascal e C.

Nos algoritmos, todas as variáveis utilizadas serão definidas no início do mesmo, por meio de um comando de uma das seguintes formas:

VAR < nome_da_variável > : < tipo_da_variável > ou VAR < lista_de_variáveis > : < tipo_das_variáveis > a palavra-chave VAR deverá estar presente sempre e será utilizada um única vez na definição de um conjunto de uma ou mais variáveis;

numa mesma linha poderão ser definidas uma ou mais variáveis do mesmo tipo; Para tal, deve-se separar os nomes das mesmas por vírgulas;

variáveis de tipos diferentes devem ser declaradas em linhas diferentes. Exemplos de definição de variáveis:

VAR nome: caracter[30] idade: inteiro salário: real tem_filhos: lógico

No exemplo acima foram declaradas quatro variáveis: a variável nome , capaz de armazenar dados caractere de comprimento 35 (35 caracteres); a variável idade , capaz de armazenar um número inteiro; a variável salário , capaz de armazenar um número real;

a variável tem_filhos , capaz de armazenar uma informação lógica.

4.4. Conceito e Utilidade de Constantes

Têm-se como definição de constante tudo aquilo que é fixo ou estável. Existirão vários momentos em que este conceito deverá estar em uso, quando desenvolvermos programas.

É comum definirmos uma constante no início do programa, e a utilizarmos no decorrer do programa, para facilitar o entendimento, a programação ou então para poupar tempo no caso de ter que alterar o seu valor, de modo que alterando uma única vez a declaração da constante, todos os comandos e expressões que a utilizam são automaticamente atualizados.

4.5. Definição de Constantes em Algoritmos

Nos algoritmos, todas as constante utilizadas serão definidas no início do mesmo, por meio de um comando da seguinte forma:

CONST < nome_da_constante > = < valor > Exemplo de definição de constantes: CONST pi = 3. nome_da_empresa = “Enxuga Gelo SA”

A prioridade entre operadores define a ordem em que os mesmos devem ser avaliados dentro de uma mesma expressão.

3.. Operadores Relacionais Os operadores relacionais são operadores binários que devolvem os valores lógicos verdadeiro e falso.

Operador Comparação

maior que < menor que = maior ou igual <= menor ou igual = igual <> diferente

Estes valores são somente usados quando se deseja efetuar comparações. Comparações só podem ser feitas entre objetos de mesma natureza, isto é variáveis do mesmo tipo de dado. O resultado de uma comparação é sempre um valor lógico

Por exemplo, digamos que a variável inteira escolha contenha o valor 7. A primeira das expressões a seguir fornece um valor falso, e a segunda um valor verdadeiro:

escolha <= 5 escolha > 5

Com valores string, os operadores relacionais comparam os valores ASCII dos caracteres correspondentes em cada string. Uma string é dita "menor que" outra se os caracteres correspondentes tiverem os números de códigos ASCII menores. Por exemplo, todas as expressões a seguir são verdadeiras:

“algoritmo” > “ALGORITMO” “ABC” < “EFG” “Pascal” < “Pascal compiler” Observe que as letras minúsculas têm códigos ASCII maiores do que os das letras maiúsculas. Observe também que o comprimento da string se torna o fator determinante na comparação de duas strings, quando os caracteres existentes na string menor são os mesmos que os caracteres correspondentes na string maior. Neste caso, a string maior é dita “maior que” a menor.

4.. Operadores Lógicos Os operadores lógicos ou booleanos são usados para combinar expressões relacionais. Também devolvem como resultado valores lógicos verdadeiro ou falso.

Oper ador

Tipo Operação Priorid ade OU Binário Disjunção 3 E Binário Conjunção 2 NÃO Unário Negação 1

Uma expressão relacional ou lógica retornará falso para o valor lógico falso e verdadeiro para o valor lógico verdade.

Fornecendo dois valores ou expressões lógicas, representadas por expressão1 e expressão2 , podemos descrever as quatro operações lógicas a seguir:

expressão1 E expressão2 é verdadeiro somente se ambas, expressão1 e expressão2 , forem verdadeiras. Se uma for falsa, ou se ambas forem falsas, a operação E também será falsa.

expressão1 OU expressão2 é verdadeiro se tanto a expressão1 como a expressão2 forem verdadeiras. As operações OU só resultam em valores falsos se ambas, expressão1 e expressão2 , forem falsas.

NÃO expressão1 avalia verdadeiro se expressão1 for falsa; de modo contrário, a expressão NÃO resultará em falso, se expressão1 for verdadeira.

5.. Operadores Literais

Os operadores que atuam sobre caracteres variam muito de uma linguagem para outra. O operador mais comum e mais usado é o operador que faz a concatenação de strings: toma-se duas strings e acrescenta-se (concatena-se) a segunda ao final da primeira.

O operador que faz esta operação é: +

Por exemplo, a concatenação das strings “ALGO” e “RITMO” é representada por: “ALGO” + ”RITMO” e o resultado de sua avaliação é: “ALGORITMO”

Expressões

O conceito de expressão em termos computacionais está intimamente ligado ao conceito de expressão ou fórmula matemática, onde um conjunto de variáveis e constantes numéricas relacionam-se por meio de operadores aritméticos compondo uma fórmula que, uma vez avaliada, resulta num valor.

1.. Expressões Aritméticas Expressões aritméticas são aquelas cujo resultado da avaliação é do tipo numérico, seja ele inteiro ou real. Somente o uso de operadores aritméticos, variáveis numéricas e parênteses é permitido em expressões deste tipo

2.. Expressões Lógicas

Expressões lógicas são aquelas cujo resultado da avaliação é um valor lógico verdadeiro ou falso. Nestas expressões são usados os operadores relacionais e os operadores lógicos, podendo ainda serem combinados com expressões aritméticas.

Quando forem combinadas duas ou mais expressões que utilizem operadores relacionais e lógicos, os mesmos devem utilizar os parênteses para indicar a ordem de precedência.

3.. Expressões Literais Expressões literais são aquelas cujo resultado da avaliação é um valor literal (caractere). Neste tipo de expressões só é usado o operador de literais (+).

4.. Avaliação de Expressões Expressões que apresentam apenas um único operador podem ser avaliadas diretamente. No entanto, à medida que as mesmas vão tornando-se mais complexas com o aparecimento de mais de um operando na mesma expressão, é necessária a avaliação da mesma passo a passo, tomando um operador por vez. A seqüência destes passos é definida de acordo com o formato geral da expressão, considerando-se a prioridade (precedência) de avaliação de seus operadores e a existência ou não de parênteses na mesma.

As seguintes regras são essenciais para a correta avaliação de expressões:

  1. Deve-se observar a prioridade dos operadores, conforme mostrado nas tabelas de operadores: operadores de maior prioridade devem ser avaliados primeiro. Se houver empate com relação à precedência, então a avaliação se faz da esquerda para a direita.
  2. Os parênteses usado em expressões tem o poder de “roubar” prioridade dos demais operadores, forçando a avaliação da subexpressão em seu interior.
  3. Entre os quatro grupos de operadores existentes, a saber, aritmético, lógico, literal e relacional, há uma certa prioridade de avaliação: os aritméticos e literais devem ser avaliados primeiro; a seguir, são avaliadas as subexpressões com operadores relacionais e, por último os operadores lógicos são avaliados.

Exercícios

  1. Dados as variáveis e operações: v1 := 32 v2 := 5 + v v1 := v2 * 2 Como fazer para segurar e mostrar o valor inicial da variável v1 no final das operações?