Laboratório de Programação. Lição n.º 3 Somas acumuladas

Documentos relacionados
Modelos de Regressão Linear Simples - Erro Puro e Falta de Ajuste

Curso C: Ponteiros e Arrays

Matrizes. matriz de 2 linhas e 2 colunas. matriz de 3 linhas e 3 colunas. matriz de 3 linhas e 1 coluna. matriz de 1 linha e 4 colunas.

tipo e tamanho e com os "mesmos" elementos do vetor A, ou seja, B[i] = A[i].

AV2 - MA UMA SOLUÇÃO

PESQUISA OPERACIONAL -PROGRAMAÇÃO LINEAR. Prof. Angelo Augusto Frozza, M.Sc.

Teste de hipótese em modelos normais lineares: ANOVA

QUESTÕES PARA A 3ª SÉRIE ENSINO MÉDIO MATEMÁTICA 2º BIMESTE SUGESTÕES DE RESOLUÇÕES

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO PROGRAMA DE EDUCAÇÃO TUTORIAL - MATEMÁTICA PROJETO FUNDAMENTOS DE MATEMÁTICA ELEMENTAR

Seu pé direito nas melhores Faculdades

= Pontuação: A questão vale dez pontos, tem dois itens, sendo que o item A vale até três pontos, e o B vale até sete pontos.

Progressão aritmética ( PA )

EGEA ESAPL - IPVC. Resolução de Problemas de Programação Linear, com recurso ao Excel

Bombons a Granel. Série Matemática na Escola. Objetivos 1. Introduzir e mostrar aplicações do produto de matrizes.

Determinantes. Matemática Prof. Mauricio José

Algoritmos e Estruturas de Dados I. Variáveis Indexadas. Pedro O.S. Vaz de Melo

Algoritmos e Estruturas de Dados I. Recursividade. Pedro O.S. Vaz de Melo

Programação Linear - Parte 4

Técnicas de Contagem I II III IV V VI

Aula de Exercícios - Variáveis Aleatórias Discretas

Prof. Neckel FÍSICA 1 PROVA 1 TEMA 2 PARTE 1 PROF. NECKEL POSIÇÃO. Sistema de Coordenadas Nome do sistema Unidade do sistema 22/02/2016.

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

Como rodar a regressão no gretl. Usando o Console para calcular elasticidade. Elasticidade. Usando o Console para calcular predição

Matemática Básica Intervalos

Álgebra Linear I - Aula 20

Aula de Exercícios - Teorema de Bayes

Matrizes de Transferência de Forças e Deslocamentos para Seções Intermediárias de Elementos de Barra

TESTES SOCIOMÉTRICOS

Em linguagem matemática, essa proprieade pode ser escrita da seguinte maneira: x. 1 = x Onde x representa um número natural qualquer.

Da linha poligonal ao polígono

Resolução de circuitos usando Teorema de Thévenin Exercícios Resolvidos

ActivALEA. ative e atualize a sua literacia

2y 2z. x y + 7z = 32 (3)

Universidade Federal de Goiás Campus Catalão Departamento de Matemática

Probabilidade. Luiz Carlos Terra

Álgebra Linear AL. Luiza Amalia Pinto Cantão. Depto. de Engenharia Ambiental Universidade Estadual Paulista UNESP

M =C J, fórmula do montante

Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009

Álgebra Linear Aplicada à Compressão de Imagens. Universidade de Lisboa Instituto Superior Técnico. Mestrado em Engenharia Aeroespacial

COMENTÁRIO DA PROVA DO BANCO DO BRASIL

Módulo de Princípios Básicos de Contagem. Segundo ano

Usando potências de 10

Somando os termos de uma progressão aritmética

Adição de probabilidades. O número de elementos da união dos conjuntos A e B n(aub) = n(a B) Dividindo os dois membros por n(e):

Os dados quantitativos também podem ser de natureza discreta ou contínua.

Capítulo 5: Repetições

ALGORITMOS E COMPLEXIDADE PROBLEMAS E ALGORITMOS

1 CLASSIFICAÇÃO 2 SOMA DOS ÂNGULOS INTERNOS. Matemática 2 Pedro Paulo

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

