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


Algoritmo e Lógica de Programação - Algoritmos (Parte 1), Notas de estudo de Algoritmos

Apostila de Algoritmos

Tipologia: Notas de estudo

2014

Compartilhado em 14/08/2014

jhonatas-moura-10
jhonatas-moura-10 🇧🇷

1 documento

1 / 33

Toggle sidebar

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

Não perca as partes importantes!

bg1
Algoritmo e Lógica de programação
- 1 -
Universidade Federal do Rio Grande do Norte
Centro de Tecnologia
Departamento de Computação e Automação
Algoritmo e Lógica de Programação
Algoritmos – Parte 1
DCA 800 – Eng. Química
Maio / 2004
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

Pré-visualização parcial do texto

Baixe Algoritmo e Lógica de Programação - Algoritmos (Parte 1) e outras Notas de estudo em PDF para Algoritmos, somente na Docsity!

Universidade Federal do Rio Grande do Norte

Centro de Tecnologia

Departamento de Computação e Automação

Algoritmo e Lógica de Programação

Algoritmos – Parte 1

DCA 800 – Eng. Química

Maio / 2004

  • Capítulo
    • Introdução.......................................................................................................
        1. Conceito de Algoritmo
      • 1.1 Algumas Definições de Algoritmo
  • Capítulo
    • Formas de Representação de Algoritmos.......................................................
      • 2.1 Descrição Narrativa...............................................................................
      • 2.2 Fluxograma Convencional.....................................................................
      • 2.3 Pseudocódigo
      • 2.4 Síntese
  • Capítulo
    • Tipos de Dados...............................................................................................
      • 3.1 Dados Numéricos..................................................................................
      • 3.2 Dados Literais
      • 3.3 Dados Lógicos
      • 3.4 Síntese
      • 3.5 Exercício Proposto
  • Capítulo
    • Variáveis
      • 4.2 Armazenamento de Dados na Memória..............................................
      • 4.3 Conceito e Utilidade de Variáveis
      • 4.4 Definição de Variáveis em Algoritmos.................................................
      • 4.5 Síntese
      • 4.6 Exercícios Propostos...........................................................................
  • Capítulo
    • Expressões
      • 5.1 Conceito
      • 5.2 Operadores
      • 5.3 Tipos de Expressões...........................................................................
      • 5.4 Síntese
      • 5.6 Exercícios Propostos...........................................................................
  • Capítulo
    • Instruções Primitivas.....................................................................................
      • 6.1 Instrução Primitiva de Atribuição
      • 6.2 Instrução Primitiva de Saída de Dados
      • 6.3 Instrução Primitiva de Entrada de Dados
      • 6.4 Síntese
      • 6.5 Exercícios Resolvidos
      • 6.6 Exercícios Propostos...........................................................................

Capítulo 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.

O critério usado para classificar hierarquicamente estas formas está diretamente ligado ao nível de detalhe ou, inversamente, ao grau de abstração oferecido.

Algumas formas de representação de algoritmos tratam os 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 obscurecer as idéias principais do algoritmo, dificultando seu entendimento.

Dentre as formas de representação de algoritmos mais conhecidas podemos citar:

ƒ Descrição Narrativa ;

ƒ Fluxograma Convencional ;

ƒ Pseudocódigo , também conhecido como Linguagem Estruturada ou Portugol.

2.1 Descrição Narrativa

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

ƒ Receita de bolo:

Misture os ingredientes Unte a forma com manteiga Despeje a mistura na forma Se houver coco ralado então despeje sobre a mistura Leve a forma ao forno Enquanto não corar deixe a forma no forno Retire do forno Deixe esfriar

ƒ 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

ƒ Tomando um banho:

Entrar no banheiro e tirar a roupa Abrir a torneira do chuveiro Entrar na água Ensaboar-se Sair da água Fechar a torneira Enxugar-se Vestir-se

ƒ Cálculo da média de um aluno:

Obter as suas 2 notas de provas Calcular a média aritmética Se a média for maior que 7, o aluno foi aprovado, senão ele foi reprovado

Esta representação é pouco usada na prática porque o uso da 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 30º no sentido anti-horário".

2.2 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 e justifica sua popularidade.

