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 Estruturas de Dados: Definição e Exemplos, Notas de estudo de Algoritmos

Neste documento, aprenda sobre algoritmos e suas representações, incluindo a importância de evitar ambiguidades e a utilização de estruturas de controle como roberto willrich's sequence, conditional tests, and repetition structures. Explore exemplos de algoritmos e como eles podem ser descritos em pseudo-código.

Tipologia: Notas de estudo

2011

Compartilhado em 22/09/2011

neto-sanders-5
neto-sanders-5 🇧🇷

1 documento

1 / 11

Toggle sidebar

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

Não perca as partes importantes!

bg1
Capítulo 5Capítulo 5
Algoritmos e a Resolução de Problemas
5.0 Índice
Capítulo 5Capítulo 5 1
5.0 Índice 1
5.1 Introdução 2
5.2 Algoritmos: Conceito e Exemplificação 2
5.2.1 Conceito de Algoritmo 2
5.2.2 Exemplos de Algoritmos 2
5.3 Português Estruturado 3
5.4 Estruturas Clássicas de Controle 3
5.4.1 A seqüência 4
5.4.2 Teste de condição Se-Então e Se-Então-Senão 4
5.4.3 A repetição Repita-Até e Enquanto-Faça 5
5.5 Pseudo-Código 6
5.5.1 Estruturas de dados 6
5.5.2 Variáveis 6
5.5.3 Constantes 7
5.5.4 Operações e Expressões 7
5.5.5 Operações aritméticos 8
5.5.6 Operadores relacionais 8
5.5.7 Operadores lógicos 8
5.5.8 Prioridades e parênteses 8
5.5.9 Entrada e saída 9
5.6 Os Fluxogramas 9
5.7 Exercícios 10
pf3
pf4
pf5
pf8
pf9
pfa

Pré-visualização parcial do texto

Baixe Algoritmos e Estruturas de Dados: Definição e Exemplos e outras Notas de estudo em PDF para Algoritmos, somente na Docsity!

Algoritmos e a Resolução de Problemas

  • Capítulo 5Capítulo
  • Capítulo 5 Capítulo 5.0 Índice
    • 5.0 Índice
    • 5.1 Introdução
    • 5.2 Algoritmos: Conceito e Exemplificação
      • 5.2.1 Conceito de Algoritmo
      • 5.2.2 Exemplos de Algoritmos
    • 5.3 Português Estruturado
    • 5.4 Estruturas Clássicas de Controle
      • 5.4.1 A seqüência
      • 5.4.2 Teste de condição — Se-Então e Se-Então-Senão
      • 5.4.3 A repetição — Repita-Até e Enquanto-Faça
    • 5.5 Pseudo-Código
      • 5.5.1 Estruturas de dados
      • 5.5.2 Variáveis
      • 5.5.3 Constantes
      • 5.5.4 Operações e Expressões
      • 5.5.5 Operações aritméticos
      • 5.5.6 Operadores relacionais
      • 5.5.7 Operadores lógicos
      • 5.5.8 Prioridades e parênteses
      • 5.5.9 Entrada e saída
    • 5.6 Os Fluxogramas
    • 5.7 Exercícios

5.1 Introdução

A construção de um programa computacional é motivada geralmente a partir de uma necessidade de solução de um problema particular: a geração automática de documentos, o controle de um equipamento eletrodoméstico, a transmissão de informações em longas distâncias, a agilização de cálculos científicos, e outras motivações mais. A solução dos nossos problemas através de um sistema computacional só é obtida no momento em que é definido um conjunto coerente de instruções de um programa que permita estabelecer que ações deverão ser executadas e em que ordem.

Embora definida inicialmente como uma “arte”, a tarefa de programação dos computadores não é simples e, à medida que a complexidade dos problemas foi aumentando, constatou-se que a construção de um programa deveria ser, na realidade, resultado de um trabalho de engenharia, como o são tantos outros produtos.

