Folha da Cálculo Jorge Cruz DI/FCT/UNL Introdução aos Computadores e à Programação 1º Semestre 2005/2006 30 Novembro 2005 Folha da Cálculo 1 Folha de Cálculo • A informação numa folha de cálculo está estruturada com base em matrizes, ou tabelas. 1 2 3 4 5 A 610 825 316 34 723 B C Paulo Fernandes Lopes 2341.36 Pedro Vieira 989.24 Marta Costa Martins 1389.17 Rui Vasco Pereira 5310.32 Jorge Barata 767.26 D 15/04/1996 25/06/1999 05/01/1992 15/04/1996 03/09/2002 • Numa folha simples, existe uma única matriz, cuja dimensão é arbitrária. Nessa matriz podem ser definidas submatrizes, ou subvectores. • Qualquer posição na matriz é uma variável, identificada pela sua coluna (A, B, Z, AA, ... – uma ou mais letras) e sua linha (1, 2, 3, ... - um inteiro). Por exemplo B2 = “Pedro Vieira” 30 Novembro 2005 Folha da Cálculo 2 Folha de Cálculo • Tal como numa linguagem de programação, a uma variável podem ser atribuídos valores, constantes ou dependentes de outras variáveis através de fórmulas. 1 2 3 4 5 A 1 2 3 4 5 B 3 6 9 12 15 A1 = 1 A2 = 2 .... A5 = 5 B1 = 3 * A1 B2 = 3 * A2 .... B5 = 3 * A5 • Uma folha de cálculo tem uma natureza reactiva. Sempre que uma variável muda de valor, as que são dependentes mudam igualmente de valor. • Por exemplo, se A1 passar para 2, B1 passará automaticamente para B1 = 3* A1 = 3* 2 = 6. 30 Novembro 2005 Folha da Cálculo 3 Folha de Cálculo • Por esta razão, não são permitidas fórmulas que introduzam dependências circulares – directas ( A1 = 2 * A1); – ou indirectas (A1 = 2 * B1 e B1 = 2 * A1). 1 2 3 4 5 A 1 2 3 4 5 B 3 6 9 12 15 A1 = 1 A2 = 2 .... A5 = 5 • Qualquer destas fórmulas eventualmente infinitas. 30 Novembro 2005 B1 = 3* A1 B2 = 3* A2 .... B5 = 3 * A5 levaria Folha da Cálculo a computações 4 Condicionais em Folhas de Cálculo • Em folhas de cálculo existem instruções condicionais de atribuição de valores. • A sua sintaxe (em EXCEL) é if(condition, then_value, else_value) 1 2 3 4 5 A 1 2 3 4 5 B 3 6 9 0 0 A1 = 1 A2 = 2 .... A5 = 5 B1 = if (A1 <=3, 3* A1,0) B2 = if (A2 <=3, 3* A2,0) .... B5 = if (A5 <=3, 3* A5,0) • Estas instruções podem encadear-se. Por exemplo if(condition1, then_value1, if(condition2, then_value2, if(condition3, then_value3,value_4))) 30 Novembro 2005 Folha da Cálculo 5 Iterações em Folhas de Cálculo • O conceito de iteração numa linguagem imperativa implica a repetição temporal de instruções. Por exemplo, a instrução para i de 1 até n <instruções> fimpara; • Pretende fazer executar as <instruções> (de atribuição de valores a variáveis) n vezes, em sequência. • Numa folha de cálculo, essa iterações podem ser obtidas através de uma repetição espacial das instruções. • A título de exemplo, vamos calcular xn. 30 Novembro 2005 Folha da Cálculo 6 Iterações em Folhas de Cálculo • Numa linguagem imperativa, por exemplo em Octave, o cálculo pode ser feito através do programa y = 1 ; x = <valor> for i = 1:n y = y * x endfor; • Neste programa, a variável y vai tomando os diversos valores (1, x, x2, x3, ..., xn), ao longo do tempo, começando com o valor 1, e terminando no valor xn. 30 Novembro 2005 Folha da Cálculo 7 Iterações em Folhas de Cálculo • Numa folha de cálculo, os diferentes valores que y toma, podem ser arrumados, ao longo do espaço, por exemplo num conjunto de células contíguas (por exemplo, uma coluna). 1 2 3 4 5 A 2 4 8 16 32 A1 A2 A3 … A5 = <...> = A1 * A1; = A2 * A1; = A4 * A1; X = <...> Y1 = 1 * Y2 = Y1 * Y3 = Y2 * … Y5 = Y4 * X X; X; y = 1 ; x = <...> for i = 1:n y = y * x fimfazer; X; • De notar que, na realidade, o mesmo programa tem de ser “escrito” n vezes, uma vez em cada célula. • Para evitar este inconveniente, a interface das folhas de cálculo permite “copiar” o conteúdo de uma célula para outras, fazendo automaticamente o ajuste das referências. Folha da Cálculo 30 Novembro 2005 8 Iterações em Folhas de Cálculo • Por exemplo, se tivermos a célula B1 definida como B1 = 2* A1 e copiarmos a célula B1 para a célula B2, como a cópia é feita para uma célula com nº de linha superior em 1, (B1 para B2), o valor 1 é acrescentado a todas as linhas na fórmula, obtendo-se B2 = 2*A2 • Igualmente ao copiar uma célula para outra ao lado, a diferença de colunas entre a célula origem e a célula destino é acrescentada às referências a colunas. Se copiar a célula B1 para a posição D1 (2 colunas de diferença) obtém-se D1 = 2*C1 – Nota: A cópia pode ser feita com os habituais comandos <ctrl-c> e <ctrlv>, ou por comandos de “arrastamento”. 30 Novembro 2005 Folha da Cálculo 9 Referências em Folhas de Cálculo • As referências a linhas e colunas que são ajustadas nas cópias de células são chamadas referências relativas (à célula de onde são copiadas – a célula é 2 vezes superior à célula “de cima” ou “do lado”). • No entanto, há situações em que não queremos que estas referências a linhas e colunas sejam relativas mas sim absolutas, e que não sejam alteradas na cópia. A1 A2 A3 … A5 = <...> = A1 * A1; = A2 * A1; = A4 * A1; 30 Novembro 2005 Por exemplo, ao copiar o conteúdo da célula A2 para A3, queremos alterar a 1ª referência a A1 para A2 (referência relativa), mas não a 2ª referência (referência absoluta). Folha da Cálculo 10 Referências em Folhas de Cálculo • Para explicitarmos que uma referência é absoluta, e não se altera quando copiada para uma linha/coluna diferentes, antecedemos a linha/coluna pelo símbolo ‘$’. A1 A2 A3 … A5 = <...> = A1 * A$1; = A2 * A$1; = A4 * A$1; A cópia da célula A2 para as células abaixo altera a referência à linha relativa (1 acima), mas não à referência absoluta (a célula A1). • As referências podem ser relativas a uma dimensão e absolutas na outra dimensão, como no exemplo presente (a linha é absoluta, mas a coluna não é). • Assim, se copiarmos as células A2 a A5 para as células B2 a B5, iremos calcular B1^5. 30 Novembro 2005 Folha da Cálculo 11 Referências em Folhas de Cálculo • As referências relativas/absolutas podem ser igualmente utilizadas em matrizes. 1 2 3 4 5 A 2 4 8 16 32 B 3 9 27 81 243 A1 A2 A3 … A5 = 2 = A1 * A$1; = A2 * A$1; = A4 * A$1; B1 B2 B3 … B5 = 3 = B1 * B$1; = B2 * B$1; = B4 * B$1; • A iteração (temporal) pode pois ser substituída pela iteração (espacial) mas depende do utilizador o número de células que copia. • Os ciclos enquanto não são assim directamente representáveis numa folha de cálculo, se o utilizador não souber à partida o número de iterações que devem ser efectuadas. 30 Novembro 2005 Folha da Cálculo 12 Soma de um Vector • Os valores de um vector ou tabela numa folha de cálculo podem ser agregados (somas, médias, etc..) de uma forma semelhante ao que se faz numa linguagem de programação como o Octave, com a implementação de iteração. • Consideremos a soma de o vector nas posições A1 a E1. Em Octave poderíamos escrever (para um vector de 5 posições). s = 0; for i = 1:5 s = s+a(i); endfor. • A variável s cujo valor vai sendo iterado, pode ser substituída pelo vector B1 a B5 que vai tomando os valores de s nas diferentes iterações A2 = A1 + 0; 1 2 A 3 3 30 Novembro 2005 B 5 8 C 4 12 D 2 14 E 6 20 Folha da Cálculo B2 C2 D2 E2 = = = = B1 C1 D1 E1 + + + + A2; B2; C2; D2; 13 Soma Condicional de um Vector • Em Octave podemos somar valores de um vector que satisfaçam uma condição através de uma instrução condicional dentro do ciclo. • Consideremos a soma apenas dos valores positivos de um vector nas posições A1 a E1. Em Octave poderíamos escrever (para um vector de 5 posições). s = 0; for i = 1:5 if a(i) > 0 then d = a(i) else d = 0; s = s+d; endfor. • Este estilo de programação pode ser adaptado a uma folha de cálculo, utilizando-se uma linha adicional, onde se colocam ou os valores do vector original ou o valor 0. 30 Novembro 2005 Folha da Cálculo 14 Soma Condicional de um Vector s = 0; for i = 1:5 if a(i) > 0 then d = a(i) else d = 0; s = s+d; endfor. A2 B2 C2 D2 E2 = = = = = if(A1 if(B1 if(C1 if(E1 if(E1 30 Novembro 2005 1 2 3 A 3 3 3 > > > > > 0, 0, 0, 0, 0, B -5 0 3 A1, B1, C1, D1, E1, C 4 4 7 D 0 0 7 0); 0); 0); 0); 0); Folha da Cálculo E 6 6 13 A3 B3 C3 D3 E3 = = = = = A2 B2 C2 D2 E2 + + + + + 0; A3; B3; C3; D3; 15 Funções para Somas de Vectores • Tal como em Octave, também as folhas de cálculo permitem a utilização de funções. O paralelo é ainda maior do que noutras linguagens de programação, porque em Octave vectores e matrizes são tipos básicos, permitindo referências a subvectores e submatrizes. • Assim em Octave, a soma dos elementos de um vector V com n elementos é obtida através da função s = sum(V) • Se se pretender somar apenas os valores do subvector constituído pelos elementos 3 a 7, podemos usar a referência a esse subvector na função através de s = sum(V(3:7)) 30 Novembro 2005 Folha da Cálculo 16 Funções para Somas de Vectores • Numa folha de cálculo, podemos usar igualmente a função sum, sendo o vector delimitado entre a sua célula inicial e final. – Quer no caso de um vector linha F1 = SUM(A1:E1) 1 A 3 B -5 C 4 D 0 E 6 F 8 G 13 – Quer no caso de um vector coluna A6 = SUM(A1:A5) • Estas funções podem ainda utilizar-se para somas condicionais: G1 = SUMIF(A1:E1,">0") A7 = SUMIF(A1:A5,">0") 30 Novembro 2005 Folha da Cálculo 1 2 3 4 5 6 7 A 3 -5 4 0 6 8 13 17 Soma de uma Matriz • As mesmas técnicas podem ser utilizadas no caso de matrizes, sendo mais “prático” o uso de funções. 1 2 3 4 5 A 0 -3 2 -1 2 B -3 1 0 -2 1 C 4 7 3 14 14 D 2 9 -4 7 11 E 3 14 1 18 28 F 6 17 5 28 28 A4 = SUM(A1:A3) ..... D4 = SUM(D1:D3) F1 = SUMIF(A1:D1,”>0”) F2 = SUMIF(A1:D1,”>0”) F3 = SUMIF(A1:D1,”>0”) E4 = SUM(A1:D4) A5 = SUMIF(A1:A3,”>0”) ... D5 = SUMIF(D1:D3,”>0”) 30 Novembro 2005 E1 = SUM(A1:D1) E2 = SUM(A2:D2) E3 = SUM(A3:D3) Folha da Cálculo F4 = SUM(F1:F3) E5 = SUM(E1:E4) F5 = SUMIF(A1:D4,”>0”) 18