Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Lógica de Programação Algorítmica Leopoldo França WEBCONFERÊNCIA III e IV Estruturas Compostas Homogêneas (Vetores) Até agora sempre utilizamos variáveis definidas a partir de tipos básicos de dados. •Cada variável só é capaz de armazenar um dado por vez. Existem situações em que é necessário armazenar uma grande quantidade de dados na memória ao mesmo tempo. •Esta quantidade torna inviável a criação de variáveis para cada um dos dados a ser armazenado. Para estes casos, poderemos criar variáveis a partir de tipos de dados estruturados. •Um tipo de dado estruturado é aquele formado pela junção ou combinação de tipos básicos, definindo apenas uma variável que o represente. Vetores Vetor (ou array) é uma estrutura de dados composta por uma quantidade determinada de elementos de um mesmo tipo primitivo. Como armazena sempre dados do mesmo tipo primitivo, diz-se que vetores são estruturas de dados homogêneas. Vetores Ao apresentar o conceito de variável, dissemos que ela funciona como uma caixa na memória do computador, capaz de armazenar um único dado de um determinado tipo. Por analogia, podemos imaginar um vetor como um conjunto de variáveis agrupadas sob um mesmo nome, todas de um mesmo tipo. • O vetor passa a ser um conjunto de caixinhas, contendo dados de mesma natureza e que estejam agrupados. Vetores Armazenamento em memória 15 A -7 15 23 A Variável simples Vetor Vetores Para referenciar o conteúdo de uma variável simples, basta indicar o nome que foi definido. Para vetores, somente o nome não é suficiente. Além do nome, preciso indicar a posição no vetor onde está o dado que queremos acessar/utilizar. • Esta posição é denominada índice. • Os vetores são também chamados de variáveis indexadas unidimensionais. Vetores Sintaxe para declaração de um vetor: Sintaxe para referenciação de uma posição: Suponha que é necessário armazenar 100 preços de produtos de uma loja. • Declaração: • Referenciação: <var> : vetor[<inicio>..<fim>] de <tipo>; preco : vetor[1..100] de real; preco[1] = 32.50; <nome_vetor>[<posicao>]; preco[102] = 43.80; Vetores Sintaxe para declaração de um vetor: Sintaxe para referenciação de uma posição: Suponha que é necessário armazenar 100 preços de produtos de uma loja. • Declaração: • Referenciação: <var> : vetor[<inicio>..<fim>] de <tipo>; preco : vetor[1..100] de real; preco[1] = 32.50; <nome_vetor>[<posicao>]; preco[102] = 43.80; Não é possível acessar posições fora do intervalo definido Vetores Observações É necessário validar acessos a índices inexistentes, evitando erros no sistema; Apenas variáveis inteiras podem ser utilizadas como índices de um vetor. Cada elemento do vetor deve ser tratado como uma variável independente Todas as operações que podem ser realizadas sobre variáveis de tipos básicos, podem ser aplicadas a posições de um vetor. • Ex.: ler preco[10]; escrever preco[12]; Vetores • Exemplo: • Uma prova de química foi feita por um grupo de 20 alunos. Faça um algoritmo para ler as notas obtidas pelos alunos, e depois exibir um relatório de notas iguais ou superiores a 7,5 no seguinte formato: Notas iguais ou superiores a 7,5: 7.8 9.4 10.0 7.7 8.5 7.5 Vetores Solução: • Este exemplo é uma aplicação simples de vetores. • Existe uma repetição embutida, pois é necessário ler as 20 notas. • Não poderíamos solucionar este problema sem a utilização de vetores, pois perderíamos as notas dos alunos, o que é uma má ideia. • Temos então quer ler todas as notas, e em seguida varrer todo o vetor, decidindo quais devem ser impressas. • Como a quantidade de leituras é fixa, podemos utilizar o comando PARA nas repetições. Vetores • Como fica o algoritmo: Variáveis cont : inteiro; nota : vetor[1..20] de real; Início // Lê as notas e armazena no vetor para cont de 1 até 20 faça [[ escrever “Digite a ”, cont, “ª nota: “; ler nota[cont]; ]]; // imprime as notas acima de 7.5 escrever “Notas iguais ou superiores a 7,5: ”; para cont de 1 até 20 faça se nota[cont] >= 7.5 então escrever nota[cont]; Fim. Vetores em VisuAlg • Exemplo: var vet: vetor [1..10] de real inicio vet[1] <- 12 escrevaL( vet[1] ) escreva("Digite um valor: ") leia(vet[2]) escrevaL( vet[2] ) fimalgoritmo Vetores em VisuAlg •Como ficaria o exemplo anterior escrito em VisuAlg? Exercícios: 1) Faça um programa que leia, via teclado, 200 valores do tipo inteiro e os guarde na memória. 2) Amplie o exercício anterior emitindo um relatório com todos os números pares que você leu. 3) Faça um programa que determine qual o menor valor existente no vetor do exercício número 1. 4) Faça um programa que imprima quantos dos valores do exercício número 1 são maiores que a média desses valores. Matrizes Vimos que vetores são utilizados para armazenar dados de uma única “fileira”. Porém, existem situações em que a natureza dos dados exige uma forma de armazenamento em mais de uma dimensão. Para estas situações, existem as matrizes, que podem ser vistas como vetores que possuem mais de uma dimensão (nesse caso, duas). Por ser bidimensional, uma matriz representa uma tabela de valores colocados em linhas e colunas. • Para identificar um valor é necessário informar a linha e a coluna • Conhecidas como tabelas, ou variáveis indexadas bidimensionais • Um vetor pode ser visto como uma matriz com uma única linha. Matrizes Sintaxe para declaração de uma matriz: Sintaxe para referenciar uma posição: Exemplos: • Declaração: • Referenciação: <var> : vetor[<inicio1>..<fim1>,<inicio2>..<fim2>,...] de <tipo>; valor : vetor[1..3,1..4] de real; valor[1,1] <- 8.50; <nome_vetor>[<posicao1>,<posicao2>,...]; valor[2,3] <- 7.3; Matrizes Exemplo • Um distribuidor de refrigerantes vende seu produto em todo o país. Em cada trimestre do ano passado ele vendeu uma certa quantidade de garrafas em cada região do Brasil. Faça um algoritmo para ler as quantidades vendidas e escrever a quantidade total vendida em todo o país. Solução • Pelo enunciado do problema, vimos que existem 20 dados de entrada, pois temos 4 trimestres no ano e cada trimestre teve uma venda para cada uma das cinco regiões do Brasil. • O enunciado do problema também nos leva a concluir que devemos utilizar uma estrutura matricial ao invés de vetorial. • Temos vendas para regiões por trimestre. Matrizes Solução (cont.) • A tabela abaixo mostra uma representação possível para os dados do problema: 150 1150 900 1500 400 180 980 1100 2300 650 140 1000 950 2100 500 210 1600 1400 2600 840 1 - Norte 2 - Nordeste 3 - Sul 4 - Sudeste 5 – Centro- Oeste 1º Trimestre 2º Trimestre 3º Trimestre 4º Trimestre Matrizes • Solução (cont.): Variáveis quant : vetor[1..4,1..5] de inteiro; i, j, soma : inteiro; Início para i de 1 até 4 faça para j de 1 até 5 faça [[ escrever “Informe a quantidade do “, i, “º trimestre e “, j, “ª região: “; ler quant[i,j]; ]]; soma = 0; para i de 1 até 4 faça para j de 1 até 5 faça soma = soma + quant[i,j]; escrever “O total das quantidades vendidas é ”, soma; Fim. Matrizes em VisuAlg • Acessando os elementos de um array multidimensional: var i , j : inteiro a : vetor [1..3, 1..2] de inteiro inicio para i de 1 ate 3 faca para j de 1 ate 2 faca escrevaL(a[ i , j ] ) fimpara fimpara fimalgoritmo Solução Exemplo em VisuAlg algoritmo "matriz_vendas" var quant : vetor [1..4, 1..5] de inteiro i , j , soma : inteiro inicio para i de 1 ate 4 faca para j de 1 ate 5 faca escreva("Informe a quantidade do ", i,"º trimestre e ", j, "ª região: ") leia(quant[ i , j ]) fimpara fimpara soma <- 0 para i de 1 ate 4 faca para j de 1 ate 5 faca soma <- soma + quant[ i , j ] fimpara fimpara escrevaL("O total das quantidades vendidas é ", soma) fimalgoritmo Matrizes •Exercício: • Faça um programa que solicite ao usuário os dados de uma matriz com 3 linhas e 4 colunas de números inteiros. Em seguida, exiba a matriz digitada pelo usuário, colocando todos os elementos de cada linha em uma mesma linha da tela. Solução (VisuAlg) algoritmo "matriz" var i , j : inteiro a : vetor [1..3, 1..4] de inteiro inicio para i de 1 ate 3 faca para j de 1 ate 4 faca escreva("digite o valor do elemento da ",i,"º linha e ",j,"º coluna: ") leia(a[ i , j ]) fimpara fimpara escrevaL("A matriz digitada foi:") para i de 1 ate 3 faca para j de 1 ate 4 faca escreva(a[ i , j ] ) fimpara escrevaL() fimpara fimalgoritmo Matrizes •Exercícios (1 e 2) •Faça um programa que leia uma matriz 5x3 e exiba o menor valor, o maior valor e a média dos elementos presentes nesta matriz. •Crie uma matriz 7x8 onde cada elemento é a soma dos índices de sua posição dentro da matriz. Modularização de algoritmos • Consiste em dividir um algoritmo em etapas, fazendo com que cada etapa seja parte da solução de um problema maior. • Se um subproblema ainda parecer muito complexo, podemos tentar dividi- lo em partes menores, para facilitar sua solução, e assim sucessivamente. • “Dividir para conquistar” • Nós temos dificuldade de resolver problemas quando os mesmos possuem uma grande quantidade de elementos inseridos. • A modularização é a forma humilde de reconhecermos esta dificuldade, mas ainda assim resolvermos o problema. Modularização: funções e procedimentos • Realizada através de sub-algoritmos, também chamados de funções e procedimentos. • Todas as funções precisam ser chamadas para ser executadas. • Ao encontrar uma chamada para uma função ou procedimento, o fluxo de execução do programa desvia para o local onde a função existe, e executa a mesma. Ao terminar a execução da função, o fluxo de execução retorna para o local onde a função foi chamada. • A execução do programa é reiniciada na linha seguinte à linha onde a função foi acionada. Modularização Modularização em VisuAlg • Todas as funções devem indicar um valor para quem chamou a função. Caso não seja necessário retornar um valor, deve-se usar um procedimento. Como a função retorna um valor, devemos usar o comando retorne seguido de uma variável ou constante para retornar esse valor para quem chamou a função. • VisuAlg possui uma grande quantidade de funções disponíveis para uso imediato pelo programador. Criando Funções A criação de uma Função deve ser declarada no início do programa. Este tipo de sub-algoritmo sempre retornam um e apenas um valor ao algoritmo que lhe chamou. Cada função tem associada ao seu valor de retorno um tipo explícito. Da mesma maneira com que os parâmetros são fixos para todas as chamada o retorno também é fixo. Algoritmo "<nome do algoritmo>" var <declaração de variáveis globais> <definição da função> inicio < lista de comandos> fimalgoritmo Criando Funções • Identificador: Nome da função. • Passagem de parâmetros por referência: utiliza-se a construção VAR antes dos identificadores para indicar a passagem por referência. Os identificadores são separados por vírgula. • Parâmetros: Entre um mesmo tipo de dados são separados por vírgula. Entre tipos de dados a separação é feita com ponto-e-vírgulas ';'. • Tipo de retorno da função: Real, Inteiro, Lógico ou Caractere. • Declaração de variáveis locais: idêntica a declaração de variáveis globais. As variáveis declaradas localmente tem validade dentro do escopo da função. • Retorne: local onde é colocado a variável de retorno. funcao <identificador> ([var]<parâmetros>) <tipo de retorno> var <declaração de variáveis locais> inicio <lista de comandos> retorne <variável de retorno> fimfuncao Exemplo algoritmo "funcao" var a , b , s : inteiro funcao soma (x,y: inteiro): inteiro inicio retorne x + y fimfuncao inicio escreva("Dig. o 1º número: ") leia(a) escreva("Dig. o 2º número: ") leia(b) s <- soma(a,b) escrevaL("A soma é ", s) fimalgoritmo Criando Procedimentos • Identificador: Nome do procedimento. • Passagem de parâmetros por referência: utiliza-se a construção VAR antes dos identificadores para indicar a passagem por referência. Os identificadores são separados por vírgula. • Parâmetros: Entre um mesmo tipo de dados são separados por vírgula. Entre tipos de dados a separação é feita com ponto-e-vírgulas ';'. procedimento <identificador> ([var]<parâmetros>) var <declaração de variáveis locais> inicio <lista de comandos> fimprocedimento Exemplo algoritmo "procedimento" var a , b : inteiro procedimento escreve_soma (x,y: inteiro) inicio escrevaL(x + y) fimprocedimento inicio escreva("Dig. o 1º número: ") leia(a) escreva("Dig. o 2º número: ") leia(b) escreva("A soma é ") escreve_soma(a,b) fimalgoritmo Compartilhando variáveis entre funções • Caso seja necessário acessar ou alterar o valor de uma variável dentro de mais de uma função, devemos declarar a variável dentro do algoritmo, mas fora de qualquer função. • As variáveis criadas dentro de funções recebem o nome de variáveis locais, e só existem dentro das funções onde foram criadas. • As variáveis criadas dentro de um algoritmo podem ser utilizadas em qualquer lugar. São chamadas de variáveis globais. Exemplo algoritmo "escopo" var a , b , s : inteiro procedimento altera_s (x,y: inteiro) inicio s <- x + y fimprocedimento inicio escreva("Dig. o 1º número: ") leia(a) escreva("Dig. o 2º número: ") leia(b) altera_s( a , b ) escreva("A soma é ", s) fimalgoritmo Vantagens do uso de funções • Facilita a resolução de problemas complexos; • Viabiliza a divisão do trabalho entre a equipe de desenvolvimento (cada programador ou grupo de programadores pega um pedaço do problema para resolver e trabalha de forma independente); • Desenvolvimento mais rápido de programas (várias funções podem ser escritas em paralelo pelos membros da equipe). Vantagens do uso de funções • Incentiva a divisão de responsabilidades; • Reuso de funções desenvolvidas em projetos anteriores ou obtidas externamente diminui o tempo de desenvolvimento de novos programas; • Aumento de qualidade pelo uso de funções cujo funcionamento foi validado em projetos anteriores. Exercícios • Escreva uma função que receba um número inteiro positivo e retorne o fatorial desse número. • A fábrica de refrigerantes Meia-Cola vende seu produto em três formatos: lata de 350ml, garrafa de 600ml e garrafa de 2 litros. Se um comerciante compra uma determinada quantidade de cada formato, faça um programa para calcular quantos litros de refrigerante ele comprou. Resolva o problema utilizando funções. Ordenação e busca de dados Ordenação de dados Vejamos o algoritmo abaixo : VAR I : inteiro nomes :vetor[1..4] de caractere Inicio Para i:=1 ate 4 faca Escreval(“informe nome da posição ” , i) leia(nomes[i]) Fimpara Ordenação de dados • Da forma em que está, os nomes são armazenados na ordem em que são inseridos • Seria interessante ordenar esses dados em ordem alfabética. • Se inseríssemos os nomes assim : • Maria, João, Ana, Bruno • Após ordenamento ficariam assim : • Ana, Bruno, Maria, João Ordenação de dados • Para isso, um algoritmo apropriado seria bastante útil. • Bastaria fazer a leitura normal e depois ordenar. • Vejamos abaixo como seria a leitura : var I : inteiro nomes :vetor[1..4] de caractere trocou, aux : caractere Inicio Para i:=1 ate 4 faca Escreval("informe nome da posição " , i) leia(nomes[i]) Fimpara Ordenação de dados • Para ordenar, usaríamos o código abaixo, por exemplo : trocou <- "v" enquanto trocou = "v" faca trocou <- "f" para i <- 1 ate 3 faca se nomes[i] > nomes[i +1] entao aux <- nomes[i] nomes[i] <- nomes[i+1] nomes[i+1] <- aux trocou <- "v" fimse fimpara fimenquanto fimalgoritmo Ordenação de dados Vetor antes da ordenação Vetor depois da ordenação Vetor intermediário maria joão ana bruno joão ana bruno maria ana bruno joão maria Ordenação de dados • Existem diversos tipos de ordenação • Todas têm a mesma função • São usadas em diversas aplicações • Bubble Sort, Quick Sort, Heap Sort • As ordenações são uteis para preparar vetores para buscas. LINGUAGENS DE PROGRAMAÇÃO Tipos de linguagem de programação • 3 Tipos de programação (existem outros mas só abordaremos estes) • Sequencial • Estruturada • Orientada a objetos Programação sequencial • Usada nos primórdios da informática • Muito ligada à máquina (hardware) • Exemplo : sub esp, 2D0h mov dword ptr [ebp+FFFFFDDCh], eax mov dword ptr [ebp+FFFFFDD8h], ecx mov eax, dword ptr [ebp+8] mov ecx, dword ptr [ebp+4] mov dword ptr [eax+0Ch], ecx Programação estruturada • Baseada na ideia de dividir um problema em partes para depois resolver as partes menores • Ao final, acabamos abordando o problema todo a partir do entendimento das partes. • Usa subprogramas, funções e tarefas subdivididas para resolver o problema • Cobol, C, Pascal, Fortran, e muitas outras linguagens Programação Orientada a Objetos • Decorre da modelagem orientada a objetos • Consiste em analisar um cenário particular, verificar quais são os seus objetos, como interagem e como um programa de computador pode representar esses objetos e sua interação. • Os objetos são modelados partindo do pressuposto de que possuem atributos e comportamentos. Programação Orientada a Objetos • Usada em sistemas modernos • Linguagens como Java, C#, C++ • É a metodologia mais utilizada atualmente. Referências Bibliográficas • ASCENCIO, A. F. G., CAMPOS, E. A. V. Fundamentos da Programação de Computadores. 2ª Edição. São Paulo: Prentice Hall, 2008. 448p. • FORBELLONE, A. V. Lógica de Programação – A construção de Algoritmos e Estruturas de Dados, Makron Books, 2005. • LOPES, A., GARCIA, G. Introdução à Programação: 500 Algoritmos Resolvidos Ed. Campus, 2002. 488p. • SEBESTA, R.W. Conceitos de linguagens de programação. 5 ed. Porto Alegre: Bookman, 2003. OBRIGADO LEOPOLDO FRANÇA Professor
Compartilhar