Da mesma forma como, no caso de um edifício ou o motor de um automóvel, não se passa diretamente da idéia à construção, o desenvolvimento de um programa deverá ser caracterizado pela execução de uma fase (a mais exaustiva possível) de reflexão onde o objetivo é analisar o problema a resolver e encontrar uma solução (se possível, a melhor) que possa ser realizada por um sistema computacional. O resultado deste trabalho de reflexão pode ser, então, registrado na forma de um algoritmo , a partir do qual o programa será finalmente construído.

Um algoritmo pode ser definido, de maneira simplificada, como uma descrição formal do processo de obtenção de uma solução computacional. O objetivo deste capítulo será a definição precisa de algoritmo , sua exemplificação e como eles podem ser utilizados quando da construção de um programa.

5.2 Algoritmos: Conceito e Exemplificação

5.2.1 Conceito de Algoritmo

Desde o início da Computação, diversos autores preocuparam-se em apresentar uma definição adequada para o termo algoritmo. Neste curso, será adotada a definição dada por Kronsjö, onde um algoritmo é “um procedimento consistindo de um conjunto finito de regras não ambíguas que especificam uma seqüência finita de operações necessárias à solução de um problema ou para especificar uma classe de problemas”.

Da mesma forma que, na nossa rotina diária nós podemos encontrar infinitas maneiras de “contar uma mesma história” ou explicar a alguém como executar determinada tarefa, vamos encontrar diversas formas de especificar um mesmo problema através de um algoritmo... o objetivo na construção dos algoritmos é evitar qualquer ambigüidade que possa surgir na definição de um problema e que pode resultar em erros (muitas vezes catastróficos) uma vez que a solução venha a ser executada pelo computador.

5.2.2 Exemplos de Algoritmos

Exemplos básicos de algoritmos seriam as receitas de cozinha, ou as instruções de montagem de um aparelho. Por exemplo, vejamos qual seria o algoritmo usado para trocar um pneu furado:

  1. Pegar o macaco e o estepe no porta-malas do carro.
  2. Levantar o carro usando o macaco.
  3. Retirar o pneu furado.
  4. Colocar o estepe em seu lugar.
  5. Abaixar o carro.
  6. Guardar o macaco e o pneu furado.

ser definidas como um padrão de representação de partes do comportamento de um programa que implemente uma dada solução, constituindo-se como verdadeiras “peças” ou “blocos de construção” para os algoritmos. Algumas destas estruturas serão introduzidas a seguir.

5.4.1 A seqüência

É a forma mais evidente de apresentar as ações a realizar para solucionar um dado problema. A representação das seqüências de ações, no caso da representação por texto é feita relacionando-se uma ação por linha, o que permite impor uma ordem lógica para a execução das ções. Considerando a seqüência abaixo, do exemplo apresentado na seção 2, deve ficar claro para quem vai executar que a ação “Disque o número da UFSC” não poderá ser realizada se a ação “Tire o fone do gancho” não tiver sido executada. Da mesma forma “Tire o fone do gancho” só poderá ser realizada após “Recoloque o fone no gancho”.

Recoloque o fone no gancho Tire o fone do gancho Disque o número da UFSC

Em alguns casos, por questões de economia de espaço, é possível relacionar mais de uma ação por linha. Neste caso, para delimitá-las, utiliza-se o símbolo “;” (ponto e vírgula), como é mostrado a seguir:

Recoloque o fone no gancho ; Tire o fone do gancho Disque o número da UFSC

5.4.2 Teste de condição — Se-Então e Se-Então-Senão

Extraindo outra parte do algoritmo apresentado, vai ser possível conhecer uma outra estrutura bastante utilizada na construção de programas de computador — os Testes de Condição.

SE alguém atende ENTÃO pergunte se é da UFSC

Na sua forma geral, pode-se escrever esta estrutura como:

SE condição Então ação

A condição vai corresponder a uma situação que deve ser verificada como verdadeira para que a ação associada seja realizada. Caso contrário (a condição é falsa ), nada deve acontecer.

Por outro lado, pode ser interessante que, quando se verifica a condição como falsa, uma outra ação tem de ser efetuada. Para isto, utiliza-se a seguinte estrutura:

SE condição ENTÃO ação 1 SENÃO ação 2

