03.prog.imp.nb 1 Programação Imperativa Nos exercícios que se seguem, as únicas funções primitivas sobre listas que deve utilizar são: First, Last, Rest, Append, Prepend, Length, [[.]] e{}. Cada exercício sobre listas pode (e deve) ser resolvido de várias maneiras: - recorrendo à função Length para determinar a guarda do While; - utilizando variável de progresso em lista; -... Defina imperativamente em Mathematica as funções abaixo descritas. somanat: recebe um número natural n e devolve a soma de todos os naturais até n. somanat@6d 21 quadrados: recebe um número natural n e devolve a lista dos quadrados perfeitos até n. quadrados@6d 81, 4, 9, 16, 25, 36< quadradosinv: recebe um número natural n e devolve a lista dos quadrados perfeitos até n, por ordem decrescente. quadradosinv@6d 836,25,16,9,4,1< prodlista: recebe uma lista de inteiros e devolve o produto dos seus elementos. prodlista@81, 2, 3, 4<D 24 contemprimoq:recebe uma lista de naturais w e devolve sse w contém pelo menos um número primo. contemprimoq@81, 2, 3, 4<D
03.prog.imp.nb 2 contemprimoq@84, 6, 8, 10<D pertenceq: recebe uma lista de inteiros w e um inteiro k e devolve sse k ocorre em w. pertenceq@83, 4, 5, 6, 7, 5<, 8D pertenceq@83, 4, 5, 6, 7, 5<, 7D junta: recebe duas listas e devolve a sua concatenação. junta@81, 2, 3<, 89, 8, 7<D 81, 2, 3, 9, 8, 7< indicespar: recebe uma lista de inteiros w e devolve a lista dos elementos de w em posições pares. indicespar@82, 3, 4, 4, 5<D 83, 4< retirapares: recebe uma lista de inteiros w e devolve a lista dos elementos pares de w. retirapares@82, 3, 4, 4, 5<D 82, 4, 4< retiraneg: recebe uma lista de inteiros w e devolve a lista resultante de retirar todos os números negativos de w. retiraneg@83, 2, 1, 7<D 83, 1< supremo: recebe uma lista de inteiros e devolve o seu supremo. (Note que o supremo do conjunto vazio é -.) supremo@8<d supremo@81, 3, 6, 27<D 6
03.prog.imp.nb 3 posicoesmaximo: recebe uma lista de inteiros e devolve a lista das posições onde ocorre o maior elemento. posicoesmaximo@82, 7, 6, 5, 7<D 82, 5< conta: recebe como argumentos uma lista de inteiros w e um inteiro k e devolve o número de vezes que k ocorre em w. conta@81, 2, 3, 1, 2, 3<, 2D 2 lposicoes: recebe como argumentos uma lista de inteiros w e um inteiro k e devolve a lista das posições em que k ocorre em w. lposicoes@81, 2, 3, 1, 2, 3<, 2D 82, 5< caracteristicaprimos: recebe uma lista de naturais w e devolve uma lista com nas posições onde ocorre em w um número primo e nas outras. caracteristicaprimos@81, 2, 3, 4, 5, 6, 7, 8, 9<D 8,,,,,,,, < apaga1: recebe uma lista w e um número inteiro k e devolve a lista que resulta de se apagar de w a primeira ocorrência de k (caso exista). apaga1@81, 2, 3, 2, 1, 2<, 1D 82, 3, 2, 1, 2< apaga: recebe uma lista w e um número inteiro k e devolve a lista que resulta de se apagar de w todas as ocorrências de k. apaga@81, 2, 3, 2, 1, 2<, 1D 82, 3, 2, 2< seleccao: recebe uma lista e um predicado e devolve a lista dos elementos que verificam esse predicado. seleccao@81, 2, 3, 4, 5, 6<, PrimeQD 82, 3, 5<
03.prog.imp.nb 4 mapeia: recebe uma função f e uma lista w e devolve a lista dos resultados de aplicar f aos elementos de w. mapeia@function@x, 2^xD, 83, 5, 7, 8<D 88, 32, 128, 256< mapeia@function@x, EvenQ@xDD, 83, 5, 7, 8<D 8,,, < primalg: recebe um inteiro k e devolve o primeiro algarismo de k. primalg@2d 2 primalg@6535d 6 invertelista: recebe uma lista e devolve a mesma lista mas invertida. invertelista@81, 2, 3, 4<D 84, 3, 2, 1< ligualq: recebe duas listas e devolve se as listas forem iguais e caso contrário. ligualq@81, 2, 3<, 81, 2, 3<D ligualq@81, 2, 3<, 82, 1, 3<D Os exercícios seguintes são de um nível de dificuldade mais elevado; caso considere necessário, utilize algumas das funções acima definidas. permutacao: recebe duas listas w1 e w2 e devolve se w2 for uma permutação de w1 e caso contrário. permutacao@81, 2, 3<, 82, 1, 3<D permutacao@81, 2, 3<, 81, 2, 2, 3<D
03.prog.imp.nb 5 intercala: recebe duas listas w1 e w2 e devolve a lista resultante de intercalar os elementos de w1 e w2. intercala@83, 2, 1<, 85, 6, 7<D 83, 5, 2, 6, 1, 7< intercala@83, 2, 1<, 84<D 83, 4, 2, 1< intercala@8<, 85, 6, 7<D 85, 6, 7< separamult3e5: recebe uma lista de inteiros w e devolve um par formado por duas listas: a dos múltiplos de 5 que ocorrem em w e a dos múltiplos de 3 que ocorrem em w. separamult3e5@81, 2, 3, 4, 5, 9, 15<D 883, 9, 15<, 85, 15<< potencia: recebe um dígito k (que não zero) e devolve o menor natural n tal que 2^n começa por k. potencia@2d 2 potencia@3d 6 repete: recebe uma lista w e devolve uma lista em que o primeiro elemento de w aparece uma vez, o segundo elemento duas vezes,.... repete@8a, b, c<d 8a, b, b, c, c, c< Ciclos encaixados temprimoq: recebe uma lista de listas de inteiros e devolve sse alguma das suas sublistas tem um número primo. temprimoq@884<, 83<, 81, 4, 6<<D temprimoq@884<, 88<, 81, 4, 6<<D
03.prog.imp.nb 6 prodmatriz: recebe uma matriz e devolve o produto de todos os seus elementos. prodmatriz@883, 2, 1<, 82, 1, 2<<D 24 mediacolunasparesmatriz: recebe uma matriz e devolve a média dos elementos das colunas pares da matriz. mediacolunaspares@881, 2, 3, 6<, 84, 3, 2, 1<, 81, 6, 7, 6<<D 4 indprimos: recebe uma lista de listas de inteiros {w11,w12,...,w1k} e devolve a lista de listas {w21,w22,...,w2k} em que cada w2i contém as posições dos números primos em w1i. indprimos@881, 2, 3, 4, 5<, 82, 4, 3, 5<, 84, 6, 8, 9<, 8<<D 882, 3, 5<, 81, 3, 4<, 8<, 8<< transposta: recebe uma matriz e devolve a sua transposta. transposta@881, 2, 3<, 89, 8, 7<, 85, 7, 9<, 84, 6, 8<<D 881, 9, 5, 4<, 82, 8, 7, 6<, 83, 7, 9, 8<< Problemas Defina uma função produtomatrizes que recebe como argumentos duas matrizes e devolve a sua matriz produto. Verifique que a dimensão das matrizes recebidas é tal que é possivel realizar o seu produto (se não o for, retorne uma mensagem de erro adequada). Sugestão: use um procedimento auxiliar para multiplicar a linha de indice i de uma matriz pela coluna de indice j da outra matriz. produtomatrizes@882, 3<, 88, 7<, 86, 2<<, 884, 5<, 81, 9<<D 8811, 37<, 839, 103<, 826, 48<< Considere o problema de calcular a área por baixo do gráfico duma função f (o integral de f) num intervalo [a,b]. Defina uma função aproximaintegral que receba como argumentos a função f, os extremos do intervalo de integração e um parâmetro n e calcula uma aproximação do integral da função nesse intervalo. A ideia básica consiste em dividir o intervalo [a,b] em n sub-intervalos consecutivos, com n suficientemente grande para se obter a aproximação desejada [a, b] = [x 0, x 1 ]... [x n-1, x n ] e aproximar a função em cada um dos intervalos [x i-1, x i ] por f(x i-1 ).
03.prog.imp.nb 7 400 300 200 100 2.5 3 3.5 4 4.5 Nestas condições, o valor do integral é aproximado por n i=1 Hx i - x i-1 L f Hx i L. Escolhendo todos os intervalos com os mesmo comprimento d = b-a ÅÅÅÅÅÅÅÅ n tem-se que x i = x i-1 + d, ou então, x i = a + id, e chega-se a n i=1 dfha + Hi - 1L dl. ou seja n d i=1 f Ha + Hi - 1L dl g = Function@x, H1 + xl^ 1D; aproximaintegral@g, 0, 1.5, 5D 1.01253 aproximaintegral@g, 0, 1.5, 500000D 0.916292
03.prog.imp.nb 8 Defina uma função bisseccao que calcula uma raíz de uma equação não linear num intervalo [a,b] com aproximação pelo menos e, usando o método da bissecção a seguir descrito. O Método da Bissecção é um método iterativo para encontrar raízes de funções baseado no Teorema do Valor Intermédio. Pretende-se encontrar uma solução da equação f(x)=0, admitindo que f é contínua em [a,b] e que f(a)f(b)<0. Tome-se a 0 = a, b 0 = b, I 0 = @a 0, b 0 D e repita-se iterativamente o seguinte processo. Seja x i o ponto médio do intervalo I i. Uma das três condições seguintes verifica-se: 1) f Ha i L f Hx i L < 0, e existe uma raíz de f em @a i, x i D; 2) f Ha i L f Hx i L > 0, e existe uma raíz de f em @x i, b i D; 3) f Ha i L f Hx i L = 0, e x i é uma raíz de f. No terceiro caso, não é preciso fazer mais nada. Nos outros dois casos, defina-se a i+1 e b i+1 como sendo a i e x i (primeiro caso) ou x i e b i (segundo caso), tome-se I i+1 = @a i+1, b i+1 D e repita-se o processo. Aplicando este procedimento sucessivamente, é calculada uma sequência de intervalos I 0 I 1 I 2... onde a raíz rœi k para todo o k. O procedimento termina quando a amplitude do intervalo for menor do que o erro pretendido e. Note que a amplitude do intervalo se reduz a metade a cada iteração. f = Function@x, E^ x Sin@xDD; bisseccao@f, 0.25, 0.75, 0.000001D O numero de iterações realizadas foi: 18 0.588532 Exercícios de Exame Defina imperativamente as seguintes funções. (Exame 21/01/2002 - Versão A) exame1 que recebendo como argumento uma matriz quadrada de números inteiros calcula a lista dos pares {i,j} tais que a soma da linha i é igual à soma da coluna j. Sugestão: defina uma função auxiliar eqsum tal que eqsum[i,j] seja no caso de a soma da linha i ser igual à soma da coluna j e no caso contrário. exame1@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 882, 1<, 82, 2<<
03.prog.imp.nb 9 (Exame 21/01/2002 - Versão B) exame2 que recebendo como argumento uma matriz quadrada de números inteiros calcula a lista dos números (2^i)*(3^j) tais que o produto da linha i é igual ao produto da coluna j. Sugestão: defina uma função auxiliar eqprod tal que eqprod[i,j] seja se o produto da linha i for igual à soma da coluna j e no caso contrário. exame2@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 812< (Exame 06/02/2002 - Versão A) exame3 que recebendo como argumento uma matriz de números inteiros calcula a lista dos pares {i,x} tais que a soma dos elementos da linha i é igual a x. Sugestão: defina uma função auxiliar sum tal que sum[i] seja a soma da linha i. exame3@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 881, 12<, 82, 10<, 83, 9<< (Exame 06/02/2002 - Versão B) exame4 que recebendo como argumento uma matriz de números inteiros calcula a lista dos pares {j,y} tais que o produto dos elementos da coluna j é igual a y. Sugestão: defina uma função auxiliar prod tal que prod[j] seja o produto da coluna j. exame4@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 881, 30<, 82, 36<, 83, 40<< (Exame 22/01/2003 - Versão A) triangularsuperiorq que recebendo como argumento uma matriz quadrada de números inteiros determina se a matriz é triangular superior (isto é, todos os elementos abaixo da diagonal principal são nulos). triangularsuperiorq@883, 4, 5<, 80, 3, 2<, 80, 0, 4<<D triangularsuperiorq@883, 4, 5<, 80, 3, 2<, 80, 3, 4<<D (Exame 22/01/2003 - Versão B) triangularinferiorq que recebendo como argumento uma matriz quadrada de números inteiros determina se a matriz é triangular inferior (isto é, todos os elementos acima da diagonal principal são nulos). triangularinferiorq@883, 0, 0<, 85, 3, 0<, 82, 3, 4<<D triangularinferiorq@883, 4, 0<, 85, 3, 0<, 82, 3, 4<<D
03.prog.imp.nb 10 (Exame 07/02/2003 - Versão Ax) exame5 que recebendo como argumento uma matriz quadrada de números inteiros calcula o produto de todos os elementos pares acima da diagonal principal. exame5@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 11 (Exame 07/02/2003 - Versão Ay) exame6 que recebendo como argumento uma matriz quadrada de números inteiros calcula a soma de todos os elementos ímpares acima da diagonal principal. exame6@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 10 (Exame 07/02/2003 - Versão Bx) exame7 que recebendo como argumento uma matriz quadrada de números inteiros calcula a soma de todos os elementos pares abaixo da diagonal principal. exame7@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 2 (Exame 07/02/2003 - Versão By) exame8 que recebendo como argumento uma matriz quadrada de números inteiros calcula o produto de todos os elementos ímpares abaixo da diagonal principal. exame8@883, 4, 5<, 85, 3, 2<, 82, 3, 4<<D 15 (Exame 17/01/2005 - Versão A) exame9 que quando recebe como argumento w uma lista de listas de números inteiros percorre w recorrendo a dois ciclos While encaixados e verifica se cada lista em w é prefixo de todas as listas posteriores. Sugestão: Basta verificar se cada lista em w é prefixo da lista seguinte. Recorde que se diz que w1 é prefixo de w2 se existe w3 tal que Join[w1,w3]==w2. exame9@881, 2<, 81, 2, 3<<D
03.prog.imp.nb 11 (Exame 17/01/2005 - Versão B) exame10 que quando recebe como argumento w uma lista de listas de números inteiros percorre w recorrendo a dois ciclos While encaixados e verifica se cada lista em w é sufixo de todas as listas anteriores. Sugestão: Basta verificar se cada lista em w é sufixo da lista anterior. Recorde que se diz que w1 é prefixo de w2 se existe w3 tal que Join[w1,w3]==w2. exame10@881, 2, 3<, 82, 3<<D (Exame 31/01/2005 - Versão A) exame11 que quando recebe como argumento w uma lista de listas de números inteiros percorre w recorrendo a dois ciclos While encaixados e devolve a soma de todos os números ímpares que ocorrem em listas estritamente decrescentes de w. exame11@883, 2<, 83, 2, 3<<D 3 (Exame 31/01/2005 - Versão B) exame12 que quando recebe como argumento w uma lista de listas de números inteiros, percorre w recorrendo a dois ciclos While encaixados e devolve a soma de todos os números pares que ocorrem em listas estritamente crescentes em w. exame12@883, 1, 2<, 81, 2, 3<<D 2 (Exame 16/01/2006) exame13 que quando recebe como argumento w uma lista de listas de números inteiros percorre w recorrendo a dois ciclos While encaixados e verifica se w é um código de Gray. Nota: um código de Gray é uma lista de listas de números inteiros tal que todas as listas têm o mesmo comprimento e cada lista difere da lista seguinte exactamente numa posição. exame13@881, 2, 4<, 81, 2, 3<, 83, 2, 3<, 83, 5, 3<<D