Credin Silva de Menezes, Maria Cludia Silva oeres, Maria C!ristina "alle #auber, $!ais %elena Castro, Alberto &ogueira de Castro '(nior, Cludia )alarda "arassin *e+artamento de In,ormtica - .F/S *e+artamento de Ci0ncia da Com+utao 1 .FAM 2334 C5&C/I$5S 6SIC5S 787 I&$#5*.9:5 Neste curso o leitor estar se envolvendo com a aprendizagem de conceitos e mtodos bsicos para a construo de programas de computador. A abordagem que daremos est voltada para o envolvimento do aprendiz com a soluo de problemas ao invs da atitude passiva de ver o que os outros fizeram. Uma questo central que permeia o curso a de que construir programas uma tarefa de engenharia, e que, portanto produzir artefatos com os quais o ser humano ter de conviver. Artefatos estes que devem satisfazer requisitos de qualidade e serem, portanto, passveis de constatao. !ptamos desenvolver o curso orientado " descrio de fun#es, um formalismo bastante conhecido por todos os que chegam a este curso. $speramos, com isso, atenuar algumas dificuldades tpicas do ensino introdut%rio de programao. Nas se#es seguintes apresentamos alguns conceitos bsicos que nos parecem importantes ter em mente antes de iniciarmos um curso de programao. 7828 C5MP.$A*5#/S &enominamos de computador uma mquina de processar dados, numricos ou simb%licos, que funciona atravs da e'ecuo de programas. Ao contrrio das in(meras mquinas que conhecemos, tais como) mquina de lavar roupa, liquidificador, enceradeira, aspirador de p%, e tantas outras, que realizam uma (nica funo, o computador uma mquina multiuso. *odemos us+lo como uma mquina de escrever sofisticada, como uma mquina de fa', como uma prancheta de desenho sofisticada, como um fichrio eletr,nico, como uma planilha de clculos e de tantas outras formas. - e'atamente como o nosso conhecido videogame) para mudar de .ogo basta trocar o cartucho. No videogame, cada novo .ogo determinado por um novo programa. $m linhas gerais podemos entender um computador como uma mquina capaz de) a/ interpretar dados que lhe so fornecidos, produzindo resultados em forma de novos dados ou comportamentos, usando para isso conceitos que lhe foram antecipadamente informados e, b/ aceitar a descrio de novos conceitos e consider+los na interpretao de novas situa#es. Alguns e'emplos de uso de um computador) /; 7) &escrever para uma mquina a relao mtrica que e'iste entre os lados de um tri0ngulo ret0ngulo. &e posse desse conhecimento, a mquina poderia, por e'emplo, determinar o valor de um dos lados quando conhecido o valor dos outros dois. 1 /; 2) 2nformar a uma mquina as regras de con.ugao de verbos. 3om este conhecimento a mquina pode determinar a forma correta para um determinado tempo e pessoa de um verbo especfico. /; <) 4raduo de te'tos5 /; =) 3lassificao de te'tos quanto " sua natureza) romance, poesia, documentrio, entrevista, artigo cientfico5 /; 4) 6anipulao de e'press#es algbricas, resoluo de integral indefinida, etc5 /; >) *rogramao automtica) dada uma certa especificao, gerar um programa eficiente5 /; ?) 6onitoramento de pacientes em um 3entro de 4ratamento 2ntensivo5 /;@) 2dentificao de tumores no crebro a partir da comparao de imagens com padr#es conhecidos de anormalidade5 /; A) 7oteamento inteligente de mensagens. 78<8 P#5)#AMA9:5 8 tarefa de identificar o conhecimento necessrio para a descrio de um conceito, organiz+lo e codific+lo de modo a ser entendido pela mquina damos o nome de programao de computadores. Ao conhecimento codificado, produto final da tarefa de programao d+se o nome de programa. A programao de computadores uma atividade que compreende vrias outras atividades, tais como) entendimento do problema a ser resolvido, plane.amento de uma soluo, formalizao da soluo usando uma linguagem de programao, verificao da conformidade da soluo obtida com o problema proposto. 78=8 BI&).A)/M */ P#5)#AMA9:5 A descrio de conhecimento para um agente racional qualquer 9se.a uma mquina ou um humano/ subentende a e'ist:ncia de padr#es segundo os quais o agente possa interpretar o conhecimento informado. A esses padr#es, quando rigorosamente elaborados, damos o nome de formalismo. Um formalismo composto de dois aspectos) a sinta'e e a sem0ntica. A sinta'e permite ao agente reconhecer quando uma ;seq<:ncia de smbolos; que lhe fornecida est de acordo com as regras de escrita e, portanto representa um programa. A sem0ntica permite que o agente atribua um significado ao conhecimento descrito pela ;seq<:ncia de smbolos;. *or e'emplo, quando um agente humano 9com determinado grau de escolaridade/ encontra a seguinte seq<:ncia de smbolos =>, ?@ U =A, B, CA@, ele por certo reconhecer como uma e'presso algbrica escrita > corretamente e, se lembrar dos fundamentos da teoria dos con.untos, associar esta cadeia como a descrio de um con.unto composto pela unio dos elementos de dois con.untos menores. $is aqui algumas observa#es importantes sobre a necessidade de linguagens de programao) Ainda no possvel usar linguagem natural para ensinar o computador a realizar uma determinada tarefa. A linguagem natural, to simples para os humanos, possui ambig<idades e redund0ncias que a inviabilizam como veculo de comunicao com os computadores. A linguagem nativa dos computadores muito difcil de ser usada, pois requer do programador a preocupao com muitos detalhes especficos da mquina, tirando pois ateno do problema. *ara facilitar a tarefa de programao foram inventadas as linguagens de programao. $stas linguagens t:m por ob.etivo se colocarem mais pr%'imo do lingua.ar dos problemas do que do computador em si. *ara que o programa que escrevemos possa ser DentendidoE pelo computador, e'istem programas especiais que os traduzem 9compiladores/ ou os que interpretam 9interpretadores/ para a linguagem do computador. *odemos fazer um paralelo com o que ocorre quando queremos nos comunicar com uma pessoa de lngua estrangeira. *odemos escrever uma carta em nossa lngua e pedir a algum que a traduza para a lngua de nosso destinatrio ou se quisermos conversar pessoalmente, podemos usar um intrprete. 7848 P#5P#I/*A*/S */ .M P#5)#AMA Fazemos programas com a inteno de dotar uma mquina da capacidade de resolver problemas. Neste sentido, um programa um produto bem definido, que para ser usado precisa que se.am garantidas algumas propriedades. Aqui fazemos refer:ncias a duas delas) a correo e o desempenho. A correo pode ser entendida como a propriedade que assegura que o programa descreve corretamente o conhecimento que tnhamos inteno de descrever. ! desempenho trata da propriedade que assegura que o programa usar de forma apropriada o tempo e os recursos da mquina considerada. 3abe aqui alertar aos principiantes que a tarefa de garantir que um programa foi desenvolvido corretamente to comple'a quanto " pr%pria construo do programa em si. Garantir que um programa funciona corretamente condio imprescindvel para o seu uso e, portanto estaremos dando maior :nfase a esta propriedade. 78>8 PA#A*I)MAS */ BI&).A)/&S */ P#5)#AMA9:5 ? As regras que permitem a associao de significados "s ;seq<:ncias de smbolos; obedecem a certos princpios. $'istem vrias manifesta#es destes princpios e a cada uma delas denominamos de paradigma. Um paradigma pode ser entendido informalmente como uma forma especfica de se ;pensar; sobre programao. $'istem tr:s grandes grupos de paradigmas para programao) o procedimental, o funcional e o l%gico. !s dois (ltimos so freq<entemente referidos como sendo subparadigmas de um outro mais geral, o paradigma declarativo. ! paradigma procedimental subentende a organizao do conhecimento como uma seq<:ncia de tarefas para uma mquina especfica. ! paradigma l%gico requer o conhecimento de um formalismo matemtico denominado de l%gica matemtica. ! paradigma funcional baseia+se no uso dos princpios das fun#es matemticas. &e uma forma geral, os paradigmas declarativos enfatizam o aspecto correo e o procedimental os aspectos de desempenho. He.am que falamos em ;enfatizam;, o que quer dizer que apresentam facilidades para descrio e verificao da propriedade considerada. $ntretanto, em qualquer caso, o programador dever sempre garantir que os dois aspectos 9correo e desempenho/ se.am atendidos. 78?8 P#5)#AMA9:5 F.&CI5&AB *ara os fins que aqui nos interessam neste primeiro momento, podemos entender o computador, de uma forma simplificada, como uma mquina capaz de) a/ avaliar e'press#es escritas segundo regras sintticas bem definidas, como a das e'press#es aritmticas que to bem conhecemos 9e'. > I A + J/ obedecendo " sem0ntica das fun#es primitivas das quais ela dotada 9por e'emplo) as fun#es aritmticas bsicas como somar, subtrair, multiplicar e dividir/5 b/ aceitar a definio de novas fun#es e posteriormente consider+las na avaliao de e'press#es submetidas " sua avaliao. *or enquanto, denominaremos o computador de mquina funcional. A seguir apresentamos um e'emplo de interao de um usurio com a nossa 6quina Funcional. usurio) > I A K 1 sistema) A,A usurio) f ' L M 9' I L/ K 1 sistema) definio de , foi aceita usurio) 9f > A/ I 9f CN ?N/ sistema) 1B Na primeira interao podemos observar que o usurio descreveu uma e'presso aritmtica e que o sistema avaliou e informou o resultado. Na segunda interao o usurio descreve, atravs de uma equao, uma nova funo, que ele A denominou de , e que o sistema acatou a nova definio. Na terceira interao o usurio solicita a avaliao de uma nova e'presso aritmtica usando o conceito recentemente definido e que o sistema faz a avaliao usando corretamente o novo conceito. 78@8 /CP#/SSD/S A#I$ME$ICAS A nossa mquina funcional hipottica entende a sinta'e das e'press#es aritmticas, com as quais todo aluno universitrio . bem familiarizado e capaz de avali+las usando essas mesmas que regras que . conhecemos. Sinta;e + 4odo operador aritmtico pode ser entendido, e aqui o ser, como uma funo que possui dois par0metros. A notao usual para as opera#es aritmtica a infi'ada, ou se.a, smbolo funcional colocado entre os dois operandos. Nada impede de pensarmos nele escritos na forma prefi'ada, que a notao usual para fun#es com n(mero de par0metros diferente de 1. *or e'emplo, podemos escrever ;+ 3 2; para descrever a soma do n(mero > com o n(mero 1. As fun#es definidas pelo programador devem ser escritas de forma prefi'ada, como no e'emplo de interao acima apresentado. 3ombinando essas duas formas, infi'ada e prefi'ada, podemos escrever e'press#es bastante sofisticadas. Avaliao + As e'press#es aritmticas, como sabemos, so avaliadas de acordo com regras de avaliao bem definidas, efetuando as opera#es de acordo com suas prioridades. *or e'emplo, na e'presso ;3 + 5 / 2; o primeiro operador a ser avaliado ser o de diviso 9K/ e posteriormente o de adio. Oe dese.armos mudar essa ordem, podemos usar par:nteses em qualquer quantidade, desde que balanceados e em posi#es apropriadas. *or e'emplo, na e'presso ;(3 + 5) / 2;, a utilizao de par:nteses determina que a sub+e'presso > I A ter prioridade na avaliao. 78A8 F.&9D/S *odemos entender o conceito de fun#es como uma associao entre elementos de dois con.untos A e P de tal forma que para cada elemento de A e'iste apenas um elemento de P associado. ! con.unto A conhecido como o domnio da funo, ou ainda como o con.unto de entrada, e o con.unto P o contra+domnio ou con.unto de sada. *ara ser mais preciso, podemos afirmar que uma funo f , que associa os elementos de um con.unto A aos elementos de um con.unto P, um con.unto de pares ordenados onde o primeiro elemento do par pertence a A o segundo a P. $'emplos)
a/ Oe.a a funo 4 que associa as vogais do alfabeto com os cinco primeiros inteiros positivos. 4 M =9a,C/, 9e,1/, 9i,>/, 9o,?/, 9u,A/@ Q b/ Oe.a a funo R, que associa a cada n(mero natural o seu quadrado. R M =9N,N/, 9C,C/, 91,?/, 9>,B/, 9?,CQ/, ...@ *odemos observar que a funo 4 um con.unto finito e que a funo R um con.unto infinito. 78738 */SC#I9D/S F.&CI5&AIS *odemos descrever um con.unto, de duas formas) extensional, onde e'plicitamos todos os elementos que so membros do con.unto, como no caso do con.unto 4 apresentado anteriormente5 ou na forma intencional, onde descrevemos um critrio de pertin:ncia dos membros do con.unto. *or e'emplo, o con.unto R acima apresentado poderia ser reescrito da seguinte forma) F G HI;, JK L ; natural e J G ;8;M que pode ser lido da seguinte maneira) Q o conjunto dos pares ordenados (x, y) tal que x um nmero natural e y o produto de x por x Ruando descrevemos uma funo para fins computacionais, estamos interessados em e'plicitar como determinar o segundo elemento do par ordenado, conhecido o primeiro elemento do par. $m outras palavras, como determinar L conhecendo+se o valor de '. Normalmente dizemos que queremos determinar L em funo de '. Nesta forma de descrio, omitimos a varivel L e e'plicitamos o primeiro elemento que denominado ento de par0metro da funo. No caso acima teramos ento) F x G x 8 x 78778 Por Nue comear a a+rendizagem de +rogramao atravs do +aradigma ,uncionalO 4endo em vista a prtica vigente de comear o ensino de programao utilizando o paradigma procedimental, apresentamos a seguir alguns elementos que baseiam nossa opo de comear o ensino de programao usando o paradigma funcional. C/ ! aluno de graduao em 3omputao tem de ? a A anos para aprender todos os detalhes da rea de computao, portanto no se .ustifica que tudo tenha que ser absorvido no primeiro semestre. ! curso introdut%rio apenas o primeiro passo e no visa formar completamente um programador. $ste o momento de apresentar+ lhe os fundamentos e, alm disso, permitir que ele vislumbre a variedade de problemas que podem ser solucionados como o apoio do computador5 1/ ! paradigma procedimental requer que o aluno tenha um bom entendimento dos princpios de funcionamento de um computador real, pois eles se baseiam, como as mquinas reais, no conceito de mudana de estados 9mquina de Hon Neumann/. S >/ ! paradigma l%gico, outro forte candidato, requer o conhecimento de l%gica matemtica que o aluno ainda no domina adequadamente5 ?/ ! paradigma funcional baseado num conhecimento que o aluno . est familiarizado desde o ensino mdio 9fun#es, mapeamento entre domnios/ o qual ainda e'plorado em outras disciplinas do ciclo bsico, o que nos permite concentrar nossa ateno na elaborao de solu#es e na descrio formal destas5 A/ ! elevado poder de e'presso das linguagens funcionais permite que a abrang:ncia do uso do computador se.a percebida mais rapidamente. $m outras palavras, podemos resolver problemas mais comple'os . no primeiro curso5 Q/ ! poder computacional do paradigma funcional id:ntico ao dos outros paradigmas. Apesar disso, ele ainda no usado nas empresas, por vrios aspectos. &entre os quais podemos citar) i/ No passado, programas escritos em linguagens funcionais eram e'ecutados muito lentamente. Apesar disso no ser mais verdadeiro, ficou a fama5 ii/ A cultura de linguagens procedimentais possui muitos adeptos no mundo inteiro, o que, inevitavelmente, cria uma barreira " introduo de um novo paradigma. Afinal, temos medo do desconhecido e trememos quando temos que nos livrar de algo que . sabemos5 iii/ T uma crena que linguagens funcionais so difceis de aprender e s% servem para construir programas de intelig:ncia artificial. S/ A inefici:ncia das linguagens funcionais em comparao "s procedimentais tem se reduzido atravs de alguns mecanismos tais como) lazL evaluation, grafo de reduo, combinadores. J/ *ara fazer um programa que ;funciona; 9faz alguma coisa, embora no necessariamente o que dese.amos/ mais fcil faz:+lo no paradigma procedimental. *ara fazer um programa que funciona ;corretamente; para resolver um determinado problema mais fcil no paradigma funcional, pois esse paradigma descreve ;o que fazer; e no ;como fazer;. B/ As linguagens funcionais so geralmente utilizadas para processamento simb%lico, ou se.a, soluo de problemas no numricos. 9$'emplo) integrao simb%lica U integrao numrica/. Atualmente constata+se um crescimento acentuado do uso deste tipo de processamento. CN/ A crescente difuso do uso do computador nas mais diversas reas do conhecimento gera um crescimento na demanda de produo de programas cada vez mais comple'os. !s defensores da programao funcional acreditam que o uso deste paradigma se.a J uma boa resposta a este problema, visto que com linguagens funcionais podemos nos concentrar mais na soluo do problema do que nos detalhes de um computador especfico, o que aumenta a produtividade. CC/ Oe mais nada .ustificar o aprendizado de uma linguagem funcional como primeira linguagem, resta a e'plicao didtica. $stamos dando um primeiro passo no entendimento de programao como um todo. -, portanto, importante que este passo se.a simplificado atravs do apoio em uma ;mquina; . conhecida, como o caso das fun#es. C1/ Ainda um outro argumento) mesmo que tenhamos que usar posteriormente uma outra linguagem para ter uma implementao eficiente, podemos usar o paradigma funcional para formalizar a soluo. Oendo assim, a verso em linguagem funcional poderia servir como uma especificao do programa. /;ercPciosQ C. 3onceitue programao de computadores. 1. Ruais os principais paradigmas de programao e o que os diferenciam. >. Faa uma descrio intencional da funo) F M =C,>,A,S,...@. ?, Faa uma listagem de outros e'emplos de programas de computador que so usados ho.e em diferentes reas do conhecimento e por diferentes profissionais. A. Apresente e'emplo de outras linguagens tcnicas usadas pelo ser humano para descrever conhecimento. Q. !s conceitos de correo e de desempenho, se aplicam a qualquer artefato. $scolha > artefatos quaisquer e discuta os dois conceitos. S. Apresente uma descrio informal da funo que con.uga os verbos regulares da C a . con.ugao. B 28 A Binguagem de Programao %asRell e o ambiente %.)S 2878 I&$#5*.9:5Q Neste curso usaremos o ambiente TUGO, no qual utilizada uma implementao da linguagem de programao funcional TasVell. $ssa linguagem por apresentar uma sinta'e simples e elegante, alm de oferecer operadores bastante e'pressivos, tem sido usada com bons resultados para a aprendizagem de fundamentos de programao. *odemos usar o TUGO como uma calculadora qualquer, " qual submetemos e'press#es que ela avalia e nos informa o valor resultante. He.amos por e'emplo a interao a seguir. O > I A W 1 C> O 9> I A/ W 1 CQ O Nas e'press#es acima importante destacar o uso do smbolo W 9asterisco/ que empregado para representar a multiplicao. Alm desse, outros smbolos usuais sero substitudos, como veremos logo mais. As opera#es aritmticas so, como sabemos, fun#es. A notao utilizada em TasVell para as opera#es aritmtica a usual, ou se.a, infi'ada 9o smbolo da operao fica entre os operandos/. Uma outra forma que pode ser usada para escrever e'press#es usando o operador de forma prefi'ada. *or e'emplo, di! "5 # , indica a diviso inteira do n(mero CA 9dividendo/ pelo n(mero Q 9divisor/. ! smbolo de maior 9$/ usado pelo sistema para indicar que est preparado para avaliar uma nova e'presso. Ap%s avaliar uma e'presso o TasVell informa o resultado na linha seguinte e em seguida e'ibe uma nova interrogao, se disponibilizando para uma nova avaliao. *odemos e'plicar o seu funcionamento conforme o esquema da figura abai'o. $m outras palavras, o ambiente TUGO estabelece uma repetio para leitura de uma e'presso, avaliao de uma e'presso e e'ibio do resultado, conforme se ilustra no esquema a seguir.. *odemos usar o ambiente TUGO somente para isso, para escrever e'press#es e solicitar ao sistema que as avalie. $ntretanto podemos ousar mais e usar o ambiente para descrever novas fun#es a partir das fun#es . oferecidas pelo ambiente. *odemos tambm utilizar nessas novas defini#es as pr%prias defini#es que tivermos construdo anteriomente. 2828 */SC#I9:5 */ F.&9D/SQ A forma de descrever fun#es similar ao que nos referimos anteriormente no captulo C, ou se.a, atravs de uma equao, onde no lado esquerdo da igualdade damos um nome " funo e relacionamos os par0metros considerados na sua definio. No lado direito escrevemos uma e'presso utilizando outras fun#es, primitivas ou no. 2sto nos leva portanto a tomar conhecimento que a linguagem possui fun#es primitivas que . a acompanham e que portanto prescindem de definio. *or e'emplo, para definir a funo que determina o espao percorrido por um m%vel em movimento retilneo uniforme, conhecidos a sua velocidade e o tempo decorrido, podemos escrever) espaco ! t % ! & t No esquema a seguir fazemos uma identificao didtica dos vrios elementos da definio.! lado esquerdo da igualdade tambm chamado de inteface ou assinatura da funo e o lado direito o corpo da definio. espaco v t M v W t nome da funo par0metros e'presso aritmtica que define a relao que h entre os par0metros interface da funo corpo da definio *ara alimentar o TUGO com novas defini#es devemos criar um arquivo em disco no qual editaremos as defini#es dese.adas. 3ada arquivo pode ter uma ou mais defini#es. Normalmente agrupamos em um mesmo arquivo as defini#es relacionadas com a soluo de um problema especfico ou defini#es de prop%sito C C geral. No .argo de programao com a linguagem TasVell, um con.unto de defini#es denominado de script. A alimentao de novas defini#es indicada ao sistema atravs de um comando que usado no lugar de uma e'presso, quando o sistema e'ibe o seu pedido de tarefa 9o smbolo de interrogao. *ara indicar que estaremos dando um comando usamos o smbolo ; Q ; 9dois pontos/ seguido do nome do comando 9e'istem vrios/. *ara a tarefa que temos neste instante utilizamos o comando load 9oportunamente veremos outros/. *or e'emplo, podemos escrever um con.unto de defini#es em um arquivo denominado p'(((")s. *ara alimentar este arquivo no ambiente TUGO podemos escrever) S Qload +,3378!s A partir deste momento, todas as defini#es contidas no arquivo informado estaro disponveis para uso. *odemos entender isso como fazer uma e'tenso da mquina TasVell. Na figura 1.C apresentamos um esquema de utilizao do ambionete TUGO e de um editor de te'tos para provimento de novas defini#es. Hale aqui um pequeno lembrete, podemos estender a noo de fun#es para incorporar tambm as chamadas fun#es constantes, ou se.a, aquelas que no possuem domnio, apenas contradomnio. Na nomenclatura de defini#es dizemos que temos defini#es paramtricas e defini#es no paramtricas. *or e'emplo, podemos definir a constante pi, da seguinte maneira) pi = 3.1416 $ditor de te'to Arquivo com defini#es 2nterpretador TUGO programador Figura 1.C X 2ntera#es do *rogramador com o Ambiente de *rogramao C 1 28<8 .M /C/MPB5Q 3onsidere que queremos descrever uma funo para determinar as razes de uma equao do segundo grau. Oabemos que pela nossa clssica f%rmula as razes so descritas genericamente por) A soluo, como sabemos, formada por um par de valores. *or enquanto vamos descrever este fato por duas fun#es, uma para a primeira raiz e outra para a segunda. eq2g1 a b c = ((-b) + sqrt (b^2 - 4! " a " c )) # (2! " a) Hamos discutir alguns detalhes desta codificao) o termo *+ precisa ser codificado entre par:ntesis pois n(meros negativos so obtidos por um operao unria que produz um n(mero negativo a partir de um positivo5 o smbolo da raiz quadrada foi substitudo pela funo sqrt5 o numerador da frao precisa ser delitimado pelo uso de par:ntesis5 o denominador tambm precisa ser delimitado por par:ntesis5 o smbolo de multiplicao usual foi trocado pelo W 9asterisco/5 o smbolo de potenciao foi substitudo pelo Y 9circunfle'o/. *odemos agora descrever a outra raiz de forma anloga) eq2g2 a b c = ((-b) - sqrt (b^2 - 4! " a " c )) # (2! " a) Histo que as duas possuem partes comuns, poderamos ter escrito abstra#es au'iliares e produzir um con.unto de defini#es, tal como) quad ' M x " x raizdelta a b c M sqrt ( quad b - 4! " a " c ) dobro x = 2! " x eq2g1 a b c = ((-b) + rai$delta a b c) # dobro a eq2g2 a b c = ((-b) - rai$delta a b c) # dobro a
He.amos como ficaria uma interao com o TUGO, a partir de um arquivo de defini#es denominado eN2g8gs) % ,l eq2ggs &eading script file 'eq2ggs'( )as*ell session for( C > standardprelude eq2ggs Z eq1gC 1.N A.N 1.N +N.A Z eq1g1 1.N A.N 1.N +1.N Z eq1gC >.N ?.N A.N +rogram error( ,sqrt (-44!)- *odemos observar que houve um problema com a avaliao da e'presso eq2-" 3( .( 5( /ste um erro sem0ntico, pro!ocado pela tentati!a de extrair a rai1 quadrada de um nmero ne-ati!o 2 'un34o que de'inimos portanto uma 'un34o parcial, ou seja, ela n4o est de'inida para todo o dom5nio dos reais 6este caso o sistema apenas acusa o pro+lema ocorrido 28=8 */FI&I9D/S B5CAISQ As defini#es que discutimos anteriormente so globais, no sentido de que esto acessveis ao uso direto do usurio e tambm disponveis para uso em qualquer outra definio. *or e'emplo, se temos o scriptQ quad ' M ' W ' hipo ' L M sqrt 9 quad ' I quad L/ *odemos utilizar a definio quad tanto e'ternamente pelo usurio quanto internamente pela definio )ipo. Oe no entanto dese.amos construir subdefini#es para uso em uma definio especfica, podemos defini+las internamente, restringindo o seu conte'to A maneira de introduzir defini#es locais utilizando a clusula 7)ere Hamos modificar o script acima para que quad s% possa ser usado no interior de )ipo. hipo ' L M sqrt 9 quad ' I quad L/ [here quad ' M ' W '
As defini#es internas tambm no precisam ser paramtricas. He.a este outro e'emplo. hipo ' L M sqrt 9 VC I V1/ [here
VC M ' W ' V1 M L W L C ?
Note que apesar de x e y no serem par0metros de 8" e 82 eles foram utilizados em suas defini#es. 2sto possvel porque x e y t:m validade em todo o lado direito da definio. 4emos que considerar ainda que nada impede que em uma definio local tenhamos uma outra definio local e dentro desta outra, e assim sucessivamente. hipo ' L M sqrt V [here V M quad ' I quad L [here quad ' M ' W '
2848 M5*/B5 */ A"ABIA9:5 */ /CP#/SSD/SQ Ruando o avaliador do TUGO toma uma e'presso contendo apenas constantes e opera#es primitivas, ele apenas efetua as opera#es obedecendo " prioridade dos operadores e aquelas determinadas pelo uso de par:ntesis. *or e'emplo, para avaliar a e'presso > I A K 1, primeiro realizada a diviso AK1, resultando em 1.A, o qual adicionado ao >, finalmente obtendo A.A. *odemos entender isso como uma seq<:ncia de redu#es de uma e'presso " outra mais simples, at que se atin.a um termo irredutvel. He.a os e'emplos a seguir) > I A K 1 > I 1.A A.A 9> I A/ K 1 J K 1 ? > I A I 1 J I 1 CN As setas 9/ so usadas para indicar um passo de reduo. Ruando as e'press#es utilizam fun#es definidas pelo usurio, o processo anlogo. 3ada refer:ncia " uma definio substituda por seu lado direito, at que se atin.a uma e'presso bsica, e prossegue como no caso anterior. He.amos os e'emplos abai'o, considerando a primeira definio de )ipo e de quad apresentada anteriormente)
ordem e'presso reduo aplicada C hipo > A I hipo ? ? e'presso inicial 1 sqrt 9 quad > I quad A/ I hipo ? ? def de hipo > sqrt 9 > W > I quad A/ I hipo ? ? def de quad ? sqrt 9> W > I A W A/ I hipo ? ? def de quad A sqrt 9> W > I A W A/ I sqrt 9quad ? I quad ?/ def de hipo Q sqrt 9> W > I A W A/ I sqrt 9? W ? I quad ?/ def de quad S sqrt 9> W > I A W A/ I sqrt 9? W ? I ? W ?/ def de C A quad J sqrt 9B I A W A/ I sqrt 9? W ? I ? W ?/ W B sqrt 9B I 1A/ I sqrt 9? W ? I ? W ?/ W CN sqrt >? I sqrt 9? W ? I ? W ?/ I CC A.J>NBA I sqrt 9? W ? I ? W ?/ sqrt C1 A.J>NBA I sqrt 9CQ I ? W ?/ W C> A.J>NBA I sqrt 9CQ I CQ/ W C? A.J>NBA I sqrt 9>1/ I CA A.J>NBA I A.QAQJA sqrt CQ CC.?JSJ I
*ara uma realizao especfica da linguagem, isso no precisa acontecer e'atamente assim. $ntretanto este modelo suficiente para nossos interesses. ! n(mero de redu#es necessrias para chegar " forma irredutvel de uma e'presso, tambm denominada de forma can,nica ou ainda forma normal, pode ser usado como critrio para discutir o desempenho da mesma. $'erccios C. $stabelea categorias para comparar duas defini#es5 1. Usando as categorias definidas no item C compare as duas defini#es apresentadas para as razes de uma equao do segundo grau5 >. 3ompare usando as suas categorias, as tr:s defini#es apresentadas para hipo5 ?. Apresente uma e'plicao para o erro produzido pela avaliao da e'presso eq2-" 3( .( 5( A. Apresente uma seq<:ncia de redu#es para a e'presso) eq2-" 2( 5( 2( Q. Apresente um con.unto de defini#es para a funo total para a determinao das razes de uma equao do segundo grau. 28>8 ASSI&A$.#A */ F.&9D/S / A &5$A9:5 C.##TQ &o estudo de fun#es sabemos que toda funo possui um domnio e um contradomnio. ! domnio pode ser formado por zero ou mais con.untos. Ruando uma funo no possui domnio dizemos que uma funo constante. *ara descrever este conhecimento sobre domnio e contradomnio usado o conceito de DassinaturaE, do ingl:s DsignatureE. *or e'emplo, na funo que determina a mdia aritmtica de > n(meros reais, temos que o domnio formado pelo produto cartesiano R x R X R e o contradomnio R. A assinatura desta funo a seguinte) ma3 :: R X R X R R C Q $m TasVell poderamos ter a seguinte definio) ma3 x y z = (x + y + z) / 3. - usual tambm dizer R X R X R R o tipo da funo ma3. *ara simplificar o trabalho com fun#es o matemtico TasVell 3urL criou uma nova notao, que considera que qualquer funo tem sempre um (nico par0metro de entrada. Oegundo ele, o resultado de aplicar uma funo sobre um par0metro produz uma nova funo que pode ser aplicada a outro par0metro, e assim sucessivamente. *or e'emplo, nesta notao, a funo ma3 teria a seguinte assinatura) ma3 :: R R R R *odemos ler da seguinte maneira) ma3 uma funo que mapeia um numero real em uma nova funo cu.a assinatura ) ma3 :: R R R. A funo ma3 por sua vez mapeia um n(mero real em uma nova funo cu.a assinatura ) ma3 :: R R. A funo ma3 por sua vez mapeia um n(mero real em uma nova funo cu.a assinatura ) ma3 :: R. Rue uma funo constante. $m captulos posteriores veremos as vantagens desta notao introduzida por TasVell, conhecida por notao 3urrL. *or enquanto podemos afirmar que essa facilidade vem do fato que nesta notao as fun#es possuem propriedades equivalentes "s dos dados. C S <8 A Arte de #esolver Problemas <878 I&$#5*.9:5Q ! grande ob.etivo deste curso criar oportunidades para que o estudante desenvolva suas habilidades como resolvedor de problemas. 6ais especificamente estamos interessados na resoluo de problemas usando o computador, entretanto, temos certeza, que as idias so gerais o suficiente para a.udar a resolver qualquer problema. $mbora muitas pessoas . tenham discutido sobre este assunto ao longo da hist%ria, nosso principal referencial ser o professor George *olLa, que escreveu um livro sobre este assunto, com o mesmo nome deste captulo, voltado para a resoluo de problemas de matemtica do ensino fundamental. 4odos os alunos deste curso tero grande proveito se lerem este livro. As idias ali apresentadas com certeza se aplicam com muita propriedade " resoluo de problemas com o computador. Na medida do possvel estaremos apresentando aqui algumas adapta#es que nos parecem apropriadas neste primeiro contato com a resoluo de problemas usando o computador. <828 *ICAS I&ICIAIS: apresenta+se a seguir algumas orienta#es: >.1.C. O% se aprende a resolver problemas atravs da e'peri:ncia. \ogo o aluno que est interessado em aprender deve trabalhar, buscando resolver por si mesmo, os problemas propostos antes de tentar o au'lio do professor ou de outro colega5 >.1.1. A a.uda do professor no deve vir atravs da apresentao pura e simples de uma soluo. A a.uda deve vir atravs do fornecimento de pistas que a.udem o aluno a descobrir a soluo por si mesmo5 >.1.>. - muito importante no se conformar com uma (nica soluo. Ruanto mais solu#es encontrar, mais hbil o estudante ficar, e alm disso, poder comparar as vrias alternativas e escolher a que lhe parecer mais apropriada. A escolha dever sempre ser baseada em critrios ob.etivos. >.1.?. Na busca pela soluo de um problema, nossa ferramenta principal o questionamento. &evemos buscar formular quest#es que nos a.udem a entender o problema e a elaborar a soluo. >.1.A. Aprenda desde cedo a buscar um aprimoramento da sua tcnica para resolver problemas, crie uma sistematizao, evite chegar na frente de um problema como se nunca tivesse resolvido qualquer outro problema. 3onstrua um processo individual e v aperfeioando+o " cada vez que resolver um novo problema. <8< C5M5 #/S5B"/# .M P#5B/MAQ ! professor *olLa descreve a resoluo de um problema como um processo comple'o que se divide em quatro etapas, as quais apresentamos aqui, com alguma adaptao. Oegundo nos recomenda *olLa, em qualquer destas etapas devemos ter em mente tr:s quest#es sobre o andamento do nosso trabalho, que so) *or onde comear esta etapa] ! que posso fazer com os elementos que disponho] Rual a vantagem de proceder da forma escolhida] C J /ta+a 7 - Com+reenso do Problema - impossvel resolver um problema sobre o qual no tenhamos um entendimento adequado. *ortanto, antes de correr atrs de uma soluo, concentre+se um pouco em identificar os elementos do problema. Faa perguntas tais como) Ruais so os dados de entrada] ! que dese.amos produzir como resultado] Rual a relao que e'iste entre os dados de entrada e o resultado a ser produzido] Ruais so as propriedades importantes que os dados de entrada possuem] /ta+a 2 - PlaneUamento Nesta fase devemos nos envolver com a busca de uma soluo para o problema proposto. *ode ser que . o tenhamos resolvido antes, para dados ligeiramente modificados. Oe no o caso, pode ser que . tenhamos resolvido um problema parecido. Rual a relao que e'iste entre este problema que temos e um outro problema . conhecido] Oer que podemos quebrar o problema em problemas menores] Oer que generalizando o problema no chegaremos a um outro . conhecido] 3onhecemos um problema parecido, embora mais simples, o qual quando generalizado se apro'ima do que temos] /ta+a < - *esenvolvimento $scolhida uma estratgia para atacar o problema, devemos ento caminhar para a construo da soluo. Nesta fase, devemos considerar os elementos da linguagem de programao que iremos usar, respeitando os elementos disponibilizados pela linguagem, tais como tipos, formas de definio, possibilidades de generalizao e uso de elementos anteriormente definidos. A seguir, devemos codificar cada pedao da soluo, e garantir que cada um este.a descrito de forma apropriada. $m outras palavras, no basta construir, temos que ser capazes de verificar se o resultado de nossa construo est correto. 2sto pode ser realizado pela identificao de inst0ncias tpicas, da determinao dos valores esperados por estas, da submisso dessas inst0ncias ao avaliador e finalmente, da comparao dos resultados esperados com os resultados produzidos pela avaliao de nossas defini#es. Alm disso, devemos garantir que a definio principal tambm est correta. $m sntese, a fase de desenvolvimento compreende as seguintes subfases) C. construo da soluo5 1. plane.amento do teste5 >. teste com o computador de mesa5 ?. codificao da soluo5 A. teste com o uso do computador. /ta+a = - Avaliao do Processo e seus resultados ! trabalho do resolvedor de problemas no pra quando uma soluo est pronta. &evemos avaliar a qualidade da soluo, o processo que realizamos e questionar as possibilidades de uso posterior da soluo obtida e tambm do pr%prio mtodo utilizado. Novamente devemos fazer perguntas) $ste foi o melhor caminho que poderia ter sido usado] Oer que desdobrando a soluo no obtenho componentes que poderei usar mais facilmente no futuro] Oe esta C B soluo for generalizada possvel reus+la mais facilmente em outras situa#es] 7egistre tudo, organize+se para a resoluo de outros problemas. Anote suas decis#es, enriquea a sua biblioteca de solu#es e mtodos. <8=8 .M P/F./&5 /C/MPB5Q /nunciado) &ese.a+se escrever um programa que permita determinar a menor quantidade de cdulas necessrias para pagar uma dada quantia em 7eais. /ta+a 7 1 Com+reenso Ruesto) Ruais os dados de entrada] 7esposta) A quantia a ser paga. Ruesto) Rual o resultado a ser obtido] 7esposta) A menor quantidade de cdulas. Ruesto) Rual a relao que e'iste entre a entrada e a sada] 7esposta) ! somat%rio dos valores de cada cdula utilizada deve ser igual " quantia a ser paga. Ruesto) $'iste algum elemento interno, ou se.a, uma dado implcito] 7esposta) Oim, os tipos de cdulas e'istentes.3onsidere que o 7eal possui apenas as seguintes cdulas) C, A, CN, AN e CNN. - importante observar que qualquer cdula um m(ltiplo de qualquer uma das menores. /ta+a 2 - PlaneUamento 3onheo algum problema parecido] $'iste um problema mais simples] *odemos entender como um problema mais simples um que busque determinar quantas cdulas de um dado valor so necessrias para pagar a quantia dese.ada. *or e'emplo, para pagar 7^ 1JB,NN poderamos usar 1JB cdulas de 7^ C,NN. !u tambm poderamos usar A notas de 7^ AN,NN, mas neste caso ficariam ainda faltando 7^ >B,NN. 3laro que no queremos que falte nem que sobre e, alm disso, dese.amos que a quantidade se.a mnima. *arece uma boa estratgia comear vendo o que d para pagar com a maior cdula e determinar quando falta pagar. ! restante pode ser pago com uma cdula menor, e por a afora. $'plorando a inst0ncia do problema . mencionada, vamos fazer uma tabela com estes elementos. $'presso para determinar a quantidade de cdulas de um determinado valor. Ruantidade de cdulas Ruantia a *agar 1JB,NN 1JB K CNN 1 JB,NN 1 N JBK AN C >B,NN >BK CN > B,NN BK A C ?,NN ?K C ? N,NN $5$AB 77
/ta+a < - *esenvolvimento Ooluo C + 3onsiderando a tabela acima descrita, codificando cada linha como uma sube'presso da definio. ncedulas q M 9div q CNN/ I 9div 9mod q CNN/ AN/ I 9div 9mod 9mod q CNN/ AN/ CN/ I 9div 9mod 9mod 9mod q CNN/ AN/ CN/ A/I 9div 9mod 9mod 9mod 9mod q CNN/ AN/ CN/ A/ C/ Ooluo 1 + 3onsiderando uma propriedade das cdulas, ou se.a, . que uma cdula qualquer m(ltiplo das menores, a determinao do resto no precisa considerar as cdulas maiores do que a cdula que estamos considerando em um dado ponto. ncedulas1 q M 9div q CNN/ I 9div 9mod q CNN/ AN/ I 9div 9mod q AN/ CN/ I 9div 9mod q CN/ A/I 9div 9mod q A/ C/ /ta+a = - Avaliao A soluo dei'a de e'plicitar as abstra#es referentes " quantidade de cdulas de um determinado valor, assim como o resto correspondente. *odemos questionar, no seria melhor e'plicitar] Assim poderamos us+las de forma independente e alm disso, a soluo fica mais clara e portanto inteligvel. ncedulas q M nCNN q I nAN q I nCN q I nA q I nC q nCNN q M div q CNN rCNN q M mod q CNN nAN q M div 9rCNN q/ AN rAN q M mod 9rCNN q/ AN nCN q M div 9rAN q/ CN rCN q M mod 9rAN q/ CN nA q M div 9rCN q/ A rA q M mod 9rCN q/ A nC q M div 9rCN q/ A 1 C Oupondo que no queremos generalizar todas as fun#es menores ainda poderamos escrever o programa usando defini#es locais. ncedulas q M nCNN I nAN I nCN I nA I nC [here
nCNN M div q CNN rCNN M mod q CNN nAN M div rCNN AN rAN M mod rCNN AN nCN M div rAN CN rCN M mod rAN CN nA M div rCN A nC M mod rCN A
*odemos ainda considerar que se houver uma troca no sistema, de modo a incluir uma nova cdula que no se.a m(ltiplo de seus valores menores. Oeria fcil mudar o programa para contemplar a mudana nas leis do mundo do problema. <848 P#5"E#I5SQ ! professor *olLa tambm nos sugere que a lembrana de alguns provrbios pode a.udar o aprendiz 9e o resolvedor de problemas/ a organizar o seu trabalho. &iz *olLa que, apesar dos provrbios no se constiturem em fonte de sabedoria universalmente aplicvel, seria uma pena desprezar a descrio pitoresca dos mtodos heursticos que apresentam. Alguns so de ordem geral, tais como) . fim indica aos meios /eus mel0ores amigos so . que1 +or que1 .nde1 2uando e 3omo pergunte . que1 pergunte +or que1 pergunte .nde1 pergunte 2uando e pergunte 3omo - e no pergunte a ningu4m quando precisar de consel0o 5o confie em coisa alguma1 mas s6 du7ide daquilo que merecer d87ida .l0e em torno quando encontrar o primeiro cogumelo ou fi$er a primeira descoberta9 ambos surgem em grupos
A seguir apresentamos uma lista deles, organizados pelas etapas "s quais parecem mais relacionados. /ta+a 7 Q Com+reenso do +roblema. 2uem entende mal1 mal responde +ense no fim antes de comear . tolo ol0a para o comeo1 o s:bio 7; o fim 1 1 . s:bio comea pelo fim1 o tolo termina no comeo /ta+a 2 Q PlaneUamento da soluo8 < perse7erana 4 a me da boa sorte 5o se derruba um car7al0o com uma s6 mac0adada /e no princ=pio no conseguir1 continue tentando >xperimente todas as c0a7es do mol0o ?ele@a-se conforme o 7ento Aaamos com pudermos se no pudermos fa$er como queremos . s:bio muda de opinio1 o tolo nunca Banten0a duas cordas para um arco Aaa e refaa que o dia 4 bastante longo . ob@eti7o da pescaria no 4 lanar o an$ol mas sim pegar o peixe . s:bio cria mais oportunidades do que as encontra . s:bio fa$ ferramentas daquilo que l0e cai Cs mos Aique sempre de ol0o na grande ocasio /ta+a <Q Construo da soluo. .l0e antes de saltar +ro7e antes de confiar Dma demora prudente torna o camin0o seguro 2uem quiser na7egar sem risco1 no se faa ao mar Aaa o que puder e espere pelo mel0or E f:cil acreditar naquilo que se dese@a Fegrau a degrau sobe-se a escada . que o tolo fa$ no fim1 o s:bio fa$ no princ=pio /ta+a =Q Avaliao da soluo. 5o pensa bem quem no repensa E mais seguro ancorar com dois ferros /;ercPcios C/ 3ompare as duas defini#es para a funo que descreve o n(mero mnimo de cdulas para pagar uma quantia q, ncedulas e ncedulas15 1/ &esenvolva a soluo para o problema da cdulas considerando o fato de que o 7eal possui notas de 1 e notas de 1N. ! que muda] >/ Apresente tr:s problemas semelhante ao das cdulas5 1 > ?/ &esenvolva uma soluo para o problema considerando que para cada tipo de cdula e'iste um quantidade limitada 9maior ou igual a zero/5 1 ? =8 AS$#A9:5, )/&/#ABIVA9:5, I&S$A&CIA9:5 / M5*.BA#IVA9:5 =878 I&$#5*.9:5: Na busca por resolver um problema podemos usar vrios princpios, cada um evidentemente ter uma utilidade para a resoluo do problema, ou para garantia de sua correo ou ainda para facilitar os usos posteriores da soluo que obtivermos. Apresentamos a seguir alguns deles. =828 AS$#A9:5Q Ruando escrevemos uma e'presso e no damos nome a ela, o seu uso fica limitado "quele instante especfico. *or e'emplo, suponha que dese.amos determinar a hipotenusa de um tri0ngulo ret0ngulo com catetos CN e ?. 3omo conhecemos o teorema de *itgoras 9a 1 M b 1 I c 1 /, podemos usar diretamente nossa mquina funcional para avaliar a seguinte e'presso)
S sNrt II7383 W 7383KX I=83 W =83KK CN.SSN> S A e'presso que codificamos serve apenas para esta vez. Oe em algum outro instante precisarmos avalia+lateremos que codific+la novamente. *ara evitar isso, que damos nomes "s nossas e'press#es, para que possamos us+las repetidamente, apenas referenciando+as pelo seu nome. No caso acima, poderamos escrever a definio) !i+otenusa G sNrt II7383 W 7383KX I=83 W =83KK &e posse dessa definio nossa mquina poder avaliar a e'presso sempre que dela precisarmos., basta escreve+la) S !i+otenusa CN.SSN> Hoc: pode agora estar se perguntando, porque no trocamos a definio para usar diretamente o valor "(99(3] !i+otenusa G "(99(3 Agindo assim a mquina no precisaria avaliar a e'presso sqrt (("(( & "(()+ (.( & .()) a cada uso. *or outro lado no ficaria registrada a origem do valor "(99(3., com o tempo perderamos esta informao. &e qualquer forma, teramos criado uma abstrao " qual denominamos )ipotenusa. !utra pergunta pode estar rondando a sua cabea, por que escrever uma definio que sempre avaliada para o mesmo valor, por que no generaliza+la] Pom, este foi apenas um recurso didtico para separar os dois conceitos, a abstrao que acabamos de apresentar a generalizao que apresentaremos a seguir. No entanto convm lembrar que algumas defini#es so realmente constantes e que no so de grande utilidade, como o caso da seguinte definio) 1 A pi M >.C?CQ =8<8 )/&/#ABIVA9:5) Ruando uma abstrao se aplica a vrios valores podemos generaliz+la. Assim, alm de us+la vrias vezes para os mesmos valores, podemos tambm us+la para valores diferentes. $sta ultima alternativa evidentemente facilita o seu reuso. Hamos apresentar duas formas para fazer isso. a/ $laborando a definio usando outras defini#es constantes. *or e'emplo, no caso da definio acima para a hipotenusa, poderamos escrever as defini#es a seguir) b G 7383 c G =83 !i+otenusa G sNrt II b W bK X I c W cKK Aqui, )ipo se aplica a dois valores quaisquer + e c, os quais so ob.etos de outras defini#es. b/Uma forma mais geral atravs do conceito de parametrizao. $sta consiste em indicar no cabealho da definio 9lado esquerdo da igualdade/ quais so os ob.etos da generalizao. *ara o e'emplo que estamos trabalhando, podemos escrever) !i+otenusa b c G sNrt II b W bK X I c W cKK 4emos ento descrito a funo paramtrica )ipotenusa cu.os par0metros so + e c. =8<87 I&S$A&CIA9:5Q A parametrizao permite que usemos a mesma definio para diferentes inst0ncias do problema. *or e'emplo, suponha que dese.amos determinar a hipotenusa de tr:s tri0ngulos ret0ngulos. ! primeiro com catetos CN e ?, o segundo com catetos >A e CJ e o terceiro com catetos B e C1. *odemos instanciar a definio paramtrica para estabelecer a seguinte interao) S !i+o 7383 =83 CN.SSN> 9A reductions, ?1 cells/ S !i+o <483 7@83 >B.>AS> 9A reductions, ?> cells/ S !i+o A83 7283 CA.N 9A reductions, >J cells/ S 1 Q =8=8 M5*.BA#IVA9:5Q $m geral, nossos problemas no sero to simples e diretos quanto o e'emplo acima. Ruando nos deparamos com problemas maiores, um bom princpio ) :i!ida para 'acilitar a conquista Pasicamente este princpio consiste em quebrar o problema inicial em problemas menores, elaborar a soluo para cada um dos problemas menores e depois combin+las para obter a soluo do problema inicial. A cada um dos subproblemas encontrados podemos reaplicar o mesmo princpio. Oegundo *olLa, esta uma heurstica muito importante " qual ele denomina de &ecomposio e 3ombinao. Antes de pensar em codificar a soluo em uma linguagem de programao especfica, podemos represent+la atravs de um esquema grfico denominado de estrutura modular do problema 9ve.a a representao para o problema a seguir/. =8>8 M5*.BA#IVA&*5: 3onsidere o problema de descrever rea da figura Fig ?.C abai'o. Figura 4.1 Um polgono irregular para o qual desejamos determinar a sua rea 3omo podemos concluir por uma inspeo da figura, no e'iste uma f%rmula pronta para calcular sua rea. *recisamos dividir a figura em partes para as quais conheamos uma maneira de calcular a rea e que, alm disso, conheamos as dimens#es necessrias. 1 S *odemos fazer vrias tentativas, como por e'emplo, as ilustradas nas figuras Fig. ?.1 a, Fig. ?.1 b e Fig. ?.1 c. a b c Figura ?.1 X *ossveis subdivis#es do polgono apresentado na Figura ?.C.
*odemos tentar descrever a rea das figuras menores em cada uma das figuras apresentadas. Nas figuras ?.1. b e ?.1 c, parece que precisaremos subdividir novamente. $m ?.1 b a casinha em verde pode ser transformada em um ret0ngulo e um tri0ngulo. $m ?.1 c a casinha azul 9meia+gua/ que pode ser dividida em um ret0ngulo e um tri0ngulo, como na Figura ?.>. $ a figura Fig. ? a, que podemos dizer] Figura 4.3 Subdiviso de uma sub!igura da Figura 4.3 "# Hamos partir para a nossa soluo a partir da figura Fig. ?.1 c. *odemos dizer que a rea total pode ser obtida pela soma das reas amarela, com rea vermelha e mais a rea azul. A rea azul pode ser subdividida em azul+claro e azul+escuro
rea total M rea amarela I rea vermelha I rea azul rea azul M rea azulclaro I rea azulescuro
Ruando escolhemos as reas acima citadas, no foi por acaso. A escolha foi baseada na simplicidade do subproblema. *odemos usar este conhecimento para chegar a um outro. 4r:s das reas que precisamos calcular so de forma 1 J retangular. !u se.a, so especializa#es de um conceito mais geral. A quarta rea, tambm pode ser obtida pela especializao do conceito de tri0ngulo ret0ngulo. Hamos agora apro'imar nossas defini#es da linguagem de programao. *ortanto podemos escrever) aYretangulo ; J G ; W J ! tri0ngulo que temos ret0ngulo e podemos descrever sua rea por) aYtYretangulo ; J G I; W JK Z 283 A determinao da rea vermelha nos traz uma pequena dificuldade, no nos foi informado qual o comprimento da base do ret0ngulo. $ agora] !bservando bem a figura podemos concluir que a base do ret0ngulo igual " hipotenusa do tri0ngulo ret0ngulo de catetos a e d *odemos escrever ento) atotal a b c d e M a_retangulo a b I a_retangulo 9hipo a d/ e I a_azul a c d a_azul ' L z M a_retangulo L z I a_t_retangulo ' L hipo ' L M sqrt 9 ' W ' I L W L/ a_retangulo ' L M ' W L a_t_retangulo ' L M 9' W L/ K 1.N
A estrutura da soluo de um problema obtida pela modularizao pode ser representada por um diagrama denominado de rvore. *ara o problema acima discutido a rvore da forma apresentada na Figura ?.A. 1 B Figura ?.A X 7epresentao em rvore da estrutura modular do problema Dclculo da rea do polgono irregular apresentado na Figura ?.CE. =8?8 .M /C/MPB5 */$AB%A*5: $screva uma descrio funcional para o volume de cada uma das peas apresentadas nas Fguras ?.Q e ?.S. Figura 4.$ %e&a no. 1 Figuras 4.' %e&a no. ( Soluo 7) Hamos comear pela Figura ?.Q. Uma rpida anlise nos leva a identificar duas partes. Na parte inferior temos um paraleleppedo, sobre o qual se assenta um cilindro. Hamos supor que so macios. 3hamemos de a, b e c as dimens#es do paraleleppedo, de r o raio da base do cilindro e de 0 a sua altura. ! volume total da pea pode ser determinado pela soma do volume das duas peas menores. 3hamemos a funo de volfig?Q, e tentemos uma definio.
vol,ig=> a b c r h M 9a W b W c/ I 9>.C?CQ W r W r W h/ > N Hamos ento tratar da pea descrita na figura ?.S. Agora identificamos uma pea apenas. Um paraleleppedo com um furo no centro. 3hamemos de a, b e c as dimens#es do paraleleppedo, de r o raio do buraco. *ara descrever o volume da pea devemos subtrair do volume do paraleleppedo o volume correspondente ao buraco. 3hamemos a funo de volfig?S, e tentemos uma definio. "ol,ig=? a b c r M 9a W b W c/ + 9>.C?CQ W r W r W c/ Soluo 2) A soluo C, apesar de resolver o problema, dei'a de contemplar algumas prticas importantes. No tratamento da primeira pea 9Figura ?.Q/, apesar de identificadas duas peas menores, estas abstra#es no foram descritas separadamente. !u se.a, dei'amos de registrar formalmente a e'ist:ncia de duas abstra#es e com isso no pudemos modularizar a descrio da funo principal. *odemos tentar ento um outro caminho, contemplando as abstra#es para o cilindro e para o paraleleppedo) volcil r h M >.C?CQ W r W r W h volpar a b c M a W b W c Holfig?Q a b c r h M volpar a b c I volcil r h Holtemos ento para a segunda pea 9Figura ?.S/, e ve.amos se podemos identificar similaridades. Aqui s% temos uma pea, que como sabemos, guarda uma relao com o paraleleppedo da primeira e s%. 3omo podemos encontrar similaridades] Aprofundando melhor nossa anlise podemos lembrar que o furo no paraleleppedo, na verdade corresponde a um cilindro que foi retirado. Assim considerando, podemos ento concluir que o volume da figura ?.S pode ser obtido pela diferena entre o volume de um paraleleppedo e de um cilindro. 3omo . temos as defini#es para volume de cilindro e volume de paraleleppedo, s% nos resta escrever a definio final do volume da figura ?.S)
vol,ig=? a b c r M volpar a b c + volcil r c Analisando a soluo, podemos tirar algumas conclus#es) a/ a soluo ficou mais clara, b/ a soluo propiciou o reaproveitamento de defini#es. c/ se precisarmos usar volume de cilindro e de paraleleppedo isoladamente ou em outras combina#es, . as temos disponveis. Considera[es com+lementares + assim como decidimos descrever isoladamente o volume de dois s%lidos, poderamos ter feito o mesmo para as figuras. As descri#es das reas de um ret0ngulo e de uma circunfer:ncia podem ser dadas isoladamente por)
acir r M pi W r W r > C aret a b M a W b *odemos reescrever o volume do cilindro e do paraleleppedo da seguinte maneira) volcil r h M acir r W h volpar a b c M aret a b W c Soluo <) Oe aprofundarmos a anlise podemos observar que as duas figuras podem ser abstradas como uma s%` ! cilindro que aparece na primeira, como um volume que deve ser acrescentado pode ser entendido como o mesmo cilindro que deve ser subtrado na segunda. Alm disso, podemos estender a soluo para furos que no vazem a pea, pois a altura do cilindro pode ser qualquer.
vol,ig a b c r h M volpar a b c I volcil r h *odemos observar que esta a mesma definio apresentada anteriormente para a figura ?.Q. ! que muda o uso. *ara calcular o volume da Figura ?.Q usamos um ) positivo e para Figura ?.S um ) negativo. Z volfig Q.N J.N 1.N 1.N A.N CAJ.J>1 ++ determinar o volume de uma inst0ncia da figura Fig. C, com um cilindro de raio 1 e altura A. Z volfig Q.N J.N 1.N 1.N 9+1.N/ SN.JQS> ++ determinar o volume de uma inst0ncia da figura Fig. 1, vasada por um furo de raio 1. ++ neste caso fornecemos um valor negativo para a altura do cilindro com o mesmo valor da altura do paraleleppedo Z volfig Q.N J.N 1.N 1.N 9+C.N/ J>.?>>Q ++ determinar o volume de uma inst0ncia da figura Fig. 1, que tem um furo de raio 1 e profundidade C.
/;ercPciosQ C/ &iscuta o significado da e'presso vol,ig >83 @83 283 283 I-483K. ! que poderia ser feito para contornar este efeito indese.vel] 1/ 7esolva o problema da Figura ?.C usando a modularizao sugerida pela figura ?.1 b. >/ 7edesenhe a Figura ?.A 9rvore de modularizao/ para a soluo apresentada ao e'erccio 1. ?/ Apresente > problemas similares para calculo de rea de polgono irregular. A/ Apresente > problemas similares para calculo de volume de ob.etos. Q/ Apresente > problemas similares em outros domnios de conhecimento. > 1 48 $i+os de *ados &umricos 4878 I&$#5*.9:5Q &enominamos de 4ipo de &ado a um con.unto de valores, munido de um con.unto de opera#es sobre esses valores. *or e'emplo, podemos denominar de 4C ao tipo de dados formado por um con.unto O de valores id:ntico aos n(meros naturais 9 O M =N,C,1,>, ...a/ e munido das opera#es de adio 9a/ e multiplicao 9m/. 3ada operao possui uma tipo, indicando o domnio e o contradomnio. *or e'emplo, para o tipo 4C, o domnio de a ; < ; e o contradomnio ; A notao a seguir usualmente utilizada e em geral denominada de a DassinaturaE da operao. a QQ O U O O m QQ O U O O 3omo visto no captulo 1, em TasVell escreveramos) a QQ O O O m QQ O O O $m TasVell, conhecendo+se o tipo dos valores de uma e'presso podemos determinar o tipo do valor que dela resultar, ou se.a, o seu contra+domnio. $m linguagens de programao isto equivale a dizer que a linguagem 'ortemente tipada. &izemos ainda que os tipos so elementares ou estruturados. !s numricos so elementares, assim como tambm o so os tipos l%gico e os caracteres. Neste captulo trataremos dos tipos numricos, os demais viro em captulos posteriores. !s n(meros formam um tipo de dados fundamental na computao. Aqui nos interessa subdividi+los em inteiros e reais. Antes de irmos alm, importante que se saiba que, sendo o computador composto de elementos finitos, algumas adapta#es e simplifica#es precisam ser feitas para o tratamento de n(meros. $m TUGO, quando estamos submetendo e'press#es para avaliao, podemos dese.ar que o tipo do resultado se.a e'ibido. *ara que isso ocorra, podemos dar um comando ao TUGO. *ara obtermos este comportamento do ambiente, podemos usar o comando ,set, que ativa ou desativa par0metros do ambiente. *ara ativiar um par0metro usamos uma letra correspondente ao par0metro, precedido do smbolo DIE. *ara desativar usamos o smbolos D+D. *ara saber sobre outros parametros, e'perimente submeter apenas o comando D,setE. A sequencia de intera#es a seguir ilustra a ativao e desativao da e'ibio do tipo dos resultados. Z Qset Xt Z 1Y1N > > CN?JASQ QQ Integer Z Qset -t Z 1YCNN C1QSQANQNN11J11B?NC?BQSN>1NA>SQ 4828 &\M/#5S I&$/I#5SQ *ara trabalhar com n(meros inteiros, a lingugem TasVell prov: o tipo Integer, que pode produzir n(meros que podem ter uma quantidade ilimitada de algarismos, entretanto, como a mem%ria do computador finita, qualquer que se.a a mquina real que estivermos usando, inevitavelmente esbarraremos em limites. Na ilustrao a seguir podemos observar essa fle'ibilidade, quando obtemos o valor para a e'presso 1 CNNN , um n(mero de >N1 algarismos. 3laro, o limite pode estar bem longe e podemos no atingi+lo em nossas aplica#es. Z 1YCNNN CNSCANJQNSCJQ1QS>1NB?J?1AN?BNQNNNCJCNAQC?N?JCCSNAA>>QNS??>SAN>JJ>S N>ACNACC1?B>QC11?B>CBJ>SJJCAQBAJAJC1SAB?QS1BCSAA>C?QJ1ACJSC?A1JAQB 1>C?N?>ABJ?ASSAS?QBJAS?JN>B>?AQSSS?J1?1>NBJA?1CNS?QNANQ1>SCC?CJSSB A?CJ1CA>N?Q?S?BJ>AJCB?C1QS>BJSQSAABCQAA?>B?QNSSNQ1BC?ASCCBQ?SSQJQA ?1CQSQQN?1BJ>CQA1Q1?>JQJ>S1NAQQJNQB>SQ $'perimente com n(meros maiores` *or e'emplo, BBBB BBBB um n(mero que tem por volta de ?N mil algarismos. - provida ainda uma representao de inteiros mais restrita, denominada =nt. $sta verso trabalha com um intervalo de valores fi'o e reduzido e tem como vantagem economizar mem%ria do computador e tempo de processamento, usando caractersticas especficas do computador. *ara que um n(mero se.a representado nesta verso, devemos indicar e'plicitamente, como no e'emplo a seguir. Z C1>?AQSJBNQQInt C1>?AQSJBN QQ Int
Z C1>?AQSJBNCQQInt *rogram error) arithmetic overflo[ ! e'emplo a seguir ilustra a diferena entres as duas possibilidades. Z CNJBBSBJSBJSNBSBJSB CNJBBSBJSBJSNBSBJSB QQ Integer Z CNJBBSBJSBJSNBSBJSBQQInt *rogram error) arithmetic overflo[ > ? ! con.unto de opera#es associadas ao domnio pode variar, entretanto, em geral so fornecidas as seguintes opera#es primitivas) Nome &escrio $'emplos I Adio Z C> I CA I 1C I 1? I 1S I >C C>C )) 2nteger W 6ultiplicao Z 1N W CN W BJ CBQNN )) 2nteger + Oubtrao Z C1>? + ?>1C +>NJS )) 2nteger div diviso inteira Z div C1J>? CN C1J> )) 2nteger Y *ot:ncia Z 1Y1N CN?JASQ )) 2nteger rem descreve o resto da diviso inteira entre dois inteiros Z rem C1J>? CN ? )) 2nteger Z rem 9C1J>? CN/ +? )) 2nteger mod &escreve o m%dulo da diviso inteira entre dois inteiros Z mod C1J>? CN ? )) 2nteger Z mod 9+C1J>?/ CN Q )) 2nteger abs valor absoluto Z abs C1> C1> )) 2nteger Z abs 9+C1>/ C1> )) 2nteger signum produz +C, N ou C, indicando quando o n(mero negativo, zero ou positivo Z signum 9+>JJJJSQA1SJ1BSBJ/ +C )) 2nteger Z signum N N )) 2nteger Z signum > C )) 2nteger
Algumas observa#es so importantes) a/ As opera#es podem ser combinadas para construir e'press#es mais comple'as5 Z A I C1 W > ?C )) 2nteger b/ As opera#es possuem preced:ncia, ou se.a, e'iste uma ordem em que devem ser consideradas. No e'emplo anterior, a multiplicao 9W/ > A tem preced:ncia sobre a adio 9I/ e portanto realizada antes da adio. $sta preced:ncia pode ser modificada pelo uso de par:ntesis. Z 9A I C1/ W > AC )) 2nteger c/ A operao div 9diviso/ parcial, ou se.a, no se aplica quando o denominador nulo. Ruando submetemos uma e'presso com esta caracterstica, o TUGO no avalia a e'preso e sinaliza que h um erro. Z div >BJ N Program errorQ divide bJ zero 48<8 &\M/#5S #/AISQ A denominao em TasVell para a adequao dos reais aos computadores, denominada de >loat. *ara este tipo no falaremos de uma lista de constantes. Ao invs disso falaremos aqui em magnitude e preciso de um n(mero. 3omo na notao cientfica. A preciso nos diz quantos algarismos significativos so usados e a magnitude nos diz qual o maior e'poente admitido. *or e'emplo, uma determinada implementao pode utilizar Q algarismos significativos. Nesta, o n(mero C1>?AQ.SJB seria representado pelo n(mero C1>?AS.N, onde o Q foi arredondado para S. A magnitude permite que n(meros bem pequenos e bem grandes se.am representados. *or e'emplo, um n(mero muito grande como BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.N poderia ser representado por C.NeI1B e um n(mero bem pequeno como N.NNNNNNNNNNBBBBBBBBBBBBBBBBBBBBBBBBBBBB, poderia ser representado por C.Ne+NCN. Z N.C1>?AQSJBNC1>?AQSJBNC1>?AQSJBNC1>?AQSJBN N.C1>?AQSJBNC1>?Q QQ *ouble A representao cientfica utilizada quando necessrio) Z C1>?AQSJBNC1>?AQSJBNC1>?AQSJ.B C.1>?AQSJBNC1>?QeIN1S QQ *ouble A implementao corrente usa por default um verso estendida denominada D*oubleE. Oe dese.armos, podemos representar os n(meros usando uma quantidade menor de algarismos significativos, para isso precisamos e'plicitar que o n(mero considerado deve ser representado na modalidade D>loat?. Z N.C1>?AQSJBNC1>?AQSJBNC1>?AQSJBNC1>?AQSJBNQQFloat N.C1>?AQJ QQ Float ! con.unto de opera#es aqui tambm pode variar, entretanto, em geral as listadas no quadro abai'o so providas. > Q &ome *escrio /;em+los pi a constante >.C?CAB... Z pi >.C?CAB1QA>AJBSB )) &ouble I Adio Z 1.A I >.>1CQ I N.>JB?AJ Q.1CCNAJ )) &ouble W 6ultiplicao Z >.1 W C.1> W N.1NJ N.JCJQJJ )) &ouble + Oubtrao Z >.?AQSJB + C.>???BBNJBJSS 1.CC11JBBCNC1> )) &ouble K &iviso Z B.>?ABJJ K 1>?AQB.>? >.BJ?>CSJC?NJ?>Ce+NNA )) &ouble Y pot:ncia 9o e'poente tem que ser 2nt e positivo/ Z C.A>1?YCN SC.?N>JCSSBAQQA? )) &ouble sin Oeno Z sin pi C.11?QNQ>A>J11>Je+NCQ )) &oubl cos 3oseno Z cos pi +C.N )) &ouble tan 4angente Z tan 9 pi K ?.N/ C.N )) &ouble sqrt raiz quadrada Z sqrt J.A 1.BCA?SAB?S?11QA )) &ouble log logaritmo na base e Z log 1.SCJ1JCJ1J?ABNA C.N )) &ouble e'p pot:ncia na base e Z e'p C.N 1.SCJ1JCJ1J?ABNA )) &ouble
&a mesma forma como ocorre nos n(meros inteiros, nos reais tambm podemos combinar opera#es para construir opera#es mais comple'as. 4ambm vale para os reais a preced:ncia de operadores, como nos inteiros podemos usar par:ntesis para controlar a ordem em que as opera#es sero realizadas. 48=8 C5&"/#S:5 */ $IP5S: $m TasVell os inteiros so tratados como um subcon.unto dos reais. Assim, quando temos n(meros reais misturados com n(meros inteiros em uma mesma e'presso, os n(meros inteiros so automaticamente tratados como reais. Z > I A J )) 2nteger Z > I A.N J.N )) &ouble $'istem fun#es especficas para converso de tipos) > S a/ a funo truncate converte um real ' para o menor inteiro menor ou igual '. Z truncate pi > )) 2nteger b/ a funo round converte um real ' para o inteiro mais pr%'imo de ', ou se.a) round ' M truncate 9' I N.A/ Z round pi > )) 2nteger Z round 9e'p C/ > )) 2nteger 4848 P#/C/*]&CIA *5S 5P/#A*5#/S: Ruando aparecem vrios operadores .untos na mesma e'presso, certas regras de preced:ncia so estabelecidas para resolver possveis ambig<idades. A ordem em que os operadores so considerados a seguinte) Cb/ di7, mod, abs, sqrt e qualquer outra funo 1b/ Y >b/ W K ?b/ I, + &a mesma forma que na matemtica usual podemos usar os par:ntesis para forar uma ordem diferente de avaliao. /;em+losQ S 1 I > W A CS coment:rio( o operador " tem preced;ncia sobre o operador + +odemos escre7er a expresso a seguir para denotar a seqG;ncia de a7aliaHes( 2 + I " J 2 + 1J 1K S 91 I >/ W A 1A > J coment:rio( a ordem de a7aliao foi alterada pelo uso dos par;ntesis < seqG;ncia de a7aliao 4 portanto( (2 + I) " J J " J 2J S > W mod CN ? I A CC coment:rio( a primeira prioridade 4 para a7aliao do operador mod1 seguida da a7aliao do operador " e finalmente do operador + +odemos escre7er a seguinte seqG;ncia de a7aliao( I " mod 1! 4 + J I " 2 + J L + J 11 S > Y mod CN ? B coment:rio ( < primeira a7aliao 4 do operador mod e em seguida 4 a7aliado o operador ^ < seqG;ncia de a7aliao 4( I ^ mod 1! 4 I ^ 2 M S ? Y mod 9div 1N ?/ 1 ? coment:rio( < seqG;ncia de a7aliao 4( 4 ^ mod (di7 2! 4) 2 4 ^ mod J 2 4 ^ 1 1 48>8 5#*/M */ ASS5CIA9:5: Ruando h ocorr:ncia de operadores de mesma preced:ncia leva+se em considerao a ordem de associao que pode ser " direita ou " esquerda. C. ! operador de subtrao faz associao " esquerda, A + ? + 1 M 9A + ?/ + 1 e no A + 9 ? + 1/ 1. c o operador de e'ponenciao faz associao " direita, > Y ? Y A M > Y 9 ? Y A / e no 9 > Y ? / YA > B
! uso adequado das no#es de preced:ncia e associao serve tambm para escrevermos e'press#es com economia de par:ntesis. 5bserva[esQ C. ! operador unrio + deve ser sempre representado entre par:nteses quando utilizado .unto com outro operador. C. 9+ '/YL ou + 9'YL/ e nunca +'YL ou 'Y+L. 1. A e'ponenciao quando repetida em uma e'presso avaliada da direita para a esquerda. C. 1Y>Y> M 1Y9>Y>/. >. !s demais operadores, na situao acima, so avaliados da esquerda para a direita. C. 1 + > + A M 91 + >/ + A 1. 1 I > I > M 91 I >/ I > /;em+losQ S> + S + 1 + Q S > W S I ? 1A S > W 9 S I ?/ >> S > Y 9 C I >/ JC 48>8 $IP5S */ &5"AS */FI&I9D/S: Ao definir novas fun#es, o fazemos tomando por base os tipos de dados e'istentes na linguagem. ! corpo dessas defini#es tem por base a composio das opera#es fornecidas por estes tipos bsicos. Assim, o tipo do dado resultante da avaliao de uma aplicao desta nova funo, pode ser antecipado por um analisador de tipos, antes mesmo de avaliar a e'presso. !bserve as duas defini#es a seguir) media ' L M 9' I L/ K 1 mediad ' L M truncate 99' I L/ K 1/o tipo de dado resultante pela aplicao de DmediaE real, uma vez que a operao DKE 9diviso/, s% se aplica a n(meros reais. &a mesma forma, o tipo resultante pela aplicao da funo Dmedia@ A inteiro, ? N dado que a ultima operao a ser realizada, a DtruncateE, converte reais para inteiros. *odemos conferir isso nas submiss#es de avaliao a seguir) Z media > ? >.A )) &ouble 48>8 %I/#A#F.IA */ &\M/#5S: At agora dissemos que a linguagem TasVell trabalha com dois tipos numricos, os reais e os inteiros. 2sto uma verdade irrefutvel. Ao avaliar uma e'presso numrica o resultado ser sempre um n(mero real ou um n(mero inteiro. $ntretanto, para facilitar a construo de um sistema de tipos adequado para a avaliao do tipo de uma e'presso, antes mesmo que ela se.a avaliada, tornou+se necessrio a criao de uma hierarquia de tipos, conforme mostraremos agora. Ao definir novas fun#es, o fazemos tomando por base os tipos de dados e'istentes na linguagem. ! corpo dessas defini#es tem por base a composio das opera#es fornecidas por estes tipos bsicos. Assim Z media > ? > )) 2nteger ? C S /;ercPcios Rual o tipo resultante da avaliao da definio) mediade ' L M div 9' I L/ 1 ! que ocorre na avaliao de uma e'presso que usa a definio) mediade ' L M div 9' I L/ 1.N ? 1 >8 /CP#/SSD/S B^)ICAS / 5 $IP5 55B/A& >878 I&$#5*.9:5Q Uma caracterstica fundamental dos agentes racionais a capacidade de tomar decis#es adequadas considerando as condi#es apresentadas pelo conte'to onde est imerso. Uma mquina que sabe apenas fazer contas, ou se.a, manusear as opera#es aritmticas, ter sua utilidade fortemente reduzida e, portanto no despertar tantos interesses prticos. !s computadores que temos ho.e so passveis de serem programados para tomada de deciso, ou se.a, possvel escolher entre 1 ou mais a#es, qual a que se dese.a aplicar em um determinado instante. $m nosso paradigma de programao precisamos de dois elementos fundamentais) um tipo de dados para representar a satisfao ou no de uma condio e um mecanismo que use essas condi#es na escolha de uma definio. Neste captulo discutiremos a natureza das proposi#es l%gicas, sua aplicabilidade na resoluo de problemas e introduziremos um novo tipo de dados, denominado de boolean. Oatisfazendo logo de sada a curiosidade do leitor lembramos que o nome uma homenagem a George Poole que estudou e formalizou as opera#es com estes tipos de valores. >828 P#5P5SI9D/S B^)ICASQ 7evirando o ba( das coisas estudadas no ensino fundamental, por certo encontraremos "s sentenas matemticas. \embraremos ento que elas so afirma#es sobre entes matemticos, tais como os e'emplos a seguir) C. vinte e dois maior que cinco 1. dois mais tr:s igual a oito >. todo n(mero primo impar ! conceito de proposio l%gica mais geral, aplicando+se "s mais diversas situa#es do cotidiano, como nos e'emplo a seguir) C. 6aria namorada de *edro 1. cos apai'onado por 6aria >. To.e domingo Analisando o significado da informao contida em uma proposio l%gica podemos concluir que ela ser uma afirmao verdica, quando se referir a fatos que realmente acontecem em um determinado mundo. Ruando isso no ocorre, conclumos que elas so inverdicas. !bviamente que isto ir requerer que possamos ter acesso ao mundo considerado para podermos avaliar uma dada proposio. Sentenas Fec!adasQ as sentenas acima possuem uma caracterstica importante) todos os seus componentes esto devidamente e'plicitados. &enominamos estas sentenas de sentenas fechadas. Uma sentena fechada ? > pode ser avaliada imediatamente, conferindo o que elas afirmam com o mundo sobre o qual elas se referem. Sentenas AbertasQ Um outro tipo de proposio importante so as sentenas abertas. Nestas, alguns personagens no esto devidamente e'plicitados e, portanto a sentena no pode ser avaliada. Ruando tratamos sentenas abertas, antes necessrio instanci+las para algum valor. *or e'emplo, a sentena matemtica, x + 5 $ "( nem sempre verdadeira, depende do valor que atribuirmos " varivel x. Ruando atribumos valores "s variveis de uma sentena dizemos que estamos instanciando a sentena. No caso acima, podemos instanciar a sentena para os valores > e CN, entre outros, obtendo as seguintes inst0ncias) C. > I A Z CN 1. CN I A Z CN Agora podemos avali+las e concluir que a segunda verdica e a primeira no. ! mesmo poderia ocorrer com afirma#es de outra natureza, como por e'emplo) Oe substituirmos Bm certo cidad4o por Pill Gates, podemos concluir que a sentena verdica. ! mesmo no se pode concluir se a substituirmos pelo nome de in(meras pessoas que arrancam os cabelos todos os dias, pre.udicados que ficam com o mau funcionamento do citado programa. Sentenas Com+ostasQ ! discurso do cotidiano e at o discurso matemtico, pode ser escrito como uma lista de proposi#es simples. 3omo por e'emplo) C. To.e domingo 1. Aos domingos tem futebol >. Ruando meu time .oga, eu assisto Nem sempre isto dese.vel ou suficiente. *ara resolver a questo, podemos contar com as sentenas compostas. 3omo por e'emplo)) a/ Nr;s 4 menor que cinco e o quatro tamb4m9 b/ Fomingo irei ao futebol ou escre7erei notas de aula9 c/ >speranto no 4 uma linguagem de programao !bservamos ento, o surgimento de tr:s palavras para criar essas sentenas e que essas palavras 9 e, ou, n4o/ no se referem a coisas, propriedades ou ? ? fen,menos de um determinado universo. $las so denominadas de palavras l%gicas, visto que a sua funo na linguagem possibilitar a articulao entre as proposi#es do discurso. A composio de uma proposio pode envolver vrias palavras l%gicas, como nos e'emplos a seguir) C. :ois menor que trCs e maior que um mas n4o maior que a soma de trCs com doisD 1. Earia -osta de Fedro e de Goana mas n4o -osta de 2ntonio Avaliao de Sentenas Com+ostasQ *ara avaliar sentenas simples, vimos que bastava inspecionar o mundo ao qual ela se refere e verificar se a situao e'pressa pela sentena ocorre ou no. $ como proceder para as sentenas compostas] Um caminho que parece confivel apoiar essa avaliao no papel representado por cada uma das palavras l%gicas. Assim, quando ao considerarmos a proposio) Hoje 'ui ao cinema e ao teatro, s% poderemos dizer que ela verdica se tanto a proposio Hoje 'ui ao cinema quanto a proposio Hoje 'ui ao teatro forem avaliadas como verdicas. *ara a proposio composta Earia 'oi a missa ou ao cinema1 devemos consider+la como verdica se uma das duas proposi#es) " Earia 'oi a missa 1. Earia 'oi ao cinema forem avaliadas como verdica. $ se as duas forem avaliadas como verdicas] No discurso cotidiano tendemos a pensar nesta situao como inverdica visto que queramos uma ou outra. A linguagem natural no estabelece se devemos ou no e'plicitar que no estamos falando do caso em que ambas podem ser constatadas. *odemos assumir, portanto, que a nossa sentena composta usando ou ser avaliada como verdica quando pelo menos uma das duas proposi#es que a comp#e for avaliada com verdica. No caso da sentena composta usando a palavra l%gica n4o, como em Hoje n4o c)o!eu diremos que ela ser avaliada como verdica quando a proposio Hoje c)o!eu no puder ser constatada e como inverdica no caso oposto. ? A >8<8 5 $IP5 */ *A*5S 55B/A&Q *odemos agora discutir sobre a natureza do valor resultante da avaliao de uma sentena. A avaliao de natureza funcional, ou se.a, dada uma sentena s ela ser mapeada em um de dois valores distintos. $nto, o contradomnio de uma avaliao um con.unto com apenas dois valores, um para associar com avalia#es verdicas e outras com as inverdicas. *odemos escolher um nome para esses valores. Tistoricamente, as linguagens de programao os tem denominado de Irue e >alse. ! primeiro para associar com as proposi#es que podem ser constatadas no mundo considerado e a segunda com as no constatveis. ! tratamento das proposi#es compostas pode tambm receber um tratamento formal. 3ada uma das palavras l%gicas associamos uma funo matemtica cu.o domnio e contradomnio ser o con.unto que acabamos de definir com as constantes Irue e >alse. aval )) fsentenaZ =4rue, False@ $m Tugs nossos operadores so representados por)
Palavra l_gica SPmbolo em %ugs e gg ou hh no not Hamos ento formalizar a avaliao de sentenas compostas. Oe.am sC e s1 duas proposi#es l%gicas, C. ! valor l%gico da sentena s" JJ s2 Irue se e somente se o valor l%gico de s" Irue e o valor l%gico de s2 Irue e >alse em caso contrrio. 1. ! valor l%gico da sentena s" KK s2 >alse se e somente se o valor l%gico de s" >alse e o valor l%gico de s2 >alse e Irue em caso contrrio. >. ! valor l%gico da sentena not s" Irue se e somente se o valor l%gico de s" False e ) False em "aso "ontrrio ? Q $abela "erdadeQ $stas defini#es tambm podem ser representadas atravs de uma enumerao de suas associa#es, formando o que se costuma chamar de Ia+elas Lerdade as quais apresentamos a seguir. s7 s2 s7 `` s2 4rue 4rue 4rue 4rue False False False 4rue False False False False s7 s2 s7 LL s2 4rue 4rue 4rue 4rue False 4rue False 4rue 4rue False False False s7 not s7 4rue False False 4rue >8=8 5P/#A*5#/S #/BACI5&AISQ Ruando falamos de proposi#es l%gicas no discurso matemtico, ou se.a, sentenas matemticas, usamos termos tais como) Dmenor do queE, Dmenor ou igualE, DdiferenteE, entre outros. $stes termos so fundamentais para a nossa inteno de prover os computadores com a capacidade de deciso. &enominamos estes elementos de operadores relacionais, pois estabelecem uma relao de comparao entre valores de um mesmo domnio. ! contradomnio deles do tipo Poolean. A tabela a seguir apresenta esses operadores, seus significados e e'emplos de uso.
o+erador si-ni'icado exemplo resultado MM igualdade 91 I >/ MM 9J X >/ 4rue KM &iferena A KM 9? W 1 +>/ False f 6enor 91 I >/ f Q 4rue fM 6enor ou igual 91 W >/ fM Q 4rue Z 6aior 9? I 1/ Z 91 W >/ False ZM 6aior ou igual 9J X > W 1/ ZM 9CA div >/ False *odemos usar estes operadores para construir novas defini#es ou simplesmente, em uma sesso de Tugs para solicitar a avaliao de uma e'presso, como apresentado nos e'emplos a seguir.
>848 /CP#/SSD/S / */FI&I9D/SQ Agora que temos um novo tipo de dados, ou se.a, um par composto de constantes e fun#es, podemos p,+lo a nosso servio, escrevendo e'press#es, de forma to natural quanto aquela que usamos para escrever e'press#es aritmticas. Usando essas e'press#es podemos ento construir defini#es cu.o tipo resultante se.a booleano. !s ingredientes bsicos para construir essas e'press#es so os operadores relacionais. /;+ress[es sim+les Q *or e'emplo, para construir uma definio que avalie se um n(mero par, podemos usar a seguinte definio)
&ar x = (mod x 2) == % He.amos alguns e'emplos ilustrados abai'o)
> &ar 5 False > &ar '4( True > &ar % True > &ar ("ru#$a"e ((5 + 2) / 2)) False ? J !utros e'emplos de defini#es) Herificar se a m(ltiplo de + mul"i&lo a ) = (mod a )) == % Herificar se a divisor de + diisor a ) = mul"i&lo ) a Herificar se uma dist0ncia d igual " diagonal de um quadrado de lado a dia* d a = (a + s,r" 2.%) == d Herificar se um n(mero um quadrado perfeito ,uad& # = (s,r" #)-2 == # Herificar se dois n(meros a e + so termos consecutivos de uma *.A. de razo r s&a a ) r = (a + r) == ) /;+ress[es com+ostas Q *odemos usar agora os operadores l%gicos para construir e'press#es compostas. 3omo nos e'emplos a seguir) Herificar se > n(meros esto em ordem decrescente ord$ a ) $ = (a > )) .. () > $) Herificar se um n(mero x est no intervalo fechado definido por a e + &er" x a ) = (x >= a) .. (x != )) ou &er" x a ) = #o" ((x ! a) // (x > ))) Herificar se um determinado ponto do espao cartesiano est no primeiro quadrante &,uad x y = (x > %) .. (y > %) Herificar se > n(meros a, + e c, so lados de um tri0ngulo ret0ngulo "re" a ) $ = ((a-2 + )-2) = = $-2) // ((a-2 + $-2) = = )-2) // (()-2 + $-2) = =a-2) Ruando nossas e'press#es possuem mais de um operador l%gico devemos observar a preced:ncia de um sobre o outro. *or e'emplo, na e'presso) P || Q && R onde *, R e 7 so e'press#es l%gicas, o operador gg ser avaliado primeiro pois tem preced:ncia sobre o hh, portanto a e'presso ser avaliada para 4rue se * for avaliado para 4rue ou se a sub+e'presso 9R gg 7/ for avaliada para 4rue. ? B *odemos modificar esta ordem utilizando par:ntesis como nas e'press#es aritmticas. A e'presso acima poderia ser reescrita como) (P || Q) && R $ agora, para que ela se.a avaliada para verdadeira preciso que 7 se.a avaliada para verdadeira. He.amos mais um e'emplo de definio) Herificar se ' est fora do intervalo definido por a e b e a e b esto em ordem no decrescente f ' a b M 99' fMa/ hh 9' ZM b// gg 9a fM b/ Herificar se ' menor que a ou se ' maior que b e a e b esto em ordem no decrescente g ' a b M 9' fMa/ hh 9' ZM b/ gg 9a fM b/ >8>8 #/S5B"/&*5 .M P#5B/MAQ &ese.amos verificar se um determinado ponto do espao cartesiano est dentro ou fora de um ret0ngulo paralelo aos ei'os, conhecidos o ponto, o canto superior esquerdo e o canto inferior direito do ret0ngulo. /ta+a 7 i$ntendendo o problemaa ! ponto pode estar em qualquer quadrante] $ o ret0ngulo, pode estar em qualquer quadrante] Pasta ter os dois cantos para definir o ret0ngulo] $m que ordem sero informados os cantos] 3omo se descreve um canto] Um ponto que este.a sobre um dos lados, est dentro ou fora do ret0ngulo] Hamos assumir ento as seguintes decis#es) discutiremos inicialmente apenas sobre pontos e ret0ngulos localizados no primeiro quadrante. A ordem em que os dados sero informados ser) primeiro o ponto, depois o canto superior esquerdo e por ultimo o canto inferior direito. *ara cada ponto sero informadas as duas coordenadas, primeiro a abscissa e depois a ordenada. !s pontos na borda so considerados pertencentes ao ret0ngulo. /ta+a 2 i*lane.ando a Ooluoa) 3onheo algum problema parecido] *osso decompor este problema em problemas mais simples] Oei resolver um problema mais geral em que este um caso particular] Pom, . nos envolvemos com o problema para verificar se um ponto estava num intervalo linear, este tambm se refere a intervalo. Herificar se um ponto pertence a uma regio qualquer do espao n+dimensional mais geral, se eu conhecesse uma definio para este problema geral, bastaria instanci+la. Oer que posso decompor o problema na verificao de dois espaos lineares, um definido pelos lados paralelos ao ei'o das ordenadas e outro paralelo ao ei'o das abscissas] Oe afirmativo, como combino as duas solu#es] A N *ara que um ponto este.a dentro do ret0ngulo necessrio que sua ordenada este.a entre as ordenadas dos dois cantos. Oabemos tambm que a abscissa precisa estar entre as abscissas dos dois cantos. 2sso basta] *ara combinar as solu#es percebemos que suficiente que as duas primeiras este.am satisfeitas. /ta+a < i3onstruindo a Ooluoa 3onstruindo a soluo + Anteriormente . elaboramos a definio de pertin:ncia a um intervalo linear, vamos us+la aqui. pert ' a b M 9'ZMa/ gg 9' fM b/ pertin:ncia linear pertsup ' L 'C LC '1 L1 M 9pert ' 'C '1/ gg 9pert L L1 LC/ pertin:ncia de superfcie $ o teste, para que valores interessam testar] /ta+a ? iAnalisando a Ooluoa) $'istem outras maneiras de resolver o problema] $sta soluo se aplica as outras dimens#es] A C ?8 *e,ini[es Condicionais ?878 I&$#5*.9:5: Oabemos de nosso conhecimento matemtico que algumas fun#es no so contnuas em um domnio e que, portanto, possuem vrias defini#es. $m muitos casos, o domnio & de uma funo est dividido em regi#es dis.untas que se complementam e, para cada uma dessas regi#es, e'iste uma e'presso que define o seu mapeamento no contra+domnio. *odemos representar esta situao pela figura abai'o)
/;em+lo 7 + 3onsidere a funo que determina o valor da passagem area de um adulto, para um determinado trecho, por e'emplo, Hit%ria+6anaus, considerando a sua idade. *essoas com idade a partir de QN anos possuem um desconto de ?Nj do valor. 3onsidere ainda que a passagem para o trecho considerado custa 7^ QNN,NN. 4emos aqui duas formas de calcular o valor da passagem de uma pessoa, dividindo o domnio em dois subcon.untos. ! dos adultos com menos de QN e o dos demais. *odemos definir as duas fun#es) &ass' = 0%% &ass2 = &ass' + %.0 *ara usar uma das defini#es, temos que e'plicitamente escolher a que se aplica ao nosso caso. /;em+lo 2 + 3onsidere a funo que associa com um determinado rendimento o 2mposto de 7enda a ser pago. At um determinado valor, o A 1 contribuinte no paga imposto, e a partir de ento o rendimento dividido em fai'as 9intervalos/, aos quais se aplicam diferentes ta'as. Ouponha a tabela hipottica abai'o.
Fai;a alPNuota *esconto inferior ou igual a CN.JNN N N entre CN.JNC e 1N.NNN CN CNNN entre 1N.NNC e >N.NNN 1N CANN acima de >N.NNN 1A CJNN
*ara descrever as vrias defini#es e os correspondentes subdomnios, poderamos escrever separadamente cada definio, construindo portanto vrias fun#es, e dei'ar que o usurio escolha qual usar. 3laro que isto traria muitos inconvenientes pois estaramos dei'ando uma escolha mec0nica na mo do usurio, que alm de sobrecarreg+lo com tarefas desnecessrias, ainda estaria e'pondo+o ao erro por desateno. 6as vamos l construir as fun#es independentes. ir' s = % ir2 s = s + %.' - '%%% ir3 s = s + %.2 - '5%% ir4 s = s + %.25 - '(%% Agora, para us+las, o usurio pega o seu salrio, olha a tabela e seleciona qual funo aplicar. A escolha de qual definio usar para uma dada situao, em si, um tipo de computao. *odemos descrever essa computao com e'press#es condicionais, vamos dei'ar que o computador escolha. &escrevemos cada subdomnio com a respectiva funo aplicvel e dei'emos que ele escolha a definio a aplicar, dependendo do valor fornecido. He.amos ento como isso pode ser feito nas se#es subsequentes. ?828 A /S$#.$.#A IFQ Uma e'presso condicional construda com i' possui a seguinte sinta'e) i, fe'presso l%gicaZ t!en fe'presso CZ else fe'presso 1Z onde) A >
fe'presso l%gicaZ Uma e'presso descrevendo uma condio a ser satisfeita, envolvendo operadores relacionais e operadores l%gicos. fe'pressoCZ e fe'presso1Z C. $'press#es descrevendo um valor a ser produzido como resposta " entrada fornecida e, como a e'presso total tem que ser de um (nico tipo, as duas e'press#es devem ser do mesmo tipo. 1. 3ada uma destas e'press#es pode ser inclusive uma outra condicional, dentro da qual pode haver outras e assim sucessivamente. >. Ruando a fe'presso l%gicaZ avaliada para Irue o valor resultante ser o que for obtido pela avaliao da fe'presso CZ caso contrrio ser o obtido pela avaliao da fe'presso 1Z
*ara a funo que calcula o valor da passagem area podemos ento construir a seguinte definio) &ass x = if x ! 0% then 0%% else 30% 6rvore de deciso) *odemos representar as e'press#es condicionais atravs de uma notao grfica denominada de rvore de deciso. - importante considerar que este tipo de representao uma ferramenta importantssima para estruturarmos a soluo de problemas que requerem e'press#es condicionais.
/;em+lo < X &efinir a funo que determina o valor absoluto de um n(mero. Oabemos que esta funo se define em dois subdomnios) subdomPnio e;+resso ' f N + ' ' ZM N ' A ? 3omo s% temos duas possibilidades, podemos codificar da seguinte maneira) absoluto ' M i, ' f N t!en +' else ' *ara concluir esta apresentao voltemos ao nosso e'emplo 1 que definie a funo para calculo do 2mposto de 7enda. ! domnio neste caso deve ser quebrado em quatro subdomnios e para cada um deles construiremos uma e'presso. domPnio ,uno s k CNJNN irC s pert s CNJNC 1NNNN ir1 s pert s 1NNNC >NNNN ir> s s Z >NNNN ir? s *ara codificar precisaremos ir quebrando sucessivamente o domnio da funo. *rimeiro dividimos entre o primeiro intervalo e o resto, depois dividimos o resto entre o segundo intervalo e o resto e assim sucessivamente. A codificao final pode ser)
ir s = if s != '%(%% then ir' else if &er" s '%(%% 2%%%% then ir2 else if &er" s 2%%%' 3%%%% then ir3 else ir4 where ir' = % ir2 = s + %.' - '%%% ir3 = s + %.2 - '5%% ir4 = s + %.25 - '(%% &er" x a ) = x>=a .. x!=) ?8287 .SA&*5 5 IF /C/MPB5 7Q 3onsidere um mapeamento de valores numricos onde o domnio se divide em ? regi#es, cada uma das quais possui diferentes formas de mapeamento. As regi#es so apresentadas na figura abai'o, numeradas da A A esquerda para direita. !bserve ainda que as e'tremidades so abertas. 3onsidere ainda a seguinte tabela de associa#es)
regio ma+eamento deseUado regio C o dobro de ' regio 1 o sucessor de ' regio > o quadrado de ' regio ? o simtrico do quadrado de '
*odemos analisar as regi#es atravs do seguinte diagrama) C a 3 C a -74 C S 73 $rue $rue $rue False False False A Q ! que nos levar " seguinte definio) 1 x = if x ! % then i1 x ! (-'5) then 2 + x else x + ' else if x ! '% then x -2 else - (x - 2) $'emplo 1Q &ados > n(meros inteiros distintos, determinar o maior deles. *odemos e'plorar uma soluo da seguinte maneira. 3onsidere um ret0ngulo e divida+o horizontalmente em 1 partes, a parte de cima representa as situa#es onde a Z b e a de bai'o aquelas onde b Z a. &ivida agora o ret0ngulo verticalmente, em cada uma das regi#es anteriores surgiro 1 metades. Na de cima, representamos agora a relao entre a e c. Na de bai'o, a relao entre b e c.
$'plorando as rela#es entre os n(meros 7epresentando as rela#es atravs de uma rvore de deciso 4raduzindo a rvore de deciso para Tugs, chegamos " seguinte definio) maior a ) $ = if a > ) then if a > $ then a else $ else if ) > $ then ) else $ A S ?8< */FI&I9D/S P#5$/)I*AS Iguarded commandsKQ A estrutura IF foi apresentada por primeiro por quest#es hist%ricas, por tratar+se de uma forma pioneira de escrever defini#es condicionais. $ntretanto, algumas vezes podemos lanar mo de estruturas mais simples e mais legveis. As defini#es protegidas, tambm conhecidas por Dguarded commandsE permitem que se escreva para uma mesma funo, vrias defini#es, cada uma delas protegida por uma e'presso l%gica. !#ome da 1u#23o> !&ar4me"ros> / !&ro"e23o '> = !de1i#i23o '> / !&ro"e23o 2> = !de1i#i23o 2> / !&ro"e23o 3> = !de1i#i23o 3> . . . / !&ro"e23o #> = !de1i#i23o #> 565 / o"7er8ise = !de1i#i23o # + '> 59: A (ltima clausula da definio opcional, por este motivo est apresentada dentro de colchetes. He.amos como podemos reescrever a definio da nossa funo DirE para clculo do imposto de renda. ir; s / s!='%(%% = ir' / &er" s '%(%% 2%%%% = ir2 / &er" s 2%%%' 3%%%% = ir3 /o"7er8ise = ir4 87ere ir' = % ir2 = s + %.' - '%%% ir3 = s + %.2 - '5%% ir4 = s + %.25 - '(%% /;ercPcios 78 7eescreva, usando defini#es protegidas. a definio da funo que determina o maior de > n(meros inteiros fornecidos.
A J @8 5 $/S$/ */ P#5)#AMAS @878 I&$#5*.9:5Q No basta desenvolver um programa para resolver um dado problema. - preciso garantir que a soluo este.a correta. 6uitos erros podem ocorrer durante o desenvolvimento de um programa e, portanto temos que garantir que o programa que ir ser e'ecutado est livre de todos eles. Ao conceber a soluo podemos nos equivocar e escolher caminhos errados, precisamos eliminar esses equvocos. Ao codificarmos a nossa soluo podemos cometer outros erros ao no traduzirmos corretamente nossa inteno. $sses erros podem ocorrer por um mau entendimento dos elementos da linguagem ou at mesmo por descuido, o certo que eles ocorrem. Uma estratgia muito (til, mas no infalvel, o teste de programa. $m sua ess:ncia, o teste de programa consiste em submeter um programa ao e'erccio de algumas inst0ncias do problema e comparar os resultados esperados com os resultados obtidos. @828 5 P#5C/SS5 */ $/S$/Q $m primeiro lugar devemos escolher as inst0ncias apropriadas, no basta escolh:+las aleatoriamente. A seguir devemos determinar, sem o uso do programa, qual o valor que deveria resultar quando o programa for alimentado com essas inst0ncias. ! passo seguinte consiste em submeter cada inst0ncia ao programa e anotar o resultado produzido por ele. Finalmente devemos comparar cada valor esperado com o valor produzido e descrever qual o tipo de ocorr:ncia. .m e;em+lo) 3onsidere o problema de identificar se um dado ponto est ou no localizado no primeiro quadrante do espao cartesiano. 3onsidere ainda que concebemos a seguinte definio)
primquad ' L M 9' ZM N/ gg 9L ZM N/ *recisamos agora verificar se ela atende nossa inteno. *ara tanto devemos escolher algumas inst0ncias, prever o resultado esperado e em seguida submeter ao TUGO, para ver o que acontece. Rue pares de valores deveremos escolher] Pom, vamos escolher uns pares usando a seguinte estratgia) um par onde ' maior que L, outro onde L se.a maior que ' e um terceiro em que os dois se.am iguais. Gerando uma planilha como apresentada a seguir. A B
; J resultado es+erado resultado obtido diagn_stico +A +1 False +1 +A False A A 4rue *odemos agora submeter as inst0ncias " avaliao do sistema, obtendo a seguinte interao) ] primquad 9+A/ 9+1/ False ] primquad 9+1/ 9+A/ False ] primquad A A $rue ] *odemos agora completar o preenchimento de nossa planilha, obtendo a tabela a seguir)
; J resultado es+erado resultado obtido diagn_stico +A +1 False False sucesso +1 +A False False sucesso A A 4rue 4rue sucesso Herificando as diversas linhas da coluna D&iagn%sticoE, parece que nosso programa est correto. He.a que ele passou com sucesso em todos os testes` Rue pena que no se.a verdade. Apesar de passar em todos os testes a que foi submetido, ele no funciona corretamente. 4udo que podemos afirmar neste instante que para os valores usados, o programa funciona corretamente. $ para os outros valores, ser que funciona corretamente] !utros valores] Ruais] @8<8 PBA&5 */ $/S$/Q *ara escolher os valores que usaremos, antes de mais nada devemos identificar as classes de valores que sero relevantes para o teste, em um segundo instante podemos ento escolher os representantes destas classes. Ruando temos um par0metro, os possveis valores a serem usados so todas as constantes do domnio. *ara o caso de um par0metro do tipo int, e'istem QAA>Q valores diferentes. 4estar nosso programa para todos esses valores implicaria em determinar a mesma quantidade de resultados esperados e em Q N seguida digitar e submeter esta mesma quantidade de inst0ncias do problema para o sistema e ainda depois conferir um a um os resultado obtidos com os esperados. $nfim, um trabalho imenso. 2magine agora se fossem dois par0metros] A quantidade de pares seria da ordem de ?.1B?BS ' CNYNB 9algo da ordem de quatro bilh#es/. $ para > par0metros] $ para n par0metros] N(meros cada vez mais enormes. *or este caminho, testar programas seria invivel. Felizmente no precisamos de todos eles, basta identificar as classes distintas que importam para o problema, ou se.a, as classes de equival:ncia relevantes. 2sto pode ser obtido analisando o enunciado estendido do problema. No caso de nosso e'emplo anterior, analisando melhor a definio, podemos identificar que por definio espao cartesiano se divide em quatro regi#es. A primeira, onde ambos as coordenadas so positivas, denominamos de primeiro quadrante. A segunda, onde a coordenada ' negativa e a L positiva, denominamos de segundo quadrante. ! terceiro quadrante o espao onde ambas as coordenadas so negativas. Ainda temos o quarto quadrante onde a coordenada ' positiva e a L negativa. $ os pontos que ficam em um dos ei'os ou na interseo destes, qual a classificao que eles t:m] Pom, podemos convencionar que no esto em nenhum dos ? quadrantes descritos. 7esumindo, nosso plano de teste deve contemplar estas situa#es, conforme ilustra+se na tabela a seguir. ; J Nuadrante positivo positivo primeiro negativo positivo segundo negativo negativo terceiro negativo positivo quarto nulo qualquer no nulo ei'o das ordenadas qualquer no nulo nulo ei'o das abscessos nulo nulo origem
- bom observar ainda que este plano pode e deve ser preparado antes mesmo de elaborar o programa, para faz:+lo, precisamos apenas da especificao detalhada. Alm disso, este plano no precisa ser feito pelo programador responsvel pela elaborao da soluo, qualquer outro programador, de posse do enunciado detalhado, pode se encarregar da tarefa. $ste tipo de plano serve para alimentar o teste denominado de caixa preta. $sta denominao se deve ao fato de no ser necessrio conhecermos a estrutura da soluo para elaborar o plano. Um outro aspecto positivo da elaborao do plano o mais cedo possvel que contribu para um melhor entendimento do problema. Q C Holtando ao nosso e'emplo, podemos agora elaborar a nossa planilha de teste considerando as classes de equival:ncia a serem definidas. Uma questo que surge como escolhemos o representante de uma classe] $'istem melhores e piores] No nosso caso, como pode ser qualquer valor positivo ou negativo, podemos escolher valores de um dgito apenas, no mnimo escreveremos e digitaremos menos. ; J resultado es+erado resultado obtido diagn_stico 1 > 4rue +1 > False +1 +> False 1 +> False N > False N +> False 1 N False +1 N False N N False @8=8 #/ABIVA&*5 5 $/S$/Q He.amos agora o resultado de nossa interao com o TUGO. ] primquad 1 > $rue ] primquad 9+1/ > False ] primquad 9+1/ 9+>/ False ] primquad 1 9+>/ False O primquad N 9+>/ False ] primquad N > $rue ] primquad N 9+>/ False ] primquad 1 N $rue ] primquad 9+1/ N False ] primquad N N $rue ]
Q 1 Holtemos agora para nossa planilha e vamos preench:+la na coluna de resultado obtido e diagn%stico. ; J resultado es+erado resultado obtido diagn_stico 1 > 4rue 4rue sucesso +1 > False False sucesso +1 +> False False sucesso 1 +> False False sucesso N > False 4rue falha N +> False False sucesso 1 N False 4rue falha +1 N False False sucesso N N False 4rue falha J.A. &epuraoQ Uma vez testado o programa e identificado que ocorreram inst0ncias para as quais a nossa definio no est fazendo a associao correta, ou se.a, o valor obtido diferente do esperado, devemos passar a uma nova fase. &epurar um programa um processo que consiste em buscar uma e'plicao para os motivos da falha e posteriormente corrigi+la. !bviamente isto tambm no um processo determinante e nem possumos uma f%rmula mgica. Ao longo de nossa formao de programadores iremos aos poucos incorporando heursticas que facilitem esta tarefa. *or enquanto muito cedo para falarmos mais do assunto e vamos concluir com um fechamento do problema anterior. Ap%s concluir as modifica#es devemos testar o programa novamente. *e+urando nossa soluo + *odemos concluir por simples inspeo da nossa (ltima planilha 9aquela com todas as colunas preenchidas/ que nossa soluo est incorreta. Uma interpretao dos resultados nos leva " hip%tese de que a nossa soluo considera que quando o ponto se localiza na origem ou em um dos ei'os positivos, a nossa definio est considerando que eles esto no primeiro quadrante. *asso seguinte, verificar se de fato nossa definio incorre neste erro. $m caso afirmativo, corrigi+la e a seguir resubmet:+la aos testes. !bservando a nossa definio inicial, podemos concluir que de fato nossa hip%tese se confirma. primquad ' L M 9' ZM N/ gg 9L ZM N/
*odemos ento modific+la para obter uma nova definio, que esperamos que este.a correta. Q > primquad ' L M 9' Z N/ gg 9L Z N/
Agora submet:+la novamente ao teste e ver o que acontece` @8>8 .MA Sb&$/S/ *5 P#5C/SS5Q ! processo , como vimos, repetitivo e s% se encerra quando no identificarmos mais erros. ! diagrama ilustra o processo como um todo. Bas lembre-se1 isto ainda no garante que seu programa este@a 1!!O corretoP 2uando no identificamos erro1 apenas podemos concluir que para as instQncias que usamos o nosso programa apresenta os resultados esperados
Q ? A8 #/S5B"/&*5 P#5B/MAS - 5S M5"IM/&$5S *5 CA"AB5 A878 I&$#5*.9:5Q 3onsidere o .ogo de 'adrez, onde peas so movimentadas em um tabuleiro dividido em J linhas e oito colunas. 3onsidere ainda os movimentos do cavalo, a partir de uma dada posio, conforme diagrama a seguir, onde cada possvel movimento designado por mi8 No esquema, o cavalo localizado na posio 9A, ?/ pode fazer oito movimentos, onde o primeiro deles, m", levaria o cavalo para a posio 9S,A/. J m> m> m> m> m> m> m> 6> S Q m> m1 A m? mC ? C > mA mJ 1 mQ mS C C 1 > ? A Q S J A828 P#5B/MA 7Q $screva uma funo que determina se, a partir de uma dada posio, o cavalo pode ou no realizar o primeiro movimento. Hamos cham+la de pmo!, e denominar seus par0metros 9a posio corrente/, de x e y. $is alguns e'emplos de uso de nossa funo e os valores esperados) instcncia resultado pmov A ? 4rue pmov J C False pmov C C 4rue pmov C J False B.1.C. Ooluo + A O!\Ulm! *!&$ O$7 $N3!N47A&A A47AH-O &A 3!NO47Ulm! &$ U6A $U*7$OOm! P!!\$ANA RU$ AHA\2$ O$ A N!HA *!O2lm!, !U O$cA, ARU$\A $6 RU$ ! 3AHA\! O$72A *!O232!NA&! *$\! *726$27! 6!H26$N4!, $O4n &$N47! &! 4APU\$27!. 3!6! ! 3AHA\!, N! *726$27! 6!H26$N4!, AN&A &UAO 3AOAO *A7A &27$24A $ U6A *A7A 326A, PAO4A H$72F23A7 O$ AO 3!!7&$NA&AO &A N!HA *!O2lm! Nm! U\47A*AOOA6 A !24AHA F2\$27A 9\2NTA !U 3!\UNA/. 3odificando em TUGO, temos ento) pmov ' L M 9' I 1 fM J / gg 9L I C fM J/ Q A
B.1.1. 4$O4AN&! A O!\Ulm! + 3omo . discutimos anteriormente, para verificar a correo de nossa soluo, devemos submet:+la a um teste. *ara tanto devemos escolher as classes de equival:ncias relevantes e, a partir delas, produzir a nossa planilha de teste. !lhando para a especificao do problema, podemos identificar ? con.untos de valores que se equivalem para os fins do nosso programa, como podemos observar na figura abai'o) J S Q A ? > 1 C C 1 > ? A Q S J B.1.>. $stendendo o *roblema + *odemos fazer o mesmo para todos os demais movimentos, obtendo com isso as seguintes defini#es) pmov ' L M 9' I 1 fM J / gg 9L I C fM J/ smov ' L M 9' I C fM J / gg 9L I 1 fM J/ tmov ' L M 9' + C ZM C / gg 9L I 1 fM J/ qmov ' L M 9' + 1 ZM C / gg 9L I C fM J/ qtmov ' L M 9' + 1 ZMC / gg 9L + C ZM C/ s'mov ' L M 9' + C ZM C / gg 9L + 1 ZM C/ stmov ' L M 9' I C fM J / gg 9L + 1 ZM C/ omov ' L M 9' I 1 fM J / gg 9L + C ZM C/ B.1.?. 2dentificando Abstra#es + *odemos agora indagar, olhando para as oito defini#es, sobre a ocorr:ncia de algum conceito geral que permeie todas elas. *oderamos tambm ter feito isso antes. 3omo no o fizemos, faamo+lo agora. *odemos observar que todas elas avaliam duas e'press#es e que ambas testam fronteiras que podem ser margem direita, margem esquerda, margem superior ou margem inferior. *odemos observar ainda, que o par margem direita e margem superior testam o mesmo valor J, assim como ocorre com as duas outras, que testam o valor C. 3om isso podemos definir duas novas fun#es, ' e -, para testar estes limites. Agora, as nossas defini#es anteriores podem ser reescritas, usando as duas abstra#es identificadas. pmov ' L M f 9' I 1 / gg f9 L I C/ smov ' L M f 9' I C/ gg f 9L I 1/ tmov ' L M g 9' + C/ gg f 9L I 1/ Q Q qmov ' L M g 9' + 1/ gg f 9L I C/ qtmov ' L M g 9' + 1/ gg g 9L X C/ s'mov ' L M g 9' + C/ gg g 9L X 1/ stmov ' L M f 9' I C / gg g 9L X 1/ omov ' L M f 9' I 1/ gg g 9L X C/ f [ M [ fM J g [ M [ ZM C B.1.A. Anlise da Ooluo + ! que ser que ganhamos com esta nova forma de descrever a nossa soluo] *odemos indicar pelo menos tr:s indcios de vantagem na nova soluo) C. 3lareza + Na medida em que agora est e'plicitado, que todas as oito fun#es para verificar os movimentos possuem estrutura semelhante e que todas esto usando fun#es para verificar a ultrapassagem das bordas5 1. 6anuteno + Oe nosso tabuleiro mudasse, ou se.a, passasse a ter B linhas por nove colunas, bastaria alterar a funo ' e tudo estaria modificado, ao invs de termos que alterar as oito defini#es. >. 7euso + As duas fun#es que testam as bordas poderiam ser usadas para construir fun#es para avaliar o movimento de outras peas do .ogo de 'adrez. A8<8 P#5B/MA 2Q Oabemos que para cada posio alguns movimentos podem ser realizados e outros no. 3omo ordenamos os movimentos no sentido anti+ horrio, gostaramos de obter, para uma dada posio, dos movimentos que podem ser realizados, aquele que possui o menor ndice. He.amos o esquema abai'o.
J m= m7 m< m> C7 S C< mA Q m4 m@ mQ A m> m? ? > m2 m< 1 m7 m= C C= C2 C 1 > ? A Q S J *odemos observar que o cavalo 3C s% pode fazer os movimentos mA e mQ e que o de menor ndice mA. c o cavalo 31 s% pode fazer os movimentos m> e m? e que o de menor ndice o m>. $nquanto isso o cavalo 3> pode fazer os Q S movimentos mC, m?, mA, mQ, mS e mJ. *ara este caso o movimento de menor ndice o mC. Hamos chamar esta funo de qualmo! e, como no problema anterior, os par0metros sero as coordenadas da posio atual do cavalo. $is alguns e'emplos de uso de nossa funo) 2nst0ncia resultado qualmov J C > qualmov J J A qualmov > S C qualmov C C C B.>.C. O!\Ulm! + Pem, como . sabemos, para verificar se um dado movimento mi possvel, basta arran.ar um meio de sair verificando um+a+um os movimentos, a partir do primeiro 9mC/ e encontrar o primeiro que pode ser realizado. Ruando isso ocorrer podemos fornecer como resposta o seu ndice. *odemos construir para isso uma rvore de deciso. Na raiz da rvore estar a pergunta M poss5!el reali1ar o mo!imento m"MN $m caso afirmativo 9brao esquerdo da rvore/, mapeamos no valor C e em caso negativo 9brao direito/, o que devemos fazer] Pom, a podemos comear uma nova rvore 9na verdade uma sub+rvore/, cu.a raiz ser) M poss5!el reali1ar o mo!imento m2MN $ da prosseguimos at que todos os movimentos ha.am sido considerados. A rvore resultante ser) Q J B.>.1. 3!&2F23AN&! A O!\Ulm! + Hamos ento e'plorar os recursos da linguagem para transformar nosso plano em um programa que de fato possa ser ;entendido; pelo nosso sistema de programao 9TUGO/. 3omo podemos observar temos aqui o caso de uma funo que no contnua para o domnio do problema. *elo que sabemos at ento, no d para e'pressar a soluo como uma (nica e'presso simples. 7esta+nos o recurso das e'press#es condicionais. *ara verificar se um dado movimento satisfeito podemos usar as fun#es que construmos anteriormente e com isso obtemos a seguinte definio) qualmov ' L M i, pmov ' L t!en 7 else i, smov ' L t!en 2 else i, tmov ' L t!en < else i, qmov ' L t!en = else i, qtmov ' L t!en 4 else i, s'mov ' L t!en > else i, stmov ' L t!en ? else i, omov ' L t!en @ else 3 B.>.>. Anlise da Ooluo + $m primeiro lugar, inclumos a resposta igual a zero 9N/ quando o movimento mJ, o (ltimo a ser avaliado, resulta em fracasso. *ara que serve isso] Acontece que se a posio de entrada no for vlida, ou se.a, uma ou ambas as coordenadas no pertencerem ao intervalo iC, Ja, nenhum movimento seria vlido e se no providenciarmos uma resposta alternativa, nossa funo seria parcial. 6as isto resolve de fato nosso problema] ! que ocorreria se a posio de entrada fosse 9N, N/] Pom, nossa funo determinaria que o primeiro movimento poderia ser realizado e isto no verdade. A inveno de um resultado e'tra para indicar que no h soluo possvel, transformando uma funo parcial em uma funo total, parece ser boa, mas como foi feita no resolveu. $m geral o melhor nestas situa#es preceder toda e qualquer tentativa de determinar a soluo adequada, por uma avaliao da validade dos dados de entrada. Neste Q B caso, bastaria verificar se os dois esto no intervalo iC, Ja. Hamos construir aqui uma funo que avalia a pertin:ncia de um valor a um intervalo numrico, conforme definio a seguir) pert ' a b M 9' ZM a/ gg 9'fMb/ $speculando um pouco mais sobre a nossa soluo, podemos observar que o movimento mO, .amais ocorrer` Analisando os possveis movimentos chegaremos " concluso de que para nenhuma posio, o oitavo o (nico movimento possvel. Ougerimos fortemente que o leitor prove este teorema. *ortanto a soluo final pode ser) qualmov ' L M i, not 9pert ' C J/ LL not 9pert L C J/ t!en 3 else i, pmov ' L t!en 7 else i, smov ' L t!en 2 else i, tmov ' L t!en < else i, qmov ' L t!en = else i, qtmov ' L t!en 4 else i, s'mov ' L t!en > else ? A8=8 #/"ISI$A&*5 5 P#5B/MA 7Q !bservando a soluo encontrada para o problema C, constatamos que embora a noo de movimento do cavalo se.a (nica, quem precisar saber se um dado movimento vlido, precisar conhecer o nome das oito fun#es. $mbora se.a cedo para falarmos de interface homem+ mquina, . d para dizer que estamos sobrecarregando nosso usurio ao darmos oito nomes para coisas to parecidas. Oer que temos como construir uma s% funo para tratar o problema] Hamos reproduzir aqui a interface das oito) +mov ' L smov ' L tmov ' L Nmov ' L Ntmov ' L s;mov ' L stmov ' L omov ' L
*ropositadamente escrevemos o nome delas com um pedao em vermelho e outro em preto. Oeria alguma homenagem " algum time que tem essas cores] S N Na verdade estamos interessados em destacar que a pequena diferena nos nomes sugere que temos uma mesma funo e que e'iste um par0metro oculto. Rue tal e'plicit+lo] *odemos agora ter uma funo com > par0metros, sendo o primeiro deles para indicar o n(mero do movimento que nos interessa. A interface agora seria) mov m ; J Agora, por e'emplo, para solicitar a avaliao do stimo movimento para um cavalo em 9>, ?/, escrevemos) O mov ? < = 4rue ] 6uito bem, e como codificaremos isso] B.?.C. O!\Ulm! + *recisamos encampar em nossa soluo o fato de que a nossa funo possui diferentes formas de avaliao, para diferentes valores do domnio, algo parecido com a soluo do problema 1, ou se.a, a nossa funo no continua e portanto temos que selecionar qual a definio apropriada para um determinado valor de m. &evemos construir uma rvore de deciso. Aqui dei'amos esta tarefa a cargo do leitor e passamos direto " codificao conforme apresentamos a seguir) mo m x y = if #o" (&er" m ' () then False else if m == 1 then &mo else if m == 2 then smo else if m == 3 then "mo else if m == 4 then ,mo else if m == 5 then ,"mo else if m == 6 then sxmo else if m == 7 then s"mo else omo where
&mo = ... smo = ... "mo = ... ... B.?.1. Anlise da soluo + Ao contrrio da soluo do problema 1, onde necessariamente a validade dos movimentos tinha que ser verificada do primeiro para o (ltimo, pois nos interessava saber qual o primeiro possvel de ser realizado, o leitor pode observar que esta ordem aqui no necessria. 4anto faz se perguntamos primeiro se mMS ou se mM>. Oer que podemos tirar algum proveito disso] Alertamos o iniciante, que devemos sempre identificar propriedades S C internas do problema e e'plor+las adequadamente. Rual a influ:ncia desta ordem na efici:ncia da avaliao de uma e'presso submetida ao TUGO] *ara responder, basta lembrar que as condi#es so avaliadas seq<encialmente. *or e'emplo, se mMJ, teremos que avaliar J condi#es, se mMC faremos 1 avalia#es e se m est fora do domnio faremos uma avaliao. !u se.a, no pior caso faremos J avalia#es e no melhor caso uma 9C/. $m mdia, ao longo do uso da funo, assumindo uma distribuio uniforme dos valores de m, faremos ? avalia#es. $ se o intervalo fosse de CNN elementos distintos, quantas avalia#es de condi#es faramos em mdia] Oer possvel elaborar solu#es onde este n(mero de avalia#es se.a menor] A resposta sim` c que a ordem das avalia#es no importa, podemos buscar uma ordem mais conveniente para reduzir o n(mero de avalia#es por cada inst0ncia avaliada. A idia geral para estes casos obtida a partir de um conceito de vasta utilidade na 3omputao. Falamos de r!ore +inria e o leitor por certo ouvir falar muito dela ao longo da vida enquanto profissional da rea. ! caminho consiste em dividir intervalo considerado ao meio e fazer a primeira pergunta, por e'emplo, mfM?] &ividindo em 1 o intervalo de compara#es, para cada um destes podemos novamente dividir ao meio, at que no mais tenhamos o que dividir, como ilustramos no diagrama a seguir, onde cada linha representa um passo da diviso dos intervalos. a7 7 2 < = 4 > ? @ S@ a7 7 2 < = 4 > ? @ S@ a7 7 2 < = 4 > ? @ S@
Rue tambm podemos representar por)
S 1 A codificao ficar ento) mo m x y = i1 #o" (&er" m ' () "7e# False else i1 m != 4 "7e# i1 m!= 2 "7e# i1 m== ' "7e# &mo else smo else i1 m==3 "7e# "mo else ,mo else i1 m!= 0 "7e# i1 m==5 "7e# ,"mo else sxmo else i1 m == < "7e# s"mo else omo 87ere &mo = ... smo = ... "mo = ... ...
Oe fizermos uma anlise das possibilidades veremos que para qualquer valor de m o n(mero m'imo de avalia#es que faremos ser sempre igual a quatro` $ se fosse CNN valores para m, qual seria o n(mero m'imo de compara#es] $ para CNNN] $ CNNNNNN] ! n(mero de compara#es, seguindo este esquema, apro'imadamente igual ao logaritmo do n(mero de valores na base 1. *ortanto para CNN teramos S, para CNNN teramos CN e para um milho teramos 1N. He.a que bem inferior ao que obtemos com o esquema anterior, tambm denominado de linear. 3onfira a comparao na tabela abai'o. n(mero de valores esNuema linear 9n(mero mdio/ esNuema binrio 9n(mero m'imo/ J J ? CNN AN S CNNN ANN CN CNNNNNN ANNNNN 1N S > 738 $.PBAS 73878 I&$#5*.9:5Q At ento trabalhamos com valores elementares. !u se.a, valores at,micos, indivisveis a nvel das opera#es de seu tipo de dados. *or e'emplo, Irue, 523, O23., so valores elementares dos tipos Poolean, 2nteger e Float, respectivamente. No podemos, por e'emplo, nos referir, dentro da linguagem, ao primeiro algarismo do valor 523. &izemos que esses so tipos primitivos da linguagem. Alm desses tr:s, o Tugs prov: ainda o tipo c)ar. ! elenco de tipos primitivos de uma linguagem pode ser entendido como o alicerce da linguagem para a descrio de valores mais comple'os, que so denominados genericamente de !alores estruturados. !s problemas que pretendemos resolver esto em universos mais ricos em abstra#es do que esse das linguagens. *ara descrever esses mundos, precisamos usar abstra#es apropriadas para simplificar nosso discurso. *or e'emplo, quando quero saber onde algum mora, eu pergunto) Rual o seu endere3o] Ruando quero saber quando um amigo nasceu, eu pergunto) Rual a data do seu nascimento] $ quando quero saber para onde algum vai deslocar o cavalo no .ogo de 'adrez, eu pergunto) Rual a nova posi34o] !s nomes endereo, data e posio designam valores estruturados. Uma data tem tr:s partes) dia, m:s e ano. Um endereo pode ter quatro) rua, n(mero, complemento e bairro. c a posio no tabuleiro tem duas partes, linha e coluna. *ara possibilitar a descrio de valores dessa natureza, o Tugs disp#e de um construtor denominado tupla. *odemos definir uma tupla como um agregado de dados, que possui quantidade pr+estabelecida de componentes 9dois ou mais/, e onde cada componente da tupla pode ser de um tipo diferente 9primitivo ou no/. 73828 */FI&I9:5 *5 C5&C/I$5Q A representao de uma tupla feita com a seguinte sinta'e) It7, t2, t<, 888, tnK !nde cada ti um termo da tupla. Oe Ii o tipo de ti, ento o universo de uma tupla dado por) II % I" x I2 x x In Oabendo+se que os con.untos bases dos tipos Ii so ordenados, tambm os elementos de II o sero. S ? $'emplos de 4uplas) Inteno #e+resentao C uma data 9CA, NA, 1NNN/ 1 uma posio no tabuleiro de 'adrez 9>, J/ > uma pessoa 9;6aria Aparecida;, ;solteira;, 9>, N1, CBSN// ? um ponto no espao 9>.N, A.1, >?.A/ A uma carta de baralho 9S, ;espada;/ Q 94rue, >/ S 9False, div A 1/ J 9'KMN gg L KM N, I' Z L, i' 'WL /% N t)en i' ' Z L t)en div ' L else div L ' else NK/ B 9', L, ' I L/ 738<8 C5MP5&*5 $.PBASQ !s e'emplos apresentados . parecem suficientes para que tenhamos entendido como descrever um valor do tipo tupla. Hamos ento apenas comentar sobre os e'emplos e ilustrar o uso de tuplas nas defini#es. Uma tupla um valor composto. 2sto significa que devemos colocar entre par:ntesis e separados por vrgulas os componentes deste valor. 3ada componente um valor, descrito diretamente ou atravs de e'press#es envolvendo operadores. Nos e'emplos de C a S, todos eles usam constantes. ! e'emplo S apresenta um dos valores descrito por uma e'presso. No e'emplo >, um dos termos uma outra tupla. Rualquer termo pode ser uma tupla. Um valor pode tambm ser paramtrico, como no e'emplo B, onde temos uma tupla de > termos, todos eles paramtricos, mas o terceiro depende dos dois primeiros. *odemos dizer que esta tupla descreve todas as triplas onde o terceiro termo pode ser obtido pela soma dos dois primeiros. No e'emplo J podemos observar o uso de e'press#es condicionais. !bserva+se a tambm a descrio de um termo do tipo boolean, atravs de uma e'presso relacional combinada com operadores l%gicos. He.amos agora alguns e'emplos de uso de tuplas na descrio de valores. /;em+lo 7) &ese.amos definir uma funo, para que dados 1 valores, se.a produzido uma tripla onde os dois primeiros termos so id:nticos aos elementos fornecidos, em ordem inversa, e o terceiro termo se.a igual " soma dos dois. S A
"ri&la= a ) = ( )> a> a + ) ) /;em+lo 2Q Hamos definir uma funo que produza o quociente e o resto da diviso inteira de dois n(meros. di?#" a ) = ( ,> r) 87ere , = di a ) r = rem a ) /;em+lo <Q Holtemos " definio das razes de uma equao do 1o. grau. Himos anteriormente que como eram duas, precisvamos definir tambm duas fun#es. Agora podemos agrup+las em uma (nica definio) re2* a ) $ = ( x'> x2) 87ere x' = ((-)) + e)/ du&lo@ x2 = ((-)) - e)/ du&lo@ e = s,r" ()-2 - 4.%+a+$) du&lo@ = 2.% + a S Q /;em+lo =Q Holtemos aos movimentos do cavalo no .ogo de 'adrez. Hamos definir uma funo que produza a nova posio, usando o primeiro movimento vlido segundo o que se discutiu em 7esolvendo *roblemas + !s 6ovimentos do 3avalo.
,Aos x y = i1 1 x2 .. 1 y' "7e# (x2>y') else i1 1 x' .. 1 y2 "7e# (x'>y2) else i1 * x'e .. 1 y2 "7e# (x'e>y2) else i1 * x2e .. 1 y' "7e# (x2e>y') else i1 * x2e .. * y'e "7e# (x2e>y'e) else i1 * x'e .. * y2e "7e# (x'e>y2e) else i1 1 x' .. 1 y2e "7e# (x'>y2e) else (%>%) 87ere x' = x + ' x2 = x + 2 y' = y + ' y2 = y + 2 x'e = x - ' x2e = x - 2 y'e = y - ' y2e = y - 2 1 8 = 8 != ( * 8 = 8 >= ' Rual o valor de q*os C B ] ! que h de errado] 7eescreva q*os de forma a contornar o problema encontrado. 738=8 S/B/CI5&A&*5 $/#M5S */ .MA $.PBAQ Assim com precisamos compor uma tupla na descrio dos mapeamentos de uma funo, tambm precisamos decomp,+la. Ruando uma funo possui tuplas como par0metros, para usar seus termos necessrio que se possa referenci+los.. 2lustraremos aqui vrias formas, utilizando a definio que soluciona o seguinte problema) :esejamos determinar a dist0ncia entre dois pontos no plano C. Utilizando a clusula 7)ere ) dis" &' &2 = s,r" (dx-2 + dy-2) 87ere dx = x' - x2 dy = y' - y2 (x'>y') = &' (x2>y2) = &2 S S !bserve a eleg0ncia da definio da tupla 9'C, LC/` *or anlise da definio, sabemos que o tipo de pC e p1 tupla de 1 termos. Ruando submetemos a avaliao de uma inst0ncia, o sistema casa pC com um par de valores e a partir da pode determinar o valor de cada termo de nossa tupla 9'C, LC/. ? dist (.!." (5.!5." -- o sis"ema $asa &' $om (%.%>%.%) -- e &2 $om (5.%>5.%) -- lo*o x'=%.%> y'=%.%> x2=5.% e y2=5.% 7.717 1. 3onstruindo fun#es seletoras ) &rim (x>y) = x se* (x>y) = y dis" &' &2 = s,r" (dx-2 + dy-2) 87ere dx = &rim &' - &rim &2 dy = se* &' - se* &2 3om esta abordagem, podemos generalizar e construir fun#es seletoras para tuplas com uma quantidade de termos qualquer. - importante destacar que tuplas com quantidade diferente de termos precisam ter o seu pr%prio elenco de fun#es seletoras. $m particular, para o caso acima, onde o n(mero de termos 1, o pr%prio TUGO . possui as fun#es seletoras, fst 9primeiro/ e snd 9segundo/. *oderamos t:+las usado diretamente, mas preferimos ilustrar como se constr%i. *odemos reescrever a soluo usando+as. dis" &' &2 = s,r" (dx-2 + dy-2) 87ere dx = 1s" &' - 1s" &2 dy = s#d &' - s#d &2 >. $'plicitando os componentes) dis" (x'>y') (x2>y2) = s,r" (dx-2 + dy-2) 87ere dx = x' - x2 dy = y' - y2 S J 778 "ABI*A9:5 */ *A*5S 77878 I&$#5*.9:5Q 3omo sabemos, toda funo tem um domnio e um contradomnio. $m Tugs, quando tentamos avaliar uma inst0ncia de uma definio, usando valores fora desse domnio, podemos receber como resposta mensagens nem sempre esclarecedoras. Ruando se trata do usurio de nosso programa, esta situao se mostra mais indese.vel ainda. Aqueles que constroem a definio podem discernir com mais facilidade a natureza dos problemas que ocorrem durante o seu desenvolvimento. ! mesmo no se pode esperar de algum que no tem conhecimento dos elementos internos de nossas defini#es. 4ipicamente os erros sero de duas naturezas. *ode ser que o tipo da inst0ncia este.a correto mas nossa definio use alguma funo primitiva que no se aplica ao valor da inst0ncia. *or e'emplo, se temos a definio)
1 x y z = di x y + z e se a submetemos a uma inst0ncia onde y % (, teremos como resultado algo da seguinte natureza) B 1 5 % 3 Aro*ram error: C5 DdiD %E B Um outro tipo de problema ocorre quando o tipo de algum par0metro da nossa inst0ncia no casa com o tipo inferido pelo Tugs. *or e'emplo, se usamos um valor do tipo >loat para y, obtemos) B 1 5 '.% 3 FGGHG: Ty&e error i# a&&li$a"io# +++ ex&ressio# : 1 5 '.% 3 +++ "erm : '.% +++ "y&e : Floa" +++ does #o" ma"$7 : ?#" B Nesta seo trataremos do primeiro caso, dei'ando o segundo para outra oportunidade. S B 77828 CA#AC$/#IVA&*5 A SI$.A9:5 - Holtemos " definio anteriormente apresentada)
1 x y z = di x y + z Neste caso, o tipo inferido pela linguagem para os dois primeiros par0metros o tipo =nte-er, visto que o operador di! s% se aplica a valores deste tipo. *ortanto o universo ser formado por todos os possveis ternos de valores onde os dois primeiros so do tipo =nte-er e o (ltimo, do tipo obtido pela unio dos tipos >loat e =nte-er 3hamemo+lo de I. $ntretanto, o domnio de nossa funo no e'atamente o con.unto de constantes de I, posto que a funo no est definida para as constantes de I cu.o segundo elemento nulo. &ese.amos construir uma funo que se.a uma e'tenso da funo original e ao mesmo tempo lhe sirva como uma casca de proteo contra as viola#es de domnio. *recisamos escolher um contradomnio da funo estendida 9'x/. Um candidato natural o contradomnio da funo original 9'/. $ a imagem de nossa funo, o que podemos dizer dela] Oer que ela igual ao contradomnio] !u ser que temos um subcon.unto para o qual no e'ista um mapeamento] 778<8 CAS5 )/#AB IIMA)/M I*]&$ICA A5 C5&$#A*5Mb&I5KQ No caso geral, podemos encontrar duas situa#es) ou o contradomnio id:ntico " imagem, ou a determinao dos elementos que no pertencem " imagem pode no ser fcil. 3om isto no dispomos de valores no contradomnio que possam ser utilizados para mapearmos os valores que violam o domnio de f. Neste caso podemos estender o contradomnio 93&/ de tal modo que o novo escolhido incorpore um valor que ser a imagem da e'tenso de f. Uma soluo geral bastante conveniente construir um novo contradomnio 9N3&/ para f' 9e'tenso de f/, formado por pares onde o primeiro elemento do tipo boolean e o segundo do contradomnio de f. 4emos ento a seguinte estrutura) J N NCD(fx) = (boolean, CD(f)) *ara valores de x no domnio de ', teremos) fx x = (True, fx ) *ara os valores de x fora do domnio teremos) fx x = (False, k ) onde 8 um valor qualquer pertencente ao contradomnio de '. *ara o nosso e'emplo inicial teramos ento) fx x y z = i1 invalido x y z "7e# (False,0) else (#r$e! f x y z) 87ere i#alido x y z = ... f x y z = di x y + z - como se estivssemos criando uma casca protetora para a ' 778=8 F.&9D/S F./ AP#/S/&$AM P#5B/MAS /M "6#I5S PA#dM/$#5SQ Ruando uma funo possui vrios par0metros, pode ocorrer que mais de um deles d:em origem " questo que aqui levantamos. Ruando isso ocorre, pode ser relevante caracterizar a situao apropriadamente. Neste caso podemos usar um con.unto de constantes mais variado do que as constantes booleanas, permitindo que possamos associar com cada erro uma constante diferente. *odemos tomar como e'emplo o problema do movimento dos cavalos no .ogo de 'adrez, especificamente a soluo genrica que produzimos com a funo mo! m x y onde m o n(mero do movimento, x a linha atual e y a coluna atual. !s tr:s par0metros so vlidos apenas para o intervalo iC, Ja. *ortanto mo! no est definida para os valores pertencentes ao subcon.unto do universo formado por todas as triplas onde pelo menos um dos elementos no pertence ao intervalo iC, Ja. *or outro lado, o contradomnio con.unto booleano e portanto s% possui 1 constantes, e ambas . esto comprometidas. Oe quisermos distinguir os > tipos de viola#es do domnio 9movimento invlido, posio invlida, ambos invlidos/ precisaremos usar um con.unto com pelo menos ? constantes. J C *odemos ento definir a funo Dmov'E da seguinte forma)
m%&' m x y = i1 #o" alidom "7e# i1 #o" alido& "7e# (3> False) else ('> False) else i1 #o" alido& "7e# (2> False) else (%> m%& m x y) 77848 CAS5 PA#$IC.BA# IIMA)/M *IF/#/&$/ *5 C5&$#A*5Mb&I5KQ Ouponha que e'iste pelo menos um elemento 8 que no pertence " imagem, ou se.a, a imagem est contida no contradomnio. *odemos construir uma e'tenso de ' de tal forma que os elementos que no pertenam ao domnio se.am mapeados neste 8 e os demais se.am mapeados diretamente pela ' . Ruando e'iste tal 8, nosso problema est resolvido. Pasta que o usurio saiba que, quando a avaliao resultar em 8, significa que a funo no se aplica para aquela inst0ncia. Holtemos " funo , introduzida anteriormente. *odemos, usando a proposta desta seo reescrever a sua definio, da seguinte forma)
fx x y z = i1 invalido x y z "7e# k else f x y z 87ere I = ... i#alido x y z = ... f x y z = di x y + z 2nfelizmente, para esse caso, o 8 no e'iste 9prove`/. Holtemos ao movimento do cavalo. Nesse caso, especificamente, porque o contradomnio original o con.unto booleano, poderamos ter tomado outro caminho. *oderamos usar n(meros negativos para indicar os > tipos de violao do domnio, o ( para representar >alse e o " para representar Irue, eliminando com isso a necessidade de termos um novo domnio formado por pares. He.amos como fica esta definio)
m%&' m x y = i1 #o" alidom "7e# i1 #o" alido& "7e# (-3) else (-') else i1 #o" alido& "7e# (-2) else i1 m%& m x y "7e# ' else % J 1 778>8 .M /C/MPB5 - #AIV/S */ .MA /F.A9:5 *5 258 )#A.Q Holtemos ao problema de determinar as razes de uma equao do segundo grau. c sabemos que elas so duas e que podemos fazer uma (nica funo para descrev:+las, usando tupla. Oabemos ainda que o universo definido pelos tipos dos > par0metros 9a, b, c/, maior que o domnio da funo. !u se.a, a funo no est definida para inst0ncias de a, b e c, onde se verifica a seguinte desigualdade) () - 2) + (4 + a + $) ! % *recisamos, portanto de uma funo estendida. re2*x a ) $ = (#o" (del"a ! %)! i1 del"a ! % "7e# (%>%) else (x'> x2)" 87ere del"a = () - 2) + (4 + a + $) x' = ((-)) + s,r" del"a) / (2 + a) x2 = ((-)) - s,r" del"a) / (2 + a) !u, de outra forma) re2*x a ) $ = i1 del"a ! % "7e# (False> (%> %)) else (True> (x'> x2)) 87ere del"a = () - 2) + (4 + a + $) x' = ((-)) + s,r" del"a) / (2 + a) x2 = ((-)) - s,r" del"a) / (2 + a) 778?8 /;ercPcios C. $'plique por que no e'iste o valor V que ap%ie a definio da funo f'5 1. cpo.po. >. *o.po. ?. *o.poi. J > 728 BIS$AS 72878 I&$#5*.9:5Q A maioria dos itens de informao de nosso interesse esto agrupados, dando origem a um conceito muito importante para a resoluo de problemas, o agrupamento. Freq<entemente estamos interessados em manipular esses agrupamentos para e'trair informa#es, definir novos itens ou avaliar propriedades desses agrupamentos. 4ratamos anteriormente das tuplas, que so agrupamentos de tamanho predefinido e heterog:neo, ou se.a, cada elemento que participa do agrupamento pode ser de um tipo diferente. Agora estamos interessados em e'plorar um outro tipo de agregao, as listas. $ste novo tipo, em TUGO, caracteriza+se por agregar quantidades variveis de elementos desde que todos eles se.am de um mesmo tipo. Hivemos cercados de listas. $las esto em qualquer lugar onde precisamos registrar e processar dados. He.amos alguns e'emplos) C. \ista de n(meros pares5 1. \ista dos livros lidos por uma pessoa5 >. \ista dos amigos que aniversariam em um dado m:s5 ?. \ista dos presidentes corruptos5 A. \ista dos vereadores decentes5 Q. \ista das farmcias enganadoras5 S. \ista das disciplinas que . cursei5 J. \ista dos \ugares que visitei5 B. \ista dos n(meros feios5 CN. \ista dos n(meros primos5 CC. \ista das posi#es para as quais um cavalo pode se deslocar5 C1. \ista das palavras de um te'to5 C>. \ista dos bug provocados pelo oindo[s5 C?. \ista dos pr:mios Nobel ganhos pelo Pertrand 7ussel.5 CA. \ista dos ttulos conquistados pelo Nacional Futebol 3lube5 CQ. \istas dos funVs compostos pelo Noel 7osa. &estas, algumas so vazias, outras so finitas e algumas infinitas. 72828 C5&C/I$5S 6SIC5S ) Uma lista uma seq<:ncia de zero ou mais elementos de um mesmo tipo. $ntende+se por seq<:ncia uma quantidade qualquer de itens dispostos linearmente. *odemos representar uma lista pela enumerao dos seus elementos, separados por vrgulas e cercados por colchetes. i e", e2, .., ene J ? *or e'emplo) C. i a 1. iC,>,A,S,Ba >. idad, ded, did, dod, duda ?. i911,N?,CANN/, 9NS,NB,CJ11/, 9>C,N>,CBQ?/a A. iiC,1,A,CNa, iC,CCa, iC,1,>,?,Q,C1a, iC,C>a, iC,1,S,C?a, iC,>,A,CAaa - importante ressaltar que em uma lista podemos falar do primeiro elemento, do quinto, do ensino, ou do (ltimo. !u se.a, h uma correspond:ncia direta entre os n(meros naturais e a posio dos elementos de uma lista. $ste (ltimo fato nos lembra de um equvoco freq<ente, que queremos esclarecer de sada. A ordem que se adota em listas, por ser baseada nos n(meros naturais, comea do zero. !u se.a, o primeiro elemento de uma lista tem o n(mero de ordem igual a zero. *or e'emplo, na relao acima apresentada, a primeira lista vazia. Na lista do item ? o elemento de ordem C a tupla 9NS, NB,CJ11/ e na lista do item A, o elemento de ordem zero 9N/ a lista iC,1,A,CNa. Ruanto ao tipo, podemos dizer que a segunda lista uma lista de n(meros, a terceira uma lista de caracteres, a quarta uma lista de triplas de n(meros e a quinta uma lista de listas de n(meros. Rual ser o tipo da primeira lista] Uma lista vazia de natureza polim%rfica, isto , seu tipo depende do conte'to em que se.a utilizada, como veremos em momento oportuno. 728<8 F5#MAS AB$/#&A$I"AS PA#A */FI&I9:5 */ BIS$ASQ Alm da forma bsica, acima apresentada, tambm conhecida como enumerao, onde e'plicitamos todos os elementos, dispomos ainda das seguintes maneiras) definio por intervalo, definio por progresso aritmtica e definio por compreenso. As duas primeiras formas apresentamos a seguir a terceira posteriormente. *e,inio +or Intervalo &e uma forma geral, podemos definir uma lista e'plicitando os limites inferior e superior de um con.unto conhecido, onde e'iste uma relao de ordem entre os elementos, no seguinte formato) fflimite inferiorZ 88 flimite superiorZe J A $'emplos) abai'o listamos algumas submiss#es de listas definidas por intervalo e as correspondentes respostas do sistema TUGO. 1 (rel$de> 6'..59 6'>2>3>4>59 2 (rel$de> 6-2..29 6-2>-'>%>'>29 3 (rel$de> 6'%..59 69 4 (rel$de> 6-5.%..5.%9 6-5.%>-4.%>-3.%>-2.%>-'.%>%.%>'.%>2.%>3.%>4.%>5.%9 5 (rel$de> 6-'..-59 FGGHG: J#de1i#ed aria)le K..-K 6 (rel$de> 6-'..(-5)9 69 7 (rel$de> 6'.0..'%.%9 6'.0>2.0>3.0>4.0>5.0>0.0><.0>(.0>L.09 ) (rel$de> 6'.5..'%.%9 6'.5>2.5>3.5>4.5>5.5>0.5><.5>(.5>L.5>'%.59 *odemos observar aqui algumas aparentes surpresas) na definio ? podemos observar que o TUGO considera sempre o intervalo de uma unidade entre os elementos da lista definida. Na definio A, temos uma questo de ambig<idade, N sinal de menos logo ap%s os dois pontos no entendido e o sistema sinaliza erro. A definio Q contorna essa dificuldade. &ei'o ao leitor buscar e'plicao para o que ocorre com as defini#es S e J. *e,inio +or Progresso Aritmtica *odemos definir qualquer progresso aritmtica por uma lista utilizando a seguinte notao) ffCo. termoZ, f1o. termoZ 88 flimite superiorZe $'emplos) observemos as defini#es a seguir e as respectivas respostas do sistema TUGO. *odemos perceber que dependendo do segundo termo da definio o sistema interpreta a *.A. como crescente ou decrescente. 1 (rel$de> 6'>2..09 6'>2>3>4>5>09 2 (rel$de> 6-5>2..59 6-5>29 3 (rel$de> 6-5>2..'59 6-5>2>L9 4 (rel$de> 6-5>2..'09 6-5>2>L>'09 5 (rel$de> 6'>'.' .. 29 6'.%>'.'>'.2>'.3>'.4>'.5>'.0>'.<>'.(>'.L>2.%9 6 (rel$de> 60>5..%9 60>5>4>3>2>'>%9 7 (rel$de> 65>0..59 J Q 659 ) (rel$de> 63><..'9 69 728=8 5P/#A9D/S 6SICAS : As listas, como . dissemos, so elementos da linguagem que podemos utilizar para descrever valores estruturados. 3omo nos demais tipos da linguagem, valores descritos por listas podem e devem ser usados na descrio de novos valores atravs da utilizao de opera#es definidas sobre eles. A seguir so apresentadas algumas dessas opera#es. elem Q avalia se um determinado elemento membro de uma lista. elem felementoZ flistaZ /;em+losQ Mai#> elem 5 6-5..'59 True Mai#> elem (-'%) 6-5..'59 False Mai#> elem 2% 6-5..'59 False Mai#> elem '5 6-5..'59 True lengt! Q descreve o tamanho de uma lista. lengt! flistaZ /;em+losQ (rel$de>le#*"7 6'..'%%9 '%% (252( redu$"io#s> 3442 $ells) (rel$de>le#*"7 6'..'%%9 + le#*"7 6'..'%%9 2%% (5%5% redu$"io#s> 0(<3 $ells) (rel$de> a + a 87ere a = le#*"7 6'..'%%9 2%% (253% redu$"io#s> 3442 $ells) inde;ao Q podemos descrever como um novo valor, cada termo de uma lista. *ara tanto basta indicarmos a posio do elemento dentro da lista, considerando que o primeiro elemento tem a ordem zero. flistaZggfndiceZ /;em+losQ J S 1 (rel$de> 63>4>0><4>459**% 3 2 (rel$de> 63>4>0><4>459**4 45 3 (rel$de> 6'>5..2%9**3 '3 4 (rel$de> 666'9>62>3>4999**%**'**2 4 5 (rel$de> 63>4>0><4>459**3 <4 6 (rel$de> 63>4>0><4>459**3 + 62>39**% <0 7 (rel$de> 63>4>0><4>459**(%+') 4 ) (rel$de> 63>4>0><4>459**(i+N) 87ere i=3O N=% <4 + (rel$de> 6(4><0>23>'24><03>239**(6%>'>2>39**2) 23 1 (rel$de> 6'>5..2%9PP5 Aro*ram error: Arelude.PP: i#dex "oo lar*e concat Q descreve uma nova lista obtida pela concatenao de uma lista de listas. concat *lista de listas+ /;em+losQ 1 (rel$de>,%n,at 66'..59>6'>'%..'%%9>6L99 6'>2>3>4>5>'>'%>'L>2(>3<>40>55>04><3>(2>L'>'%%>L9 (4<3 redu$"io#s> <4< $ells) 2 (rel$de>,%n,at 66'99 6'9 (25 redu$"io#s> 35 $ells) 3 (rel$de> len-th (,%n,at 66'..59>6'>'%..'%%9>6L99) '( (45' redu$"io#s> 03( $ells) 4 (rel$de> ,%n,at 66len-th 6'%>(<..5%%99> 6len-th 6'%>(<>5%%999 6<>39 (22( redu$"io#s> 3%L $ells) 5 (rel$de> len-th (,%n,at 66len-th 6'%>(<..5%%99> 6len-th 6'%>(<>5%%999) 2 (3% redu$"io#s> 35 $ells) *ode tambm ser usado com a sinta'e infi'ada usando o operador XX /;em+losQ J J 1 (rel$de> 6'9 ++ 6'9 6'>'9 (33 redu$"io#s> 4( $ells) 2 (rel$de> 6'9 ++ 69 6'9 (23 redu$"io#s> 33 $ells) 3 (rel$de> 6 9 ++ 6 9 FGGHG: Qa##o" 1i#d Ks7o8K 1u#$"io# 1or: +++ Fx&ressio# : 69 ++ 69 +++ H1 "y&e : 6a9 4 (rel$de> 6'..59 ++ 6'>'%..'%%9 ++ 6L9 6'>2>3>4>5>'>'%>'L>2(>3<>40>55>04><3>(2>L'>'%%>L9 (40< redu$"io#s> <3( $ells) construtor Q descreve uma nova lista onde o primeiro termo um dado elemento e os demais so os componentes de uma lista tambm dada.. felementoZ Q flistaZ /;em+losQ 1 (rel$de> 3: 64>5>09 63>4>5>09 2 (rel$de> 639:664>5>099 6639>64>5>099 3 (rel$de> 63: 64>5>099 663>4>5>099 4 (rel$de> 63: 64>5>099PP% 63>4>5>09 5 (rel$de> 63: 64>5>099PP%PP3 0 !ead Q descreve o primeiro elemento de uma lista.. tail Q descreve uma sublista contendo todos os elementos, e'ceto o primeiro elemento de uma lista dada.
4eorema importante) !ead ;s Q Itail ;sK G ;s
last Q descreve o (ltimo elemento de uma lista.. init Q descreve uma sublista contendo todos os elementos, e'ceto o (ltimo elemento de uma lista dada. J B
$eorema im+ortanteQ init xs ++ [last xs] = xs 2mportante) As fun#es head, last, init e tail no possuem em seu domnio a lista vazia. *ortanto ela no deve ser inst0ncia de avaliao para qualquer uma delas. felementoZ Q flistaZ /;em+losQ 1 .$-s> 7ead 6'>2>3>4>5>09 ' 2 .$-s> "ail 6'>2>3>4>5>09 62>3>4>5>09 3 .$-s> "ail 6'>2>3>4>5>09 62>3>4>5>09 4 .$-s> las" 6'>2>3>4>5>09 0 5 .$-s> i#i" 6'>2>3>4>5>09 6'>2>3>4>59 6 .$-s> x == (7ead x : "ail x) 87ere x = 6'%..'59 True 7 .$-s> i#i" 6'%..'59 ++ "ail 6'%..'59 6'%>''>'2>'3>'4>''>'2>'3>'4>'59 72848 */FI&I9:5 P5# C5MP#//&S:5Q Uma lista pode ser descrita atravs da enumerao de seus elementos, como . vimos atravs de vrios e'emplos. $sta forma tambm denominada de definio por e'tenso, visto que todos os componentes precisam ser e'plicitados. *odemos tambm descrever listas atravs das condi#es que um elemento deve satisfazer para pertencer a ela. $m outras palavras, queremos descrever uma lista atravs de uma inteno. $sta forma anloga " que . conhecemos para descrio de con.untos. *or e'emplo, usual escrever a notao abai'o para descrever o con.unto formado pelo quadrado dos n(meros naturais menores que CN. P G H Nuadrado de ; L ; natural e menor Nue 73M ou ainda mais formalmente, P G H ; 2 L ; +ertence a & e ; a73M *odemos observar, no lado direito da definio, que ela formada por duas partes. A primeira uma e'presso que descreve os elementos, usando para isso B N termos variveis que satisfazem condi#es de pertin:ncia estabelecidas pela segunda parte. e'presso 'Y1 varivel ' pertin:ncia ' pertence a N e ' fCN $m nosso caso, no estamos interessados em descrever con.untos e sim listas. $ isso tem algumas implica#es prticas. *or e'emplo, em um con.unto a ordem dos elementos irrelevante, para listas no. - bom lembrar ainda que em uma lista, o mesmo valor pode ocorrer varias vezes, em diferentes posi#es. A sinta'e que usaremos a seguinte) f fe'pressoZ L fpertin:nciaZ e !nde) ae;+ressoS + e'press#es usuais em Tugs para definio de valores, inclusive condicionais. a+ertin0nciaS + descrio dos elementos a serem considerados para avaliao da fe'pressoZ A pertin:ncia formada por uma seq<:ncia de qualificadores de dois tipos de constru#es) os geradores e os predicativos. !s geradores descrevem uma lista de onde se originam os elementos a serem considerados, usando a sinta'e)
/term%> /0 /lista> *or e'emplo, ve.amos a descrio da lista dos quadrados dos n(meros menores que A. Arelude> 6x-2/ x!-6%..499 6%>'>4>L>'09 !s predicativos so e'press#es descrevendo valores booleanos, envolvendo termos . definidos anteriormente 9inclusive por geradores/. He.amos o e'emplo a seguir, onde descrevemos uma sublista de n(meros mpares, tendo como origem de gerao uma lista definida por uma *rogresso Aritmtica. Arelude> 1' 2 '/011!4..13!%dd '3 6'><>'3>'L>25>3'>3<>43>4L>55>0'>0<><3><L>(5>L'>L<9 - importante destacar que as e'press#es de pertin:ncia so avaliadas da esquerda para direita. B C *or e'emplo, se na e'presso acima, primeiro colocssemos a e'presso booleana ;odd ';, o sistema acusaria um erro, visto que ao tentar a avaliar ;odd ';, a varivel ;'; ainda no estaria definida. Arelude> 1' 2 %dd '! '/011!4..133 FGGHG: J#de1i#ed aria)le KxK 2sto s% ocorre porque o sistema usa uma ordem pr+definida` He.amos como usar este novo conceito na escrita de novos scripts. A seguir apresentamos a definio de tr:s novas fun#es. A primeira, sl+ares, define uma sublista formada pelos quadrados dos elementos pares de uma lista dada. A segunda, lmenor, define uma sublista formada pelos elementos de uma dada lista, que so menores que um elemento fornecido. A terceira, +maioresR, ilustra o uso da clusula i,-t!en-else para a gerao de elementos de uma lista. -- Rada uma lis"a ;xs; de1i#a uma su)lis"a 1ormada -- &elo ,uadrado dos eleme#"os ,ue s3o &ares -- slpares 's = 1'42 2 '/0 's! e&en '3 Mai#> :l &re&aralis"a."x" Geadi#* 1ile K&re&aralis"a."x"K: Su*s sessio# 1or: F:TSJU=L(Tli)TArelude.7s &re&aralis"a."x" Mai#> slpares 11!4..53 6'0>'%%>250>4(4><(4>''50>'0%%>2''09 Mai#> slpares 134!67!++!23!12!3!67!++3 6''50>'449 -- -- Re"ermi#ar a su)lis"a de eleme#"os me#ores ,ue ;x; -- em uma lis"a ;xs -- lmen%r ' 's = 1 5 2 5 /0's! 5 / '3 ... Mai#> lmen%r 45 11!5!6!)6!34!76!12!34!)6!++3 6'>5>0>34>'2>349 Mai#> lmen%r 1 11!5!6!)6!34!76!12!34!)6!++3 69 B 1 Mai#> lmen%r 1 11!5!6!)6!34!76!12!34!)6!++3 6'>5>0>(0>34><0>'2>34>(0>LL9 -- -- Re"ermi#ar a lis"a de eleme#"os *erados $o#di$io#alme#"e a uma -- $o#s"a#"e dada I. pmen%res6 6 's = 1 if ' > 6 then '2 else ' 7 2 2 ' /0's3 ... Mai#> pmen%res6 3 11!5!6!)6!34!76!12!34!)6!++3 6'>25>30>((>30><(>'44>30>((>'%'9 Ruando mais de um gerador utilizado, devemos levar em conta que para cada elemento do gerador mais a esquerda sero gerados todos os elementos dos geradores subseq<entes. He.amos o e'emplo a seguir onde se descreve uma lista de pontos do plano cartesiano, localizados no primeiro quadrante e delimitado pelas ordenadas > e A.
-- -- Re"ermi#ar a lis"a dos &o#"os do &la#o de#"ro da -- re*iao de1i#ida &ela ori*em> a $orde#ada (eixo y) -- 5 e a a)s$issa (eixo x) 3. -- p%nt%s = 1 ('!5" 2 ' /0 1..33! 5 /0 1..533 ... Mai#> p%nt%s 1(%>%)>(%>')>(%>2)>(%>3)>(%>4)>(%>5)> ('>%)>('>')>('>2)>('>3)>('>4)>('>5)> (2>%)>(2>')>(2>2)>(2>3)>(2>4)>(2>5)> (3>%)>(3>')>(3>2)>(3>3)>(3>4)>(3>5)3 $ntre dois geradores podemos usar predicativos, como se observa no e'emplo a seguir. B > -- -- Re"ermi#ar a lis"a dos &o#"os do &la#o de#"ro da -- re*iao de1i#ida &ela ori*em> a $orde#ada (eixo y) -- 5 e a a)s$issa (eixo x) 3. Qo#sidere a&e#as os -- &o#"os o#de x V im&ar e y &ar. -- p%nt%s1 = 1 ('!5" 2 ' /0 1..33! %dd '! 5 /0 1..53! e&en 5 3 ... Mai#> p%nt%s1 6('>%)>('>2)>('>4)>(3>%)>(3>2)>(3>4)9 728>8 */FI&I9:5 P5# C5MP#//&S:5 - /CPB5#A&*5 */$AB%/SQ Hamos e'plorar um problema onde e'ista mais riqueza de detalhes quanto ao uso de predicativos. &eterminar os pares de valores, onde) o primeiro m(ltiplo do segundo5 o primeiro dado pelos elementos impares de uma *.A de primeiro termo igual a C, a razo igual > e o ultimo termo menor ou igual a CNN5 o segundo termo dado pelos elementos de uma *.A de primeiro termo igual a C, a razo igual ? e o ultimo termo menor ou igual a AN5 um dos dois diferente da unidade5 os dois termos so diferentes. -- -- @ 1u#23o &aresF> "raduz li"eralme#"e o e#u#$iado. -- @s A.@.;s s3o realizadas dire"ame#"e &elo me$a#ismo -- &ara de1i#i23o de A.@. em)u"ido #a li#*ua*em. -- Hs &redi$a"ios 1oram i#seridos #a &osi23o em ,ue -- suas ariWeis NW es"3o i#s"a#$iadas. -- pares81 = 1 ('!5" 2 ' /0 11!4..13! %dd '! 5 /0 11!5..53! ('9=1 22 59= 1"! '9=5! m%d ' 5 == 3 ... Mai#> pares81 1(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')> (43>')>(4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')> (<L>')>((5>')> ((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')3 He.amos algumas observa#es sobre a soluo acima apresentada) B ? o predicado odd poderia ser colocado em qualquer lugar mais a frente, entretanto o desempenho cairia, visto que iramos produzir valores desnecessrios para ;L;5 a e'presso I;ZG7 LL JZG 7K desnecessria visto que s% ser falsa quando ambos, ' e L, forem iguais a C, mas nesse caso eles sero iguais e portanto falsificariam a e'presso a seguir ;ZGJ5 podemos reescrever a e'presso ; a- f7,=88733e de tal maneira que gere apenas valores impares e assim descartar a e'presso odd ;. *ara tanto basta mudar a *.A. para f7,?88733eh pode+se observar que os valores de J que interessam so sempre menores que os de ; 9 . que J divisor de ;/. *ortanto, a segunda *.A poderia ser substituda por f7,488I;-7Ke. Acontece que agora poderemos geram valores para J maiores que AN e isto no interessa. ! que fazer] Rue tal substitu+ la por) f7, 488Ii, ; a 43 t!en I;-7K else 43Ke $is ento uma nova verso para nossa funo) pares82 = 1 ('!5" 2 ' /0 11!7..13! 5 /0 11!5..(if ' / 5 then ('01" else 5"3! '9=5! m%d ' 5 == 3 *odemos agora refletir sobre uma possvel generalizao para a nossa funo, considerando+se duas listas quaisquer. Neste caso, o esforo realizado para melhorar o desempenho seria em vo porque no conhecemos a priori a natureza das duas listas. Nossa funo poderia ser) pares83 's 5s = 1 ('!5" 2 ' /0 's! %dd '! 5 /0 5s! '9=5! m%d ' 5 == 3 Apenas a e'presso I;ZG7 LL JZG 7K poderia ser eliminada. ! ob.etivo de nossa verso original poderia ser obtido pelo uso da nova funo aplicada "s listas especficas. 3onforme se observa a seguir) Mai#> pares83 11!4..13 11!5..53 6(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')>(43>')> (4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')>(<L>')>((5>')> ((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')9 (16)7) red$,ti%ns! 23++2 ,ells"
B A Agora podemos ainda inspecionar o que de fato acontece com o desempenho das tr:s vers#es.
3oloquemos os valores obtidos em uma tabela. verso redu!es c"lulas #ares$% ((,-4 3((1. #ares$& 1/1(4 ((.14 #ares$' 1$,', (3--( Aqui podemos constatar que a verso pares$>, bastante similar a pares$C, a menos da generalizao, possui efici:ncia bem superior. \embre+se que a (nica diferena a eliminao da comparao dos dois termos com o valor C. *ara ver o que est acontecendo, vamos construir ainda uma outra verso, similar a pares$C, eliminando a comparao citada e descrevendo as *.A.ds fora dos geradores, assimilando+se assim " verso pares$>. He.a que com isso a nova verso, que obtivemos partindo de pares$C, possui efici:ncia similar a pares$>. 3onfirma+se ento a observao de que a definio de listas dentro dos geradores produz perdas.
pares84 = 1 ('!5" 2 ' /0 's! %dd '! 5 /0 5s! '9=5! m%d ' 5 == 3 where 's = 11!4..13 5s = 11!5..53 ... mai#> pares84 6(<>')>('3>')>('L>')>(25>')>(25>5)>(3'>')>(3<>')>(43>')> (4L>')>(55>')>(55>5)>(0'>')>(0<>')>(<3>')>(<L>')>((5>')> ((5>5)>((5>'<)>(L'>')>(L'>'3)>(L<>')9 (16)7) red$,ti%ns! 23++2 ,ells" B Q 728?8 5P/#A9D/S PA#A */$/#MI&A# S.BIS$ASQ $'istem algumas opera#es predefinidas no TUGO para descrevermos sublistas de uma lista dada. Nada que no possa ser feito com o que . apresentamos at aqui. $ntretanto o seu uso pode a.udar na prtica do reuso e contribuir bastante para a clareza de um programa. )ru+o I - Considerando um taman!o es+eci,icado taRe R ;s + define uma lista com os V primeiros elementos de uma lista 's. dro+ R ;s + define uma lista com os elementos de 's, a partir do elemento seguinte aos V primeiros. He.amos a ilustrao a seguir. Arelude> ta6e 3 6%..'%9 1!1!23 ('50 redu$"io#s> 22' $ells) Arelude> dr%p 3 6%..'%9 13!4!5!6!7!)!+!13 (35( redu$"io#s> 5'3 $ells) Arelude> 1's**i 2 i /01..(6 0 1"33 where 's = 1..13: 6 = 3 1!1!23 (24L redu$"io#s> 330 $ells) Arelude> 1's**i 2 i /016..len-th 's 0 133 where 's = 1..13: 6 = 3 13!4!5!6!7!)!+!13 ('5L' redu$"io#s> 2%<2 $ells) Arelude> (ta6e 3 11..13 77 dr%p 3 11..13" == 11..13 #r$e (05( redu$"io#s> L(% $ells) Na verdade podemos escrever uma descrio geral para taVe e drop usando listas por compreenso. Alm disso, sabemos que a concatenao de taVe e drop para um certo V, aplicado " uma lista 's, igual " pr%pria lista. "aIe I xs = 6xsPPi / i !-6%..(I - ')99 dro& I xs = 1's**i 2 i /016..len-th 's 0 133 ale o se*ui#"e "eorema: TaIe I xs ++ dro& I xs = xs )ru+o II - Considerando a satis,ao de um +redicado pred8 "ale lembrar Nue um +redicado uma ,uno cuUo valor resultante do ti+o boolean8 B S taRei!ile +red ;s + define uma lista com os primeiros elementos de uma lista 's satisfazendo o predicado pred. dro+i!ile +red ;s + define uma lista com os elementos de 's, a partir do primeiro elemento que no satisfaz o predicado pred. He.amos a ilustrao a seguir. Arelude> "aIeX7ile ee# 6'..'%9 69 Arelude> "aIeX7ile odd 6'..'%9 6'9 Arelude> dro&X7ile odd 6'..'%9 62>3>4>5>0><>(>L>'%9 Arelude> dro&X7ile ee# 6'..'%9 6'>2>3>4>5>0><>(>L>'%9 Arelude> "aIeX7ile (!5) 6'..'%9 6'>2>3>49 Arelude> dro&X7ile (!5) 6'..'%9 65>0><>(>L>'%9 Arelude> "aIeX7ile (!5) 6'..'%9 ++ dro&X7ile (!5) 6'..'%9 == 6'..'%9 True
/;ercPciosQ jUoU Iono+i 5iUoi+ 'oiU 5ioi IoUo B J 7<8 #esolvendo Problemas com Bistas Neste captulos desenvolveremos a soluo para alguns problemas mais comple'os. A inteno apresentar o uso de estratgias de prop%sito geral que podem ser (teis na resoluo de novos problemas. &iscutimos tambm algumas quest#es relativas ao desempenho das solu#es. 7<87 P#5B/MA 7 Q :ada uma lista, determine o seu maior elemento 3omecemos por definir, usando a linguagem de con.untos, quem este elemento. &izemos que V o maior elemento de um con.unto 3, se e somente se, o subcon.unto de 3 formado por todos os elementos maiores que V vazio. $m linguagem de lista isto equivale a dizer que se 3 uma lista, a sublista de 3 formada pelos caras de 3 maiores que V vazia. He.amos como fica a codificao em TasVell. -- -- de1i#i#do uma 1u#23o &ara de"ermi#ar> em uma lis"a> -- a su)lis"a dos eleme#"os maiores ,ue um dado x -- maiores x xs = 6 y / y !- xs> y > x9 -- -- -- Fm lis"as> &odemos "er eleme#"os re&e"idos> e em &ar"i$ular -- &odemos "er Wrios exem&lares do maior eleme#"o. -- Q7amemos esses $aras de os Kmaiorais da lis"aK. -- Yamos $o#s"ruir uma 1u#23o &ara des$reZ-los. -- maiorais xs = 6 I / I !- xs> maiores I xs == 69 9 -- -- Qomo eles s3o "odos idZ#"i$os &odemos "omar o &rimeiro deles -- $omo solu23o de #osso &ro)lema. -- maximo xs = 7ead (maiorais xs) -- 7<82 P#5B/MA 2Q :ada uma lista, !eri'ique se ela n4o decrescente 3omo aquecimento, vamos considerar listas de n(meros e a noo usual de ordem no decrescente. Nosso problema ) Antes de programar, vamos resgatar a definio de seq<:ncias no decrescentes.
:e'ini34o , Uma seq<:ncia O est em ordem no decrescente se e somente se qualquer um de seus elementos menor ou igual aos seus sucessores. $m B B outras palavras, podemos dizer que a coleo de elementos de O que so maiores que seus sucessores vazia.
-- -- lis"a dos maiores ,ue os su$essores -- lms' xs = 6 xsPPi / i !-6%..le#*"7 xs - 29> N !-6i+'..le#*"7 xs - '9> xsPPi > xsPPN9 -- -- a se,[Z#$ia es"W orde#ada se a lis"a dos eleme#"os -- ,ue s3o maiores ,ue al*um su$essor V azia -- ord' xs = (lms' xs) == 69 ... Mai#> %rd1 11..13 True ('%(%' redu$"io#s> '3(L' $ells) Mai#> %rd1 11!+..13 False (4%5 redu$"io#s> 5<' $ells) 7<8<8 *ISC.$I&*5 /FICI]&CIAQ !bservando a avaliao da funo ord7, apresentada na seo anterior, para uma lista . ordenada, a lista iC,1,>,?,A,Q,S,J,B,CNa, constatamos um n(mero muito grande de redu#es. 3onvm questionar os motivos. Mai#> %rd1 11..13 True ('%(%' redu$"io#s> '3(L' $ells) Mai#> %rd1 11!+..13 False (4%5 redu$"io#s> 5<' $ells) $m geral os motivos para um bai'o desempenho so de duas naturezas) e'plorao inadequada das propriedades do problema e escolha inadequada dos mecanismos da linguagem. A seguir fazemos uma pequena e'plorao desses dois aspectos. 7<8<878 /CPB5#A&*5 P#5P#I/*A*/S *5 P#5B/MA - Analisando a nossa definio anterior constatamos que ela diz mais do que precisamos. $la avalia cada elemento com respeito a todos sucessores. Na verdade, nossa definio pode ser melhorada. Pasta saber que cada elemento tem que ser menor ou igual ao seu sucessor imediato. Hamos reescrever a nossa definio) :e'ini34o , Uma seq<:ncia O est em ordem no decrescente se e somente se qualquer um de seus elementos menor ou igual ao seu sucessor imediato. $m outras palavras, podemos dizer que a coleo de elementos de O que so maiores que seus sucessores imediatos vazia. C NN
He.amos ento a implementao em TasVell e sua aplicao "s mesmas inst0ncias do problema) -- -- lis"a dos eleme#"os maiores ,ue o su$essor imedia"o -- lms2 xs = 6 xsPPi / i !-6%..le#*"7 xs - 29> xsPPi > xsPP(i+')9 -- ord2 xs = (lms2 xs) == 69 ... Mai#> %rd2 11..13 True (2230 redu$"io#s> 2((5 $ells) Mai#> %rd2 11!+..13 False (3'4 redu$"io#s> 44L $ells) *odemos observar uma queda no n(mero de reduHes da ordem de SBj``` *ara o pior caso, ou se.a, quando todos os elementos satisfazem a propriedade estabelecida. No melhor caso, onde o primeiro . no satisfaz a propriedade, a queda foi da ordem de 11j. Na utilizao de clulas, os ganhos foram da mesma ordem. 7<8<828 /CPB5#A&*5 5S M/CA&ISM5S *A BI&).A)/M - Uma outra investida que podemos fazer com respeito ao uso adequado dos mecanismos da linguagem. As solu#es acima apresentadas processam as listas atravs de ndices, ou se.a, fazem um acesso aleat%rio aos elementos da lista. 3omo . foi discutido, o acesso seq<encial possui realizao mais eficiente. -- -- Aara ma#usear os &ares de adNa$e#"es> ao -- i#Vs de usar \#di$es> usemos a 1u#23o ;ip -- a&li$ada a um &ar de lis"as $o#s"ru\das $om )ase em 's -- a)lis"a 1ormada &elos eleme#"os de xs> ex$e"o o ]l"imo> -- ,ue &ode ser o)"ida $om a 1u#23o initO -- ))lis"a 1ormada &elos eleme#"os de xs> ex$e"o o &rimeiro> -- ,ue &ode ser o)"ida $om a 1u#23o tail. -- Qom isso o)"emos uma lis"a 1ormada &elos &ares adNa$e#"es. -- ad<a,entes 's = ;ip (init 's" (tail 's" ... Mai#> ad<a,entes 11..13 6('>2)>(2>3)>(3>4)>(4>5)>(5>0)>(0><)>(<>()>((>L)>(L>'%)9 (4'4 redu$"io#s> (22 $ells) Mai#> ad<a,entes 11!+..13 6('%>L)>(L>()>((><)>(<>0)>(0>5)>(5>4)>(4>3)>(3>2)>(2>')9 (304 redu$"io#s> 00< $ells) -- -- C NC -- @ #oa 1u#23o &ara de1i#ir lis"a dos maiores -- ,ue os su$essores. @*ora "ra)al7aremos $om os &ares -- lms3 &s = 6 (x>y) / (x>y) !- &s> x>y9 -- -- @ #oa ers3o de ;ord; -- ord3 xs = lms3 (adNa$e#"es xs) == 69 ... Mai#> %rd3 11..13 True (3'3 redu$"io#s> 4(3 $ells) Mai#> %rd3 11!+..13 False ((2 redu$"io#s> '45 $ells) ! ganho obtido para a inst0ncia considerada foi de JQj no n(mero de redu#es e de J>j no n(mero de clulas utilizadas, com respeito " segunda definio. /;ercPcios C. \VnVhn 1. \VnlV >. \VhlV ?. llhnlVhlV.pq.oi[eh. A. !ihophp C N1 7=8 Paradigma A+licativo 7=878 I&$#5*.9:5Q A descrio de fun#es, como acontece com outras formas de representao de conhecimento, admite vrios estilos. &ependendo do problema que estamos tratando, um estilo pode ser mais conveniente que outros. *odemos dizer que influi muito na escolha, o quanto dese.amos ou necessitamos, falar sobre como computar uma soluo. A descrio de solu#es tem um espectro de operacionalidade que vai do declarativo at o procedural, em outras palavras, do Nue dese.amos computar ao como queremos computar.. Uma situao que ocorre com freq<:ncia na descrio de fun#es a necessidade de aplicar uma funo, de forma cumulativa, " uma coleo de elementos. $m outras palavras, dese.amos generalizar uma operao para que seu uso se estenda a todos os elementos de uma lista. 3hamemos este estilo de paradigma aplicativo. *or e'emplo, suponha que dese.amos obter a soma de todos os elementos de uma lista. A operao adi34o IXK segundo sabemos, de natureza binria, ou se.a, opera sobre dois elementos produzindo um terceiro. *ara operar sobre todos os elementos de uma lista de forma a obter a soma total, podemos oper+los dois a dois, obtendo com isso resultados intermedirios, que por sua vez podero ser novamente operados e assim sucessivamente at que se obtenha o resultado final. !bservemos o processo para uma inst0ncia) P+ter a soma dos elementos da lista Q5, R, 3, O, "5, "#S *odemos tomar os pares de elementos, primeiro com segundo, terceiro com quarto e assim sucessivamente. e;+resso nova e;+resso reduo X iA, B, >, J, CA, CQa X iC?, >, J, CA, CQa A I B M C? X iC?, >, J, CA, CQa X iC?, CC, CA, CQa > I J M CC X iC?, CC, CA, CQa X iC?, CC, >Ca CA I CQ M >C X iC?, CC, >Ca X i1A, >Ca C? I CC M 1A X i1A, >Ca X iAQa 1A I >C M AQ X iAQa AQ A escolha dos pares, no caso da adio, no importa. As redu#es poderiam ser aplicadas em qualquer ordem, visto que a operao adio comutativa. Oe, pode ser qualquer uma, ento podemos estabelecer uma ordem, como por C N> e'emplo, da esquerda para a direita, usando em cada nova reduo o elemento resultante da reduo anterior.
/;+resso nova e;+resso #eduo X iA, B, >, J, CA, CQa X iC?, >, J, CA, CQa A I B M C? X iC?, >, J, CA, CQa X iCS, J, CA, CQa C? I > M CS X iCS, J, CA, CQa X i1A, CA, CQa CS I J M 1A X i1A, CA, CQa X i?N, CQa 1A I CA M ?N X i?N, CQa X iAQa ?N I CQ M AQ X iAQa AQ $m HBT; e'iste um operador que permite a descrio de computa#es desta natureza. $ste operador denomina+se 'oldl. A sua utilizao requer ainda que se.a indicado um !alor especial para a operao considerada. $ste elemento tomado como ponto de partida para as redu#es, ou se.a, a primeira aplicao da operao sobre o !alor especial e o primeiro elemento da lista. $is a sinta'e) ,oldl foperaoZ fvalor especialZ flistaZ A ordem estabelecida para as redu#es semelhante " ilustrao acima, ou se.a, caminha+se da esquerda para direita, usando o resultado da reduo anterior para a nova reduo. e;+resso nova e;+resso 'oldl op !e i'N, 'C, '1,...,'na op i9op ve 'N/, 'C, '1,...,'na op i9op 9op ve 'N/ 'C/, '1,...,'na op iop99op 9op ve 'N/ 'C/ '1/,...,'na op iop9op99op 9op ve 'N/ 'C/ '1/... 'n/a op9op99op 9op ve 'N/ 'C/ '1/... 'n/ 6erece aqui um destaque, foldl na verdade um funo, com > parametros, sendo que um deles uma outra funo. &izemos neste caso que foldl uma funo de segunda ordem. ! tipo da operao tem que ser)
C N? /alfa> 0> /=eta> 0> /=eta> o#de : !al1a> &ode ser do mesmo "i&o de !)e"a>O !)e"a> "em ,ue ser do "i&o dos $om&o#e#"es da lis"aO o alor es&e$ial V do "i&o !al1a> He.amos ento a definio do operador sum disponvel no TUGO e cu.o ob.etivo a descrio da soma dos elementos de uma lista.
s$m xs = f%ldl (+) % xs 5SQ C. !s operadores infi'ados so indicados entre par:ntesis. 1. ! valor especial o zero, visto que no dese.amos que o valor especial modifique o resultado da soma de todos os elementos. $ntretanto, ele .oga um papel muito especial quando a lista for vazia. &relude> s$m 69 % >. $m e'emplos futuros veremos outros usos para o valor especial. 7=828 AB).MAS 5P/#A9D/S IMP5#$A&$/SQ Assim como a somat%ria, e'istem outras opera#es importantes, de grande utilidade, que podem ser obtidas pelas seguintes equa#es usando 'oldl 00 00 &rodu"o -- alor es&e$ial = ' 00 pr%d$,t xs = f%ldl (+) 1 xs -- -- $o#Nu#23o -- alor es&e$ial = True 00 and xs = f%ldl (..) #r$e xs -- -- disNu#23o -- alor es&e$ial = False 00 %r xs = f%ldl (//) >alse xs /;em+lo 37) Usando DproductE para descrever o fatorial de um n(mero C NA Oabemos que) . fatorial de um n8mero natural n%! 4 igual ao produto de todos os n8meros naturais de 1 at4 n 00 00 de1i#i23o de 1a"orial 00 fat # = pr%d$,t 11..n3 ... ? fat 5 '2% ? fat ' ? fat 1 ' /;em+lo 32) *odemos usar a dis.uno 9or/ generalizada para definir uma funo que avalia se em uma dada lista de n(meros pelo menos um deles impar. 00 00 &elo me#os um im&ar 00 $m?mpar xs = %r 1odd x 2 x !- xs3 ... B $m?mpar 62>2>2>2>2>2>2>29 False B $m?mpar 62>2>2>'>2>2>2>29 True B $m?mpar 69 False
7=8<8 5 M/&5# /B/M/&$5 */ .MA BIS$AQ $stamos interessados em obter uma funo que associe uma lista 's com o elemento de 's que se.a o menor de todos. Anteriormente . apresentamos uma verso para a funo que descreve o maior elemento de uma lista, que bastante similar a esta. Na oportunidade e'ploramos uma propriedade que o elemento maior de todos deve satisfazer. No caso do menor elemento, podemos e'plorar uma propriedade anloga. >m uma lista xs1 di$emos que * 4 o menor elemento de xs1 se e somente se a sublista de xs formada por elementos menores que * 4 7a$ia C NQ -- -- ^me#ores^ des$ree os eleme#"os me#ores ,ue um -- dado x em uma lis"a xs -- men%res x xs = 6 y / y !- xs> y ! x9 -- ^mi#imo^ des$ree a su)lis"a de xs dos eleme#"os -- ,ue #3o &ossuem me#ores ,ue eles em xs -- minim%s xs = 6 I / I !- xs> me#ores I xs == 69 9 -- -- Qomo eles s3o "odos idZ#"i$os &odemos "omar o -- &rimeiro deles -- $omo solu23o de #osso &ro)lema. -- men%r@ xs = 7ead (me#ores xs) Hamos e'plorar agora o problema a partir da generalizao da operao menor8 $m sua forma bsica, a funo menor associa dois n(meros quaisquer com o menor entre eles. *recisamos identificar um elemento que no interfira no resultado para fazer o papel de !alor especial. *ara a operao menor podemos observar que este papel pode ser desempenhado por qualquer um dos elementos da lista, visto que o menor entre dois valores id:nticos o pr%prio valor. 3omo pode ser qualquer um, podemos escolher o primeiro elemento de 's 9head/. -- -- me#or de dois -- men%r x y = if x ! y then x else y -- -- me#or da lis"a -- men%r@ xs = f%ldl me#or (7ead xs)xs ... B men%r@ 65>5>4>4>4>0>0>0>3>3>3>''>'>%9 % ((4 redu$"io#s> '5< $ells) B men%r@ 659 5 (5 redu$"io#s> '3 $ells) B men%r@ 6 9 FGGHG: J#resoled oerloadi#* +++ "y&e : Hrd a => a +++ "ra#sla"io# : me#or_ 69 *odemos observar aqui que a funo menorB parcial pois no se aplica a lista vazia. 7=8=8 I&S/#9:5 5#*/&A*A / 5#*/&A9:5 */ .MA BIS$AQ A ordenao de dados uma das opera#es mais realizadas em computao. &iariamente, em todos os computadores do mundo, faz+se uso intensivo dela. $ste assunto muito especial e por isso mesmo profundamente estudado. 3abe+nos aqui fazer uma C NS breve passagem pelo assunto, sem, contudo nos aprofundarmos nas quest#es de efici:ncia, que central no seu estudo. Oer que podemos usar o conceito de generalizao de uma operao para descrever a ordenao de uma lista] Rue operao seria essa] 7=8=878 I&S/#9:5 /M BIS$A 5#*/&A*A - Hamos comear discutindo uma outra questo mais simples) dada uma lista, com seus elementos . dispostos em ordem no decrescente, como descrever uma lista na mesma ordem, acrescida de um elemento tambm fornecido] *odemos observar que se a lista 's est em ordem no decrescente, com respeito ao elemento ' 9dado/, podemos descrev:+la atravs de dois segmentos) xs % Umenores que x$ ++ Umaiores ou i-uais a x$ *ara acrescentar ' a 's, basta concatenar ' entre os dois segmentos, obtendo a nova lista Ls, assim) ys % Umenores que x em xs$ ++ f;e ++ Umaiores ou i-uais a x em xs$ -- -- i#ser23o orde#ada -- -- ins%rd xs x = ta6eAhile (! x) xs ++ 6x9 ++ dr%pAhile (! x) xs ... Mai#> i#sord 69 '% 6'%9 (2< redu$"io#s> 4L $ells) Mai#> i#sord 6'%9 2% 6'%>2%9 (54 redu$"io#s> (4 $ells) Mai#> i#sord 6'%>2%9 3% 6'%>2%>3%9 (<L redu$"io#s> ''L $ells) Mai#> i#sord 6'%>2%>3%9 5 65>'%>2%>3%9 (<' redu$"io#s> ''% $ells) Mai#> i#sord 65>'%>2%>3%9 25 65>'%>2%>25>3%9 ('20 redu$"io#s> '(3 $ells) 7=8=828 5rdenao + A aplicao sucessiva de insord, conforme ilustrada acima, nos d uma pista para nossa generalizao. *odemos pegar cada elemento da lista a ser ordenada e inseri+lo em ordem em uma outra lista que ser C NJ paulatinamente construda, . ordenada. Hamos seguir o e'emplo acima, onde dese.amos ordenar a lista iCN,1N,>N,A,1Aa)
lista +arcial novo elemento reduo ia CN iCNa iCNa 1N iCN,1Na iCN,1Na >N iCN,1N,>Na iCN,1N,>Na A iA, CN, 1N, >Na iA, CN, 1N, >Na 1A iA, CN, 1N, 1A, >Na ! ponto de partida, neste caso, a lista vazia. Hamos tomar ento a lista vazia como o valor especial. He.amos como fica ento nossa definio para ordenao de listas. -- -- orde#a23o -- %rdena xs = f%ldl i#sord 69 xs ... Mai#> %rdena 6'%>2%>3%>5>259 65>'%>2%>25>3%9 (22% redu$"io#s> 344 $ells) Mai#> %rdena 6'..'%9 6'>2>3>4>5>0><>(>L>'%9 ('%55 redu$"io#s> '5%5 $ells) Mai#> %rdena 6'%>L..'9 6'>2>3>4>5>0><>(>L>'%9 (44( redu$"io#s> <'2 $ells)
7=848 I&"/#S:5 */ .MA BIS$AQ &ada uma lista 's, dese.amos descrever a lista formada pelos elementos de 's tomados em ordem inversa. *ara resolver o problema precisamos inventar uma funo bsica passvel de generalizao. Hamos comear descrevendo a funo insAntes8 C NB -- -- ?#sere um eleme#"o a#"es do &rimeiro eleme#"o -- de uma dada lis"a. Fu#23o similar ao o&erador -- (:) ex$e"o &ela ordem i#er"ida dos &ar4me"ros -- insBntes xs x = x : xs ... Mai#> insBntes 6'..59 % 6%>'>2>3>4>59 ('<' redu$"io#s> 255 $ells) Mai#> insBntes 69 % 6%9 (22 redu$"io#s> 2L $ells) 4entemos agora a generalizao. A inteno incluir cada elemento da lista 's que dese.amos inverter, antes do primeiro elemento de uma lista que iremos construindo gradativamente. ! !alor especial ser a lista vazia. He.amos um e'emplo onde inverteremos a lista iN, C, 1, >, ?a lista +arcial novo elemento reduo ia N iNa iNa C iC, Na C, Na 1 i1, C, Na i1, C, Na > i>, 1, C, Na i>, 1, C, Na ? i?, >, 1, C, Na Hamos ento usar o operador foldl para construir a generalizao dese.ada) -- i#ersao -- in&erte xs = f%ldl i#s@#"es 69 xs ... Mai#> in&erte 6%..49 64>3>2>'>%9 ('<2 redu$"io#s> 25L $ells) Mai#> in&erte 64>3..49 649 (<4 redu$"io#s> ''% $ells) ... Mai#> re&erse 64>3..49 649 (<4 redu$"io#s> ''' $ells) Mai#> re&erse 6%..49 64>3>2>'>%9 ('<' redu$"io#s> 25< $ells) C CN !bserve a similaridade entre o desempenho da funo reverse, pr+definida, com o desempenho da inverte que acabamos de definir.
7=8>8 I&$/#CABA9:5 */ BIS$ASQ &adas duas lista 's e Ls, ambas em ordem no decrescente, dese.amos descrever uma nova lista em ordem no decrescente, formada por todos os elementos das duas listas. Um processo bastante conhecido, chamado de +alance line, consiste em ir transferindo para a nova lista, os elementos de uma das listas de entrada, enquanto estes forem menores que os da outra. Ruando a condio no mais satisfeita, fazemos o mesmo para a outra lista. *or e'emplo, vamos intercalar as listas i1, ?, Q, Ja e iC, >, Aa. He.amos o desenrolar do processo. lista +arcial Andamento em ;s Andamento em Js #eduo ia i1, ?, Q, Ja iC, >, Aa iCa iCa i1, ?, Q, Ja i>, Aa iC, 1a iC, 1a i ?, Q, Ja i>, Aa iC, 1, >a iC, 1, >a i ?, Q, Ja iAa iC, 1, >, ?a iC, 1, >, ?a iQ, Ja iAa iC, 1, >, ?, Aa iC, 1, >, ?, Aa iQ, Ja ia iC, 1, >, ?, A, Qa iC, 1, >, ?, A, Qa i Ja ia iC, 1, >, ?, A, Q, Ja iC, 1, >, ?, A, Q, Ja ia ia Hamos precisar aqui de uma bela engenharia para a construo da funo a generalizar. &esta vez, nossa entrada formada por duas listas e como sabemos o operador ,oldl, a cada vez, processa um elemento de uma determinada lista. 2sto nos leva a ter que inventar tambm a lista a ser processada. A funo bsica pode ser inventada a partir da descrio de um passo do processo que denominamos de +alance line. $m cada passo temos como entrada uma lista parcialmente construda e duas listas parcialmente processadas. 3omo sada teremos mais um passo de construo da lista resultante e o andamento no processamento de uma das listas. Na lista em construo devemos inserir o menor entre os cabeas 9head/ das duas listas. Aquela que tiver o menor cabea dar origem a uma nova lista, da qual foi e'cludo o primeiro elemento, ou se.a, ser id:ntica ao resto 9tail/ da lista escolhida.
C CC -- -- Res$ri23o de um &asso do Bala#$e _i#e. -- ') `ua#do uma das duas lis"as 1or azia a -- ou"ras V dire"ame#"e $o#$a"e#ada #o 1i#al -- da lis"a em $o#s"ru23o. -- pass%C@ (xs>ys>zs) = i1 (ys == 69) "7e# (69>69>zs++xs) else i1 (xs == 69) "7e# (69>69>zs++ys) else i1 (7ead xs != 7ead ys) "7e# ("ail xs>ys>zs++67ead xs9) else (xs> "ail ys>zs++67ead ys9) ... ... a&li$a23o su$essia da 1u#23o pass%C@ a i#"er$ala23o ... das lis"as a$ima &ro&os"as ... Mai#> pass%C@ (62>4>0>(9>6'>3>59>69) (62>4>0>(9>63>59>6'9) ('2' redu$"io#s> 2'L $ells) Mai#> pass%C@ (62>4>0>(9>63>59>6'9) (64>0>(9>63>59>6'>29) ('22 redu$"io#s> 222 $ells) Mai#> pass%C@ (64>0>(9>63>59>6'>29) (64>0>(9>659>6'>2>39) ('23 redu$"io#s> 225 $ells) Mai#> pass%C@ (64>0>(9>659>6'>2>39) (60>(9>659>6'>2>3>49) ('24 redu$"io#s> 22( $ells) Mai#> pass%C@ (60>(9>659>6'>2>3>49) (60>(9>69>6'>2>3>4>59) ('2( redu$"io#s> 23L $ells) Mai#> pass%C@ (60>(9>69>6'>2>3>4>59) (69>69>6'>2>3>4>5>0>(9) (''0 redu$"io#s> 223 $ells) ... Mai#> pass%C@ (6'..59>69>69) (69>69>6'>2>3>4>59) ('L% redu$"io#s> 32L $ells) Mai#> pass%C@ (69>6'..59>69) (69>69>6'>2>3>4>59) ('L3 redu$"io#s> 33L $ells) Mai#> pass%C@ (6'..39>64..59>69) (62>39>64>59>6'9) (2'L redu$"io#s> 3<' $ells) A generalizao, de forma que possamos aplicar a funo gradativamente, de tal forma que todo o processo se complete, requer a inveno de uma lista sobre a qual ocorra a repetio. ! n(mero de aplica#es sucessivas ser no m'imo igual " soma dos comprimentos das listas a serem intercaladas. *odemos ento definir a aplicao sobre a lista dos n(meros de C at a soma dos tamanhos. C C1 -- -- Fu#23o &ara ?#"er$alar duas lis"as orde#adas -- ') a 1u#23o &assoB_ V re&e"idame#"e a&li$ada> so)re -- o resul"ado o)"ido #o &asso a#"eriorO -- 2) a 1u#23o &assoB_ V )i#Wria> $omo exi*ido &or 1oldlO -- 3) a a&li$a23o su$essia V $o#"rolada &elo $om&rime#"o -- da lis"a resul"a#"eO -- 4) o resul"ado 1i#al V o)"ido &ela sele23o do "er$eiro -- eleme#"o da "ri&la a"raVs da &rimi"ia K"7d3K -- =a@ine xs ys = "7rd3 ()a_i#e3 xs ys) -- thrd3 (x>y>z) = z -- =a@ine3 xs ys = 1oldl &assoB_ (xs>ys>69) 6'.."r9 87ere "r = (le#*"7 xs)+(le#*"7 ys) -- -- Res$ri23o de um &asso do Bala#$e _i#e. -- ') `ua#do uma das duas lis"as 1or azia a -- ou"ras V dire"ame#"e $o#$a"e#ada #o 1i#al -- da lis"a em $o#s"ru23o. -- 2) H &ar4me"ro I V a&e#as &ara es"a)ele$er o "i&o -- )i#Wrio exi*ido &or 1oldl -- pass%C@ (xs>ys>zs) I = i1 (ys == 69) "7e# (69>69>zs++xs) else i1 (xs == 69) "7e# (69>69>zs++ys) else i1 (7ead xs != 7ead ys) "7e# ("ail xs>ys>zs++67ead xs9) else (xs> "ail ys>zs++67ead ys9) ... Mai#> thrd3 ('%>2%>3%) 3% ('' redu$"io#s> '2 $ells) Mai#> =a@ine3 6'..39 64..09 (69>69>6'>2>3>4>5>09) (5'4 redu$"io#s> (L0 $ells) Mai#> =a@ine 6'..39 64..09 6'>2>3>4>5>09 (4(5 redu$"io#s> <(4 $ells) Mai#> =a@ine 6'..59 63..<9 6'>2>3>3>4>4>5>5>0><9 ((%< redu$"io#s> '320 $ells) Mai#> =a@ine 62> 4> 0> (9 6'> 3> 59 6'>2>3>4>5>0>(9 (425 redu$"io#s> 0L0 $ells) $'erccios) C. OdVnfvlnlc 1. Fsponmposfdnponsdf >. psnmfdponmposds C C> 748 Processamento de Cadeias de Caracteres 1 +rimeiros +assos 74878 I&$#5*.9:5Q Alm de n(meros, nosso mundo povoado por te'tos. 3ada vez mais se torna presente o uso de computadores para nos au'iliar na tarefa de armazenar, recuperar e processar documentos. Neste captulo estamos interessados em fazer uma breve introduo ao uso de computadores nessas tarefas. ! ponto de partida o tipo caracter 9chr/, que nos permite representar te'tos na mem%ria 9principal e secundria/ dos computadores. Heremos tambm como agrup+los para compor palavras, frases e por fim documentos. 74828 5 $IP5 C%A#) ! tipo char formado por um con.unto de smbolos. Um outro nome usado para esta coleo alfabeto, ou se.a, o con.unto de tomos que serviro de base para a construo de cadeias comple'as, inclusive os te'tos usuais. $ntre os smbolos citados podemos destacar tr:s agrupamentos relevantes, tais como) C. As letras mai(sculas do alfabeto5 1. As letras min(sculas do alfabeto5 >. !s algarismos arbicos5 $stes tr:s agrupamentos gozam de uma propriedade muito importante. &entro deles os smbolos possuem uma relao de ordem, de tal forma que podemos usar a noo usual de ordenao para letras e algarismos. Alm destes, podemos citar ainda os sinais de pontuao e alguns smbolos com fun#es especiais, como, por e'emplo, indicador de final de linha de te'to. !s smbolos so sempre apresentados em TUGO entre aspas simples, para que possam ser diferenciados dos nomes de par0metros, fun#es e outros. *or e'emplo, a letra a deve ser denotada por VaV A definio a seguir a.uda a esclarecer esta necessidade. f a = (a, 'a') Aqui usamos a letra DaE tr:s vezes. A primeira, da esquerda para direita, nomeia um par0metro da funo DfE. Na segunda ocorr:ncia, utilizamos o parametro da funo para se constituir do primeiro elemento de uma tupla. c a terceira ocorr:ncia se refere " constante DaE. He.amos as respostas do sistema para diferentes usos da funo , 1 Dain> 1 3 (3>;a;) C C? 2 Dain> 1 5 (5>;a;) 3 Dain> 1 a FGGHG - J#de1i#ed aria)le KaK 4 Dain> 1 ;a; (;a;>;a;) 5 Dain> 1 ;aa; FGGHG - ?m&ro&erly "ermi#a"ed $7ara$"er $o#s"a#" 6 Dain> 1 ;); (;);>;a;) 7 Dain> 1 a 87ere a=;a; (;a;>;a;) Nas situa#es C, 1, e Q, o parametro a instanciado para os valores >, A e rbe , resultando nos pares 9>, rae/, 9A,eae/ e 9qb, rae/. Na situao ?, o par0metro a instanciado para a constante rae, produzindo o par 9rae, rae/. Na situao >, o uso de a est incorreto, pois como no est entre as aspas simples, interpretado como um par0metro, que no est instanciado quando deveria estar. Na situao S, ao contrrio da situao >, o valor de a instanciado atravs da clusula k!ere e a situao fica similar " situao ?. A coleo total dos smbolos de nosso alfabeto forma uma seq<:ncia de tal forma que podemos fazer o mapeamento entre a subseq<:ncia de n(meros naturais, de zero 9N/ a 1AA e a seq<:ncia de smbolos. &uas fun#es bsicas permitem que se faa a converso entre as duas seq<:ncias) C. A funo c)r associa um n(mero natural no intervalo iN,1AAa com o caracter correspondente. *or e'emplo, c)r Q? M dsd e c)r >J M dgd. 1. A funo ord faz o mapeamento inverso, ou se.a, associa um smbolo com o n(mero natural correspondente. *or e'emplo, ord d]d M Q> e ord djd M >S. A tabela a seguir apresenta alguns dos agrupamentos importantes. Algarismos Betras Mai(sculas Betras Min(sculas
C CA 3( 33 34 3/ 3$ 3' 3, 3- 4. 41 4( 43 44 4/ 4$ 4' 4, 4- /. /1 /( /3 /4 // /$ /' /, /- $. $1 $( $3 $4 $/ $$ $' $, $- '. '1 '( '3 '4 '/ '$ '' ', '- ,. ,1 ,( ,3 ,4 ,/ ,$ ,' ,, ,- -. -1 -( -3 -4 -/ -$ -' -, -- 1.. 1.1 1.( 1.3 1.( 1./ 1.$ 1.' 1., 1.- 11. 111 11( 113 114 11/ 11$ 11' 11, 11- 1(. 1(1 1(( 1(3 1(4 1(/ 1($ Alm das opera#es ord e c!r, podemos contar com os operadores relacionais que foram apresentados no 3aptulo Q. &a mesma forma que e'istem os operadores para comparao de n(meros, e'istem os operadores relacionais que comparam dois smbolos, como no e'emplo) Arelude> ;$; > ;7; False ! significado de uma operao relacional sobre characteres determinado com base na ordem destes com respeito " tabela apresentada para codificao desses smbolos. Assim, podemos dizer que) Oe ' e L so do tipo caractere, ; S J se e somente se ord ; S ord J *odemos agora construir algumas defini#es interessantes, conforme se apresenta nos quadros a seguir.) C CQ -- -- &erifi,a se $m dad% sEm=%l% F letra -- le"ra x = (maius$ula x) // (mi#us$ula x) -- maius$ula x = &er"e#$e x (;@;>;b;) mi#us$ula x = &er"e#$e x (;a;>;z;) &er"e#$e x (a>)) = (x >= a) .. (x != )) -- -- eri1i$a se um s\m)olo V um al*arismo -- al*arismo x = &er"e#$e x (;%;>;L;) -- -- @sso$ia uma le"ra mi#us$ula $om a sua -- $orres&o#de#"e maius$ula e ma#"Vm o -- s\m)olo 1or#e$ido #os demais $asos -- $a&s x = i1 mi#us$ula x "7e# $7r (ord x - 32) else x -- -- Re"ermi#a a &osi23o rela"ia de uma le"ra -- de#"ro do al1a)e"o> o#de as mai]s$ulas e -- mi#]s$ulas &ossuem a mesma &osi23o. -- Hu"ros s\m)olos deem ser asso$iados ao -- alor % (zero) -- ord@l1a x = i1 le"ra x "7e# ord ($a&s x) - 04 else % $is a aplicao em algumas inst0ncias)
$is mais alguns e'emplos de fun#es com o tipo char. -- C CS -- eri1i$a se um s\m)olo V uma le"ra o*al -- &%-al x = le"ra x .. o$orre ($a&s x) o*ais 87ere o*ais = 6;@;>;F;>;?;>;H;>;J;9 -- %,%rre x xs = or 6x == y / y!- xs9 -- -- eri1i$a se um s\m)olo V uma le"ra -- $o#soa#"e -- ,%ns%ante x = le"ra x .. (#o" (o*al x)) -- -- -- Res$ree uma lis"a de &ares o#de o &rimeiro "ermo -- V um #]mero e#"re % e 255 e o se*u#do o $ara$"er -- $orres&o#de#"e. H i#"eralo deseNado V i#1ormado -- &or um &ar de alores #o i#"eralo % a 255. -- ta=GrdHhr (i>1) = 6(x> $7r x) / x !- 6i..199 He.amos alguns e'emplos de uso das defini#es acima apresentadas) Mai#> ta=GrdHhr (05><%) 6(05>;@;)>(00>;B;)>(0<>;Q;)>(0(>;R;)>(0L>;F;)>(<%>;F;)9 (35< redu$"io#s> 0%4 $ells) Mai#> ta=GrdHhr (L<>'%2) 6(L<>;a;)>(L(>;);)>(LL>;$;)>('%%>;d;)>('%'>;e;)>('%2>;1;)9 (35< redu$"io#s> 0%< $ells) Mai#> ta=GrdHhr (45>5%) 6(45>;-;)>(40>;.;)>(4<>;/;)>(4(>;%;)>(4L>;';)>(5%>;2;)9 (35< redu$"io#s> 0%4 $ells) 748<8 5 $IP5 S$#I&)Q *odemos agrupar tomos do tipo caracter 9char/ para formar o que denominamos de cadeia de caracteres, usualmente chamadas de ;palavra;. ! mecanismo para agregar o construtor da lista. *odemos por e'emplo, escrever em TUGO a lista idcd,did,ddd,dad,dnd,did,dada para representar a palavra cidadania Assim procedendo podemos escrever qualquer te'to, uma vez que um te'to no nada mais nada menos que uma longa cadeia de smbolos envolvendo letras e sinais de pontuao. A separao de palavras obtida pelo uso de um caracter especial, denominado de espa3o, que tem representao interna igual a >1. *or e'emplo, para representar a e'presso ;Hamos nessa`;, usamos a lista) fl"l,lal,lml,lol,lsl,l l,lnl,lel,lsl,lsl,lal,lgle8 C CJ Uma boa notcia que o TUGO nos proporciona uma maneira mais amistosa para tratar com lista de caracteres. $m TUGO podemos representar uma lista de caracteres, envolvendo a cadeia por aspas duplas, o que por certo, alm de mais elegante e legvel, no poupa trabalho. *or e'emplo, a cadeia acima representada por ser tambm escrita na seguinte forma) m"amos nessagm 8 uma lista de caracteres o TUGO associa um tipo sin,nimo, denominado strin-. Assim, as duas representa#es acima so id:nticas, conforme podemos observar na avaliao abai'o)
Arelude> KYamos #essaPK == 6;Y;>;a;>;m;>;o;>;s;>; ;>;#;>;e;>;s;>;s;>;a;>;P;9 True (04 redu$"io#s> '%2 $ells) Um bom lembrete que, cadeias de caracteres so definidas como listas, e como tais, podemos usar sobre elas todas as opera#es que sabemos at agora sobre listas. *or e'emplo, podemos construir uma funo para contar a quantidade de vogais e'istente em uma cadeia.
748=8 F.&9D/S 6SICAS PA#A 5 $IP5 S$#I&)Q Uma cadeia de caracteres, por ser uma lista, herda todas as opera#es que . apresentamos para as listas. Alm dessas, podemos contar ainda com algumas opera#es que apresentamos a seguir) kords 's + Associa uma cadeia de caracteres com a lista de pala7ras nela contida. $ntende+se por pala7ra um agrupamento de smbolos diferentes do smbolo espa3o IM MK
Arelude> w%rds K=e "emos ,ue a&re#der a 1azer> amos a&re#der 1aze#doPK 6K=eK>K"emosK>K,ueK>Ka&re#derK>KaK>K1azer>K> KamosK>Ka&re#derK>K1aze#doPK9 (2%'3 redu$"io#s> 3%3( $ells) C CB *odemos observar que os smbolos usuais de separao 9por e'emplo, ;,; e ;g; so considerados como parte das pala7ras. Hamos agora construir uma funo que considere os smbolos usuais de separao, alm do espao. -- -- @ 1u#23o pala&ras -- pala&ras xs = 6 "aIeX7ile le"ra x / x !- 8ords xs9 -- -- -- ... Mai#> pala&ras K=e "emos ,ue a&re#der a 1azer> amos a&re#der 1aze#doPK 6K=eK>K"emosK>K,ueK>Ka&re#derK>KaK>K1azerK>KamosK>Ka&re#derK>K1aze#doK9 (3(0L redu$"io#s> 5444 $ells) Mai#> pala&ras KNose'23 maria450 Noa#aPPPK 6KNoseK>KmariaK>KNoa#aK9 ('445 redu$"io#s> 2%(' $ells) Mai#> w%rds KNose'23 maria450 Noa#aPPPK 6KNose'23K>Kmaria450K>KNoa#aPPPK9 (L5' redu$"io#s> '423 $ells)
&e fato, a funo +alavras trata a questo a que nos prop(nhamos, abandonar os smbolos de pontuao. Acontece que ela abandona muito mais que isso, como podemos ver no e'emplo, onde a cadeia ;.oseC1>; perde o seu sufi'o numrico, tornando+se apenas ;.ose;. Hamos construir uma nova funo ento onde isso possa ser resgatado.
-- -- @ 1u#23o pala&ras1 -- pala&ras1 xs = 6 "aIeX7ile al1a x / x !- 8ords xs9 87ere al1a x = le"ra x // al*arismo x -- -- -- ... Mai#> pala&ras1 Kx'23 y450 auxPPPK 6Kx'23K>Ky450K>KauxK9 Pom, parece que agora temos uma soluo adequada. C 1N /;ercPcios jUbRU jUn 5no 5noi C 1C 7>8 5 PA#A*I)MA #/C.#SI"5 7>878 I&$#5*.9:5Q 3omo . falamos anteriormente, e'istem vrias maneiras de definir um conceito. A essas maneiras convencionamos chamar de paradigmas. Aqui trataremos de mais um destes, o paradigma recursivo. &izer que trataremos de mais um simplificar as coisas, na verdade este paradigma um dos mais ricos e importantes para a descrio de computa#es. ! domnio deste paradigma de fundamental import0ncia para todo aquele que dese.a ser um expert em *rogramao de 3omputadores enquanto ci:ncia e tecnologia. &e uma maneira simplificada podemos dizer que o n(cleo deste paradigma consiste em descrever um conceito de forma recursiva. 2sto equivale a dizer que definiremos um conceito usando o pr%prio conceito. Apesar de disto parecer muito intrigante, no se assuste, aos poucos, quando esboarmos melhor a idia ela se mostrar precisa, simples e poderosa. Hamos pensar num conceito bem corriqueiro. Rue tal definirmos o conceito escada. 3omo podemos descrever escada usando a pr%pria escada] A resposta bem simples) Bma escada i-ual a um de-rau se-uido de uma escada IFigura 7487K8 Fcil no ] Oer que isto basta] !nde est o truque] *arece que estamos andando em crculo, no mesmo] *ara entender melhor vamos discutir a seguir alguns elementos necessrios para a utilizao correta da recurso na definio de novas fun#es. 7>828 */SC#I9:5 #/C.#SI"A */ .M C5&C/I$5 FAMIBIA#Q Antes de avanar em nossa discusso vamos apresentar mais um e'emplo. &esta vez degrau escada escada Figura CA.C X Uma escada C 11 usaremos um que bastante familiar para alunos de ci:ncias e'atas. $stamos falando da descrio do fatorial de um n(mero. c vimos neste curso uma forma de descrever este conceito dentro do TUGO quando estudamos o paradigma aplicativo. Na oportunidade usamos a seguinte descrio) . fatorial de um n8mero natural n % ! 4 igual ao produto de todos os n8meros naturais de 1 at4 n !u ainda em notao mais formal) n ( = % x & x ' x ))) x n $m TUGO, como . vimos, teremos a seguinte definio) 00 00 de1i#i23o (a&li$a"ia) de 1a"orial 00 fat # = pr%d$,t 11..n3 ... ? fat 5 '2% ? fat ' ? fat 1 ' T uma outra forma de definir, tambm familiar aos alunos do primeiro ano universitrio) . Aatorial de um n8mero natural n 4 igual ao produto deste n8mero pelo fatorial de seu antecessor Novamente, sendo mais formal, podemos escrever) n ( = n x (n * %) ( $ em TUGO, como ficaria] Rue tal a definio a seguir] 00 00 de1i#i23o re$ursia de 1a"orial 00 fat # = n I fat (n 0 1" Hamos e'ercitar a definio) C 1> Mai#> fat 5 (23L0< redu$"io#s> 4<L55 $ells) 8RRGR: H%ntr%l sta,6 %&erfl%w Pom, parece que houve um pequeno problema com nossa definio. A avaliao de ,at 4 produziu uma situao de erro. Hamos dei'ar para entender este erro melhor para depois. *or enquanto . podemos adiantar que ele foi provocado por um pequeno esquecimento de nossa parte. Na verdade a nossa definio recursiva para fatorial estava incompleta. $sta que e'ibimos s% se aplica aos naturais maiores que zero. A definio do fatorial de zero no recursiva, ela independente) P 'atorial de 1ero i-ual a " 4emos ento duas defini#es para fatorial e precisamos integr+las. He.amos uma tentativa) . Aatorial de um n8mero natural n 4( C. igual a 1 se n=!9 2 igual ao produto deste n8mero pelo fatorial de seu antecessor1 se n % ! Hamos ver como essa integrao pode ser feita em TUGO. *odemos de imediato observar que trata+se de uma definio condicional e logo nos vem a lembrana de que nossa linguagem possui um mecanismo, as e'press#es condicionais. 00 00 de1i#i23o re$ursia de 1a"orial 00 (corrigida) 00 1a" # = i1 #==% "7e# ' else # + 1a" (# - ') Hamos submeter algumas situa#es para o TUGO) Mai#> fat 5 '2% (<L redu$"io#s> '24 $ells) Mai#> fat 2 2432L%2%%('<004%%%% (25( redu$"io#s> 400 $ells) Mai#> fat ' ('( redu$"io#s> '( $ells) C 1? *elo visto agora deu tudo certo. 7>8<8 /B/M/&$5S */ .MA */SC#I9:5 #/C.#SI"AQ $m uma descrio recursiva devemos ter em conta certo elementos importantes. - fundamental que todos eles se.am contemplados para que nossas descri#es este.am corretas. ! e'emplo anteriormente apresentado suficiente para ilustrar todos eles. Hamos ento discuti+los) *e,inio geral ) 4oda definio recursiva tem duas partes, uma delas se aplica a um valor qualquer do domnio do problema, denominamos de geral. $sta tem uma caracterstica muito importante, o conceito que est sendo definido deve ser utilizado. *or e'emplo, para definir fatorial de n, usamos o fatorial do antecessor de n. !bserve aqui, entretanto que o mesmo conceito foi utilizado, mas no para o mesmo valor. Aplicamos o conceito a um valor mais simples, neste caso o antecessor de n. *e,inio inde+endente Q A outra parte da definio destinada ao tratamento de um valor to simples que a sua definio possa ser dada de forma independente. $ste elemento tambm conhecido como base da recurso. No caso do fatorial, o valor considerado o zero. 5bteno de valores mais sim+les Q *ara aplicar o conceito a um valor mais simples precisamos de uma funo que faa este papel. No caso do fatorial, usamos a subtrao de n por C, obtendo assim o antecessor de n. $m cada caso, dependendo do domnio do problema e do problema em si, precisaremos encontrar a funo apropriada. Funo au;iliar Q Na definio geral, para obter um valor usando o valor considerado e o valor definido recursivamente, em geral faz+se necessrio o uso de uma funo au'iliar. Algumas vezes esta funo pode ser originada a partir de um conceito aplicvel a dois elementos e que dese.amos estender aos elementos de uma lista. Um e'emplo o caso da somat%ria dos elementos de uma lista, como veremos adiante. No caso do fatorial esta funo a multiplicao. )arantia de atingir o valor inde+endente Q - fundamental que a aplicao sucessiva da funo que obtm valores mais simples garanta a determinao do valor mais simples. $ste valor tambm denominado de base da recurso. *or e'emplo, no caso do fatorial, sabemos que aplicando a subtrao sucessivas vezes produziremos a seq<:ncia) n, In-7K, In-2K, 888 3 /sta condi34o 'undamental para -arantir que ao a!aliarmos uma express4o atin-iremos a +ase da recurs4o Holtemos " definio do fatorial para destacarmos os elementos acima citados, como podemos observar no quadro esquemtico a seguir) C 1A 7>8=8 A"ABIA&*5 /CP#/SSD/SQ A esta altura dos acontecimentos a curiosidade sobre como avaliar e'press#es usando conceitos definidos recursivamente . deve estar bastante aguada. No vamos, portanto retardar mais essa discusso. Apresentamos a seguir um modelo bastante simples para que possamos entender como avaliar e'press#es que usam conceitos definidos recursivamente. Novamente no precisaremos entender do funcionamento interno de um computador nem da maneira como uma determinada implementao de TUGO foi realizada. Pasta+nos o conceito de reduo que . apresentamos anteriormente. 7elembremos o conceito de reduo. ! avaliador deve realizar uma seq<:ncia de passos substituindo uma e'presso por sua definio, at que se atin.a as defini#es primitivas e os valores possam ser computados diretamente. Hamos aplicar ento este processo para realizar a avaliao da e'presso 'at 5 +asso #eduo 'usti,icativa C 1Q N,at 4 e'presso proposta C4 W ,at = substituindo fat por sua definio geral 14WI= W ,at <K 2dem >4WI=W I< W ,at 2K/ 2dem ?4WI=WI<WI2 W ,at 7KK/ 2dem A4WI=WI<WI2WI7 W ,at 3K 2dem Q4WI=WI<WI2WI7 W 7KKKK usando a definio especfica S4WI=WI<WI2W7KKK usando a primitiva de multiplicao J4WI=WI<W2K 2dem B4WI=W>K 2dem CN4 W 2= 2dem CC723 2dem Ourpreso9a/] Oimples, no] - assim mesmo, bem simples. A cada passo vamos substituindo uma e'presso por outra at que nada mais possa ser substitudo. ! resultado surgir naturalmente. 6ais tarde voltaremos ao assunto. 7>848 #/C.#S:5 /M BIS$ASQ A esta altura deste curso . estamos certos que o uso de lista indispensvel para escrever programas interessantes. $m vista disso, nada mais %bvio que perguntar sobre o uso de recurso em listas. Heremos que o uso de defini#es recursivas em listas produz descri#es simples, precisas e elegantes. c est na hora de alertar que os valores sobre os quais aplicamos os conceitos que queremos definir recursivamente possuem uma caracterstica importantssima, eles em si so recursivos. *or e'emplo, qualquer valor pertencente aos naturais pode ser descrito a partir da e'ist:ncia do zero e da funo sucessor 9suc/. He.amos como podemos obter o valor A) 5 % suc(suc(suc(suc(suc ())))) As listas so valores recursivos. *odemos descrever uma lista da seguinte maneira) Uma lista ) C. a lista vazia5 1. um elemento seguido de uma lista C 1S $sta natureza recursiva das listas nos oferece uma oportunidade para, com certa facilidade, escrever defini#es recursivas. A tcnica consiste basicamente em) C. !bter a definio geral) isto consiste em identificar uma operao binria simples que possa ser aplicada a dois valores. ! primeiro deles o +rimeiro 9!ead/ da lista e o outro um valor obtido pela aplicao do conceito em definio ao resto 9tail/ da lista5 1. !bter a definio independente, que se aplicar " base da recurso. $sta, em geral, a lista !a1ia5 >. Garantir que a aplicao sucessiva do tail levar " base da recurso. Na Figura CA.1 ilustramos o processo recursivo de obter listas cada vez menores, atravs da aplicao da funo tail. Ao final do processo obteremos a lista vazia 9i a/. /;em+lo 37 + &escrever o somat%rio dos elementos de uma lista. Soluo - *odemos pensar da seguinte maneira) o somat%rio dos elementos de uma lista igual " soma do primeiro elemento da lista como o somat%rio do resto da lista. Alm disso, o somat%rio dos elementos de uma lista vazia igual a zero. f; o , ; 7 , ; 2 , ; < , ; = 888 ; n-7 e ; o f; 7 , ; 2 , ; < , ; = 888 ; n-7 e tail ; 7 f; 2 , ; < , ; = 888 ; n-7 e ; 2 f; < , ; = 888 ; n-7 e ; < f; = 888 ; n-7 e ; = f888 ; n-7 e ; n-7 f e
888 Figura 7482 1 com+onentes recursivos de uma lista !ead C 1J He.amos ento a codificao) 00 00 de1i#i23o re$ursia da soma"cria dos -- eleme#"os de uma lis"a 00 s%mat 's = if n$ll 's then else head 's 7 s%mat (tail 's" A seguir alguns e'emplos de uso) Mai#> soma" 64>5>2><>L9 2< (52 redu$"io#s> 0% $ells) Mai#> soma" 6'..'%9 55 (2<5 redu$"io#s> 42' $ells) Mai#> soma" 6'%%%>LLLL..'9 % (45 redu$"io#s> 0( $ells) Mai#> soma" 6'%%%>LLL..'9 5%%5%% ('(%5' redu$"io#s> 25'2' $ells) /;em+lo 32 + &escrever a funo que determina o elemento de valor m'imo uma lista de n(meros. Soluo) ! m'imo de uma lista o maior entre o primeiro elemento da lista e o m'imo aplicado ao resto da lista. Uma lista que tem apenas um elemento tem como valor m'imo o pr%prio elemento 9Figura CA.>/. ; o X somat f; 7 , ; 2 , ; < , ; = 888 ; n-7 e C 3 X ; 7 X somat f; 2 , ; < , ; = 888 ; n-7 e 888 C 3 X ; 7 X ; 2 X somat f; < , ; = 888 ; n-7 e C 3 X ; 7 X ; 2 X ; < X somat f; = 888 ; n-7 e C 3 X ; 7 X ; 2 X ; < X somat f; = 888 ; n-7 e C 3 X ; 7 X ; 2 X ; < X ; = X somat f888 ; n-7 e C 3 X ; 7 X ; 2 X ; < X ; = X 888 X ; n-7 X somat f e somat f; o , ; 7 , ; 2 , ; < , ; = 888 ; n-7 e Figura CA.1 X desenvolvimento da computao de somat%rio dos elementos de uma lista C 3 X ; 7 X ; 2 X ; < X ; = X 888 X ; n-7 X 3 C 1B A definio recursiva apresentada a seguir) 00 00 de1i#i23o re$ursia do mWximo de uma lis"a 00 ma'im% 's = if n$ll (tail 's" then head 's else mai%r (head 's" (ma'im% (tail 's"" 00 mai%r ' 5 = if ' > 5 then ' else 5 $ vamos acompanhar agora algumas submiss#es) Mai#> ma'im% 14!6!7!)+!32!45!+)!65!313 L( ('20 redu$"io#s> '5% $ells) Mai#> ma'im% (11..1377115!14..13" '5%% (3'4'L redu$"io#s> 4450< $ells) Mai#> ma'im% 11!(1 0 6" .. 13 where 6 = ) '%% (L' redu$"io#s> '25 $ells) $ agora uma surpresa. Mai#> ma'im% 1 3 FGGHG: J#resoled oerloadi#* +++ Ty&e : Hrd a => a +++ Fx&ressio# : maximo 69 Hoc: consegue e'plicar] /;em+lo 3< + &escrever a funo que verifica se um dado valor ocorre em uma lista tambm dada. ma'imo i' o , ' C , ' 1 , ' > , ' ? ... ' n+C a maior9 ' o , ma'imo i' C , ' 1 , ' > , ' ? ... ' n+C a / maior9 ' o , maior9' C , ma'imo i' 1 , ' > , ' ? ... ' n+C a// // maior9 ' o , maior9' C , maior9' 1, ma'imo i' > , ' ? ... ' n+C a /// maior9 ' o , maior9' C , maior9' 1, maior9' >, ma'imo i' ? ... ' n+C a //// maior9 ' o , maior9' C , maior9' 1, maior9' >, maior9' ? , ... ma'imoi' n+1 , ' n+C a///// maior9 ' o , maior9' C , maior9' 1, maior9' >, maior9' ? , ... maior9' n+1 , ma'imoi ' n+C a///// maior9 ' o , maior9' C , maior9' 1, maior9' >, maior9' ? , ... maior9' n+1 , ' n+C ////// Figura CA.> X desenvolvimento da computao do elemento m'imo de uma lista C >N Soluo ) *odemos pensar da seguinte maneira) Um dado elemento V ocorre em uma lista se ele igual ao primeiro elemento da lista ou se ele ocorre no resto da lista. $m uma lista vazia no ocorrem elementos quaisquer 9Figura CA.?/. He.amos ento a codificao) 00 00 des$ree a o$orrZ#$ia de dado I em uma lis"a xs 00 %,%rre 6 's = if n$ll 's then >alse else (6==head('s"" 22 %,%rre 6 (tail 's" $ algumas submiss#es) Mai#> %,%rre 5 6(>05>40>23>LL>359 False (<' redu$"io#s> ''' $ells) Mai#> %,%rre 5 6(>05>40>5>23>LL>359 True (4< redu$"io#s> 5( $ells) Mai#> %,%rre 5 6 9 False ('0 redu$"io#s> 3% $ells) ocorre V i' o , ' C , ' 1 , ' > , ' ? ... ' n+C a V M ' o h ocorre V i' C , ' 1 , ' > , ' ? ... ' n+C a V M ' o h 9V M ' C h ocorre V i' 1 , ' > , ' ? ... ' n+C a/ V M ' o h 9V M ' C h 9 V M ' 1 h ocorre V i' > , ' ? ... ' n+C a// V M ' o h 9V M ' C h 9 V M ' 1 h 9V M ' > h ocorre V i' ? ... ' n+C a/// V M ' o h 9V M ' C h 9 V M ' 1 h 9V M ' > h 9V M ' ? / hh ocorre V i... ' n+C a//// ... V M ' o h 9V M ' C h 9 V M ' 1 h 9V M ' > h 9V M ' ? / h ... ocorre V i' n+C a///// V M ' o h 9V M ' C h 9 V M ' 1 h 9V M ' > h 9V M ' ? / h ... h 9V M ' n+C /h ocorre V i a///// Figura CA.? X desenvolvimento da computao da ocorr:ncia de um elemento em uma lista C >C /;em+lo 3= + &escrever a funo que obtm de uma lista 's a sublista formada pelos elementos que so menores que um dado V ) Soluo ) *recisamos descrever uma nova lista, vamos denomin+la de menores, em funo de 's e de V. Ruem ser esta nova lista] Oe o primeiro elemento de 's for menor que V, ento ele participar da nova lista, que pode ser descrita como sendo formada pelo primeiro elemento de 's seguido dos menores que V no resto de 's. Oe por outro lado o primeiro no menor que V, podemos dizer que a lista resultante obtida pela aplicao de menores ao resto da lista. Novamente a base da recurso definida pela lista vazia, visto que em uma lista vazia no ocorrem elementos menores que qualquer V. A codificao apresentada a seguir) 00 -- de1i#e a lis"a de me#ores ,ue um dado eleme#"o em -- uma lis"a dada 00 men%res 6 's = if n$ll 's then 's else if head 's / 6 then head 's : men%res 6 (tail 's" else men%res 6 (tail 's" &esta podemos obter as seguintes avalia#es) Mai#> men%res 23 6(>05>40>5>23>LL>359 6(>59 ('22 redu$"io#s> '(( $ells) Mai#> men%res 40 6(>05>40>5>23>LL>359 6(>5>23>359 ('35 redu$"io#s> '<5 $ells) Mai#> men%res 5 69 69 ('< redu$"io#s> 24 $ells) 7>8>8 /CPB5#A&*5 #/.S5Q Oegundo o *rofessor George *olLa, ap%s concluir a soluo de um problema, devemos levantar questionamentos a respeito das possibilidades de generalizao da soluo obtida. &entro deste esprito, vamos e'plorar um pouco a soluo obtida para o problema descrito a seguir. /;em+lo 4 ISub-lista de n(meros +aresK ) &ada uma lista 's, dese.amos descrever uma sublista de 's formada apenas pelos n(meros pares e'istentes em 's. Soluo) &evemos considerar, como no problema de encontrar a sublista dos menores 9$'emplo ?/, a e'ist:ncia de suas situa#es) C >1 C. ! primeiro elemento da lista um n(mero par, neste caso a sublista resultante dada pela .uno do primeiro com a sublista de pares e'istente no resto da lista. 1. ! primeiro no par. Neste caso a sublista de pares em 's obtida pela seleo dos elementos pares do resto de 's. 3oncluindo, tomemos como base da recurso a lista vazia, que obviamente no contm qualquer n(mero. $is a soluo em TUGO)
00 00 su)lis"a de #]meros &ares 00 slpares 's = if n$ll 's then 's else if e&en (head 's" then head 's : slpares (tail 's" else slpares (tail 's" $ a avaliao de algumas inst0ncias) Mai#> slpares 6'..'%9 12!4!6!)!13 (322 redu$"io#s> 43( $ells) Mai#> slpares 6'>3..'%%9 13 (L02 redu$"io#s> ''(3 $ells) Hamos agora, seguindo as orienta#es do mestre *olLa, buscar oportunidades de generalizao para esta funo. *odemos fazer algumas perguntas do tipo) C. 3omo faria uma funo para determinar a sublista dos n(meros mpares a partir de uma dada lista] 1. $ se quisssemos a sublista dos primos] >. $ que tal a sublista dos m(ltiplos de cinco]
Uma breve inspeo na soluo acima nos levaria a entender que a (nica diferena entre as novas fun#es e a que . temos a funo que verifica se o primeiro elemento satisfaz uma propriedade, no caso presente a de ser um n(mero par 9even/, conforme destacamos a seguir)
C >> 00 00 su)lis"a de #]meros &ares 00 slpares 's = if n$ll 's then 's else if e&en (head 's" then head 's : slpares (tail 's" else slpares (tail 's" 00 00 su)lis"a de #]meros im&ares 00 slimpar 's = if n$ll 's then 's else if %dd (head 's" then head 's : slimpar (tail 's" else slimpar (tail 's" 00 00 su)lis"a de #]meros &rimos 00 slprim% 's = if n$ll 's then 's else if prim% (head 's" then head 's : slprim% (tail 's" else slprim% (tail 's" 2sto nos sugere que a funo avaliadora pode ser um par0metro. *ois bem, troquemos ento o nome da funo por um nome mais geral e adicionemos " sua interface mais uma par0metro. $ste par0metro, como sabemos, dever ser do tipo)
alfa 0> C%%lean He.amos ento o resultado da codificao, onde a propriedade a ser avaliada se converte em um par0metro) 00 00 su)lis"a de eleme#"os de xs ,ue sa"is1azem 00 a &ro&riedade pr%p 00 s$=lista pr%p 's = if n$ll 's then 's else if pr%p (head 's" then head 's : s$=lista pr%p (tail 's" else s$=lista pr%p (tail 's" He.amos ento algumas aplica#es na nossa funo genrica para determinar sublistas) C >? Mai#> su)lis"a e&en 6'..'%9 62>4>0>(>'%9 Mai#> su)lis"a %dd 6'..'%9 6'>3>5><>L9 Mai#> su)lis"a (/5" 6'..'%9 6'>2>3>49 Mai#> su)lis"a (>=5" 6'..'%9 65>0><>(>L>'%9 !bserve que a funo que havamos anteriormente definido para determinar os elementos menores que um certo valor V, da mesma forma que a funo para determinar os maiores que V, est contemplada com a nossa generalizao. As duas (ltimas avalia#es no quadro acima ilustram a determinao da sublista dos valores menores que A e a dos maiores ou iguais a A. /;ercPciosQ &escreva fun#es em TUGO que utilizem recurso para resolver os problemas abai'o. C. !bter a interseo de duas listas 's e Ls. 1. &adas duas strings 's e Ls, verificar se 's prefi'o de Ls. >. &adas duas strings 's e Ls, verificar se 's sufi'o de Ls. ?. &adas duas strings 's e Ls, verificar se 's sublista de Ls. A. inverter uma lista 's5 Q. &efinir a funo tohile, que tenha o mesmo comportamento que a funo taVeohile. S. &efinir a funo dohile, que tenha o mesmo comportamento que a funo dropohile. J. verificar se uma string um palndrome 9a string a mesma quando lida da esquerda para a direita ou da direita para a esquerda/. B. Herifique se uma string uma palavra. &efina uma palavra como formada apenas por letras. CN. verificar se os elementos de uma lista so distintos. CC. determinar a posio de um elemento ' em uma lista 's, se ele ocorre na lista. C1. descrever a lista das palavras que e'istem no te'to, dado um te'to. C>. &adas duas listas 's e Ls, ordenadas em ordem crescente, obter a lista ordenada resultante da intercalao de 's e Ls. C?. calcular a combinao de uma lista 's, p a p. C >A CS. !7&$NAlm! 7$3U7O2HA &$ &A&!O, A\GUNO *7!P\$6AO 3!77$\A4!O $ A\GU6AO 4-3N23AO &$ *7!*tO24! G$7A\ 7?87 1 I&$#5*.9:5Q Holtemos ento ao problema de ordenar os elementos de uma lista, para o qual . discutimos uma soluo no paradigma aplicativo. :ada uma lista xs desejamos descre!er sua ordena34o Hamos comear propondo e resolvendo um problema mais simples. Insero ordenada) &ada uma lista ordenada 's e um elemento V dese.amos descrever uma lista a partir de 's, na qual este.a includo o valor V, com a condio de que a nova lista tambm este.a ordenada. Soluo ) Holtemos a nossa estratgia para obter solu#es recursivas. Aqui tambm temos dois casos) C. ! valor V menor que o primeiro da lista 's, neste caso a lista resultante descrita pela .uno de V com a lista 's5 1. ! valor V maior ou igual ao primeiro elemento da lista 's, neste caso a lista resultante descrita pela .uno do primeiro da lista 's com a lista obtida pela insero ordenada de V no resto da lista 's. A codificao pode ser realizada da seguinte forma) -- -- i#ser23o orde#ada de um alor I em uma -- lis"a orde#ada (#3o de$res$e#"e) -- i#sord I xs = i1 #ull xs "7e# 6I9 else i1 I ! 7ead xs "7e# I : xs else 7ead xs : (i#sord I ("ail xs)) V f ' N V ) Us 3aso contrrio ' N ) insord V
Us insord R Cs G Figura CS.C X insero ordenada de um elemento V em uma lista Us C >Q $ a seguir algumas aplica#es da soluo) Mai#> ins%rd 5 6%>2..'%9 1!2!4!5!6!)!13 (23% redu$"io#s> 4%< $ells) Mai#> ins%rd 5 6'%>'5..5%9 15!1!15!2!25!3!35!4!45!53 (24( redu$"io#s> 3<L $ells) Mai#> ins%rd 5 6-'%>'5..%9 101!53 (L2 redu$"io#s> '35 $ells) Mai#> ins%rd 5 6-'%>-5..%9 101!05!!53 ('54 redu$"io#s> 22% $ells) Mai#> ins%rd 5 69 153 (23 redu$"io#s> 32 $ells) Agora . podemos voltar ao nosso problema inicial de ordenao de listas. Hamos em busca de uma primeira soluo) Soluo Q A ordenao no decrescente de uma lista 's qualquer igual " insero ordenada do primeiro da lista na ordenao do resto da lista. -- -- orde#a23o de uma lis"a -- orde#a xs = i1 #ull xs "7e# xs else i#sord (7ead xs) (orde#a ("ail xs)) He.amos a aplicao da soluo " algumas inst0ncias) Mai#> %rdena 63> 4> 5%>3%>2%>34>'59 13!4!15!2!3!34!53 (24' redu$"io#s> 33% $ells) Mai#> %rdena 6'%%>L3..5%9 151!5)!65!72!7+!)6!+3!13 (50( redu$"io#s> <(% $ells) C >S 7?82 *I"IS:5 / C5&F.IS$A I.MA $EC&ICA P5*/#5SAKQ Alguns problemas possuem solu#es mais facilmente descritas, algumas at mais eficientes, quando quebramos o problema em partes menores, descrevemos a soluo de cada parte e depois combinamos as solu#es parciais para obter a soluo completa. $ste mtodo denominado de ;diviso e conquista;. Pasicamente buscamos encontrar inst0ncias do problema onde a soluo se.a imediata. . Nesta seo veremos alguns e'emplos desta abordagem. ! primeiro deles, a pesquisa binria, trata da busca de um elemento em uma lista ordenada. !s outros dois, mergesort e quicVsort, apresentam solu#es alternativas para a ordenao de uma lista. 7?82878 P/SF.ISA I&6#IA - Holtemos a um problema . apresentado anteriormente, verificao da ocorr:ncia de um elemento a uma lista. Oegundo a definio que apresentamos para a funo ocorre, apresentada no e'emplo > do 3aptulo CQ. *odemos constatar que para avaliar e'press#es onde o elemento procurado no ocorre na lista, o avaliador de e'press#es precisar fazer uma quantidade de compara#es igual ao comprimento da lista considerada. Na mdia de um con.unto de avalia#es, considerando as avalia#es de e'press#es em que o elemento procurado est na lista, e que a cada vez estaremos procurando por um elemento distinto, teremos um n(mero mdio de compara#es da ordem de 9n Z 2/. Oe n for muito grande ficaremos assustados com o n(mero de compara#es. *or e'emplo, para uma lista de CNNNNNN 9um milho/ de elementos, em mdia teremos que fazer ANN mil compara#es. Oe pudermos garantir que a lista est ordenada, ento podemos fazer uso de uma estratgia . discutida anteriormente para reduzir este n(mero. $stamos falando da rvore binria de pesquisa. A estratgia que usaremos consiste em, a cada passo de reduo, abandonarmos metade da lista considerada a partir da comparao de V com o elemento que se encontra na metade da lista. Oe o elemento buscado 9V/ for igual ao elemento central, ento o processo de avaliao est encerrado. Ruando isto no ocorre, devemos ento escolher em qual lista devemos procur+lo. Ruando ele menor que o elemento central devemos busc+ lo na sublista que antecede o central, caso contrrio devemos busc+lo na sublista dos seus sucessores. Novamente a base da recurso determinada pela lista vazia. Nesta abordagem, a cada escolha abandonamos metade da lista restante. &esta forma, o n(mero de compara#es dado pelo tamanho da seq<:ncia)
n+%, n+&, n+,, ))) , n+n *ara simplificar a anlise podemos escolher um n que se.a pot:ncia de 1. Neste caso podemos assegurar que o comprimento da seq<:ncia dado por)
-o. n na base & C >J Holtando ento ao n(mero de compara#es necessrias para localizar um elemento, podemos constatar que em uma lista com C milho de elementos, ao invs das ANN mil compara#es da soluo anterior, precisaremos no pior caso, de apenas 1N compara#es. 2sso mesmo, apenas 1N. Hamos ento " codificao em TUGO)
-- -- &es,uisa )i#Wria -- &es,)i# I xs = i1 #ull xs "7e# False else i1 I == &io" "7e# True else i1 I ! &io" "7e# &es,)i# I me#ores else &es,)i# I maiores 87ere & = di (le#*"7 xs) 2 me#ores = "aIe & xs maiores = "ail (dro& & xs) &io" = 7ead (dro& & xs) $ a seguir, a avaliao de algumas inst0ncias) Mai#> %,%rre '%23 6%..'%239 True (245L2 redu$"io#s> 32<L< $ells) Mai#> pesJ=in '%23 6%..'%239 True (<'503 redu$"io#s> L2%0% $ells) 7?8282 M/#)/S5#$ - $'istem outras maneiras de se descrever a ordenao de uma lista. Uma delas, denominada mer-esort, se baseia na intercalao de duas listas . ordenadas. 3omecemos ento por discutir a intercalao que, em si mesmo, . representa uma ferramenta intelectual bastante interessante. IntercalaoQ Antes de ver o mergesort podemos apresentar uma verso recursiva para a intercalao de duas listas em ordem no decrescente. Soluo) A intercalao de duas listas ordenadas xs e ys pode ser descrita atravs de dois casos) C. se o primeiro elemento de xs menor que o primeiro elemento de ys ento a intercalao dada pela .uno do primeiro elemento de xs com a intercalao do resto de xs com ys5 1. caso contrrio, a intercalao descrita pela .uno do primeiro elemento de ys com a intercalao do resto de ys com xs5 C >B A codificao resultante pode ser observada a seguir) -- -- ?#"er$ala duas lis"as em ordem #3o de$res$e#"e -- i#"er$ala xs ys = i1 (#ull xs) // (#ull ys) "7e# xs ++ ys else i1 7ead xs != 7ead ys "7e# 7ead xs : i#"er$ala ("ail xs) ys else 7ead ys : i#"er$ala xs ("ail ys) $ a seguir, algumas submiss#es e avalia#es do TUGO) Mai#> inter,ala 6'>3..'%9 6%>2..'%9 1!1!2!3!4!5!6!7!)!+!13 Mai#> inter,ala 6%>2..'%9 6'>3..'%9 1!1!2!3!4!5!6!7!)!+!13 Mai#> inter,ala 6%>2..'%9 69 6%>2>4>0>(>'%9 Mai#> inter,ala 69 69 FGGHG: J#resoled oerloadi#* +++ Ty&e : Hrd a => 6a9 +++ Fx&ressio# : i#"er$ala 69 69 Mai#> inter,ala 69 6%>2..'%9 1!2!4!6!)!13 Mai#> inter,ala 6%>2..'%9 6%>2..'%9 1!!2!2!4!4!6!6!)!)!1!13 Mai#> inter,ala 6L><..'9 6'%>(..'9 1+!7!5!3!1!1!)!6!4!23 (o ,ue 7oue ,ue #3o 1i$ou orde#adaB) Holtemos ao mergesort, ou, em bom portugu:s, ordenao por intercalao. Soluo ) A ordenao de uma lista por mergesort igual " intercalao do mergesort da primeira metade da lista com o mergesort da segunda metade. $sta soluo e'plora a noo de rvore binria. Neste caso, a lista original dividida em 1 partes, cada uma delas em outras duas e assim sucessivamente at que esta quebra no se.a mais possvel. A figura Fig. CS.C ilustra o processamento da ordenao de uma lista.
C ?N He.amos ento como fica a codificao em TUGO. -- -- orde#a uma lis"a &ela i#"er$ala23o da orde#a23o de -- suas duas me"ades -- mer*esor" xs = i1 #ull ("ail xs) "7e# xs else i#"er$ala (mer*esor" m) (mer*esor" #) 87ere m = "aIe I xs # = dro& I xs I = di (le#*"7 xs) 2 C ?C Mai#> mer-es%rt 6'..'%9 6'>2>3>4>5>0><>(>L>'%9 ('5L3 redu$"io#s> 2'(5 $ells) Mai#> mer-es%rt 6'%>L..'9 6'>2>3>4>5>0><>(>L>'%9 ('04' redu$"io#s> 2230 $ells) 7?828<8 F.ICjS5#$ - $'iste uma maneira muito famosa de resolver o mesmo problema de ordenao, usando ainda a noo de diviso e conquista, muito parecida com o mergesort. 2mplementa#es desta soluo reduzem sensivelmente o n(mero de compara#es necessrias e so, portanto muito utilizadas. Soluo ) Na verso usando o mergesort dividamos a inst0ncia original e'atamente ao meio. Nesta vamos dividir tambm em duas, mas com seguinte critrio) a primeira com os elementos menores que um elemento qualquer da lista e a segunda com os elementos maiores ou iguais a ele. $ste elemento denominado pi!ot e e'istem vrias formas de escolh:+lo. A melhor escolha aquela que produzir as sublistas com comprimentos bem pr%'imos, o que repercutir no desempenho da avaliao. Aqui nos limitaremos a escolher como pivot o primeiro elemento da lista. Assim sendo, ap%s obter a ordenao das duas listas, basta .untar a ordenao da primeira, com o pivot e finalmente com a ordenao da segunda. A figura Fig. B.1 ilustra a aplicao do quicVsort a uma inst0ncia do problema. C ?1 $ a seguir ve.amos a codificao. ,ui$Isor" xs = i1 (#ull xs) // (#ull ("ail xs)) "7e# xs else ,ui$Isor" (su)lis"a (! &io") ("ail xs)) ++ 6&io"9 ++ ,ui$Isor" (su)lis"a (>= &io") ("ail xs)) 87ere &io" = 7ead xs 3onvidamos o leitor a apreciar e discutir a eleg0ncia, a compacidade e a clareza da descrio do quicVsort. C ?> He.amos a avaliao de algumas inst0ncias) Mai#> J$i,6s%rt 64>5>0><>(>3>2>'9 6'>2>3>4>5>0><>(9 (5L5 redu$"io#s> <55 $ells) Mai#> J$i,6s%rt 6'..'%9 6'>2>3>4>5>0><>(>L>'%9 ('530 redu$"io#s> '((' $ells) Mai#> J$i,6s%rt 6'%>L..'9 6'>2>3>4>5>0><>(>L>'%9 ('54' redu$"io#s> 'L52 $ells) Mai#> mer-es%rt 6'%>L..'9 6'>2>3>4>5>0><>(>L>'%9 ('04< redu$"io#s> 22(3 $ells) Mai#> mer-es%rt 's == J$i,6s%rt 's 87ere xs = 6'..'%9 True (2(%5 redu$"io#s> 3503 $ells) Mai#> mer-es%rt 62>'4>'0>23>2L>35>4<>0(><%>L%9 62>'4>'0>23>2L>35>4<>0(><%>L%9 ('4'4 redu$"io#s> 'L22 $ells) Mai#> J$i,6s%rt 62>'4>'0>23>2L>35>4<>0(><%>L%9 62>'4>'0>23>2L>35>4<>0(><%>L%9 ('35< redu$"io#s> '0'( $ells) Mai#> %rdena 62>'4>'0>23>2L>35>4<>0(><%>L%9 62>'4>'0>23>2L>35>4<>0(><%>L%9 (230 redu$"io#s> 330 $ells) 7?8<8 P#5C/SSAM/&$5 */ CA*/IAS */ CA#AC$/#/SQ As cadeias de caracteres, como . vimos, tambm so listas, portanto o uso de recurso com cadeias segue as mesma recomenda#es. *ara ilustrar vamos apresentar alguns e'emplos. /;em+lo 37 + i*alndromoa &ada uma cadeia de caracteres verifique se um palndromo. Oegundo o dicionrio, um palndromo uma frase ou palavra, que no importando o sentido que se l:, significa a mesma coisa. *or e'emplo, ;Oocorram+me subi no unibus em 6arrocos;. He.am que a quantidade de espaos, os separadores e os trminos de palavra no so considerados. Aqui vamos tratar a questo de forma simplificada, os separadores sero tratados como caracteres comuns. Soluo Q Neste caso, importante observar que podemos olhar a cadeia como sendo formada por pares de valores eq<idistantes dos e'tremos. Um cadeia palndromo se os seus e'tremos so iguais e o meio da lista um palndromo. A base da recurso so as cadeias vazias ou aquelas com apenas um elemento. C ?? Figura CS.C X desenvolvimento da computao da funo palndromo He.amos ento a codificao em TUGO e a avaliao para algumas inst0ncias.
$ agora uma avaliao de algumas listas candidatas a palndromo) -- -- Yeri1i$a se uma se#"e#2a V Aal\#dromo -- -- &ali#dromo xs = i1 #ull xs // #ull ("ail xs) "7e# True else (7ead xs == las" xs) .. &ali#dromo (meio xs) 87ere meio xs = i#i" ("ail xs) Oeguindo nosso padro de apreentao,ve.amos como ficam algumas avalia#es) Mai#> palindr%m% Kso$orrammesu)i#oo#i)usemmarro$osK #r$e (0(< redu$"io#s> 0L( $ells) Mai#> palindr%m% Kso$orram-me su)i #o o#i)us em marro$osK >alse ((L' redu$"io#s> L%< $ells) Mai#> palindr%m% KamaK #r$e (3' redu$"io#s> 43 $ells) Mai#> palindr%m% K&a&a*aioK >alse (2L redu$"io#s> 45 $ells) Mai#> palindr%m% KararaK #r$e (4L redu$"io#s> 0' $ells) ' N M
' n+C g palndromo i' C , ' 1 , ' > , ' ? , ' A , ..., a ' N M
g 9' C M ' n+C g
palndromo i ' 1 , ' > , ' ? , ' A , ..., a / ' N M
g 9' C M ' n+C g
9 U 1 M U n+1 g palndromo i' > , ' ? , ' A , ..., a // palndromo i' N , ' C , ' 1 , ' > , ' ? , ' A , ..., ' n+C a C ?A /;em+lo 32 + i*refi'oa &adas duas cadeias de caracteres verifique se a primeira id:ntica " subcadeia formada pelos primeiros caracteres da segunda. *or e'emplo, ;aba; prefi'o da cadeia ;abaca'i; e ;pre; prefi'o de ;prefi'o;. Soluo Q &e imediato podemos dizer que uma cadeia 's prefi'o de uma cadeia Ls quando) i/ o primeiro elemento de 's igual ao primeiro elemento de Ls e5 ii/ o restante de 's prefi'o do restante de Ls. iii/ Ruanto " base da recurso, temos que considerar duas situa#es) i/ A primeira tem como base que a cadeia vazia prefi'o de qualquer outra cadeia5 ii/ A segunda leva em conta que nenhuma cadeia pode ser prefi'o de uma cadeia vazia 9e'ceto a cadeia vazia/. He.amos como fica em TasVell) -- -- Yeri1i$a se uma $adeia xs V &re1ixo -- de uma se*u#da (ys) -- &re1ixo xs ys = i1 #ull xs "7e# True else i1 #ull ys "7e# False else (7ead xs == 7ead ys) .. &re1ixo ("ail xs) ("ail ys) As avalia#es de e'press#es a seguir nos permitem observar o funcionamento de nossa descrio) Mai#> prefi'% Ka)aK Ka)a$adra)aK True Mai#> prefi'% KK Ka)a$adra)aK True Mai#> prefi'o K&reK K&re1ixoK True Mai#> prefi'% K&re1ixoK K&reK False Mai#> prefi'% K&re1ixoK KK False
C ?Q /;em+lo 3< + i3asamento de *adroa Herificar se uma cadeia satisfaz um determinado padro um processamento muito (til e constantemente realizado na prtica da computao. Aqui nos ateremos a uma forma simplificada deste problema que consiste em verificar se uma cadeia su+cadeia de outra. Soluo Q Uma rpida inspeo nos leva " constatao de que o problema anterior parecido com este, e'ceto pelo fato de que a primeira cadeia pode ocorrer em qualquer lugar da segunda. *odemos dizer ento que a primeira cadeia ocorre na segunda se ela um prefi'o da primeira ou se ela ocorre no resto da segunda. He.amos como fica em TUGO) -- -- Yeri1i$a se uma $adeia xs V su)$adeia -- de uma ou"ra (ys) -- su)$adeia xs ys = i1 #ull ys // #ull ("ail ys) "7e# False else &re1ixo xs ys // su)$adeia xs ("ail ys) A avaliao das e'press#es a seguir a.uda no entendimento) Mai#> s$=,adeia KK K&re1a$ioK #r$e Mai#> s$=,adeia K&reK K&re1a$ioK #r$e Mai#> s$=,adeia K$ioK K&re1a$ioK #r$e Mai#> s$=,adeia Ke1aK K&re1a$ioK #r$e Mai#> s$=,adeia Ka$idoK K&re1a$ioK >alse Mai#> s$=,adeia Ke1aK KK >alse /;ercPciosQ i/ conoihoi ii/ 2onoihno iii/ Noinboiho iv/ !iohoi v/ !ihnoih.o vi/ !inoih.po C ?S 7@8 /C/#CbCI5S C5MPB/M/&$A#/S Apresentamos a seguir alguns e'erccios que visam suprir material para o leitor que dese.ar praticar um pouco mais com a programao atravs de descri#es funcionais. *ara cada um dos problemas a seguir d: uma descrio funcional na linguagem TasVell. Ougerimos que o leitor edite as defini#es em um arquivo de scripts e use essas defini#es em alguns e'emplos para certificar+se se suas defini#es esto corretas. *ara cada funo elabore uma planilha de teste, indicando os valores para os quais as mesmas sero avaliadas e quais os resultados esperados, insira a planilha como comentrio, conforme se ilustra a seguir. /;em+lo Q *escrio do +roblemaQ &ados dois n(meros a e b mapeie+os no maior deles. SoluoQ -- de1 : ma&eia dois #]meros a e ) #o maior deles -- "es"e : maior 3 4 ==> 4O maior 4 3 ==> 4O maior 3 3 ==> 3 maior a ) = if a > ) then a else ) 7@87 )ru+o I 1 Problemas )erais C. &ados quatro n(meros pC, p1, p> e p?, mapeie+os na sua soma se a diviso desta soma por A e'ata e em zero caso contrrio. 1. &ado um n(mero inteiro, verifique se ele pertence ao intervalo 9N,CNN/ e divisvel por > e por A. >. ! operador hh 9!U inclusivo/, provido pelo Tugs, mapeia dois valores booleanos a e b em $rue quando pelo menos um deles $rue e em False caso contrrio. $screva uma funo que denominaremos de oux 9!U e'clusivo/ que se assemelha ao !U inclusivo mas que mapeia em >alse quando ambos valores so Irue. ?. &ados > valores a, b e c determine a mdia aritmtica dos valores e'tremos. ] media CN >A ? CB.A ] media AN CN J 1B C ?J A. &ados tr:s n(meros inteiros distintos, calcule o quadrado do sucessor do maior n(mero. Q. &ados > pontos pC, p1 e p>, do plano cartesiano, determine se eles formam um tri0ngulo, e se for o caso,determine sua rea. S. A empresa \ucro3erto decidiu dar aos seus funcionrios um abono de Natal. A gratificao ser baseada em dois critrios) o n(mero de horas e'tras trabalhadas e o n(mero de horas que o empregado faltou ao trabalho. ! critrio estabelecido para calcular o pr:mio ) subtrair dois t:ros das horas que o empregado faltou de suas horas e'tras, obtendo um valor que determina o n(mero de pontos do funcionrio. A distribuio do pr:mio feita de acordo com a tabela abai'o. Pontos 5btidos Pr0mio em #n de a ?C ... ANN,NN >C ?N ?NN,NN 1C >N >NN,NN CC 1N 1NN,NN C CN CNN,NN J. 3onsidere dois pontos pC e p1 no plano cartesiano. $stamos interessados em identificar as seguintes rela#es entre eles) i. por pC e p1 podemos traar uma reta paralela ao ei'o horizontal5 ii. por pC e p1 podemos traar uma reta paralela ao ei'o vertical5 iii. pC e p1 esto no mesmo quadrante5 iv. pC e p1 esto em quadrantes diferentes5 v. pC e p1 esto em quadrantes opostos 9C e > ou 1 e ?/5 vi. pC e p1 esto em quadrantes ad.acentes 9C+1, 1+>, >+?, C+?/5 B. &ados dois pontos no plano cartesiano, eles podem ser id:nticos, podem determinar uma reta paralela a um dos dois ei'os, ou determinar uma reta que corta os dois ei'os. &etermine qual o caso em que dois dados pontos se enquadram e, se ocorre o terceiro, qual a rea do tri0ngulo determinado pela reta e os ei'os. CN. &ados um segmento de reta r, atravs de dois pontos, a e b, localizados no primeiro quadrante, e um ponto p qualquer, determine se p pertence ao segmento, ou se p pertence ao prolongamento de r, ou ainda se p est acima da reta ou se p est abai'o. C ?B CC. &ados o canto superior esquerdo e o canto inferior direito de um ret0ngulo 7, paralelo aos ei'os, determine quantos quadrantes so cobertos por ele. C1. &ados dois ret0ngulos, paralelos aos ei'os, determine se h ou no interseo entre eles. &etermine ainda, se for o caso, a rea de interseo entre dois ret0ngulos. C>. 3onsidere um ret0ngulo definido por seus cantos superior esquerdo e inferior direito. *odemos traar um losango a partir de pontos localizados no ponto mdio de cada um de seus lados. &efinimos com isso seis regi#es. i. fora do ret0ngulo5 ii. o tri0ngulo superior esquerdo5 iii. o tri0ngulo superior direito5 iv. o tri0ngulo inferior direito5 v. o tri0ngulo inferior esquerdo5 vi. o interior do losango. vii. &ado um ponto p, determine a sua localizao. viii. C?. &ados > n(meros, determine se com os tr:s eu posso formar uma progresso aitimtica 9*A/, onde dois deles quaisquer so termos consecutivos e um terceiro a razo. CA. &ados > n(meros, determine se com os tr:s eu posso formar uma progresso gepmtrica 9*G/, onde dois deles quaisquer so termos consecutivos e um terceiro a razo. CQ. 3onsidere que o preo de uma passagem de avio em um trecho, pode variar dependendo da idade do passageiro. *essoas com QN ou mais anos de idade pagam apenas QNj do preo total. 3rianas at CN anos, pagam ANj e beb:s 9abai'o de 1 anos/ pagam apenas CNj. $screva uma definio que tenha como entrada o valor nominal da passagem e a idade do passageiro e produz o valor a ser pago. CS. &ados dois n(meros inteiros, considere que eles possuem no m'imo A algarismos. &etermine em que quantidade de algarismos na mesma posio eles so iguais. ]qalg C1> C1? 1 ]qalg C1>? ?>1C N C AN CJ. &ados dois pontos p e q, no plano cartesiano, tome a origem dos ei'os como o ei'o dos ponteiros de um rel%gio anal%gico, p como a posio da e'tremidade do ponteiro maior e q como a do ponteiro menor. &etermine a quantidade total de minutos decorridos desde o incio do dia. CB. &ados tr:s n(meros a, b, c. &etermine quais das seguintes rela#es eles mant:m entre si) a/ os tr:s so diferentes5 b/ apenas dois so iguais5 c/ os tr:s so iguais. 1N. 3onsidere que um dado n(mero inteiro est armazenando um valor ! escrito na base octal. *ede+se) a/ verifique se realmente o n(mero dado est na base J5 b/ determine qual o valor deste n(mero na base decimal. 1C. 3onsidere um tabuleiro de 'adrez de dimens#es infinitas, considere ainda que a numerao das casas dada por um par de n(meros inteiros. Oabemos que o cavalo possui oito movimentos conforme a figura >. m< M< m2 m= m7 C m4 m@ m> m? $screva uma funo para determinar a nova posio obtida pela aplicao de cada movimento " posio U. ! resultado dever ser produzido com um n(mero de 1 casas. 7@82 )ru+o 2 1 )eomtricos I &ado um ponto *9',L/ do plano cartesiano, defina fun#es que descrevam a sua pertin:ncia nas situa#es abai'o especificadas) C. Um ret0ngulo 9com lados paralelos aos ei'os cartesianos/ dado pelas coordenadas do canto superior esquerdo e do canto inferior direito, como mostrado na figura. C AC 1. Um losango , com os seus ei'os paralelos aos ei'os cartesianos, dado pelas coordenadas do vrtice esquerdo e do vrtice superior, como mostrado na figura. >. Um crculo dado pelo seu centro 3 e seu raio r. ?. A regio 7C 9regio cinza/, do ret0ngulo dado pelas coordenadas do canto superior esquerdo e do canto inferior direito, como mostrado na figura abai'o) A. A regio 71 do losango 9regio cinza/, sendo dados os pontos $ e & do ret0ngulo e sabendo+se que o crculo tangente aos lados do losango. C A1 7@8< )ru+o < 1 )eomtricos II 7esolva os problemas abai'o priorizando o uso de modularizao. *rocure tambm utilizar quando for adequado, o conceito de definio local atravs da clusula R0ere. C. 3onsidere a figura e descreva uma funo para calcular cada uma das reas da regi#es 7C, 71 e 7>. A funo tem como par0metros as coordenadas dos pontos * 9'C, LC/ e R 9'1,L1/. !bserve que o ponto R o centro do crculo, que a altura do tri0ngulo is%sceles igual ao raio do crculo e que um dos lados do tri0ngulo paralelo ao ei'o dos '. 1. &ada uma reta descrita por dois pontos * 9'C, LC/ e R 9'1,L1/, escreva uma funo que determine o valor da coordenada no ei'o dos L a partir de uma coordenada fornecida no ei'o dos '. coordL 'C '1 LC L1 ' M ... >. 3onsidere a figura 1 e descreva uma funo para determinar cada uma das reas das regi#es 7C, 71 e 7>. A funo tem como par0metros as coordenadas dos pontos * e R. !bserve que um dos lados do tri0ngulo is%sceles coincide com o ei'o dos ' e que um dos seus vrtices a origem. !bserve ainda que os lados do ret0ngulo so paralelos aos ei'os. v 'C '1 U
1 LC L1 * R 7C 7C 7> 71 C A> ?. 3onsidere um pea de altura h cu.a base e o topo so he'gonos de lado l. 3onsidere ainda que esta pea possui um furo cilndrico de raio r com centro no ei'o. &escreva uma funo para determinar o volume da pea. A. 3onsidere uma pea cilndrica com raio r e altura h. 3onsidere ainda que esta pea possui um furo em forma he'agonal de lado l, com centro no ei'o da pea. &escreva uma funo para determinar o volume da pea. LC L1 'C '1 U v C 7> 7C 71 C A? Q. 3onsidera a figura abai'o, onde est representada a regio 7 correspondente a interseo de dois crculos de mesmo raio r. $screva uma funo para calcular a rea dessa regio, sabendo+se que dado o 0ngulo do setor do crculo determinado pelos pontos de interseo das duas circunfer:ncias. S. &escreva uma funo que calcule a rea 9representada pela cor cinza/ de uma flor formada por quatro crculos de mesmo raio r, cu.os centros so os vrtices de um quadrado, conforme ilustrado na figura a seguir. ! miolo da flor um crculo DocoE de raio rC. 7@8= )ru+o I" - )eomtricos < C/ *roblemas de pertin:ncia de um ponto * 9',L/ nas regi#es hachuradas, utilizando e'press#es l%gicas. a/ &escrio da regio hachurada) o centro C Ic7, c2K e o raio r do crculo maior so dados. 3onsidera+se tambm que os raios dos crculos inscritos so rZ< e 2rZ<. # r C AA b/ &escrio da regio hachurada) se.a / I;7, J7K o vrtice superior esquerdo de um quadrado de lado a paralelo aos ei'os cartesianos. 3onsidere que as ptalas da flor so formadas por semi+crculos de raio aZ2 e centros no ponto mdio de cada lado do quadrado e que o miolo formado por dois crculos de raios aZ= e aZ@. c/ &escrio da regio hachurada) o centro C Ic7, c2K e o raio r do crculo maior so dados. 3onsidera+se tambm que os raios dos crculos inscritos so rZ2 e rZ=. / a a/2 a/. a/O C AQ 1/ *roblemas de mapeamento de um ponto * 9',L/ em sua regio de pertin:ncia, utilizando descri#es condicionais, de forma adequada. a/ Oe.am / I;7, J7K e S I;2, J2K os vrtices esquerdo e superior, respectivamente, de um losango cu.os ei'os so paralelos aos ei'os cartesianos. 3onsidere as regi#es descritas abai'o) b/ Oo dados os pontos $ 9'C, LC/ e & 9'1, L1/ e sabe+se que o raio dos semi+ crculos e'termos igual " 9LC + L1 / K1. regio 7) regi#es hachuradas, e'ternas ao losango, no crculo superior regio 2 ) regi#es hachuradas, interna ao losango, no crculo superior regio < ) no losango e fora dos ciculos regio =) regi#es hachuradas, e'ternas ao losango, no crculo inferior regio 4 ) regi#es hachuradas, interna ao losango, no C AS 7A8 APBICA9D/S Neste captulo apresentamos uma srie temtica de e'erccios, buscando dar ao leitor uma viso mais ampla das possibilidades de uso da programao funcional. A inteno apresentar vrios conte'tos onde precisamos programar computadores. $m todos, o conte'to descrito e vrios e'erccios so apresentados. Aos professores e estudantes, sugerimos que o conte'to sirva de prete'to para a formulao e resoluo de novos e'erccios. 3omeamos pelo *omin_ ar, onde, buscamos na ludicidade do .ogo, apresentar as necessidades de manipular informao. Na seq<:ncia apresentamos uma srie de problemas considerando as necessidades de informao de um anco de Sangue, o manuseio de mensagens de um Correio /letronico, a organizao de uma Bista de Com+ras, um sistema de Passagens Areas, )er0ncia Acad0mica, Ag0ncia de $urismo e e'erccios sobre /s+etculos $eatrais. 7A87 5 *5MI&^ A#EQ ! domin% de n(meros uma coleo de pedras, utilizado na maioria das vezes como um e'celente passatempo. &as tantas formas de utilizar o domin%, destacamos uma, utilizada no Amazonas, principalmente em 6anaus, mas tambm em muitas praias pelo mundo afora onde e'istirem amazonenses, em particular nas praias de Fortaleza. !s Amazonenses costumam cham+la de Ddomin% bar;, em homenagem a uma tribo que habitava a regio onde foi fundada a cidade de 6anaus. A maioria dos e'erccios deste captulo foram desenvolvidos em 6anaus, no final da dcada de JN. &e l pra c, vrios outros foram acrescentados, mas a lista como um todo permanece indita. A inteno desta seo apresentar alguns poucos e'erccios resolvidos e propor outros. A idia no desenvolver o .ogo e sim, inspirar+se em situa#es do .ogo para propor e'erccios interessantes e desafiadores. &ei'amos o desenvolvimento do .ogo completo como sugesto para o trabalho em grupos. Ao final do captulo discutiremos um pouco sobre a programao do .ogo. PreliminaresQ ! material do .ogo um con.unto formado por 1J ;peas;, cada uma delas com duas ;pontas;. 3ada ;ponta; representa um valor de N 9zero/ a seis 9Q/, perfazendo portanto S valores diferentes. 3ada valor possui um nome pr%prio) o wero chama+se ;branco;, o um chama+se ;s;, o dois o ;duque;, o tr:s chama+se ;terno;, o quatro a ;quadra;, o cinco a ;quina; e o seis denomina+se ;sena;. ! nome de uma ;pedra; dado pelo nome de suas ;pontas;, por e'emplo, ;quina e terno;, o nome da ;pedra; que possui em uma ponta o valor A e na outra o valor >. As pedras que possuem o mesmo valor nas duas pontas so denominadas de ;carroa;. *ara cada tipo de valor e'istem S pedras, por e'emplo, para o ;terno; teremos) terno e branco, terno e s, terno e duque, carroa de terno, quadra e terno, quina e terno, sena e terno. ! .ogo , em geral, disputado por duplas, ganhando a que fizer o maior numero de pontos, a partir de um mnimo pr+estabelecido. A seguir apresentamos em detalhes os vrios elementos do .ogo. C AJ Peas do 'ogoQ !s elementos do .ogo so 91J/ vinte e oito peas, cada uma com duas pontas, na qual marcado um valor que varia de N a Q. *ara .ogar, as ;pedras; so embaralhadas e escolhidas pelos .ogadores. A cada .ogador cabem S pedras. 3om o desenrolar do .ogo a quantidade de pedras vai sendo decrescida, at que, eventualmente chegue em zero. Partici+antesQ duas duplas 9eventualmente pode ser .ogado individualmente, com 1, > ou ? .ogadores/. 5bUetivoQ atingir um total mnimo de 1NN pontos. Hence o .ogo a dupla que ao final de uma rodada tiver o maior n(mero de pontos. *incmicaQ o .ogo se desenvolve em uma quantidade qualquer de eventos menores denominados de rodada. A figura CJ.C ilustra um instante de .ogo. #odadaQ em uma rodada, um ap%s o outro, no sentido horrio, os .ogadores vo fazendo suas .ogadas, combinando suas pedras de domin% com a DfiguraE que . est formada na mesa de .ogo. Figura CJ.C X um instante do .ogo de domin%, com quatro pontas abertas) terno, "s, duque e quadra. C AB PontuaoQ e'istem ? formas para obter pontos) C. &urante o .ogo, a figura formada na mesa possui C 9quando e'iste apenas uma pea assentada/, 1, > ou ? pontas. n soma dos valores dessas pontas denomina+se de) Dos pontos da mesaE. Ruando essa soma produz um m(ltiplo de A, o .ogador que sentou a (ltima pedra pode requerer que eles se.am anotados em favor de sua dupla. He.a que s% o .ogador que sentou a pedra pode reivindicar os pontos e isto tem que ocorrer antes que o pr%'imo .ogador sente a sua pedra5 1. Ruando um .ogador no possui pedra para colocar na mesa 9ou se.a, uma que combine com uma das pontas/, ele passa a vez, e a dupla adversria ganha CN pontos. Oe um .ogador percebe que com a colocao de sua pea ele conseguir fazer com que todos os demais passem, inclusive o seu parceiro, ele pode anunciar que deu um passe geral e com isso ganhar de b,nus AN pontos. >. Ruando um .ogador descarta sua (ltima pea em uma rodada diz+se que ele DbateuE, e, portanto ganhou a rodada. 3om isso ele ganha de b,nus CN pontos e mais o m(ltiplo de A ligeiramente inferior " soma dos valores constantes nas peas que sobraram nas mos dos adversrios 9garagem/. Oe a batida for feita com uma carroa, o b,nus de 1N pontos. ?. Ruando ocorre uma situao onde nenhum dos .ogadores consegue .ogar, embora este.am com peas na mo, diz+se que o .ogo est fechado. Neste caso ganha a rodada a dupla cu.a soma dos valores das peas for o menor. A soma das peas da dupla adversria computada em seu favor, como no caso >. Posio dos 'ogadoresQ !s membros de cada dupla so colocados em posi#es alternadas, de forma que as .ogadas 9colocao de peas/ se.a feita de forma alternada entre as duplas adversrias. *or e'emplo, em um .ogo presencial, podemos usar, como suporte para colocao das peas, uma mesa de quatro lugares, ficando os parceiros sentados frente+a+frente. *istribuio das PeasQ a distribuio das 1J peas entre os ? .ogadores deve ser feita de forma aleat%ria. Na prtica, em um .ogo com peas fsicas, viram+se as peas de cara para bai'o e mistura as peas com as mos. 3ada .ogador vai retirando as suas pr%prias peas. Fuem comea uma rodadaQ Uma rodada sempre iniciada com a colocao de uma DcarroaE. Na primeira rodada do .ogo, a carroa a ser utilizada de sena 9Q/, cabendo pois ao .ogador que a tirou comear o .ogo. As rodadas seguintes so iniciadas pelo .ogador que bateu a rodada anterior, com a carroa que ele preferir. Oe ele no possui carroa, ele passa e o .ogador seguinte 9da dupla adversria/ inicia o .ogo, se este tambm no possuir, passa a frente. .ma 'ogadaQ $stando na sua vez de .ogar, o .ogador deve escolher uma das pedras de sua mo, e coloca+la na mesa de .ogo, combinando com alguma das pontas abertas. A escolha da pea a ser .ogada deve contribuir para o ob.etivo da dupla que ganhar o .ogo, isso significa, em linhas gerais, escolher uma pedra C QN que me permita fazer o maior n(mero de pontos e, quando isso no for possvel, escolher uma pedra que reduza o n(mero de pontos que os adversrios possam fazer com base em minha .ogada. T, entretanto algumas nuances a serem consideradas) Ruando eu .ogo fazendo pontos devo buscar ma'imizar meus pontos e minimizar os que o .ogador adversrio possa fazer a partir da minha .ogada5 Oe o .ogo estiver pr%'imo do trmino, e a dupla adversria ameaa completar os 1NN pontos, pode ser dese.vel adiar o trmino, no fazendo os pontos. *or e'emplo, suponha que a dupla adversria tem CJA pontos e a minha C>N. Oe eu tiver uma pea na mo que faz 1A pontos, mas se possvel ao adversrio possuir uma pea que lhe permita fazer CA pontos, eu posso escolher outra pea, dei'ando assim de obter os 1A pontos5 Ruem abre uma rodada, bater a rodada a menos que passe. 4endo em vista que ao ganhar uma rodada, h b,nus para a dupla, posso dei'ar de marcar ponto visando vencer a rodada5 2dem para tentar evitar que a dupla adversria ganhe a rodada 9quando foro a passada de um adversrio que comeou a rodada, a batida passa para o meu parceiro/. Um passe geral d um b,nus de AN pontos, isso pode me levar a busc+los, desde que as condi#es do .ogo, definidas pelas peas de minha mo, combinadas com o que . foi .ogado, se mostrem propcias. /;ercPciosQ A seguir apresentamos alguns e'erccios, baseados no domin%. *ara fins didticos separamos em grupos. )ru+o I C. $screva a funo pedrap que associe um par a $rue se e somente se 9sss/ o par uma representao vlida para uma ;pedra; e False caso contrrio. /;em+los de usoQ C. pedrap 91, S/ MMZ False 1. pedrap 99+>/, ?/ MMZ False >. pedrap 9>,?/ MMZ $rue SoluoQ pedrap 9',L/ M validap ' `` validap L validap ' M elem ' iN..Qa 1. $screva a funo mao+ que associe uma lista de pares de inteiros a $rue sss a lista uma representao vlida para a ;mo; de um .ogador e False caso contrrio. C QC /;em+los de usoQ C. maop i a $rue 1. maop i99+>/, ?/a False >. maop i9>,?/a $rue ?. maop i 9C,1/, 9C,A/, 91,N/, 91,?/, 9>,>/, 9C,C/, 9N,N/, 9?,N/a False SoluoQ maop i a M $rue maop 9')'s/ M 9length 's fM Q/ `` pedrap ' `` maop 's >. $screva a funo carroca+ que associe um par a $rue sss o par uma ;carroa; e False caso contrrio. ?. $screva a funo temYcarrocaY+ que associe uma ;mo; a $rue sss a mo possuir pelo menos uma carroa e False caso contrrio. A. $screva a funo temYcarrocas que associe a uma ;mo; a lista das ;carroas; nela contida. )ru+o II $m vrios momentos do .ogo faz+se necessrio saber a quantidade de pontos associado " uma coleo de pedras. $m particular, no final do .ogo, quem ;sentou; a sua (ltima pedra faz .us " ;garagem; que determinada a partir dos pontos que restaram na9s/ mo9s/ dos adversrios. Q. $screva a funo pontos que associe uma lista de ;pedras; a soma dos pontos das pedras nela contidos. !nde os pontos de uma pedra a soma de suas pontas. SoluoQ pontos i a M N pontos 9')'s/ M ponto ' I pontos 's k!ere ponto 9',L/ M ' I L S. $screva a funo -ara-em que associe uma lista de ;pedras; ao maior m(ltiplo de A 9cinco/, menor ou igual " soma dos pontos nela contidos. J. $screva a funo pedraWi-ualWp que associe dois pares de inteiros a $rue sss representam a mesma pedra e False caso contrrio. - bom lembrar que a ordem das pontas irrelevante, assim 91,?/ e 9?,1/ representam a mesma pedra. C Q1 B. $screva a funo ocorreWpedraWp que associe uma ;pedra; e uma ;mo; a $rue sss a ;pedra; ocorre na ;mo; e False caso contrrio. CN. $screva a funo ocorreW!alorWp que associe um valor vlido para ;ponta; e uma ;mo; e produza $rue sss o valor ocorre em alguma pedra da mo e False caso contrrio. CC. $screva a funo ocorreWpedra que associe a um valor e uma ;mo;, uma lista contendo as pedras da ;mo; que possuem o valor dado. C1. $screva a funo pedraWmaior que associe uma ;mo; a pedra de maior valor na ;mo; dada. Uma pedra pC maior que uma outra p1 sss a soma das pontas de pC for maior que a soma das pontas de p1. C>. $screva a funo ocorreW!alorWq que associe um valor e uma ;mo; e produza o n(mero de pedras na mo que possuem o valor dado. C?. $screva a funo ocorreWcarrocaWq queassocie uma mo " quantidade de carroas nela e'istentes. CA. $screva a funo tiraWmaior que associe uma mo a uma lista similar " ;mo; de onde foi e'trada a pedra de maior ponto. CQ. $screva a funo tiraWmaiorW! que associe um valor e uma ;mo; " lista similar " ;mo; de onde se e'traiu a pedra de maior pontos de um determinado valor para ponta. )ru+o III ! .ogo se desenvolve pela colocao, pelo cogador da vez, de uma pedra que combine com alguma das ;pontas; da ;mesa;. Num momento genrico do .ogo temos quatro pontas disponveis para e'ecuo de uma .ogada. Uma ponta pode ser simples ou uma carroa. As carroas so dispostas de tal forma que todos os seus pontos este.am para ;fora;. 3hamaremos ;mesa; " lista de pontas disponveis para .ogada. *ontas simples sero representadas por listas de um elemento e carroas por uma lista com dois elementos id:nticos. *or e'emplo, a ;mesa; ilustrada na Figura CJ.1 representada pela qudrupla 9 iA,Aa, iAa, iNa,i?a /. Uma ponta ainda no aberta representada por lista vazia. &izemos que h marcao de pontos em uma mesa quando a soma das pontas um m(ltiplo de A. !s pontos a serem marcados a soma das pontas, com as carroas contando em C Q> dobro. CS. $screva a funo mesap que associe uma qudrupla de listas a $rue sss a qudrupla for uma descrio vlida de ;mesa;. SoluoQ mesap 9pC,p1,p>,p?/ M vponta pC `` vponta p1 `` vponta p> `` vponta p? k!ere vponta 9')L)'s/ M if not 9null 's/ t!en False else validap ' gg vponta 9L)'s/ vponta 9' )i a / M validap ' validap ' M elem ' iN..Qa CJ. $screva a funo carrocaWmWp que associe uma mesa a $rue sss pelo menos uma das pontas for carroa. CB. $screva a funo pontosWmarcados que associe uma mesa ao o n(mero de pontos a serem marcados se a soma das pontas for m(ltiplo de cinco e zero em caso contrrio. Figura CJ.1 X desenvolvimento do .ogo, no instante em que temos nas pontas e'ternas, uma carroa de quina, uma quina, branco e quadra. C Q? 1N. $screva a funo podeWjo-asWp que associe uma ;pedra; e uma ;mesa; a $rue sss a pedra possui uma ponta que combina com pelo menos uma das pontas da mesa. 1C. $screva a funo marcaWpontoWp que tenha como entrada uma ;pedra; e uma ;mesa; e produza $rue sss a pedra pode ser .ogada fazendo pontos em uma das pontas da mesa. \embre+se que as carroas devem ser contadas pelas duas pontas da pedra. 11. $screva a funo maiorWponto que tenha associa uma pedra e uma mesa ao n(mero da ;ponta; da mesa onde pode ser marcado o maior valor de ponto que ser marcado pela pedra. 3onsidere que a em uma ;mesa; as pontas so numeradas a partir de zero, da esquerda para a direita. 1>. $screva a funo jo-aWpedra que associe uma ;pedra;, uma ;mesa; e um n(mero de ;ponta; da mesa a uma nova mesa obtida ao se .ogar a ;pedra; na ;ponta; indicada. 1?. $screva a funo jo-ap que associe uma ;mo; e uma ;mesa; e produza $rue sss e'iste pelo menos uma pedra na mo que possa ser .ogada em pelo menos uma ponta da mesa. 3aso contrrio produza False. 1A. $screva a funo .ogada que associe uma ;mo; e uma mesa ao n(mero da pedra na mo e n(mero da ponta na mesa onde pode ser feita a .ogada que marque mais ponto. 3onsidere inclusive .ogada onde no h marcao de ponto. 1Q. $screva a funo faz_.ogada que associe uma ;mo; e uma ;mesa; e produza uma nova ;mesa; obtida por se .ogar marcando o maior n(mero de pontos possvel 7A82 anco de SangueQ para facilitar o atendimento da demanda por transfus#es de sangue o sistema de sa(de criou os chamados Pancos de Oangue. 3omo sabemos, cada transfuso s% pode ser realizada usando tipos de sangue apropriados. A adequao de um determinado tipo de sangue baseada em estudos cientficos que identificou quatro tipos sang<neos, denominados de 2, X, 2X e P. !utros estudos identificaram ainda a e'ist:ncia do chamado fator 7T que pode ser positivo 9I/ ou negativo 9+/, assim o sangue de qualquer indivduo classificado de acordo com esses dois atributos. *or e'emplo, dizemos que fulano possui sangue tipo ! e fator 7T positivo, e abreviamos para 5X. $m um dado Panco de Oangue, diariamente, so feitas doa#es por pessoas de diferentes tipos sang<neos, para as quais feito um registro contendo o n(mero da carteira de identidade do doador 97G/, o se'o 9O/, a data da doao 9&&/, a data de nascimento 9&N/, o tipo sang<neo 94O/, o fator 7T 97T/ e a quantidade doada 9R&/ 91AN ou ANN ml/. ! sangue doado guardado em recipientes com uma capacidade fi'a 91AN ml/. 4ambm, diariamente so feitas requisi#es pelos hospitais 9T/, cada requisio indica as caractersticas do sangue 9tipo e fator 7T/ e a quantidade solicitada 9RO/. Oabemos que homens e mulheres possuem intervalos de tempo diferentes para fazer doa#es. *ara homens o intervalo mnimo de 1 9dois/ meses e para mulheres de > 9tr:s/. A idade m'ima para doadores QN anos. C QA Oe.am as seguintes estruturas &oao 97G, O, &&, &N, 4O, 7T, R&/ 7equisio 9T, 4O, 7T, RO/ /;ercPciosQ $screva programas em TUGO para resolver os seguintes problemas) C. &ada uma lista de doa#es, obtenha a quantidade total de sangue doado por tipo sang<neo e fator 7T. ! resultado ser uma tupla 9um item para cada combinao de tipo sang<neo com fator 7T/ com triplas e'plicitando o tipo sang<neo, o fator 7T e a quantidade total. Ruando no houver doao de uma dado par tipo+fator deve ser indicado o valor zero. *or e'emplo) I IpAq, pXq, 3K, 888 Ip5q,qXq, 4433K 888K 1. *ara uma dada lista de doa#es, determine a lista dos dias de um dado m:s onde as doa#es foram menores que a mdia mensal. >. &ada uma lista de doa#es e a data atual, determine a lista de doadores que . esto aptos a fazerem novas doa#es. ?. &ada a lista de doadores e o m:s, determinar o n(mero de doadores que esto aptos a doar sangue naquele m:s. 9$ssa e a questo > parecem anlogas, no]/ A. &etermine a relao de doadores que fazem doa#es com o maior ndice de regularidade. ! ndice de regularidade dado pela n(mero de vezes que o intervalo entre as doa#es coincidem, dividido pelo n(mero de doa#es menos um. Q. &ada a lista de doadores, verificar o tipo sang<neo que mais comumente doado. S. &ada a lista de doadores e o ano, determine o m:s em que houve mais doa#es naquele ano. J. &ada a lista de requisi#es de um determinado hospital, determinar a lista de tipos sang<neos com os respectivos fatores 7T, que possuem seus pedidos atendidos pelo banco de sangue. B. &eterminar, para um dado hospital em um determinado ano, a demanda mensal de sangue, por tipo sang<neo e fator 7T. CN. &eterminar a lista de doadores que no esto mais aptos a fazer doa#es, considerando a data atual. CC. 3onsidere o estoque atual do banco de sangue, determinado pela funo estoque 9prob C/, e uma lista com vrias requisi#es. \eve em conta que o C QQ estoque pode ser insuficiente para atender completamente todos os pedidos. &etermine o estoque atualizado ap%s o atendimento dos pedidos e produza uma lista das requisi#es atendidas, constando a quantidade que foi de fato fornecida. C1. No problema CC, considere que voc: dese.a atender cada hospital solicitante, de forma proporcional ao seu pedido, considerando os pedidos de cada tipo sang<neo separadamente. *or e'emplo, suponha que) o total de pedidos de sangue !I de C1.NNN ml, que o hospital DhCE solicitou >.NNN ml de sangue !I e que no estoque J.NNN ml. *odemos observar que o pedido para o sangue !I do hospital DhCE representa 1A j do total. Neste caso o hospital DhCE ser atendido com 1A j de J.NNN ml que representa 1.NNN ml. *roduza uma lista como os pedidos atendidos e outra com os pedidos pendentes. C>. 3onsidere a poltica de atendimento do problema C1 mas leve em conta que um dado pedido deve ser atendido completamente. 3onsidere o e'emplo do problema anterior, e suponha que os pedidos do hospital rhCe para o sangue !I so ?, 9DhCE, !, I, C.ANN/, 9DhCE, !, I, C.NNN/ e 9DhCE, !, I, 1AN/ e 9DhCE, !, I, ANN/. Neste caso, considerando que os pedidos esto em ordem de prioridade, seriam atendidos os pedidos 9DhCE, !, I, C.ANN/ e 9DhCE, !, I, 1AN/. C?. 6odifique a poltica de atendimento do problema C? para que o atendimento se.a tal que o hospital DhCE use da melhor forma possvel a proporcionalidade que lhe cabe. No caso do e'emplo apresentado no problema C?, o pedido de 1AN ml seria descartado visto que atendendo o pedido de ANN ml o hospital rhCE estar usando melhor a parte que lhe cabe. 9escolher a combinao mais apropriada/ 7A8< Correio /letronicoQ 3onsidere um sistema de mensagens eletr,nicas. Uma mensagem pode ser descrita por uma tupla contendo o remetente, o destinatrio, a data de envio, o assunto e o corpo da mensagem. 6ensagens podem ser acumuladas em listas para posterior acesso. *ara facilitar o acesso podemos construir ndices baseados nos dados contidos na mensagem. *or e'emplo, podemos ter um ndice baseado no remetente para facilitar o acesso a todas as mensagens de um dado remetente. 3onsidere as seguintes estruturas) mensagem 9remetente, destinatrio, data, assunto, corpo/ ndice i 9argumentoC,iordem na lista de mensagensa/, 9argumento1, ia/, ...a /;ercPciosQ $labore programas em TUGO, usando recurso, para atender aos seguintes problemas. A interface 9nome e par0metros/ das fun#es dado em cada uma das quest#es. C. 9inde'a msgs/ &ada uma lista de mensagens, produza o ndice das mensagens por remetente. Um ndice ter a seguinte estrutura) i 9remetenteC, lista de ocorr:ncias/, 9remetente1, lista de ocorr:ncias/, ...a onde lista de C QS ocorr:ncias formada pela posio na lista de mensagens onde o remetente ocorre. *or e'emplo) i 9D.osesinf.ufes.brE, iC, 1>a/, 9Dmariasinf.ufes.brE, iCN, 1N, ANa/, ...a 1. 9consulta r p/ 3onsidere definidos um ndice por remetente, um ndice por palavras constantes no assunto das mensagens e uma lista de mensagens. &ados um remetente 9r/ e uma palavra9p/, obtenha a lista de mensagens enviadas por r onde a palavra p ocorre no assunto. remetentes M i9DremetenteCE, i...a/,9Dremetente1E, i...a/, ... a palav_assunto M i 9DpalavraCE. i...a/,9Dpalavra1E. i...a/, ... a mensagens M i mensagem11 mensagem21 mensagemI1 a >. 9msg*mes a r msgs/ &ado um ano 9a/, um remetente 9r/ e uma lista de mensagens 9msgs/, verificar a quantidade mensagens enviadas por r em cada m:s. ?. 9busca p ind msgs/ 3onsidere um ndice construdo na forma de lista 9indb/. ! primeiro elemento um par com uma palavra 9p/ e a lista de mensagens 9msgs/ onde p ocorre, o segundo elemento uma lista no mesmo formato de indb, para as palavras menores que p e o terceiro para as palavras maiores que p ndice M i 9palavraC, i...a/, ndice para palavras menores que p, ndice para palavras maiores que pa Ruando no houver palavras menores ou maiores que uma dada palavra, o ndice igual a uma lista vazia. &ada uma palavra p, o ndice 9indb/ e a lista de mensagens 9msgs/, descreva a lista mensagens onde p ocorre, usando o ndice dado. 48 9palav*assunto msgs/ 3onsidere definida uma lista de palavras irrelevantes 9lis/. &ada uma lista de mensagens 9msgs/ produza um ndice com as palavras distintas que ocorrem nos assuntos das mensagens e no ocorrem em lis. *ara cada palavra deve ser produzido tambm a lista das posi#es na lista de mensagens 9msgs/ onde ela ocorre. lis M i DpalavraCE, Dpalavra1E. ... a Q. 9releva msgs li lf/ &ada uma lista de mensagens podemos obter uma lista de palavras relevantes. &efine+se como palavra relevante em uma lista mensagens 9msgs/ aquelas cu.a freq<:ncia satisfazem um intervalo para o qual so dados um limite superior 9ls/ e um limite inferior 9li/. C QJ ?8 9constante msgs a/ &ada uma lista de mensagens 9msgs/, determinar a lista de remetentes que enviaram pelo menos uma mensagem para cada m:s de um dado ano a. @8 9freq&ata msgs m/ *ara uma dada lista de mensagens dese.amos obter a quantidade de mensagens para cada dia de um dado m:s m. B. 9identico indbC indb1/ &ados dois ndices no formato de rvore binria de pesquisa dese.amos verificar se so id:nticos. &izemos que dois ndices so id:nticos quando a palavras e as listas de ocorr:ncia coincidem e os subndices das palavras menores e o das palavras maiores respectivamente so id:nticos. ndice M 9 9palavraC, i...a/, ndice para palavras menores que p, ndice para palavras maiores que p/ CN. 9palav!rd indb/ &ado um ndice no formato de rvore binria de pesquisa produza uma lista das palavras nele contidas de tal forma que as palavras se apresentem em ordem alfabtica crescente. CC. 9resgate indb/ &ado um ndice no formato de rvore binria de pesquisa produza uma lista das palavras que ocorrem em cada mensagem. A lista resultante ter o seguinte formato) i ipalavras da mensagem de ordem Na, ipalavras da mensagem de ordem C a, ... a C1. 9balance arbinpq/ Uma rvore binria de pesquisa est balanceada se e somente se a quantidade 9qC/ de elementos no subindice das palavras menores difere da quantidade 9q1/ de elementos no subindice das palavras maiores de no m'imo um 9C/ e qC maior ou igual a q1. q2 + 1 %= q1 %= q2 7<8 9ins!rd indb msg/ &ados um ndice 9indb/ no formato de rvore binria de pesquisa e uma mensagem 9msg/, descreva a nova rvore obtida pela insero das palavras das mensagem 9msg/, e'ceto as irrelevantes. 7=8 9perfil msg diret fga/ Um diret%rio uma lista de assuntos, cada um dos quais associado a uma coleo de palavras. &ada uma mensagem e um diret%rio podemos atribuir " mensagem um perfil que uma lista de valores indicando o grau de apro'imao 9ga/ dela com cada assunto. ! ga de uma mensagem com respeito a um assunto pode ser obtido com base na freq<:ncia com que as palavras a ele associadas ocorrem na mensagem. C QB 3onsidere que a funo que calcula o ga fornecida e opera sobre uma lista de inteiros. 3onsidere os seguintes formatos) &iret%rio S (Tassunto1U1 Spala7ra11 pala7ra21 V)1 (Tassunto2U1 Spala7ra11 pala7ra21 V)1 V *erfil S (Tassunto1U1 ga1)1 (Tassunto2U1ga2)1 V
7A8= Bista de Com+rasQ *ara realizar um determinado pro.eto necessitamos adquirir certos componentes eletr,nicos. No mercado de componentes e'istem vrios fornecedores que vendem seus produtos com preos diferenciados. A escolha da melhor alternativa para satisfao de nossas compras depende de vrios fatores, dos quais o melhor preo um dos mais importantes. 3onsidere as seguintes defini#es) 4abela de *reo Uma lista contendo todos os preos dos componentes comercializados por um determinado revendedor. 3ada elemento da lista um par no formato 9material, preo/. $'emplo) i9DpotenciometroE, 1.AN/, 9Dresistor+CNNVE, N.>N/, 9Dcapacitor+CNmFE,N.AN/, 9Dindutor+ CN7E,>.NN/a *edido de 3ompra Uma lista contendo todos os materiais necessrios para um determinado pro.eto, com suas respectivas quantidades. 3ada elemento da lista um par no formato 9material, quantidade/. $'emplo) i9DtransformadorE, AN/, 9Dfonte &3E, CN/, 9Dresistor+1NNVE,CNN/a \ista de 7evendedores Uma lista contendo a tabela de preos de todos os revendedores, no formato) i 9revendedorC, itabela de preoa /, ...a
Exerccios: Elabore programas em HUGS, usando recurso, para atender aos seguintes problemas. O nome das funes dado em cada uma das questes. C. 9custo/ &ado o resultado da pesquisa de preos de um pedido de compra, para um certo fornecedor, no formato i 9materialC, qtde, preo/, 9material1, qtde, preo/, ... a, queremos obter o custo total da compra se optarmos por esse fornecedor. 1. 9fornece/ &ado um pedido de compra e a tabela de preos de um determinado revendedor, obtenha a lista dos materiais que ele pode fornecer. >. 9subpro.eto/ 3onsidere os pedidos de compra para dois pro.etos 9pC e p1/. $ventualmente alguns itens do pedido do pro.eto pC podem ocorrer no pedido de p1, possivelmente com quantidades distintas. &izemos que um pro.eto pC subpro.eto de p1 se cada componente de pC tambm componente de p1 em quantidade id:ntica ou inferior. ?. 9lfornecedor/ &ado um pedido de compra e a lista de revendedores, descrever a lista de fornecedores para cada componente, com seus respectivos preos, no formato i9materialC,irevC, rev1,...a /, 9material1, i...a/, ...a C SN 7A84 Passagens areasQ 3onsidere que vrias companhias areas brasileiras oferecem v,os dirios para vrias regi#es do mundo. &evido a competitividade do mercado, vrias so as ofertas promocionais de v,os nacionais e internacionais. 3ada v,o identificado pela companhia area, o n(mero do v,o, a rota, a tarifa em reais e a data de partida. A rota descrita por uma lista onde o primeiro elemento corresponde " origem, o (ltimo elemento corresponde ao destino e os outros elementos correspondem "s escalas do v,o. *ara escolher e reservar um determinado v,o, um passageiro deve fornecer as seguintes informa#es) a origem, o destino e a data de partida dese.ados. Um v,o atende a um pedido de reserva se, para a data de partida dese.ada, a origem requisitada coincide com a origem definida na rota do v,o e o destino requisitado coincide com alguma escala ou com o destino da rota do v,o. A tarifa a mesma, da origem para qualquer escala ou destino da rota. 3onsidere as seguintes defini#es) v,o 3onsiste em uma tupla definida com os seguintes componentes) 9fcompanhia areaZ, fn o Z, frotaZ, ftarifaZ, fpartidaZ/ $'emplo) 9DHA72GE,?JN,iDrioE,EsalvadorE,Emacei%Ea,?>N,9NB,NS,1NNC// *edido de reserva Uma tupla definida com os seguintes componentes) 9forigemZ, fdestinoZ, fpartidaZ/ $'emplo) 9DrioE, DsalvadorE, 9NB,NS,1NNC// !bs) 3ompanhia area, origem e destino so do tipo string, rota uma lista de strings, nx e tarifa so n(meros e partida uma tripla de n(meros.
/;ercPciosQ $labore programas em TUGO para resolver os problemas propostos. ! nome das fun#es assim como seus par0metros so dados para cada uma das quest#es. $scolha duas quest#es para resolver utilizando descrio por listas e duas utilizando recurso. C. Ivoos lv +rK &ada uma lista de v,os e um pedido de reserva, descreva a lista de companhias areas que atendem ao pedido de reserva. 1. Imtari,a lv +rK 3onsiderando a funo descrita na questo anterior, das companhias areas que atendem a um determinado pedido de reserva, obter aquela que oferece a menor tarifa. >. I+artidas dt ds lvK &ados uma data e um destino, obter o n(mero de partidas para aquele destino, naquela data. ?. Ivsescalas lv dtK &ada a lista de v,os, descrever a lista de v,os sem escalas, atravs do n(mero do v,o. A resposta deve ser no formato) Q nY do !Zo,S C SC 7A8> )er0ncia Acad0micaQ 3onsidere a ger:ncia acad:mica dos cursos de graduao de uma universidade. As disciplinas cursadas por um aluno so registradas em seu hist%rico. ! registro deve conter o c%digo da disciplina, o ano e o semestre em que foi cursada e a nota obtida. Oemestralmente o aluno deve requerer matrcula em novas disciplinas. ! pedido de matrcula realizado atravs da apresentao das disciplinas dese.adas pelo aluno. Um dos critrios para conseguir se matricular em uma disciplina que o aluno tenha cumprido, com aprovao, os pr+requisitos da disciplina. Um aluno aprovado em uma disciplina se obtiver mdia superior ou igual a A 9cinco/. 3ada curso possui uma grade curricular que relaciona cada disciplina do curso com seus respectivos pr+ requisitos. 3onsidere as seguintes defini#es) Histrico Escolar Um par contendo o cdigo de matrcula do aluno e a lista de disciplinas cursadas. !ada disciplina cursada representada por uma tripla com o cdigo da disciplina, o ano e o semestre que ela foi cursada e a nota obtida. "ormato# $matrcula, % $disciplina, $ano, semestre&, nota&, ... '& onde matrcula ( $ano, curso, n)mero*dentifica+o*ndi,idual& !adastro de -isciplinas Uma lista contendo, para cada disciplina, um par com o cdigo da disciplina e a quantidade de crditos. Grade !urricular Um par com o cdigo do curso e uma lista de pares onde cada par representa uma disciplina $cdigo& e uma lista dos seus pr. requisitos. "ormato# $curso, %$disciplina, %disciplina, disciplina,...'&, ...'& /edido de matrculaUm par com o cdigo do aluno e uma lista contendo o cdigo das disciplinas nas quais o aluno dese0a se matricular. "ormato# $matrcula, %pedido1, pedido2, ...'& Oferta Uma lista contendo as turmas a serem ofertadas, com seus 3or4rios e limite de ,agas. "ormato# %$disciplina, turma, quantidade5de5,agas, 3or4rio&,...' onde 3or4rio ( %$dia5da semana, 3ora5inicial, 3ora5final&, ...' 6ista de disciplinas de um curso, apresentadas por perodo Um par contendo o cdigo do curso e uma lista de pares, onde cada par representa um perodo do curso e uma lista das disciplinas do perodo. "ormato# $curso, %$perodo, %disciplina, disciplina,...'& Tist%rico $scolar Um par contendo o c%digo de matrcula do aluno e a lista de disciplinas cursadas. 3ada disciplina cursada representada por uma tripla com o c%digo da disciplina, o ano e o semestre que ela foi cursada e a nota obtida. Formato) 9matrcula, i 9disciplina, 9ano, semestre/, nota/, ... a/ onde matrcula M 9ano, curso, registro/ 3adastro de &isciplinas Uma lista contendo, para cada disciplina, um par com o c%digo da disciplina e a quantidade de crditos. Grade 3urricular Um par com o c%digo do curso e uma lista de pares onde cada par representa uma disciplina 9c%digo/ e uma lista dos seus pr+ C S1 requisitos. Formato) 9curso, i9disciplina, idisciplina, disciplina,...a/, ...a/ \ista de disciplinas de um curso, apresentadas por perodo Um par contendo o c%digo do curso e uma lista de pares, onde cada par representa um perodo do curso e uma lista das disciplinas do perodo. Formato) 9curso, i9perodo, idisciplina, disciplina,...a/ /;ercPciosQ $screva fun#es em Tugs para resolver os problemas propostos abai'o, usando os nomes indicados em negrito. 7 pala,ra semestre, nestes problemas, representa um elemento do tipo $ano,s&, onde s ( 1 ou s ( 2. '. IcredseK &ado um hist%rico, o cadastro de disciplinas e um semestre, descrever o total de crditos cumpridos no semestre. 2. IncredK &ado um hist%rico e o cadastro de disciplinas, descrever a quantidade de crditos cumpridos por semestre. 3. IdncursadasK &ado um hist%rico e uma lista com as disciplinas por perodo, descrever a lista das disciplinas no cursadas ainda pelo aluno, dos perodos . cumpridos. $sta lista deve ter o seguinte formato) i9perodo,idisciplina,..a/, 9perodo,idisciplina,...a/,...a 4. Ima;credK &ada uma lista de hist%ricos, identificar a lista de alunos que possuem o maior n(mero de crditos cumpridos. 5. Icontere+K &ado um hist%rico, contar o n(mero de reprova#es. 0. IUubilaK Herificar se um determinado aluno se encontra em situao de .ubilamento 9possui tr:s reprova#es em uma mesma disciplina/. <. IabandonoK Herificar se o aluno dei'ou de cursar disciplinas em algum semestre. (. IdividaK !bter a lista das disciplinas que foram cursadas por um dado aluno, nas quais ele ainda no obteve aprovao. L. Ire+rovaK !bter uma lista de reprova#es por perodo, para um dado aluno. '%. IcrendK ! coeficiente de rendimento 937/ de um dado aluno determinado pela mdia ponderada das notas obtidas, tendo como peso, o n(mero de crditos das disciplinas. &etermine o 37 de um dado aluno. ''. Isem+rereNK !bter uma lista das disciplinas de um dado curso, que no possuem pr+requisito. '2. Icum+rereNK &ada uma disciplina, verificar se o aluno cumpriu seus pr+requisitos. '3. IdividasK !bter para um dado aluno, a lista de disciplinas que ele ainda no cursou, com respeito a uma dada grade curricular. '4. IsugestaoK !bter para um dado aluno, a lista de disciplinas que ele est apto a cursar, com respeito a uma dada grade curricular. C S> '5. Ilcum+rereNK !bter uma lista de pedidos de disciplinas para as quais os pr+requisitos foram cumpridos. '0. IldiscsolK &ada uma lista com os pedidos de todos os alunos, obtenha uma lista das disciplinas solicitadas, sem repetio. '<. IsolYdisci+linasYordK !bter a lista de alunos que solicitaram uma dada disciplina, com seus respectivos coeficientes de rendimentos. A lista de alunos deve estar em ordem crescente por coeficiente de rendimento. A lista resultante deve ter o seguinte formato) i9alunoC, coeficiente_de_rendimentoC/,9aluno1, coeficiente_de_rendimento1/, ...a 7A8? Ag0ncia de $urismoQ Uma ag:ncia de turismo possui o mapa atualizado de reservas dos hotis de uma determinada regio. *ara cada hotel, todas as informa#es pertinentes aos tipos de quarto oferecidos so registrados no mapa. $ste mapa representado por uma lista de tuplas, seguindo o seguinte formato) i9nomeY!otel, i9ti+oYNuarto, valorYdiria, situao/, ...a /, ...a onde nomeY!otel do tipo string5 ti+oYNuarto uma string5 valorYdiria um n(mero real positivo5 situao) n(mero inteiro positivo que indica a quantidade de quartos livres do tipo indicado. *ara o melhor entendimento da representao da lista de hotis no hugs, considere o seguinte e'emplo) lhoteis M i9;peterle;, i9;simples;, AN.N, A/,9;duplo;, SA.J, CN/, 9;lu'o;, CCN.N, 1/a /, 9;ibis;, i9;simples;, ?A.N, >/,9;duplo;, QA.A, CA/, 9;lu'o;, BA.N, >/a /, 9;novotel;, i9;simples;, QA.Q, CN/,9;duplo;, BN.A, 1N/, 9;lu'o;, CAN.N, CN/a /a /;ercPciosQ 3onsiderando o formato desta lista de hotis apresentada acima, resolva o seguinte problema, descrevendo fun#es em TUGO. C. &ados um tipo de quarto e a lista de hotis, apresente a lista com o nome do hotel ou com os nomes dos hotis que possuem a oferta mais barata para aquele tipo de quarto. 1. Avalie a funo definida no problema C para os par0metros adequados, considerando a lista de hotis como a dada acima. 7A8@ /s+etculos $eatraisQ Hrios espetculos esto sendo apresentados em um grande teatro da cidade. *ara cada um dos espetculos, registra+se o mapa de C S? ocupao da platia, conforme as vendas dos ingressos. A platia est representada por m filas numeradas de 1 a m, sendo que cada fila contm n cadeiras tambm numeradas de 1 a n 3onsidere a seguinte representao para os dados) Lugar na platia (fila, cadeira), onde fila representada por um inteiro de 1 a m e cadeira, por um inteiro de 1 a n. Platia Lista de duplas (lugar, situao) sendo que a situao : 1 para indicar lugar ocupado e 0 para indicar lugar vago. Teatro Lista de duplas (espetculo, platia) onde espetculo representado por um inteiro de 1 a p. /;ercPciosQ $screva um script em TUGO, com fun#es que resolvam os problemas abai'o. Nomes para cada uma das fun#es so sugeridos ao final do enunciado de cada problema. A. &ada uma platia pls, descreva a quantidade total de lugares ocupados 9total!cup/. Q. &ado um lugar lg e uma platia pls, verifique se o lugar lg est livre 9esta\ivre/. S. &ado um lugar lg e uma platia pls, verifique se e'iste algum vizinho lateral de lg que est livre 9vizinho\ivre/. J. &ada uma fila fl e uma platia pls, descreva a lista de cadeiras livres da fila fl 9cadeiras\ivresFila/. B. &ada uma platia pls, descreva a lista de cadeiras livres para cada fila 9lug\ivresFila/ CN. &ada uma platia pls, descreva a9s/ lista9s/ com o maior n(mero de cadeiras livres 9fila6a'\ivre/. CC. &ado um teatro trs e um espetculo ep, descreva a sua platia 9plateia$sp/. C1. &ado um teatro trs, um espetculo ep e uma fila fl, descreva a lista de cadeiras livres da fila fl 9cadeiras\ivresFila$sp/. C SA 238 /&$#A*A / SAI*A */ *A*5S 2387 I&$#5*.9:5Q !s programas que apresentamos e propusemos at ento, se basearam em um padro especfico de interao entre o usurio e o sistema. ! interpretador TUGO est constantemente solicitando uma e'presso, que em seguida avaliada por ele e o resultado apresentado ao usurio. He.amos o modelo ilustrado na figura 1N.C. A avalio de uma e'presso leva em conta as defini#es disponveis em bibliotecas e as construdas pelos programadores. Algumas vezes entretanto este modelo de interao no adequado tendo em vista que o programa do usurio no pode tomar a deciso de pedir ou no um dado ao usurio. 4udo tem que ser informado antecipadamente. /;em+lo 7Q &ese.amos fazer um programa que intera.a com o usurio para que ele tente descobrir um n(mero oculto. A interao do programa s% deve continuar enquanto o .ogador no descobrir o n(mero oculto. $ ve.a, no d para antecipar antes e codificar isto em uma e'presso. A Figura 1N.1 mostra um esquema da interao necessria. ! programa pode comear pedindo um valor ao usurio. Oe o usurio fornece um valor id:ntico ao valor oculto, o programa e'ibe a mensagem anunciando que o .ogador venceu e encerra o .ogo. 3aso contrrio o programa solicita um novo palpite. usurio Inter+retado r %.)S e;+resso resultado Figura 1N.C X 6odelo de 2nterao usurio+interpretador TUGO scri+ts C SQ Nestes casos, no queremos descrever mapeamentos entre con.unto de valores e sim seq<:ncia de a#es. - o contato das fun#es com o mundo. Ainda podemos usar fun#es para determinar valores, mas quando precisamos, temos que estabelecer uma seq<:ncia de a#es a serem e'ecutadas. Agora o que nos interessa definir programas, atravs de seq<:ncias de a#es. He.amos uma soluo para o .oguinho acima introduzido) sim no rFornea outro valors valor r'ogo encerrados "alor ,ornecido G &(mero oculto O Figura 1N.1 X 2ntera#es para descobrir um n(mero oculto C SS No*o' = do &u"="r_# K>>1or#e2a um #]mero e#"re % e '%K alor !- *e"_i#e i1 alor == K5K "7e# do &u"="r_# Ka$er"ou - &ara)V#sPK else do &u"="r_# Kerrou - "e#"e ou"ra ezPK No*o' C SJ $ algumas intera#es) Mai#> No*o' >>1or#e2a um #]mero e#"re % e '% 3 errou - "e#"e ou"ra ezP >>1or#e2a um #]mero e#"re % e '% 4 errou - "e#"e ou"ra ezP >>1or#e2a um #]mero e#"re % e '% 2 errou - "e#"e ou"ra ezP >>1or#e2a um #]mero e#"re % e '% 5 a$er"ou - &ara)V#sP Hamos agora dissecar o programa) C. *ara estabelecer contato com o mundo precisamos de uma ao para leitura e outra para e'ibio de resultado. Aqui a leitura realizada atravs da primitiva getBine. *ara e'ibir resultados fazemos uso da primitiva +utStrBn. $nquanto getBine no precisa de um par0metro, visto que uma ao que sempre buscar na interao obter um valor, a +utStr necessita de um valor para ser e'ibido5 1. ! programa Uogo7 no precisa de par0metro para realizar sua atividade, dado que tudo ser solicitado diretamente dentro do corpo do programa, na medida do necessrio5 >. *ara informar que o que estamos definindo uma seq<:ncia de a#es e no uma descrio funcional, introduzida a partcula do, que pode ser traduzida pelo imperativo ,aag ?. *ara que um valor obtido pelo comando de leitura getBine, se torne disponvel para uso do programa precisamos internaliz+lo atravs do uso da primitiva representada pelo smbolo DE5 alor *e"_i#e A. *ara indicar que dese.amos continuar e'ecutando o programa podemos fazer uma chamada a ele mesmo, como o fizemos em) else d% p$tKtr@n Kerrou - "e#"e ou"ra ezPK <%-%1 C SB C JN