Neste caso, ação 1 deve ser realizada quando a condição é verdadeira ; se for falsa , a ação 2 será executada. O exemplo, extraído do algoritmo apresentado em 2 deixa claro o uso desta estrutura.

SE é da UFSC ENTÃO marque a entrevista com o professor SENÃO desculpe-se pelo engano

5.4.3 A repetição — Repita-Até e Enquanto-Faça

Outro mecanismo importante na representação de comportamento de programas corresponde à repetição de ações. Em lugar de escrever múltiplas vezes uma mesma seqüência de ações, pode-se escrevê-la uma única vez com o auxílio das estruturas de repetição, nas quais as condições funcionam como o elemento que determina a continuidade ou a interrupção da execução da seqüência de ações especificada.

Duas estruturas de repetição são utilizadas freqüentemente para a especificação de situações repetitivas. A primeira, Repita-Até , permite estabelecer a execução repetitiva da seqüência especificada até que a condição associada seja verificada. A forma geral desta estrutura fica:

REPITA ação 1 ação 2 ... ação n ATÉ condição

Isto significa que a seqüência ação 1; ação 2;...; ação n , será realizada uma vez, sendo em seguida verificada a condição associada à cláusula ATÉ. Se a condição for falsa , o processo se repete, reiniciando pela ação 1. Se a condição for verdadeira, a repetição é cancelada. Por exemplo, se quisermos que um número seja multiplicado por ele mesmo 6 vezes, é possível utilizar a estrutura Repita-Até (Repeat-Until) da seguinte forma:

REPITA multiplica número por ele mesmo; incrementa a contagem de uma unidade; ATÉ contagem seja igual a 6

Outra forma de representar a repetição de ações é associar uma condição não após a última ação da seqüência, mas antes da primeira ação. Corresponde à estrutura Faça- Enquanto (Do-While), a qual estabelece que a seqüência de ações especificada deve ser repetida enquanto a condição associada for verdadeira. Se, antes de iniciar uma nova execução da seqüência, for verificada que a condição é falsa, então a repetição é cancelada. A forma geral de representação desta estrutura é:

ENQUANTO condição FAÇA ação 1 ação 2 ... ação n FIM

Para o exemplo da multiplicação introduzido anteriormente, esta estrutura poderia ser utilizada da seguinte forma:

ENQUANTO contagem é diferente de 6 FAÇA multiplique número por ele mesmo incrementa a contagem de uma unidade FIM

Como poderá ser observado à medida que os conceitos de uma dada linguagem de programação forem estudados, estas estruturas apresentam grande utilidade na representação do comportamento dos programas. Atualmente, qualquer linguagem de programação (excetuando-se as linguagens de baixo nível) apresentam construções correspondentes a estas estruturas. A combinação coerente destas três classes de estrutura pode permitir representar a maior parte das soluções aos problemas práticos resolvidos através dos computadores, mesmo os mais complexos.

ou NC. Imagine um programa com 1000 linhas ou mais no qual a maioria da variáveis se chama A, X, n, etc.

No início de um programa de computador precisamos definir que variáveis iremos usar, e que tipo de dados podem ser armazenados nelas. Isso é efetuado através de uma declaração de variáveis. Vejamos um exemplo de declaração de variáveis em pseudo- código:

variáveis Aluno : caractere; idade,filhos : inteiro; altura, peso : real; casado : lógico;

Neste exemplo, declaramos as variáveis nome, que pode conter um valor de tipo caractere; as variáveis idade e filhos, que podem armazenar valores inteiros, as variáveis altura e peso, que podem conter valores de tipo real, e a variável casado, que pode armazenar um dado de tipo lógico (verdadeiro ou falso).

Uma vez declaradas as variáveis, podemos usá-las em programas, para armazenar os valores que serão consultados e/ou manipulados durante a execução dos mesmos. Para utilizar o valor de uma variável basta indicar seu nome onde desejado. Para armazenar um valor em uma variável utilizamos um comando de atribuição, que nos permite fornecer um valor a uma variável, ou seja, “guardar uma informação em uma gaveta". O tipo desse valor deve ser compatível com o tipo declarado para a variável. O comando de atribuição tem a seguinte forma:

variável := expressão do mesmo tipo da variável

