Você está na página 1de 63

Prof.

Jos Miranda

O conciso dicionrio Oxford define um algoritmo com um processo ou regras para (mquina) clculos. A execuo de um algoritmo no deve incluir qualquer deciso subjetiva, nem deve exigir o uso de intuio ou criatividade (embora veremos uma exceo a esta regra) Quando conversamos sobre algoritmo vem logo mente os computadores. Nem por isso, outros mtodos sistemticos no intuito de resolver problemas poderiam ser includos.

Por exemplo, os mtodos que aprendemos na escola para multiplicar e dividir inteiros so tambm algoritmos Geralmente um mtodo elaborado para resolver um problema que surge dentro do escopo de um modelo. Por sua vez, um modelo foi criado para facilitar e responder a um questionamento da natureza.

O mais famoso algoritmo na histria data do tempo dos gregos: Isto , o algoritmo de Euclides para calcular o mltiplo divisor comum de dois inteiros tambm possvel considerar certas receitas de pratos como algoritmos, garantindo que eles no incluam instrues como adicione sal para dar sabor Quando ns nos organizamos para resolver um problema, importante decidir qual algoritmo dever ser usado para sua soluo.

A resposta pode depender de muitos fatores: O tamanho do exemplo a ser usado. A maneira ou jeito com que o problema apresentado A rapidez e o tamanho de memria do equipamento de clculo disponvel, e assim por diante. Realizar um clculo aritmtico elementar como exemplo. Suponha que voc tenha de multiplicar dois nmeros inteiros usando somente lpis e papel.

Se voc fosse criado no ocidente, as chances so que voc multiplicaria o multiplicando sucessivamente por cada algarismo do multiplicador, tomado da direita para esquerda escrevendo esses resultados intermedirios um debaixo do outro deslocando cada linha para esquerda e finalmente voc adicionaria todas essas filas para obter sua resposta. Este o clssico algoritmo da multiplicao. Todavia, podemos usar um algoritmo bem diferente para fazer a mesma coisa. Usaremos o conhecido algoritmo chamado multiplicao la russe:

Escreva o multiplicador e multiplicando lado a lado. Crie colunas, uma de baixo de cada operando, repetindo a

seguinte regra at que o nmero debaixo do multiplicador for 1. Divida o nmero debaixo do multiplicador por dois, ignorando qualquer frao. Dobre o nmero debaixo do multiplicando adicionado ele a ele mesmo. Finalmente, descarte a linha em que o nmero debaixo do multiplicador par, e ento adicione todos os nmeros que restaram na coluna debaixo do multiplicando. Vamos multiplicar 45 por 19 como mostrado abaixo:

Neste exemplo ns obtemos 19 + 76 + 152 + 605 =855. Embora este algoritmo possa parecer engraado a priori, ele

essencialmente um mtodo usado no maquinrio de muitos computadores. Para usar isso, no h necessidade de memorizar qualquer tabela de multiplicao: tudo que precisamos saber como adicionar tudo, e como dobrar um nmero ou dividi-lo por 2. 45 19 19 22 38 --11 76 76 5 152 152 2 304 --1 608 608 855

Veremos ao longo de nossa primeira abordagem de algoritmo que h algoritmos mais eficientes usados para multiplicar nmeros inteiros maiores. Mas tambm veremos que alguns desses algoritmos mais sofisticados so mais lentos do que aqueles mais simples quando os operandos no so suficientemente grandes. Neste ponto importante decidir como ns vamos representar nossos algoritmos. Se ns tentarmos descrever em nossa lngua, ns rapidamente descobriremos que as linguagens nativas no so adaptadas a esse tipo de coisa.

Para evitar qualquer confuso, ns especificaremos no futuro nosso algoritmos fornecendo um programa. Todavia, ns no iremos nos confinar ao uso de uma nica linguagem de programao especfica, por outro lado, podemos abordar diferentes linguagens para depois decidir qualquer mais conveniente para nossas atuais necessidades no tocante a validao de nossos algoritmos. Assim, a figura do laboratrio nos dar um teor prtico ao longo de toda a disciplina. Dessa maneira, os pontos essenciais de um algoritmo no sero obscurecidos pelos detalhes de programao relativamente irrelevantes. Iremos usar frases do portugus em nossos programas onde quer que isso parea favorecer a simplicidade e a clareza.

