Baixe o app para aproveitar ainda mais
Prévia do material em texto
Univ. Federal da Grande Dourados EaD UFGD Formadora: Janaína R. Loureiro Tutor: Luiz Fernando Stopa Arcenio Rio Brilhante/MS 2017 Avisos •Próxima aula: 27 e 28/10. •Serão ofertados as disciplina do 1° semestre em breve para os portadores de diploma. •A avaliação final será online. Tipos de Dados • Numérico: • Inteiro (int): 1, -1, 0 • Real (float): 1.1, -1.3 • Literal (char): ‘a’ • Literal (String – Vetor de char): “Seu nome” • Lógico (bool): Verdadeiro ou Falso Nome Variáveis • Nunca começar o nome da variável com um símbolo ou número. • Declare aux: inteiro • Variáveis de mesmo tipo podem ser declaradas na mesma linha separadas por vírgula. • Declare aux1, aux2, Cont: inteiro • Variáveis de tipos diferentes não podem ser declaradas na mesma linha. • declare i: inteiro • declare j: real • O nome de uma variável não pode ter espaço, mas pode ter _. • Declare notas_p1: inteiro • O nome de uma variável não pode ter acento. • Se você já usou um nome de variável, ele deve ser único. Entradas e Saídas •Entrada: comando leia • leia (x) • Importante: x já deve ter sido declarado e eu devo ler um tipo correto. • Declare x: inteiro • Ou seja, você vai ler um inteiro e salvar em x. •Saída: comando escreva • escreva(“O valor é: ”, x) • Você vai imprimir um valor inteiro que estava salvo em x. Entradas e Saídas •Entrada: comando leia • leia (x) • Importante: x já deve ter sido declarado e eu devo ler um tipo correto. •Saída: comando escreva • escreva(“O valor é: ”, x) Em C: leia => scanf escreva => printf -Inteiro: %d -Float: %f -Char: %c Leia/Escreva - Exemplo Em C … int A; scanf (“%d”, &A); A = 15; printf(“O valor é: %d”, A); … … declare A: inteiro leia(A) A <- 15 escreva(“O valor é: “, A) … Exercício • Escreva um programa que calcule a média de um aluno que fez duas provas. Algoritmo “Media” declare x, y: real Início escreva (“Digite as duas notas do aluno:") leia (x,y) x<-(x+y)/2 escreva (“A média do aluno é: ”, x) FimAlgoritmo Exercício • Uma loja está em promoção. Você deve ajudar o vendedor a calcular o preço final de um produto sabendo o valor do produto e o desconto sugerido. Algoritmo “Promocao” declare x, y, desc: real Início escreva (“Digite o valor do produto:") leia (x) escreva (“Digite o valor do desconto:") leia (y) desc <- (x*y)/100 x <- x - desc; escreva (“O preço final do produto é: ”, x) FimAlgoritmo Condicionais Sintaxe Se (decisão simples) se (<condição>) então <conjunto de comandos internos à estrutura condicional> fimSe Condicionais Sintaxe Se/Senão (decisão composta) se (<condição>) então <conjunto de comandos a serem executados se condição for verdadeira> senão <conjunto de comandos a serem executados se condição for falsa> fimSe Condicionais se (10==11) então escreva (“10 é igual a 11!”) senão escreva (“10 é diferente de 11!”) FimSe if(10==11){ printf(“10 é igual a 11!”); } else{ printf(“10 é diferente de 11!”); } Condicionais Aninhados se (10==11) então escreva (“10 é igual a 11!”) senão se(10<11) então escreva (“10 menor que 11!”) FimSe FimSe if(10==11){ printf(“10 é igual a 11!”); } else{ If(10<11){ printf(“10 menor que11!”); } } Faça um algoritmo que recebe duas notas e avalia se o aluno está aprovado ou reprovado. Considere aprovação em caso de nota igual ou superior a 6. Algoritmo “Aprovado” declare x, y: real Início escreva (“Digite as duas notas do aluno:") leia (x,y) x <- (x+y)/2 se (x >= 6) então escreva (“Aluno Aprovado!") senão escreva (“Aluno Reprovado!") fimSe fimAlgoritmo . Faça um algoritmo que recebe um valor e indica se ele é divisível por 5 e por 13. Algoritmo “Divisivel” declare x: inteiro Início escreva (“Entre com um número:") leia(x) se ((x%5==0) E (x%13==0)) então escreva (“É divisível por 5 e 13.”) senão escreva(“Não é divisível por 5 e 13.”) fimSe FimAlgoritmo . Faça um algoritmo que recebe três valores e indica qual o maior entre eles Algoritmo “MaiorValor” declare x, y, z: inteiro Início escreva (“Entre com três valores:") leia (x, y, z) se ((x>y) E (x>z)) então escreva (“Maior valor: ”, x) senão se ((y>x) E (y>z)) então escreva (“Maior valor: ”, y) senão escreva (“Maior valor: ”, z) fimSe fimSe fimAlgoritmo Laços de Repetição Sintaxe laço Para para i <- <início> até <fim> faça <código interno ao laço que será repetido> fimPara i: variável numérica início: valor inicial de i fim: valor final de i Laços de Repetição Algoritmo “Imprime1a4” declare x: inteiro Início para x <- 1 até 4 faça escreva (“Número:”, x) fimPara FimAlgoritmo Para x = 1 Número: 1 Para x = 2 Número: 2 Para x = 3 Número: 3 Para x = 4 Número: 4 Laços de Repetição Sintaxe laço Enquanto enquanto (teste condicional) faça <código interno ao laço que será repetido> fimEnquanto teste condicional: expressão lógica ou relacional que tem valor verdadeiro ou falso Laços de Repetição Algoritmo “Imprime1a4” declare x: inteiro Início x <- 1 enquanto (x <= 4) faça escreva (“Número:”, x) x <- x + 1 fimEnquanto FimAlgoritmo X=1 1<=4?V Número: 1 X=2 2<=4?V Número: 2 X=3 3<=4?V Número: 3 X=4 4<=4?V Número: 4 X=5 5<=4?F Laços de Repetição Sintaxe laço Repita enquanto (teste condicional) faça <código interno ao laço que será repetido> fimEnquanto teste condicional: expressão lógica ou relacional que tem valor verdadeiro ou falso Laços de Repetição Algoritmo “Imprime1a4” declare x: inteiro Início x <- 0 repita x <- x + 1 escreva (“Número:”, x) até (x < 4) FimAlgoritmo X=1 Número: 1 1<4?V X=2 Número: 2 2<4?V X=3 Número: 3 3<4?V X=4 Número: 4 4<4?F Variáveis Compostas - Vetores Sintaxe da declaração de um Vetor declare <nome do vetor> : vetor [ <coluna inicial> .. <coluna final>] de <tipo de dado> nome do vetor: deve respeitar as regras de nomes de variáveis coluna inicial: a primeira coluna do vetor coluna final: a última coluna tipo de dado: um dos tipos primitivos declare meuVetor: vetor[1..10] de inteiro //declara um vetor de inteiros chamado de meuVetor de 10 posições vetorzao: vetor[1..5000] de real //declara um vetor de reais chamado de vetorzao de 5000 posições Variáveis Compostas - Vetores Sintaxe da leitura, escrita e atribuição de um Vetor leia <nome da variável> [<índice>] escreva <nome da variável> [<índice>] <nome da variável>[<índice>] <- <valor> Variáveis Compostas - Vetores meuVetor 1 2 3 4 5 6 7 8 9 10 meuVetor[1] <- 5 meuVetor[2] <- 10 meuVetor[3] <- 15 meuVetor[4] <- 20 meuVetor[5] <- 25 . 5 101520253035404550 Variáveis Compostas - Vetores meuVetor[6] <- 30 meuVetor[7] <- 35 meuVetor[8] <- 40 meuVetor[9] <- 45 meuVetor[10] <- 50 Algoritmo “MultiplosDe3” declare meuVetor: vetor [1..10] de inteiro declare i, mult: inteiro Início mult <- 0 para i de 1 até 10 faça mult <- mult + 3 meuVetor[i] <- mult fimPara para i de 1 até 10 faça escreva (meuVetor[i]) fimPara FimAlgoritmo Variáveis Compostas - Vetores Sintaxe da declaração de uma Matriz declare <nome da matriz> : matriz[ <linha inicial> .. <linha final>, <coluna inicial> .. <coluna final>] de <tipo de dado> nome da matriz: deve respeitar as regras de nomes de variáveis linha inicial: a primeira linha da matriz linha final: a última linha coluna inicial: a primeira coluna da matriz coluna final: a última coluna tipo de dado: um dos tipos primitivos Variáveis Compostas - Matrizes declare minhaMatriz: matriz[1..3, 1..10] de inteiro //declara uma matriz de inteiros chamada de minhaMatriz de 3 linhas e 10 colunas = 30 posições superMatriz: matriz[1..100, 1..500] de real //declara uma matriz de reais chamada de superMatriz de 100 linhas e 500 colunas = 50000 posições Variáveis Compostas - Matrizes Sintaxe da leitura, escrita e atribuição de uma Matriz leia <nome da variável> [<linha>, <coluna>] escreva <nome da variável> [<linha>, <coluna>] <nome da variável>[<linha>, <coluna>] <- <valor> Variáveis Compostas - Matrizes minhaMatriz 1 2 3 4 5 6 7 8 9 101 2 3 minhaMatriz[2,7] <- 8 minhaMatriz[1,3] <- 4 8 4 5 1 Variáveis Compostas - Matrizes minhaMatriz[3,2] <- 5 minhaMatriz[2,10] <- 1 Exercício Revisão Considere que você está escrevendo um algoritmo que recebe um vetor de 15 inteiros como entrada e o armazena em vet. Como deve ser o laço de impressão para que seja mostrado o vetor na ordem inversa? Exercício Revisão Algoritmo “OrdemInversa” Início declare vet: vetor [1..15] de inteiro declare i: inteiro para i <- 1 até 15 faça leia(vet[i]) FimPara enquanto i > 0 faça escreva(vet[i]) i = i - 1 FimEnquanto FimAlgoritmo Variáveis compostas heterogêneas Registro • Estrutura de dados utilizada para representar tipo de dados diferentes. • Podem diversos campos e cada campo pode ser de um tipo diferente, permitindo assim que variáveis declaradas como sendo desse tipo (registro) sejam consideradas variáveis compostas heterogêneas. A declaração do registro tem a seguinte sintaxe Tipo <nome_to_tipo> = Registro lista de campos 1: Tipo_primitivo 1; lista de campos 2: Tipo_primitivo 2; . . . lista de campos n: Tipo_primitivo n; fim_registro Onde: nome_do_tipo é o nome da variável para guardar os dados do registro; Lista de campos : campos que serão utilizados no registro; Tipo_primitivo: é o tipo de dado dos campos de cada lista. Registro • Existe vetor de Registro? SIM! • Exemplo: tipo dados = registro Nome : literal RGA : inteiro fim_registro Dentro do corpo do algoritmo você deve declarar o vetor próximo as outras declarações: • declare aluno : conjunto [1..10] de dados Para acessar cada posição do vetor, colocar índice logo após o nome do vetor de registro: aluno[indice].campo Exercício 1 - Registro • Crie um registro com os seguintes dados: • Nome, idade, sexo e altura (em centímetros). tipo infos = registro Nome: literal Idade: inteiro Sexo: literal Altura: inteiro fim_registro . LEITURADEREGISTRO Para realizarmos a entrada de dados para a variável A, precisamos lembrar que A possui dois campos, então temos que indicar para qual campo da variável estamos lendo um dado, devemos usar o comando leia conforme abaixo: leia( nome_da_variável.nome_do_campo). Para a leitura dos dados da variável A, declarada no exemplo 2, e ilustrada na figura 2, devemos escrever: leia(A . nome) leia(A . idade) ESCRITADEREGISTRO A escrita dos dados em registros é semelhante a leitura dos dados,ou seja, ao desejar mostrar os dados armazenado dentro de uma variável do tipo registro, devemos usar o comando escreva da seguinte maneira: escreva(nome_variavel . nome_do_campo) Para a escrita dos dados da variável A declarada no exemplo 2, e ilustrada na figura 2, devemos escrever: escreva (A . nome) escreva (A . idade) Algoritmo Boletim_Aluno Tipo Boletim =Registro Nome : Alfanumérico; Nota1, Nota2 : numérico; Matricula, Conclusao : Lógico; Fim_Registro Declare X boletim; inicio X.Nome ←“Buck Ramel”; X.Matricula ←V; X.Conclusao ← F; Escreva (“Forneça a 1ª nota:”); Leia (X.Nota1); Escreva (“Forneça a 1ª nota:”); Leia (X.Nota2); // apresentação do Relatório Escreva (“Relatório do Estudante”); Escreva (X.nome); Escreva(X. Matricula); Fim. X.Nome = Buck Ramel X.Matricula = V X.Conclusão = F Leia(X.Nota1); X.Nota1 = 7 Leia(X.Nota2); X.Nota2 = 8 Escreva(X.Nome); Buck Ramel Escreva(X.Matricula); V VETORDEREGISTRO Declaraçãodeumvetorderegistro tipo date = registro nome literal idade inteiro fim_registro declare aluno : conjunto [1..10] de date CADASTRODEDADOSPARAVETORDEREGISTRO Para se cadastrar dados na posição 1 do vetor aluno, é preciso usar o seguinte comando. leia (aluno[1].nome, aluno[1].idade) Para se cadastrar dados na posição 2 do vetor aluno, é preciso usar o seguinte comando. leia (aluno[2].nome, aluno[2].idade) e assim por diante… leia (aluno[10].nome, aluno[10].idade) LISTAGEMDOSDADOSDEUMVETORDEREGISTRO Para mostrar os dados da posição 1 do vetor aluno, é preciso usar o seguinte comando. escreva (aluno[1].nome, aluno[1].idade) Para mostrar os dados da posição 2 do vetor aluno, é preciso usar o seguinte comando. escreva (aluno[2].nome, aluno[2].idade) e assim por diante... escreva (aluno[10].nome, aluno[10].idade) Algoritmo “cadastro_e_listagem” tipo date = registro nome literal idade inteiro fim_registro declare aluno: conjunto[1..10] de date i inteiro início para i ← 1 até 10 faça {cadastramento dos dados} leia (aluno[i].nome, aluno[i].idade) fim-para para i ← 1 até 10 faça {listagem dos dados} escreva (aluno[i].nome, aluno[i].idade) fim_para fim_algoritmo Exercício 2 - Registro • Crie um vetor chamado pessoa com 10 posições do registro criado no exercício anterior e o preencha. Depois verifique qual a pessoa com maior altura. Algoritmo “altura” Início declare pessoa : conjunto [1..10] de infos declare I, maior: inteiro para i <- 1 até 10 faça leia(pessoa[i]. nome) leia(pessoa[i]. idade) leia(pessoa[i]. sexo) leia(pessoa[i]. altura) FimPara maior= pessoa[1].altura para i <- 2 até 10 faça se (pessoa[i].altura>maior) então maior= pessoa[i].altura FimPara escreva (“Pessoa mais alta:”, maior) FimAlgoritmo A modularização é uma estratégia utilizada para facilitar a solução de problemas grandes e complexos. Esse método consiste na divisão de problemas maiores em pequenas trechos, que são chamados de módulos, subprogramas ou subrotinas. Modularização Uma das vantagens da modularização é a possibilidade de diferentes programadores trabalharem simultaneamente na solução de um mesmo problema, através da codificação separada dos diferentes módulos. Outra vantagem é a reutilização de código, porque sempre que houver a necessidade de um usar um código basta chamar aquele módulo. Modularização PROCEDIMENTO Procedimento possui um nome, uma lista opcional de parâmetros, um bloco de declarações e um bloco de comandos. Um procedimento é um programa com vida própria, com suas variáveis locais, e tem que ser solicitado por algum dos outros módulos do algoritmo. Os procedimentos devem ser declarados antes de serem chamados, ou devem ser codificados antes do bloco principal. Procedimentos não retornam valores ao final de sua execução. procedimento <nome_do_procedimento> ([parametros_opcionais tipo_dados]) <declarações de variáveis locais ao procedimento> Inicio <instruções desse procedimento. fim_procedimento Modularização Algoritmo “exemplo_procedimento” procedimentocalc_imposto() { inicio do procedimento } imposto ← p * 0.17 { a variável imposto que é global recebe o valor do imposto} fim_procedimento {fim do procedimento} declare p, imposto: real { variáveis globais } início {início do bloco principal} escreva (“digite o preço”) leia (p) calc_imposto( ) {o procedimento cal_imposto é chamado e quando ela terminar de executar a variável imposto receberá o resultado do cálculo} escreva ('Preço: “, p , “ Imposto:” , imposto) fim_algoritmo { fim do bloco principal} Modularização FUNÇÃO Uma função devolve um valor ao módulo que a chamou. Após a execução da função, juntamente com o nome da função, é retornado um valor. Veja no exemplo 1 que um valor pode ser armazenado no próprio nome da função, pois a mesma funciona como se fosse uma variável.Em uma função, além de informar o nome da função, é preciso informar também o tipo do dado que será retornado para quem chamou essa função. função <nome_da _função> ([parametros_opcionais tipo_dados]): <tipo_de_retorno> <declarações de variáveis locais à função> início <instruções dessa função. fim_função Modularização Algoritmo “exemplo_função” funçãocalc_imposto():real {função que retorna um valor real} calc_imposto ← p * 0.17 {o próprio nome da função funciona como uma variável} fim_função {fim da função e o valor armazenado no nome da função é retornado declare p real {variáveis globais } início {bloco principal} imposto real {imposto é uma variável local ao bloco principal} escreva (“digite o preço”) leia (p) imposto ← calc_imposto( ) {a função cal_imposto é chamada e quando ela terminar de executar o valor retornado por essa função é atribuído no bloco principal, para a variável imposto} escreva ('Preço: “, p , “ Imposto:” , imposto) fim_algoritmo Modularização PASSAGEMDEPARÂMETRO Quando uma variável é local a um determinado bloco, nenhum outro bloco pode acessar essa variável(variável simples, um vetor ou uma matriz), a não ser que ela seja passada como parâmetro para o bloco que irá acessá-la. Esse processo chamado de passagem de parâmetro. Há duas formas de se passar uma ou mais variáveis como parâmetro: - Passagem de parâmetro por valor - Passagem de parâmetro por referência Modularização PASSAGEMDEPARÂMETROPORVALOR Na passagem de parâmetro por valor é passada uma cópia do valor da(s) variável(eis) para o bloco que é chamado e o seu valor original não pode ser alterado pelo módulo chamado. Declaração do procedimento: procedimento <nome_do_procedimento> ( <parâmetros_e_tipos> ) Modularização Modularização PASSAGEMDEPARÂMETROPORREFERÊNCIA Com a passagem de parâmetro por referência é possível alterar o valor de uma variável a um bloco através de outro bloco (módulo). Isso é possível porque o endereço da variável é passado como parâmetro e não uma cópia do valor da variável, como feito anteriormente na passagem de parâmetro por valor. Para transformar um argumento formal numa referência proceda a declaração da(s) variável(eis) com a palavra chave ref. Declaração procedimento <nome_do _procedimento>( ref <nomes_variáveis <tipos> ) Modularização Modularização procedimento troca( ref x, y inteiro ) {x referência de a e y a referência de b} declare z inteiro {z é uma variável local ao procedimento} inicio z ← x {z recebe o que x referência que é o valor de a=100} x ← y {x é referência de a recebe o que está em y que é a referência de b=200} y ← z {y que é a referência de b recebe o que está em z=100} escreva (z) fim_procedimento declare a, b inteiro { variáveis locais ao bloco principal } início {início do bloco principal} a← 100 b← 200 troca(a, b) {chama o procedimento troca e passa os endereços das variáveis a e b} escreva (a, b) {os valores de a e b (variáveis locais) foram alteradas por troca porque os parâmetros foram passados por referência} fim {fim do bloco principal} Ponteiros Com os ponteiros é possível usar partes da memória sem precisar declarar uma variável para cada parte usada e estruturar dados de forma mais complexa. Um ponteiro é uma variável que armazena um endereço de memória e deve ser declarada como qualquer outra variável. OPERADORESPARAPONTEIROS Existem dois operadores especiais para trabalhar com ponteiros. São eles: ↑ : Conteúdo do endereço apontado por um ponteiro. & : Endereço de uma variável. DECLARAÇÃODEUMPONTEIRO ↑nome_variável < tipo > declare ↑p inteiro {p armazena um endereço de memória de um inteiro} ↑q real Operadoresparaponteiros declare a, ↑ q inteiro { a variável a e o ponteiro q são do tipo inteiro} q← &a { q recebe o endereço de a, então, q aponta para a} a← 10 { 10 é atribuído á variável a} escreva ( ↑ q ) { mostra o conteúdo do endereço armazenado em q} escreva ( q ) { mostra o endereço do endereço armazenado em q} escreva ( a ) { mostra o conteúdo da variável a} ACESSOAREGISTROPORMEIODEPONTEIRO tipo dados = registro nome literal idade inteiro fimregistro declare x, ↑ q dados q ← &X inicio leia (q→ nome) { leia para q apontando para nome } leia (q→ idade) { leia para q apontando para nome } escreva (q→ nome) {mostra o que esta armazenado no campo nome} escreva (q→ idade) {mostra o que esta armazenado no campo idade} fim_algoritmo Algoritmo “soma” Declare x, y : inteiro; Inicio leia (x, y); //leitura dos dados de X e Y P,Q: ↑inteiro; //declaração do ponteiro para inteiro P ←&x; //o ponteiro p recebe o endereço de X Q ← &y; //O ponteiro Q recebe o endereço de Y Escreva (↑P + ↑Q); // o comando escreva mostra a soma dos valores armazenado nos endereços guardados em P e em Q) Fim-algoritmo Arquivos Todas as estruturas de armazenamento utilizadas (vetores, matriz e registros) são variáveis simples ou compostas que possuem a limitação que é a quantidade de informação que pode ser armazenada. Nós arquivos essa limitação é apenas do meio físico onde os dados são armazenados. DECLARAÇÃODEARQUIVOS A declaração de uma variável do tipo do arquivo deve ser feita da seguinte forma: declare <nome_variavel> arquivoorganizaçãode < nome_do_registro> onde ● declare , arquivo e de : são palavras reservadas ● nome_variável: é o nome da que será usado para se referir ao arquivo. ● organização: indica o tipo de organização que é sequencial ou direta. DECLARAÇÃODEREGISTROEARQUIVO {declaração do registro} tipo dados = registro nome literal idade inteiro fim_registro declare arq1arquivosequencialdedados Um arquivo contém um grupo de registros armazenados em alguma ordem, normalmente sequencial. Assim, o arquivo é composto do inicio do arquivo, um ou mais registros e do final do arquivo. Vários são os comando que devem manipular os arquivos. Onde: nome_arquivo: é o nome da variável do arquivo abra ( nome_arquivo ); //abre arquivo feche ( nome_arquivo ) ; //fecha o arquivo copie ( nome_arquivo , var_aux ) ; //copia os dados do arquivo para var_aux que é uma variável do mesmo tipo do registro do arquivo) guarde ( nome_arquivo, var_aux ) ; //guarda os dados da variável aux no arquivo). avance ( nome_arquivo ) ; // vai para o próximo registro do arquivo. retroceda ( nome_arquivo ) ; //retorna para o um registro anterior ao registro corrente. IDA ( nome_arquivo ) ; //testa de a posição correnteé o início do arquivo) FDA ( nome_arquivo ) ; //testa se a posição corrente é o fim do arquivo) Algoritmousandocomandosdemanipulaçãodearquivos. Algoritmo “gravar_arquivo” tipo dados = registro {declaração do tipo} nome literal idade inteiro fim_dados declare arq arquivosequencialde dados {declaração do arquivo} A dados {declaração da variável auxiliar} inicio escreva (“digite o nome”) leia (A.nome) escreva (“digite a idade”) leia (A.idade) abra (arq) guarde (arq, A) {armazenamento dos dados de A no arquivo arq} feche (arq) fim_algoritmo Obrigado! •Dúvidas? • janrloureiro@gmail.com • Espaço “Dúvidas e Orientações" ambiente UFGD mailto:janrloureiro@gmail.com Um Um abraço abraço para para todos todos e e bons estudos!bons estudos! Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58 Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 66 Slide 67 Slide 68 Slide 69 Slide 70 Slide 71 Slide 72 Slide 73
Compartilhar