A expressão á direita do sinal :=" é resolvida primeiro, e seu valor é em seguida atribuído à variável da esquerda do sinal, que deve ser do mesmo tipo resultante da expressão. Vejamos um exemplo em pseudo-código:

variáveis Número : inteiro; Soma, Média : real; Aprovou : lógico; início Soma := 246, Número := 37 Média := Soma / Número Aprovou := (Média > 5.0) fim

5.5.3 Constantes

Em um programa também podemos declarar informações constantes, que não devem mudar ao longo do programa. é o caso de constantes matemáticas, por exemplo, ou de informações como o nome do programador, a versão do programa, etc. As constantes podem ser declaradas em pseudo-código de forma semelhante ás variáveis, com a inclusão de seu valor:

constantes pi = 3.141592653589793264; Versão = '1.3b' Programador = 'Mickey Mouse'

As constantes podem ser usadas da mesma forma que as variáveis, mas seu valor não pode ser modificado (ou seja, uma constante nunca pode aparecer no lado esquerdo de uma atribuição).

5.5.4 Operações e Expressões

As operações permitem alterar o valor de variáveis. As operações são especificadas através de expressões que permitem combinar variáveis, constantes e operadores, para

obter novos valores que podem ser usados nos algoritmos. Temos basicamente três tipos de operadores: aritméticos, relacionais e lógicos.

5.5.5 Operações aritméticos

Relacionam entre si valores ou expressões numéricas inteiras ou reais, dando como resultado valores numéricos (inteiros ou reais). Por exemplo, se x for uma variável de tipo numérico, então (x+3)/ (x^2 -3x+1) é uma expressão empregando operadores aritméticos e que resulta em um valor numérico. Os operadores numéricos mais usuais em informática, e sua representação em pseudo-código são: Tipos Exemplos Significado Soma b := c + d; b é igual a soma das variáveis c e d Subtração x := x - 1; O valor de x é decrementado de uma unidade produto m := n*2; A variável m é igual ao dobro da variável n divisão real m := n/2; A variável m é igual a metade da variável n potência v := n^2 A variável v é igual ao quadrado da variável n divisão inteira d := x DIV y A variável d é igual a divisão inteira de x por y resto da divisão r := x MOD y A variável r é igual ao resto da divisão inteira de x por y

Além dos operadores aritméticos, a maioria das linguagens de programação oferece um vasto conjunto de funções matemáticas, necessárias para cálculos de maior complexidade. As funções mais usuais são:

Sin(x) seno de x (em radianos) cos(x) cosseno de x tg(x) tangente de x arcsin(x) arco-seno de x arccos(x) arco-cosseno de x abs(x) valor absoluto de x int(x) parte inteira de x frac(x) parte fracionária de x random(x) valor aleatório inteiro entre 0 e x

5.5.6 Operadores relacionais

Estes operadores relacionam expressões numéricas entre si e dão como resultado valores lógicos. Os principais são: <, >, =, ≠, ≤, ≥ .Por exemplo, a expressão x + 3 ≥ 7 resulta em verdade quando x ≥ 4 e falso caso contrário.

5.5.7 Operadores lógicos

Relacionam entre si valores ou expressões lógicas, resultando em valores lógicos. Os mais usuais são:

n NÃO : nega ou inverte o resultado de uma expressão. Por exemplo, se x≥17 é verdade, então NÃO (x≥17) é falso. n • E : resulta em verdade somente se ambas as expressões forem verdadeiras. Por exemplo, se (x>5) E (x<10) só é verdade se ambas as condições forem verdadeiras. n • OU : resulta em verdade se ao menos uma das expressões for verdadeira. Por exemplo, (x>5) OU (x<10) será verdade se qualquer uma das condições for verdadeira, ou ambas.

5.5.8 Prioridades e parênteses

As prioridades usadas na resolução de expressões lógicas, aritméticas e relacionais são geralmente aquelas observadas na matemática, ou seja, resolvem-se nesta ordem: potenciações, multiplicações e divisões, somas e subtrações, operadores relacionais e

operadores lógicos. Veja a resolução da expressão: (3^2 - 5 > 0) E (5 / 2 = 3 - 4) tem