Figura 4.1: Diagrama de representação de uma função de 2 variáveis

Criar e formatar relatórios

Capítulo VI Circuitos Aritméticos

SOLUÇÕES N item a) O maior dos quatro retângulos tem lados de medida 30 4 = 26 cm e 20 7 = 13 cm. Logo, sua área é 26 x 13= 338 cm 2.

Os eixo x e y dividem a circunferência em quatro partes congruentes chamadas quadrantes, numeradas de 1 a 4 conforme figura abaixo:

Resolução da Lista de Exercício 6

Solução da prova da 2a fase OBMEP 2014 Nível 2. Questão 1. item a)

Semana 7 Resolução de Sistemas Lineares

Prof. Daniela Barreiro Claro

Programação Recursiva versão 1.02

Métodos Estatísticos Avançados em Epidemiologia

Função. Adição e subtração de arcos Duplicação de arcos

Aula 6 Propagação de erros

TRIGONOMETRIA CICLO TRIGONOMÉTRICO

Lei de Gauss. 2.1 Fluxo Elétrico. O fluxo Φ E de um campo vetorial E constante perpendicular Φ E = EA (2.1)

EXERCÍCIOS DE ÁLGEBRA LINEAR E GEOMETRIA ANALÍTICA (sistemas de equações lineares e outros exercícios)

Uma equação trigonométrica envolve como incógnitas arcos de circunferência e relacionados por meio de funções trigonométricas.

Índice. Conteúdo. Planilha Profissional Para Cálculo de Preços de Artesanato

Aula 8 21/09/ Microeconomia. Demanda Individual e Demanda de Mercado. Bibliografia: PINDYCK (2007) Capítulo 4

Resolução de sistemas de equações lineares: Método de eliminação de Gauss

Resolução do exemplo 8.6a - pág 61 Apresente, analítica e geometricamente, a solução dos seguintes sistemas lineares.

Correção dos Exercícios

Lista de Exercícios 2º Ensino médio manhã

Bacharelado em Ciência e Tecnologia Processamento da Informação. Módulos Parte III

Entropia, Entropia Relativa

Métodos Estatísticos Avançados em Epidemiologia

AV1 - MA (1,0) (a) Determine o maior número natural que divide todos os produtos de três números naturais consecutivos.

Algoritmo Simplex em Tabelas. Prof. Ricardo Santos

AULA 07 Distribuições Discretas de Probabilidade

Figuras geométricas planas. Joyce Danielle. e espaciais

Aprendendo a trabalhar com frações parciais

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE. Aula 03 Inversão de matrizes

Inversão de Matrizes

INICIADOS - 2ª Sessão ClubeMath

AULA 19 Análise de Variância

Módulo de Equações do Segundo Grau. Equações do Segundo Grau: Resultados Básicos. Nono Ano

Microeconomia. Prof.: Antonio Carlos Assumpção

Prática. Exercícios didáticos ( I)

Distribuição Normal de Probabilidade

CURSO DE MATEMÁTICA BÁSICA PROGRAMA DE EDUCAÇÃO TUTORIAL CENTRO DE ENGENHARIA DA MOBILIDADE

Aula 5. Uma partícula evolui na reta. A trajetória é uma função que dá a sua posição em função do tempo:

Graphing Basic no Excel 2007

PUC-Rio Desafio em Matemática 15 de novembro de 2008

AULA 03 MEDIDAS DE RESISTÊNCIA ELÉTICA

Simulado de Linguagem de Programação Java

Curso Mentor. Radicais ( ) Definição. Expoente Fracionário. Extração da Raiz Quadrada. Por definição temos que:

EXAME DE MACS 2º FASE 2014/2015 = 193

a) 2 b) 3 c) 4 d) 5 e) 6

Circuitos Aritméticos

Matrizes Reais conceitos básicos

Que algarismos devem ser colocados nos pontinhos da conta abaixo? x O. IS x 12 = = 120

Transcrição:

Laboratório de Programação Lição n.º 3 Somas acumuladas

Somas acumuladas Soma de arrays. Acumulação linear. Soma de matrizes. Acumulação bidimensional. Técnicas de acumulação. 4/4/16 Programação Imperativa 2