Essas frases em Portugus no devero ser confundidas com comentrios no programa. Assim optaremos em sempre colocar os comentrios em chaves { }. Declaraes de quantidades escalares (inteiro, real, ou Booleano) so geralmente omitidas. Parmetros escalares das funes e procedimentos so passados por valor pelo menos um especificao diferente fornecida explicitamente, e as agrupamentos (ARRAY) so passados por referncia. A notao usada para especificar que uma funo ou um procedimento tem um parmetro de agrupamento varia de caso a caso. Podemos escrever por exemplo: procedimento proc1(T: grupo) ou mesmo procedimento proc2(T)

Se o tipo e as dimenses do agrupamento T no forem importantes ou se eles so evidentes oriundo do contexto. Em tal caso #T denota o nmero de elementos no agrupamento T. Se os limites ou o tipo de T so importantes, escrevemos: procedimento proc3(T[1..n]) ou mais geral procedimento proc4(T[a..b]: inteiros). Em casos n, a, e b deveria ser considerado como parmetros formais, e seus valores so determinados pelos limites do parmetro real correspondente a T quando o procedimento for chamado. Essas fronteiras podem ser especificadas explicitamente, ou mudadas, pela chamada do procedimento da seguinte forma: proc3(T[1..m]).

Para evitar proliferao das frases: comeo do procedimento e fim do procedimento, o alcance de uma colocao tais como se, enquanto, ou para, como tambm tais como aquelas encontradas em uma declarao, procedimento, funo, ou gravao, mostrada pela endentao das colocaes afetadas. A colocao retorno marca o fim dinmico de um procedimento ou uma funo. No ltimo caso tambm fornece o valor da funo. Os operadores de div e mod representam divises de inteiros (descartando qualquer resultado ponto flutuante) e o resto de uma diviso, respectivamente. Logo iremos falar de conceitos de recurso e ponteiros. O ltimo representado por uma seta apontando para cima .

Por exemplo, aqui est uma descrio formal da multiplicao la russe. equanto I >0 do se X[I] mpar ento prodprod +Y[I] I I 1 retorne prod

funo russe(A,B) grupos X, Y {inicializao} X[1] A; Y[1] B I 1 {criar as duas colunas} enquanto X[I] > I faa X[I+1]X[I] div 2 Y[I+1]Y[I] + Y[I] II + 1 prod 0

Em nossa abordagem inicial focaremos na criao de algoritmos para resolver um mesmo problema de modo que possamos escolher o melhor. Isso levanta a questo de como decidir qual dos diversos algoritmos o preferido. A abordagem emprica consiste de programar algoritmos competitivos e provando os em diferentes instncias com a ajuda de um computador.

Os computadores das mais variadas arquiteturas tm funcionamento similar.

Acima temos uma figura mostrando uma arquitetura simplificada de um computador

Na CPU (processador) existe um conjunto relativamente pequeno de instrues. Cada tipo de processador tem um conjunto diferente de instrues apesar de similares entre si. O local de onde as instrues so buscadas pelo processador a memria. Essas instrues podem ser desce de operaes matemticas a instrues com os dispositivos de entrada e sada.

Um programa de computador um conjunto de instrues que ser executado pelo processador em uma determinada sequncia. Esse programa leva o computador a realizar alguma tarefa. Assim, notamos que um programa nada mais do que um algoritmo. Podemos considerar essas primeiras instrues como a primeira linguagem de programao do computador ou linguagem de mquina.

A linguagem de programao pode ser classificada em nveis. Existe a linguagem de baixo nvel como o caso de uma linguagem de mquina, ASSEMBLY como mostrada abaixo
; Incrementa a varivel de memria CONT ; Transfere o valor 48 para varivel de memria TOTAL ;Adicinar o contedo do registrador BH para o registrador AH ; Realizar operao AND na varivel MASK1 e 128 ; Adicionar 10 a varivel MARKS ; Transferir o valor 10 para o registrador AL