Esta forma é aproximadamente intermediária à descrição narrativa e ao pseudocódigo (subitem seguinte), pois é menos imprecisa que a primeira e, no entanto, não se preocupa com detalhes de implementação do programa, como o tipo das variáveis usadas.

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 fita magnética ou um monitor de vídeo. Como esta apostila não está interessada em detalhes físicos da implementação, mas tão somente com o nível lógico das instruções do algoritmo, será adotada a notação simplificada da Figura 2.1 para os fluxogramas. De qualquer modo, o Apêndice A contém uma tabela com os símbolos mais comuns nos fluxogramas convencionais.

Início e final do fluxograma

Operação de entrada de dados

Operação de saída de dados

Operação de atribuição

Decisão

Figura 2.1 Principais formas geométricas usadas em fluxogramas.

Algoritmo <nome_do_algoritmo> <declaração_de_variáveis> Início Fim

Algoritmo é uma palavra que indica o início da definição de um algoritmo em forma de pseudocódigo.

<nome_do_algoritmo> é um nome simbólico dado ao algoritmo com a finalidade de distingui-los dos demais.

<declaração_de_variáveis> consiste em uma porção opcional onde são declaradas as variáveis globais usadas no algoritmo principal e, eventualmente, nos subalgoritmos.

consiste de uma porção opcional do pseudocódigo onde são definidos os subalgoritmos (Capítulo 8).

Início e Fim são respectivamente as palavras que delimitam o início e o término do conjunto de instruções do corpo do algoritmo.

Como exemplo, a Figura 2.3 mostra a representação do algoritmo do cálculo da média de um aluno, na forma de um pseudocódigo.

Algoritmo Calculo_Media Var N1, N2, MEDIA: real Início Leia N1, N MEDIA ← (N1 + N2) / 2 Se MEDIA >= 7 então Escreva “Aprovado” Senão Escreva “Reprovado” Fim_se Fim

Figura 2.3 Exemplo de um pseudocódigo.

2.4 Síntese

Há diversas formas de representação de algoritmos que diferem entre si pela quantidade de detalhes de implementação que fornecem ou, inversamente, pelo grau de abstração que possibilitam com relação à implementação do algoritmo em termos de uma linguagem de programação específica.

Dentre as principais formas de representação de algoritmos destacam-se: a descrição narrativa , o fluxograma convencional e o pseudocódigo (ou linguagem estruturada).

Capítulo 3

Tipos de Dados

Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Grosso modo, estas informações podem ser classificadas em dois tipos:

ƒ As instruções , que comandam o funcionamento da máquina e determinam a maneira como devem ser tratados os dados. As instruções são específicas para cada modelo de computador, pois são funções do tipo particular de processador utilizado em sua implementação.

ƒ Os dados propriamente ditos, que correspondem à porção das informações a serem processadas pelo computador.

A maior parte das pessoas não ligadas à área de informática ignora o potencial dos computadores e imagina que eles são capazes de tratar apenas com dados numéricos. Na realidade, a capacidade dos mesmos se estende a outros tipos de dados.

O objetivo deste capítulo é justamente o de classificar os dados de acordo com o tipo de informação contida neles. A classificação apresentada não se aplica a nenhuma linguagem de programação específica; pelo contrário, ela sintetiza os padrões utilizados na maioria das linguagens.

3.1 Dados Numéricos

Antes de apresentar formalmente os tipos de dados numéricos, é conveniente recordar alguns conceitos básicos relacionados à teoria dos números e conjuntos.

O conjunto dos números naturais é representado por N e é dado por:

N = {1, 2, 3, 4, ...}

Algumas correntes de matemáticos teóricos convencionam que o número 0 está contido neste conjunto; contudo, não convém perder tempo em tais discussões filosóficas, uma vez que isto não influenciará de forma alguma este estudo.

Na seqüência, encontramos o conjunto dos números inteiros :

Z = {..., -3, -2, -1, 0, 1, 2, 3, ...}

O conjunto Z contém todos os elementos de N , bem como alguns números que não pertencem a N (os números negativos e o zero). Portanto, dizemos que N está contido em Z , ou então, que Z contém N.

Englobando o conjunto dos números inteiros, existe o conjunto dos números fracionários ( Q ), dado pelo universo dos números que podem ser expressos na forma de uma fração, isto é, um quociente onde o numerador e o denominador são números inteiros. Mais formalmente:

Q = ( p/q | p, q pertencem a Z }