Soma de arrays Uma das primeiras funções sobre arrays que estudámos foi que calcula a soma de todos os elementos de um array. Recordando, ei-la, para um array de ints a, com n elementos: int ints_sum(const int *a, int n) int result = 0; for (int i = 0; i < n; i++) result += a[i]; return result; 4/4/16 Programação Imperativa 3

Mais exatamente... A função ints_sum soma os n primeiros elementos de um array a que tem pelo menos n elementos. Em rigor, a função não sabe quantos elementos o array tem; ela apenas recebe ordem de somar os n primeiros elementos, presumindo que o tamanho do array (medido em número de elementos) é maior ou igual a n. 4/4/16 Programação Imperativa 4

Subarrays A função ints_sum também serve para somar subarrays. Por exemplo, para somar os n elementos do array a, começando na posição d, invoca-se a função assim: Dizemos que d representa o deslocamento do subarray, em relação ao array a.... ints_sum(a+d, n)... Neste caso, presume-se que o tamanho do array a é pelo menos d+n. 4/4/16 Programação Imperativa 5

Somas acumuladas Um exercício clássico de programação com arrays consiste em, dado um array a com n elementos, construir um array b tal que b[i] é a soma dos i primeiros elementos de a: int ints_accumulate(const int *a, int n, int *b) b[0] = 0; for (int i = 0; i < n; i++) b[i+1] = a[i] + b[i]; return n+1; Seria disparate programar assim: int ints_accumulate(const for (int i = 0; i <= n; i++) // <= b[i] = ints_sum(a, i); return n+1; int *a, int n, int *b) não porque estivesse errado, mas porque obrigaríamos o computador a trabalhar muito mais do que é necessário. 4/4/16 Programação Imperativa 6

Somas de subarrays via acumulação Em situações em que seja preciso calcular muitas vezes a soma de subarrays de um dado array, é mais prático pré-calcular o respetivo array de acumulação e obter a soma através da diferença de dois valores acumulados, em vez de calcular iterativamente: int ints_sub_sum_via_accumulation(int *acc, int d, int n) return acc[d+n] - acc[d]; Aliás, em casos simples, será mais prático escrever logo a diferença, sem recorrer à função. 4/4/16 Programação Imperativa 7

Teste unitário da acumulação Eis uma função de teste unitário, para validar em conjunto a acumulação e a soma de subarrays via acumulação: void unit_test_accumulation(void) int n = 6; int a[6] = 3, 7, 2, 8, 5, 1; int acc[7]; int m = ints_accumulate(a, n, acc); assert(m == n+1); for (int d = 0; d < n+1; d++) for (int size = 0; d + size < n+1; size++) assert(ints_sum(a+d, size) == ints_sub_sum_via_accumulation(acc, d, size)); 4/4/16 Programação Imperativa 8

Soma de matrizes Já que uma matriz é um array de arrays, para somar todos os elementos de uma matriz, podemos recorrer à soma de arrays: int ints2_sum(int **m, int r, int c) int result = 0; for (int i = 0; i < r; i++) result += ints_sum(m[i], c); return result; 4/4/16 Programação Imperativa 9

Matrizes parciais e submatrizes Na verdade, a função ints2_sum calcula a somas dos c primeiros elementos das primeiras r linhas da matriz m, presumindo que a matriz tem pelo menos r linhas e pelo menos c colunas. Podemos considerar que os primeiros c elementos das primeiras r linhas de uma matriz com pelo menos r linhas e pelo menos c colunas constituem uma matriz parcial. Outra coisa seria uma submatriz, formada por subarrays contíguos com o mesmo deslocamento e o mesmo tamanho. 7 4 24 3 4 9 0 6 2 6 16 2 3 34 5 4 12 6 5 1 7 4 24 3 4 9 0 6 2 6 16 2 3 34 5 4 12 6 5 1 A amarelo, uma matriz parcial. A cor de laranja, uma submatriz. 4/4/16 Programação Imperativa 10

Somando submatrizes Para somar submatrizes, precisamos de uma nova função. Ei-la: m é a matriz, dv é o deslocamento vertical, dh é o deslocamento horizontal, r é o número de linhas e c é o número de colunas: int ints2_sub_sum(int **m, int dv, int dh, int r, int c) Note bem: r é o número de linhas da submatriz, int result = 0; não da matriz m, e analogamente para c. for (int i = 0; i < r; i++) result += ints_sum(m[i+dv]+dh, c); return result; A função presume que a matriz m tem pelo menos r+dv linhas e c+dh colunas. 4/4/16 Programação Imperativa 11

Somas acumuladas de matrizes O problemas da acumulação de matrizes consiste em, dada uma matriz m com r linhas e c colunas, calcular uma outra matriz acc com r+1 linhas e c+1 colunas tal que acc[i][j] é a soma dos j primeiros elementos das i primeiras linhas de a. Com certeza NÃO queremos programar assim: void ints2_accumulate_brute(int **a, int r, int c, int **b) for (int i = 0; i < r+1; i++) for (int j = 0; j < c+1; j++) b[i][j] = ints2_sum(a, i, j); 4/4/16 Programação Imperativa 12

Exercício Programe a acumulação (bidimensional) de matrizes, usando como inspiração a acumulação (linear) de arrays: void ints2_accumulate(int **a, int r, int c, int **b)... Como aquecimento, resolva o problema primeiro no Excel: como transformar a folha da esquerda na folha da direita (sem usar a função SUM)? 4/4/16 Programação Imperativa 13

Teste unitário da acumulação bidimensional Podemos recorrer à soma das matrizes parciais para validar a nossa função de acumulação: void unit_test_ints2_accumulate(void) int z[4][6] = 5,1,3,4,7,1, //21 4,3,1,4,9,2, //23 1,4,2,3,7,1, //18 8,1,3,9,4,2; //27 int **a = ints2_new(4, 6); ints_copy(z[0], 24, a[0]); int **b = ints2_new(5, 7); ints2_accumulate(a, 4, 6, b); for (int i = 0; i < 5; i++) for (int j = 0; j < 7; j++) assert(b[i][j] == ints2_sum(a, i, j)); 4/4/16 Programação Imperativa 14

Soma de submatrizes via acumulação Usando a matriz de acumulação, que terá sido précalculada, podemos calcular a soma de submatrizes com apenas três adições ou subtrações. Fica como exercício: int ints2_sub_sum_via_accumulation( int **m, int dv, int dh, int r, int c) Note bem: m é a matriz de acumulação. return...; Em situações onde seja preciso calcular muitas vezes somas de submatrizes, esta técnica é muito útil. 4/4/16 Programação Imperativa 15

Teste unitário da soma de submatrizes Observe: void unit_test_ints2_sub_sum_via_accumulation(void) const int z[4][6] = 5,1,3,4,7,1, //21 4,3,1,4,9,2, //23 1,4,2,3,7,1, //18 8,1,3,9,4,2; //27 int **a = ints2_new(4, 6); ints_copy(z[0], 24, a[0]); assert(ints2_sum(a, 4, 6) == 89); assert(ints2_sum(a, 2, 5) == 41); assert(ints2_sub_sum(a, 0, 0, 4, 6) == 89); assert(ints2_sub_sum(a, 1, 1, 2, 2) == 10); assert(ints2_sub_sum(a, 2, 3, 2, 3) == 26); assert(ints2_sub_sum(a, 0, 1, 4, 1) == 9); int **b = ints2_new(5, 7); ints2_accumulate(a, 4, 6, b); assert(ints2_sub_sum_via_accumulation(b, 0, 0, 4, 6) == 89); assert(ints2_sub_sum_via_accumulation(b, 0, 0, 2, 5) == 41); assert(ints2_sub_sum_via_accumulation(b, 0, 0, 4, 6) == 89); assert(ints2_sub_sum_via_accumulation(b, 1, 1, 2, 2) == 10); assert(ints2_sub_sum_via_accumulation(b, 2, 3, 2, 3) == 26); assert(ints2_sub_sum_via_accumulation(b, 0, 1, 4, 1) == 9); 4/4/16 Programação Imperativa 16