Rastreando lgortmos José ugusto aranauskas epartamento de Físca e Matemátca FFCLRP-USP Sala loco P Fone () - Uma vez desenvolvdo um algortmo, como saber se ele faz o que se supõe que faça? esta aula veremos que uma forma é executar o algortmo manualmente, com dados representatvos de entrada, regstrando os valores tomados pela varáves passo a passo do algortmo Esta técnca é conhecda como rastreo (trace) E-mal: augusto@ffclrp.usp.br URL: http://fmrp.usp.br/augusto Rastreo de um lgortmo. ntes de ncar o rastreo de um algortmo, numere todas as lnhas (passo) do algortmo. Escolha um conjunto sgnfcatvo de dados de entrada que será fornecdo ao algortmo. Para cada dado de entrada: a) Utlze uma tabela na qual as lnhas representam os passos executados pelo algortmo e as colunas representam os valores de todas as varáves do algortmo b) Ince o rastreo do algortmo, começando pelo passo e contnue a execução respetando as estruturas de controle já vstas: seqüênca, seleção e repetção. Repta o passo para os demas dados de entrada Exemplo: umerando os Rastreo de um lgortmo lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,). ntes de ncar o rastreo de um algortmo, numere todas as lnhas (passo) do algortmo. Escolha um conjunto sgnfcatvo de dados de entrada que será fornecdo ao algortmo. Para cada dado de entrada: a) Utlze uma tabela na qual as lnhas representam os passos executados pelo algortmo e as colunas representam os valores de todas as varáves do algortmo b) Ince o rastreo do algortmo, começando pelo passo e contnue a execução respetando as estruturas de controle já vstas: seqüênca, seleção e repetção. Repta o passo para os demas dados de entrada Conjunto Sgnfcatvo de ados epende de cada algortmo Como regra geral, o conjunto de dados deve permtr que cada passo do algortmo seja executado pelo menos uma vez o caso de seleções, cada uma das alternatvas deve ser testada o caso de repetções, o laço deve ser executado zero (se possível), uma e mas de uma vez Exemplo etermne um conjunto de dados de teste para o algortmo: lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) Possíves valores: >, > =, > =, = <, = <, <...
Exemplo Exemplo etermne um conjunto de dados de teste para o algortmo: lgortmo Méda. Este algortmo lê duas notas, calcula a méda artmétca delas e mprme uma mensagem ndcatva se o aluno fo aprovado ou não, juntamente com a méda obtda. Lea(,) Meda ( + ) /. Se Meda >=. Então Escreva( provado méda, Meda) Senão Escreva( Reprovado méda, Meda) Se Possíves valores: ( + )/ > ( + )/ = ( + )/ < Os dos prmeros conjuntos de dados testam a parte do então e o últmo conjunto de dados testa a parte do senão etermne um conjunto de dados de teste para o algortmo: lgortmo ParÍmpar. Este algortmo lê um valor ntero e determna se ele é par ou ímpar. Lea() Se % = Então Escreva(, é par ) Escreva(, é ímpar ) Se Possíves valores: = = = =... Os conjuntos de dados (=, =,...) testam a parte do então e os conjuntos (=, =,...) testam a parte do senão Exemplo Exemplo etermne um conjunto de dados de teste para o algortmo: lgortmo Fatoral. Calcula o fatoral de um número. Lea() fat Para até Faça fat fat * Para Escreva( fatoral=,fat) Possíves valores: = (laço não é executado) = (laço executado vez) = (laço executado duas vezes) = (laço executado vezes)... etermne um conjunto de dados de teste para o algortmo: determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Possíves valores: = = (teste do então do º se) = (teste do senão do º se, teste do para, teste do então do º se, teste do então do º se) = (teste do senão do º se, teste do para, teste então do º se, teste do senão do º se)... Rastreo de um lgortmo Exemplo : º conjunto de dados. ntes de ncar o rastreo de um algortmo, numere todas as lnhas (passo) do algortmo. Escolha um conjunto sgnfcatvo de dados de entrada que será fornecdo ao algortmo. Para cada dado de entrada: a) Utlze uma tabela na qual as lnhas representam os passos executados pelo algortmo e as colunas representam os valores de todas as varáves do algortmo b) Ince o rastreo do algortmo, começando pelo passo e contnue a execução respetando as estruturas de controle já vstas: seqüênca, seleção e repetção. Repta o passo para os demas dados de entrada para >, > (por exemplo =, = ) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,)
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para >, > (por exemplo =, = ) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,). para >, > (por exemplo =, = ) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,).. Rastreo de um lgortmo Exemplo : º conjunto de dados. ntes de ncar o rastreo de um algortmo, numere todas as lnhas (passo) do algortmo. Escolha um conjunto sgnfcatvo de dados de entrada que será fornecdo ao algortmo. Para cada dado de entrada: a) Utlze uma tabela na qual as lnhas representam os passos executados pelo algortmo e as colunas representam os valores de todas as varáves do algortmo b) Ince o rastreo do algortmo, começando pelo passo e contnue a execução respetando as estruturas de controle já vstas: seqüencal, seleção e repetção. Repta o passo para os demas dados de entrada para =, > (por exemplo =, = ) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) Exemplo : º conjunto de dados Exemplo : º conjunto de dados para =, > (por exemplo =, = ) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) para =, > (por exemplo =, = ) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,)
Rastreo de um lgortmo Exemplo : º conjunto de dados. ntes de ncar o rastreo de um algortmo, numere todas as lnhas (passo) do algortmo. Escolha um conjunto sgnfcatvo de dados de entrada que será fornecdo ao algortmo. Para cada dado de entrada: a) Utlze uma tabela na qual as lnhas representam os passos executados pelo algortmo e as colunas representam os valores de todas as varáves do algortmo b) Ince o rastreo do algortmo, começando pelo passo e contnue a execução respetando as estruturas de controle já vstas: seqüencal, seleção e repetção. Repta o passo para os demas dados de entrada para =, = lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) Exemplo : º conjunto de dados Como Soluconar? para =, = lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) Tanto na matemátca como na computação, o resultado de uma dvsão por zero é um valor ndefndo. este caso, o algortmo apresentara um problema.? Quando um problema é detectado no rastreo de um algortmo, sua solução pode ser efetuada: Refnando as pré-condções que o algortmo exge para ser executado lterando o algortmo para soluconar o problema (o que requer novos testes para verfcar se o novo códgo ntroduzdo não produz outros resultados nesperados) etalhamento das Pré-Condções Pré-Condção lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão O segundo valor (dvsor) deve ser dferente de zero. Lea(,) / Escreva( vsão =,) pré-condção ndca o que deve ser verdade antes que o algortmo seja executado volação da pré-condção pode resultar em comportamento anormal do algortmo (resultados nesperados) esse caso, o usuáro que executa o algortmo é responsável por certfcar que a pré-condção seja verdadera
lteração do lgortmo Exemplo : º conjunto de dados lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão Lea(,) / Escreva( vsão =,) lgortmo vsão. Este algortmo lê dos valores reas e calcula o resultado da dvsão entre eles. Lea(,) Se ( ) Então / Escreva( vsão =,) Senão Escreva( Impossível dvdr ) Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se
Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Exemplo : º conjunto de dados para = determna se ele é ou não um número Lea() Se = Então Escreva( nao e' prmo ) Para até Faça Se % = Então + Se Para Se = Então Escreva(, é prmo ) Senão Escreva(, não é prmo ) Se Se Resumo da Metodologa de Solução. ssegure-se de entender completamente as especfcações do problema. Você pode fazer sso ndcando a saída desejada para cada entrada do algortmo. Formule um esboço geral do algortmo para a solução do problema, desconsderando detalhes específcos. Essa é a prmera tentatva de expressar a solução e você deve se assegurar que está correta, rastreando os város passos com amostras de dados. Identfque qualquer varável que possa ser necessára. lgumas varáves serão sugerdas dretamente pelo algortmo defndo no passo anteror e pelo própro problema. Inclua o nome da varável, seu tpo e uma ndcação de seu propósto. lsta obtda é somente uma prmera aproxmação do conjunto fnal de varáves; ela poderá ser aumentada ou dmnuída se necessáro. Retorne aos passos ndvduas do algortmo e prossga com o detalhamento. Cada vez que um passo é desdobrado em város outros mas detalhados, verfque se estes novos passos executam a função expressa no passo orgnal. Percebendo que o algortmo está detalhado adequadamente, rastree com cudado os passos do algortmo, utlzando amostras de dados até se convencer que sua solução satsfaz as especfcações propostas. O teste completo de um algortmo não é fácl mas é uma etapa que não pode ser gnorada no processo. Somente agora é aproprado consderar a mplementação do algortmo numa lnguagem de programação partcular
Resumo da Metodologa de Solução. Entenda as especfcações do problema. Formule um esboço geral do algortmo. Identfque varáves necessáras. etalhe os passos ndvduas. Rastree o algortmo. Implemente numa lnguagem de programação partcular Sempre Exste um lgortmo? À medda que você estudar mas cênca da computação, aprenderá que exstem certas classes de problemas que não têm solução, ou certas perguntas que não têm respostas pergunta exste um algortmo adequado para este problema partcular? é um caso O únco modo de determnar se um algortmo adequado exste para um dado problema é verfcar se ele pode ser construído. Se puder, você mostrou que pelo menos um algortmo exste Entretanto, suponha que você não tenha sdo capaz de construr um algortmo adequado após algum esforço. Isto não sgnfca que ele não exste, mas smplesmente que você não fo capaz de construr um