INC CONT MOV TOTAL, 48 ADD AH, BH AND MASK1, 128 ADD MARKS, 10 MOV AL, 10

A palavra ASSEMBLY vem da palavra montar, que podemos tambm chamar de linguagem de montagem e para executar usado um programa chamado ASSEMBLER (montador). A linguagem de montagem muito prxima da linguagem de mquina e por isso conhecida como de baixo nvel. Todo o processo de programao e desvio de problemas pode ser sintetizado a seguir

Edit

prog.asm

Assemble

library.lib

prog.obj

prog.lst

Link

prog.exe

prog.map

Debug

Run

Para cada processador, h uma linguagem de montagem j que uma relao direta entre as instrues em linguagem de montagem e em linguagem de mquina. Isto faz com que o cdigo tenha que ser refeito se quisermos executar um programa em um processador no compatvel com o qual ele foi escrito inicialmente. Para resolver isso foi criada as linguagens de alto nvel.

Essas linguagens so independentes do processador em que so executadas. Suas caractersticas principais soa que seu cdigo mais elaborado contemplando operaes mais complexas e mais prximas da lgica humana. Para que possam ser processadas tais linguagens so traduzidas para a linguagem de mquina. Essa traduo realizada por um compilador

O compilador, a partir do cdigo em linguagem de alto nvel, chamado de cdigofonte, gera um arquivo com o cdigo em linguagem de mquina, conhecido como cdigo-objeto. Esse cdigo-objeto fica em disco e s carregado em memria no momento da execuo. O interpretador faz o mesmo trabalho, porm no gera o arquivo em cdigo-objeto.

As instrues so traduzidas para linguagem de mquina em tempo de execuo, instruo a instruo. Podemos notar que programar um computador tornou-se muito mais fcil do que anteriormente. Vamos ver agora um de Shell que o PROMPT do sistema operacional Unix e Linux o servo que recebe os comandos digitados pelo usurio e os executa USURIO SHELL KERNEL DISCO RGIDO Enquanto o Shell script um arquivo que guarda vrios comandos que pode ser executado sempre que for requisitado. Podemos tambm usar o PROMPT do sistema operacional Windows para realizar programas combinados com comandos Esses so exemplos de interpretadores.

A linguagem Java tem uma arquitetura diferente, o que fornece a seus programas mais portabilidade que outras linguagens de programao de alto nvel. A compilao do cdigo Java no gera cdigo executvel em nenhum sistema operacional. Em vez disso, gera um cdigo pseudo-executvel, chamado BYTECODE. Esse cdigo uma espcie de baixo nvel que , porm, no uma linguagem de mquina de algum processador, nem faz interface especfica com algum determinado sistema operacional. Para que esse cdigo possa ser executado em algum sistema operacional, necessrio que mais uma camada de software esteja ai instalada. A camada de software funciona como um sistema operacional genrico, deixando transparentes as particularidades do sistema operacional real.

Essa camada chamada de mquina Java virtual. A mquina faz a traduo dos BYTECODES para cdigo executvel naquele sistema operacional. Isso faz com que um programa escrito em Java e que seja compilado para BYTECODE possa ser executado em qualquer mquina que tenha a JVM adequada instalada. Durante a execuo, esse cdigo ser traduzido em tempo real para a linguagem proprietria e executado. A traduo em tempo real pode ser entendida como uma espcie de interpretao. Portanto, difcil afirmar que a linguagem de programao Java seja um linguagem puramente compilada ou interpretada.