valor falso.

Em caso de dúvidas quanto às prioridades, use e abuse dos parênteses!

Processamento Processamento DecisãoDecisão EntradaEntrada

TerminadorTerminador SaídaSaída ( i n í c i o o u f i m )( i n í c i o o u f i m )

Figura 1 - Símbolos mais utilizados na construção dos fluxogramas.

M é d i a : = ( N o t a 1 + N o t a 2 + N o t a 3 + N o t a 4 ) / 4 M é d i a : = ( N o t a 1 + N o t a 2 + N o t a 3 + N o t a 4 ) / 4

M é d i a < 6 , 0M é d i a < 6 , 0

N o t a 1 , N o t a 2 ,N o t a 1 , N o t a 2 , N o t a 3 , N o t a 4N o t a 3 , N o t a 4

' R e p r o v a d o c o m' R e p r o v a d o c o m n o t a ' , M é d i an o t a ' , M é d i a

I n í c i oI n í c i o

' A p r o v a d o c o m' A p r o v a d o c o m n o t a ' , M é d i an o t a ' , M é d i a

FimFim

Nao Sim

Figura 2 - Fluxograma da solução para cálculo da média de uma disciplina.

5.7 Exercícios

Escreva os algoritmos solicitados em pseudo-código e/ou em fluxograma.

  1. Escreva um algoritmo para entrar com três números e imprimir o maior entre eles.
  2. Escreva um algoritmo para entrar com 8 números e imprimir a quantidade de números maiores que 4.
  3. Escreva um algoritmo para entrar com um número de 1 a 10 e imprimí-lo o número de vezes correspondente ao seu valor.
  4. Construir um algoritmo capaz de representar uma estrutura do tipo Repete-Até;
  5. Construir um algoritmo capaz de representar uma estrutura do tipo Faça-Enquanto;
  6. Construir um algoritmo que represente o critério de avaliação da disciplina INE 5201
  1. Uma empresa telefônica aplica a seguinte política de tarifamento aos seus assinantes: uma mensalidade de manutenção fixa (R$ 13,00 para assinantes domésticos; R$ 18,00 para assinantes comerciais), uma taxa de R$ 0,10 por pulso excedente (acima de 90 pulsos) e R$ 50,00 pela utilização do serviço de despertador. O programa a ser construído vai obter os dados a partir de um sistema de cartões perfurados, onde cada cartão corresponde a um assinante e fornece as seguintes informações: número do telefone, tipo do assinante (1, se for doméstico e 2, se for comercial), número de pulsos registrados no mês, quantidade de utilização do serviço de despertador. Escreva um algoritmo em pseudo-código ou fluxograma que permita calcular o valor da conta telefônica de todos os usuários da empresa. O final da leitura da pilha de cartões pode ser definida por um último cartão, tipo de assinante seja igual a 0.
  2. Complemente o algoritmo da questão anterior, para que ele forneça também o valor da maior conta, o número total de vezes que todos os assinantes utilizaram o serviço de despertador e a arrecadação total da empresa no mês.
  3. Existem três candidatos a uma vaga para o governo do estado. Durante a eleição (turno único), os votos são registrados em urna eletrônica contendo o voto do eleitor, codificado pelo número do candidato (1, 2 ou 3). Escreva um algoritmo que leia os votos e determine as seguintes informações:

n O número total de eleitores; n O número de votos que cada candidato obteve; n O número de votos nulos; n O número de votos brancos.

  1. A condição para que três segmentos de reta possam formar um triângulo é que o maior segmento seja inferior à soma dos comprimentos dos dois menores. Construa um fluxograma que represente a solução para este problema, supondo que os dados de entrada sejam os comprimentos dos três segmentos de reta. Em função destes comprimentos, o algoritmo deverá definir se os segmentos de reta podem compor um triângulo ou não.
  2. Escreva um algoritmo que permita a um usuário entrar com 3 números inteiros e os imprima em ordem crescente.
  3. Escreva um algoritmo que, dado os 3 lados de um triângulo, determine se ele é eqüilátero, isósceles ou escaleno (três lados diferentes).