Usualmente, os dados literais são representados nos algoritmos pela coleção de caracteres, delimitada em seu início e término com o caractere aspas ( " ).

Diz-se que o dado do tipo literal possui um comprimento dado pelo número de caracteres nele contido.

Exemplos de dados do tipo literal:

"QUAL ?" - literal de comprimento 6

" " - literal de comprimento 1

"qUaL ?!$" - literal de comprimento 8

" AbCdefGHi" - literal de comprimento 9

"1-2+3=" - literal de comprimento 6

“0” - literal de comprimento 1

Note que, por exemplo, "1.2" representa um dado do tipo literal de comprimento 3, constituído pelos caracteres "1", "." e "2", diferindo de 1.2 que é um dado do tipo real.

3.3 Dados Lógicos

A existência deste tipo de dado é, de certo modo, um reflexo da maneira como os computadores funcionam. Muitas vezes, estes tipos de dados são chamados de booleanos , devido à significativa contribuição de BOOLE à área da lógica matemática.

O tipo de dados lógico é usado para representar dois únicos valores lógicos possíveis: verdadeiro e falso. É comum encontrar-se em outras referências outros tipos de pares de valores lógicos como sim/não , 1/0 , true/false.

Nos algoritmos apresentados nesta apostila os valores lógicos serão delimitados pelo caractere ponto (. ).

Exemplo:

.V. - valor lógico verdadeiro

.F. - valor lógico falso

3.4 Síntese

Os dados numéricos dividem-se em duas classes:

ƒ inteiros , que não possuem parte fracionária e podem ser positivos ou negativos;

ƒ reais , que podem possuir parte fracionária e podem ser positivos ou negativos.

Os dados do tipo literal podem conter seqüências de letras, dígitos ou símbolos especiais, delimitados por aspas ( " ). Seu comprimento é dado pelo número de caracteres em string.

Os dados do tipo lógico só possuem dois valores possíveis ( .V. e .F. ).

A árvore abaixo resume a classificação dos dados com relação aos tipos de dados apresentados.

Figura 3.2 Representação dos diversos tipos de dados

3.5 Exercício Proposto

  1. Classifique os dados especificados abaixo de acordo com seu tipo, assinalando com I os dados do tipo inteiro, com R os reais, com L os literais, com B os lógicos (booleanos), e com N aqueles para os quais não é possível definir a priori um tipo de dado.

( ) 0. ( ) 1 ( ) V ( ) “0.” ( ) 1% ( ) “José” ( ) 0, ( ) .F. ( ) -0.

( ) .T.

( ) “a” ( ) “+3257” ( ) +3257. ( ) “-0.0” ( ) “.F.” ( ) ± 3

( ) .V.
( ) .V

( ) “abc” ( ) F ( ) C ( ) Maria ( ) +

traduz um outro escrito em alguma linguagem de programação para outra geral, a linguagem de máquina do computador com que se trabalha).

A Figura 4.3 mostra o caso em que se armazena a literal "banana" no conjunto de seis bytes contíguos de memória iniciando pela posição de memória 0. Na verdade, ao invés dos caracteres da literal , os códigos correspondentes aos mesmos é que são guardados na memória.

Endereço Informação 0 b (98) 1 a (97) 2 n (110) 3 a (97) 4 n (110) 5 a (97)

Figura 4.3 Armazenamento da literal “banana” na memória de um computador.

4.2.2 Armazenamento de Dados do Tipo Lógico

Uma informação do tipo lógico só possui dois valores possíveis: .V. ou .F.. Assim, a princípio, um único bit seria suficiente para armazenar uma informação deste tipo. Contudo, deve-se lembrar que a menor porção de memória que se pode acessar é o byte. Portanto, uma informação do tipo lógico é armazenada em um byte de memória. De certa forma, se por um lado isto pode ser como um "desperdício" de memória, por outro simplifica bastante a arquitetura de memória dos computadores (por motivos que fogem ao contexto desta apostila). Além do mais, isto não é tão relevante, uma vez que na prática o número de ocorrências de dados do tipo lógico é bastante inferior ao de ocorrências de dados do tipo literal ou numérico.

4.2.3 Armazenamento de Dados do Tipo Inteiro

O conjunto dos números inteiros ( Z ) contém um número infinito de elementos:

Z = { -∞, ..., -3, -2, -1, 0, 1, 2, 3, ..., +∞}

Obviamente é inviável o armazenamento de todos os números deste conjunto num computador. Faz-se necessário realizar um estudo para que se limite o número de elementos representáveis deste conjunto.

Se apenas um byte fosse utilizado para armazenar os dados do tipo inteiro, existiriam apenas 256 números diferentes neste conjunto:

{-127, -126, ..., -2, -1, 0, 1, 2, ..., 127, 128)

Esta restrição é bastante forte, uma vez que boa parte das aplicações práticas necessitam de números inteiros maiores que estes.

Se forem utilizados dois bytes para armazenar um número inteiro, o universo de números representáveis cresce para 2 8 x 2 8 = 2 16 = 65.536 possibilidades:

{-32767, -32766, ..., -2, -1, 0, 1, 2, ..., 32767, 32768}

Este conjunto satisfaz à grande maioria das necessidades práticas. Assim, em geral utilizam-se dois bytes para representar os números inteiros em computadores. Contudo, restam algumas aplicações muito específicas em que se precisa de um conjunto ainda maior. Para

estes casos, algumas linguagens de programação fornecem mecanismos para trabalhar números inteiros com quatro bytes. Nestes casos os dados são ditos inteiros longos ou estendidos.

4.2.4 Armazenamento de Dados do Tipo Real

O conjunto dos números reais ( R ) contém um número infinito de elementos e, pelas mesmas razões que o conjunto dos números inteiros , precisa ser limitado.

Para dados deste tipo julgou-se apropriado adotar quatro bytes para sua representação interna nos computadores.

São muito comuns situações como as aplicações científicas em que é necessária uma maior precisão de cálculo, intimamente ligada ao número de casas decimais dos dados. Para este caso, em analogia com o que acontece com os dados do tipo inteiro, algumas linguagens de programação decidiram criar dados do tipo real estendido (com oito bytes).

4.3 Conceito e Utilidade de Variáveis

Como visto anteriormente, informações correspondentes a diversos tipos de dados são armazenadas na memória dos computadores. Para acessar individualmente cada uma destas informações, a 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.

Nome

Tipo de dado

Informação

Figura 4.4 Atributos de uma variável.

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 nesta apostila 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 ( _ ).

Exemplos:

4.5 Síntese

A memória dos computadores é composta por células numeradas ordenadamente denominadas bytes. Cada byte é constituído por 8 bits.

Cada tipo de dado requer um número diferente de bytes para armazenar a informação representada por ele na memória. Esta quantidade também pode variar em função do tipo de computador considerado.

Uma variável é uma entidade dotada de um nome para diferenciá-la das demais e um tipo de dado que define o tipo de informação que ela é capaz de guardar. Uma vez definidos, o nome e o tipo de uma variável não podem ser alterados no decorrer de um programa. Por outro lado, a informação útil da variável é objeto de constante modificação durante o decorrer do programa, de acordo com o fluxo de execução do mesmo.

4.6 Exercícios Propostos

  1. Assinale com C os identificadores corretos e com I os incorretos. Explique o que está errado nos identificadores incorretos.

( ) valor ( ) _b ( ) notadoaluno ( ) a1b2c ( ) 3 x 4 ( ) Maria

( ) km/h ( ) xyz ( ) nome empresa ( ) sala_ ( ) “nota” ( ) ah!

  1. Supondo que as variáveis NB, NA, NMAT e SX sejam utilizadas para armazenar a nota do aluno, o nome do aluno, o número da matrícula e o sexo, declare-as corretamente, associando o tipo adequado ao dado que será armazenado.

Capítulo 5

Expressões

5.1 Conceito

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.

Figura 5.1 Triângulo de base ( B ) e altura ( H ).

Por exemplo, a fórmula de cálculo da área do triângulo da Figura 5.1 é dada por:

AREA = 0.5 x B x H

Esta fórmula utiliza três variáveis: B e H , que contêm as dimensões do triângulo, e AREA , onde é guardado o valor calculado (resultado da avaliação da expressão). Há, também, uma constante ( 0.5 ) e o operador de multiplicação ( x ), que aparece duas vezes na expressão.

O conceito de expressão aplicado à computação assume uma conotação mais ampla: uma expressão é uma combinação de variáveis, constantes e operadores, e que, uma vez avaliada, resulta num valor.

5.2 Operadores

Operadores são elementos funcionais que atuam sobre operandos e produzem um determinado resultado. Por exemplo, a expressão 3 + 2 relaciona dois operandos (os números 3 e 2) por meio do operador ( + ) que representa a operação de adição.

De acordo com o número de operandos sobre os quais os operadores atuam, os últimos podem ser classificados em:

ƒ binários , quando atuam sobre dois operandos. Ex.: os operadores das operações aritméticas básicas (soma, subtração, multiplicação e divisão);

ƒ A , B e C são variáveis do tipo inteiro;

ƒ X , Y e Z são variáveis do tipo real.

Exemplos:

A + B * C = expressão de resultado inteiro A + B + Y = expressão de resultado real A / B = expressão de resultado real X / Y = expressão de resultado real

5.3.2 Expressões Lógicas

Expressões lógicas são aquelas cujo resultado da avaliação é um valor lógico ( .V. ou .F. ).

Os operadores lógicos e suas relações de precedência são mostrados na Tabela 5.2.

Existem outros operadores lógicos, como por exemplo o OU_EXCLUSIVO. , mas suas funções podem ser exercidas por combinações dos três tipos de operadores da Tabela 5.2.

Tabela 5.2 Operadores lógicos e suas relações de prioridade.

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

Para exemplificar o uso de operadores lógicos, a Tabela 5.3 apresenta duas variáveis lógicas A e B. Uma vez que cada variável lógica possui somente dois valores possíveis, então há exatamente quatro combinações para estes valores, razão pela qual a tabela tem quatro linhas. As diversas colunas contêm os resultados das operações lógicas sobre as combinações possíveis dos valores das variáveis A e B.

Tabela 5.3 Tabela-Verdade dos operadores apresentados na Tabela 5.2.

A B .NÃO. A .NÃO. B A .OU. B A .E. B .F. .F. .V. .V. .F. .F. .F. .V. .V. .F. .V. .F. .V. .F. .F. .V. .V. .F. .V. .V. .F. .F. .V. .V.

Tabelas como a da Figura 5.3 são chamadas de Tabelas-Verdade. Convém salientar as seguintes conclusões que podem ser extraídas por observação da Tabela 5.3:

ƒ O operador lógico .NÃO. sempre inverte o valor de seu operando. Ex.: .NÃO. .V. = .F. e .NÃO. .F. = .V. ;

ƒ Para que a operação lógica .OU. tenha resultado verdadeiro basta que um de seus operandos seja verdadeiro; Para melhor visualizar este efeito, podemos imaginar que as variáveis lógicas A e B são como dois interruptores ligados em paralelo num circuito de acionamento de uma lâmpada (Figura 5.2).

Nas expressões lógicas onde aparecem apenas os operadores lógicos da Tabela 5. somente variáveis do tipo lógico podem ser usadas. Isto parece óbvio, uma vez que os operadores lógicos somente atuam sobre valores (constantes ou variáveis) lógicos.

Há, ainda, outro tipo de operador que pode aparecer em operações lógicas: os operadores relacionais , mostrados na Tabela 5.4.

Tabela 5.4 Operadores relacionais.

Operador Operação = Igual <> Diferente < Menor <= Menor ou igual

Maior = Maior ou igual

Estes operadores 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.

O uso de operadores relacionais possibilita o aparecimento em expressões lógicas de variáveis de outros tipos de dados que não o lógico.

5.3.3 Expressões Literais

Expressões literais são aquelas cujo resultado da avaliação é um valor literal. Este tipo de expressão é bem menos freqüente que os anteriores. Os tipos de operadores existentes variam de uma linguagem de programação para outra, não havendo uma padronização.

Para que o assunto não passe em branco, considere-se como exemplo a operação de concatenação de strings : toma-se duas strings e acrescenta-se (concatena-se) a segunda delas ao final da primeira. Em algumas linguagens esta operação é representada pelo símbolo (+). Por exemplo, a concatenação das strings " REFRIGERA " e " DOR " é representada por " REFRIGERA " + " DOR " e o resultado de sua avaliação é " REFRIGERADOR ".

5.4 Síntese

Uma expressão é uma combinação de variáveis, constantes e operadores, que resulta num valor quando avaliada.

Operadores são elementos funcionais que atuam sobre operandos. Segundo o número de operandos sobre os quais atua, um operador pode ser classificado em unário ou binário. Segundo os tipos de dados de seus operandos e do valor resultante de sua avaliação, os operadores podem ser classificados em aritméticos, lógicos ou literais.

Um tipo especial de operador é o relacional , que é usado na comparação de operandos de um mesmo tipo de dado e cujo resultado da avaliação é sempre um valor lógico.

As expressões são classificadas de acordo com o valor resultante de sua avaliação em:

ƒ Aritméticas , que resultam num valor numérico (real ou inteiro);