public class Operacoes { public static void main(String[ ] args) { Scanner entrada = new Scanner(System.in); int num1; int num2; System.out.print ("Digite o primeiro nmero: "); num1 = entrada.nextInt( ); System.out.print("Digite o segundo nmero: "); num2 = entrada.nextInt(); System.out.println(); System.out.println(num1 + " + " + num2 + " = " + (num1 + num2) ); System.out.println(num1 + " - " + num2 + " = " + (num1 - num2) ); System.out.println(num1 + " * " + num2 + " = " + (num1 * num2) ); }

Linguagem natural: Mostra uma maior flexibilidade e liberdade de expressar todos os procedimentos, porm torna o processo da criao do algoritmo sem uma padronizao importante. Na linguagem natural teremos tambm corremos o grande risco do subjetivismo, isto , a forma seria muito realada do que a eficcia do algoritmo. Fluxograma: Os fluxogramas apresentam os algoritmos de forma grfica. So formados de caixas que contm as instrues a serem executadas. Tais caixas ligadas por setas que indicam o fluxo das aes. Algumas caixas especiais indicam a possibilidade de o fluxo seguir caminhos distintos, dependendo de certas situaes que podem ocorrer durante a execuo do algoritmo.

Pseudocdigo: Visa trazer o mximo possvel de vantagens como o cdigo pronto para a execuo, a rigidez sinttica e a semntica que so importantes e imprescindveis para que o algoritmo possa ser lido e executado pelo computador. O pseudocdigo ao contrario da linguagem propriamente dita tem um grau de rigidez sinttica intermediria entre as linguagens natural e de programao. Alm disso, podemos utilizar o idioma nativo. Em geral, linguagem de programao so construdas utilizando palavras reservadas em ingls, uma espcie de padro. Porm, o pseudocdigo deve manter, tanto quanto possvel, a rigidez semntica. Um pseudocdigo bastante conhecido aqui o Portugol, que apresenta aceitao e tem sua razes obvias para isso.

var num1, num2, maior: inteiro; inicio leia (num1, num2); se (num1 > num2) ento maiornum1; seno maiornum2; escreva (maior); fim

Defina o que um algoritmo Cite alguns critrios de escolha de um algoritmo dentre diversos testados Diferena de um algoritmo e um programa Explique como um programa executado em um computador Defina o que uma linguagem de programao de baixo nvel e uma de alto nvel Dado um programa executvel em um sistema operacional, o que preciso fazer para que tal programa possa ser utilizado em outro sistema operacional? Explique por que um cdigo Java portvel em vrios sistemas operacionais. Explique um pouco do que vem a ser o Shell script Quais as vantagens e desvantagens da utilizao de fluxogramas e de pseudocdigo na construo de algoritmos?

A representao grfica baseada nas formas geomtrica apresentadas anteriormente implicam no uso e implementao de aes distintas. O uso de diagramas facilita o entendimento das ideias de uma pessoa ou equipe e justifica sua popularidade. A representao grfica baseada em diagrama de bloco tambm referenciada erroneamente no Brasil como fluxograma. O termo fluxograma deve ser utilizado, apenas na esfera da analise de sistemas, e no em programao.

Possivelmente o erro de definio do termo ocorre devido estrutura da palavra original inglesa, flowchart (flow=fluxo, chart=diagrama), portanto diagrama de fluxo. No entanto, diagrama de fluxo no o mesmo que fluxograma. Vale lembrar que fluxograma um conceito macro e diagrama micro do processo de documentao grfica da linha de raciocnio a ser usada na programao de um computador eletrnico. Alm da representao tradicional, h a representao alternativa denominada diagrama de

quadro (ou diagrama de NS ou diagrama de CHAPIN) . Apesar de utilizada por alguns professores, essa forma no impede de ser apresentada. O diagrama NS ou NSD foi desenvolvido por Isaac Nessi e Bem Sheiderman nos anos de 1972/73 e ampliado por Ned Chapin no ano de 1974. Esse modelo de diagramao substitui o formato tradicional por uma forma estrutural diferente baseada no uso de quadros.

Inicio Inicio Inicio Leia A, B A, B RA+B Escreva R Fim RA+B RA+B R R Fim Fim A, B Inicio N Inicio A>B S

RA+B Escrever R

A>B

Fim

Crie um diagrama de bloco para adicionar trs valores numricos e a mdia ponderada para pesos escolhidos por voc; Usando o mtodo de Euclides para determine o mximo divisor comum de dois valores numricos inteiros positivos atravs de um fluxograma; Usando a srie de Taylor para criar um algoritmo para 5 termos da srie.

Um computador, independentemente de ser de grande, mdio ou de pequeno porte, executa basicamente trs aes de trabalhos:
A entrada de dados; O processamento de dados;

A sada de dados.

A etapa de entrada de dados a parte que o computador recebe os dados do mundo, podendo armazen-los na memria principal para realizar algum tipo de processamento, ou armazenar na memria secundria para usar futuramente.

A etapa de processamento de dados quando o computador, por meio de um programa (software) executado em sua memria primria , realiza a transformao dos dados de entrada ou previamente armazenados em sua memria secundria, tornando-os elementos que possam ser usados como fontes de informao para o mundo exterior. Essa etapa realizada de forma muito comum nas linguagens de programao, pois independentemente do tipo de linguagem em uso, sofre muito pouca variao.

A etapa de sada de dados o computador envia os dados processados na memria principal ou armazenados na memria secundria para o mundo externo. Os dados processados podem ser usados como fontes de informaes, e assim facilitar a vida das pessoas que necessitam tomar decises. Essa etapa, assim como a entrada de dados, realizada de forma bastante variada nas linguagens de programao.

Dados so elementos do mundo exterior, que representam dentro de um computador digital as informaes manipuladas pelos seres humanos. Os dados a serem utilizados devem primeiramente ser abstrados para serem ento processados. Eles podem ser classificados em trs tipos primitivos ou tipos bsicos; numricos (representados por valores numricos inteiros ou reais), caracteres (representados por valores alfabticos ou alfanumricos) e lgicos (valores dos tipos falso e verdadeiro)

Inteiro: os dados numricos positivos e negativos pertencem ao conjunto de nmeros inteiros, excluindo dessa categoria qualquer valor numrico fracionrio (que pertence ao conjunto de nmeros reais), por exemplo, os valores 35, 234, -54, -9. entre outros. Em nossa abordagem do dado inteiro iremos fazer em portugus com o comando inteiro. O tipo de dado inteiro utilizado em operaes de processamento matemtico. Real: so reais os dados numricos positivos e negativos que pertencem ao conjunto de nmeros reais, incluindo nessa categoria todos os valores fracionrios e inteiros,

Por exemplo, os valores 35, 0, -57, -4, 5.2, entre outros. Iremos ao redigirmos os passos de um algoritmo usar o comando real para referenciar um dado real em nosso portugol. Caractere/Cadeia: so caracteres delimitados pelos smbolos aspas ( ). Eles so representados por letras (de A at Z), nmeros (de zero at 9), smbolos (por exemplo, todos os smbolos imprimveis existentes num teclado) ou palavras contendo esses smbolos. O tipo de dado caractere conhecido tambm como alfanumrico, string (linha ou conjunto de pontos)

Iremos em nossa abordagem nos referir aos tipos alfanumricos ou STRING como caractere ou cadeia. Lgico: so lgicos os dados com valores binrios do tipo sim ou no, verdadeiro e falso, 1 e zero, entre outros, em que apenas um dos valores pode ser escolhido. Iremos nos referir a tais tipos como lgico.

Variveis so os elementos que esto sujeitas a variaes ou mudanas, que so incertas, instveis ou inconsistentes. E quando se fala de computadores, preciso ter em mente que o volume de dados a serem tratados grande e diversificado. Desta forma, os dados a serem processados so bastante variveis. Todo dado a ser armazenado na memria de um computador deve ser previamente identificado segundo seu tipo, ou seja, primeiramente necessrio saber o tipo do dado para depois fazer seu armazenamento.

No entanto, h algumas programas que usam linguagens, como o caso Matlab que geralmente dispensa a declarao de variveis, como mostra o O qual imprimi como sada o exemplo abaixo. tringulo de Pascal: a=1 1 while length(a) < 10 11 121 a = [0 a] + [a 0] 1331 14641 end 1 5 10 10 5 1

1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 (com a= antes de cada linha)

No entanto, h algumas programas que usam linguagens, como o caso Matlab que geralmente dispensa a declarao de variveis, como mostra o O qual imprimi como sada o exemplo abaixo. tringulo de Pascal: a=1 1 while length(a) < 10 11 121 a = [0 a] + [a 0] 1331 14641 end 1 5 10 10 5 1

1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 (com a= antes de cada linha)

Constante tudo que fixo, estvel, inaltervel, imutvel, continuo, incessante, invarivel, de valor fixo e que aplicado em diversos pontos de vista. Assim sendo, do ponto de vista computacional, que semelhante ao matemtico ou cientfico, constante uma grandeza numrica fixa que determina um valor invarivel em um sistema ou expresso, independente das variveis envolvidas

O uso de constantes fica bem claro quando vamos modelar um sistema real, pois de certo haver grandezas envolvidas que precisam ser definidas e declaradas com valor invarivel Eremos aqui mostrar um trecho de programa em MATLAB que determina a dinmica de um pndulo

clear; comprimento= 1; gravidade=9.8; npointos = 250; dt = 0.04; omega = zeros(npoints,1); alfa = zeros(npoints,1); tempo = zeros(npoints,1); alfa(1)=0.2;

Pndulo simples

massa

for passo= 1:npointos-1 omega(passo+1) = omega(passo) - (gravidade/comprimento)*teta(passo)*dt; alfa(step+1) = alfa(passo)+omega(passo)*dt tempo(passo+1) = tempo(passo) + dt; end plot(time,alfa,'r' ); xlabel('tempo (segundos) '); ylabel(alfa (radiandos)');

So responsveis pelas operaes matemticas a serem realizadas em um computador. O termo operador utilizado na rea da programao para estabelecer as ferramenta de interaes com as variveis e constantes gerando uma ao computacional. A tabela a seguir apresenta os operadores aritmticos a serem usados e considerados na elaborao de expresses aritmticas em no presente curso.

Tabela de operadores aritmticos


Operador + Operao +n ou n Descrio Manuteno do Sinal Tipo Unrio Prioridade __ Resultado Positivo

X X

-n
n n

Inverso de Sinal
Atribuio do valor n a x Exposio do valor de x Radiciao de
nX

Unrio
Binrio Binrio Binrio Binrio Binrio Binrio

__
__ 1 1 2

Negativo
Positivo ou Negativo Inteiro ou Real Real

X (1/n)

(1/n)
/ * div X /n X*n X div n

Diviso de X por n Multiplicao de X por n Diviso de x por n

Real 2 4 Inteiro ou Real Inteiro

Um operao muito comum em programao de computadores usar expresso aritmtica para o estabelecimento de processamentos matemticos. As expresses aritmticas so realizadas a partir do relacionamento existente entre variveis e constantes numricas com a utilizao dos operadores aritmticos. Como por exemplo de uma expresso aritmtica considere a frmula de clculo de rea de um crculo.

A=.R2

Crie um diagrama de bloco e sua codificao respectivamente do clculo de rea de um circulo. Desenvolver um diagrama de bloco e seu programa em portugol do clculo da converso da temperatura Fahrenheit para Celsius. Elaborar um programa para determinar montante de juros simples dado o capital inicial.

Agora iremos entender a capacidade de computadores tem de realizar tomadas de decises por meio de processamento lgico. A tomada de deciso realizada pelo computador estabelece uma ao de desvio na operao do fluxo do programa. Desta forma, um determinado trecho do programa pode realizar um ou outra tarefa de processamento.

Tabela de operadores aritmticos


Operador = > < >= Descrio Igual a Maior que Menor que Maior ou igual a Menor ou igual a Diferente de

<=
<>

A tomada de deciso simples (desvio condicional simples) do ponto de vista do diagrama de blocos representada pelos smbolos deciso e conector. A partir do smbolo deciso estabelecido o foco do desvio do fluxo de um programa. Esse desvio processado apenas para o lado que indicar o resultado da condio verdadeira

Observe o diagrama de blocos com N Condio rtulos S e N para a execuo de uma tomada de deciso simples com base na CONDIO definida no smbolo deciso. Note que o uso das linhas de fluxo com as setas indicando a direo do fluxo de Instrues executadas processamento do aps condio ser digrama. verdadeira

Instrues executadas aps condio ser verdadeira

incio

A, B

XA+B

programa ADIO_DE_NMEROS var A, B, X: real inicio leia A, B XA + B se ( X > 10) ento escreva X fim_se fim

X>10

X Fim