Baixe o app para aproveitar ainda mais
Prévia do material em texto
Introdução aos tipos abstratos de dados APRESENTAÇÃO A era atual é uma era de dados, na qual todas as informações, os dados, sobre cada indivíduo encontram-se disponíveis na rede mundial de computadores, a Internet. Os dados podem abranger desde um simples cadastro com informações pessoas, tais como nome e endereço, e estender-se a gostos e particularidades de cada um, como restaurantes frequentados e ciclo de amizades. A partir dessa massa de dados à disposição de todos, é possível compreender como estes devem ser manipulados de forma a possibilitar uma melhor análise, visando a uma futura tomada de decisão. Nesta Unidade de Aprendizagem, você verá os conceitos básicos e as principais características da estrutura de dados, bem como as ferramentas necessárias para sua compreensão e suas aplicações nas diferentes áreas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Explicar estruturas de dados.• Descrever os principais elementos para definir os tipos abstratos de dados (TAD).• Identificar os recursos de programação para implementar as estruturas de dados.• DESAFIO Antes de iniciar o desenvolvimento de um software, deve-se realizar uma análise do problema e de suas características, bem como das ações a serem realizadas. Essa análise tem como objetivo fazer um desenvolvimento com foco em qualidade, efetividade e custos com a reutilização de códigos anteriormente desenvolvidos. Suponha que você atue como programador em uma empresa terceirizada que presta serviços ao DETRAN. Diante desse contexto, indique quais são os tipos abstratos de dados, suas variáveis e operações. INFOGRÁFICO O desenvolvimento de uma aplicação vai além do uso de linguagens de programação, pois requer uma análise crítica do problema a ser abordado, bem como suas possíveis soluções. Para iniciar o processo de desenvolvimento, é necessário construir um esboço inicial do que será desenvolvido, logo, dos objetos abstratos que devem ser programados. A utilização de um fluxo para a criação de tipos de dados abstratos proporcionará a redução de custos com a reutilização de códigos de projetos já desenvolvidos, bem como sua manutenção no futuro. No Infográfico, veja o fluxo necessário para o desenvolvimento de tipos abstratos de dados. Conteúdo interativo disponível na plataforma de ensino! CONTEÚDO DO LIVRO A atuação do profissional de tecnologias da informação (TI) abrange diferentes áreas, desde a análise de requisitos à testagem de aplicações. Durante a trajetória de desenvolvimento, há diferentes profissionais em cada etapa de construção de uma aplicação, porém é recomendado que o profissional de TI tenha conhecimento aprofundado em pelo menos uma das áreas no ciclo de vida de um software. No capítulo Introdução aos tipos abstratos de dados, da obra Estrutura de dados, você verá o conceito de estrutura de dados, seus principais elementos, bem como sua correta construção e a importância de realizar a análise de requisitos com foco na construção dos tipos de dados abstratos e suas particularidades. Boa leitura. ESTRUTURA DE DADOS Lucas Plautz Prestes Introdução aos tipos abstratos de dados Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Explicar estruturas de dados. � Descrever os principais elementos para definir os tipos abstratos de dados. � Identificar os recursos de programação para implementar as estruturas de dados. Introdução A Internet possibilitou o acesso a dados nas suas mais diferentes formas. Ao acessar uma rede social, você é capaz de identificar diversos dados de um amigo, gostos pessoais e grupos de interesse. A partir dessas informações, você pode imaginar o quão complexo deve ser estruturá- -las em uma base de dados e classificá-las de forma adequada para o desenvolvimento de um sistema inteligente. Estruturação e classificação de dados não são uma tarefa simples, pois as dificuldades inerentes podem acarretar problemas futuros no modo como os dados serão amostrados e na performance no sistema desenvolvido. Neste capítulo, você vai estudar a importância da estrutura de dados e suas principais características, além de conferir os recursos necessários para a sua implantação de forma clara e concisa. 1 O que é estrutura de dados? Na computação, a estrutura de dados consiste no modo de armazenamento e organização de dados em um computador. Quando estamos nos referindo ao armazenamento de dados, existe uma infinidade de opções nas quais o dado poderá ser armazenado de acordo com o seu tipo e base de dados. Os dados podem ser armazenados em pastas, arquivos de texto, planilhas ou até mesmo em um banco de dados instalado localmente ou em nuvem. Os dados armazenados não consistem somente no local no qual são ar- mazenados, mas nas relações entre eles. A organização dos dados é tão im- portante quanto o modo no qual são armazenamos, pois a correta escolha de sua categoria irá acarretar na performance ou na velocidade que o compu- tador, ou usuário, irá demorar para encontrá-los. Logo, a correta escolha de como devemos armazenar e organizar os dados deverá levar em consideração o modo no qual eles serão utilizados no futuro. No exemplo a seguir, você poderá identificar como as nossas ações diárias estão ligadas diretamente aos conceitos de dados e às suas respectivas estru- turas, bem como o seu efeito se não utilizadas de forma adequada. Hoje, João foi ao maior supermercado da cidade com o objetivo de realizar as compras de sua festa de aniversário. Sua mãe realizou uma lista de compras com 50 itens dos mais variados tipos. Aproveitando a carona, Maria foi acompanhar seu amigo, mas tinha o objetivo de realizar a compra de outros 50 itens para a festa de sua escola. Ao chegarem ao supermercado, os amigos se separaram para realizar as compras mais rapidamente e, depois, tomar um sorvete na praça de alimentação. João foi realizando as compras de acordo com a lista enviada pela mãe, item a item, seguindo a ordem descrita por ela. Maria, mais esperta, antes de iniciar as compras, parou por 5 minutos e classificou a lista de compras de acordo com as categorias de cada corredor, respeitando a sua respectiva ordem, com o objetivo de obter maior eficiência no seu processo. Após uma hora de compras, João estava na metade de sua lista, caminhando de um lado para o outro, a fim de finalizar as compras o mais rápido possível, e encontrou sua amiga na praça de alimentação, tomando sorvete. Perguntou a ela: “Você já acabou suas compras? Mas como?” Maria respondeu: “Claro, classifiquei todos os meus itens, dados, nas suas diferentes categorias, de acordo com seus respectivos tipos, na ordem dos corredores do supermercado. Logo, realizei as compras de forma mais rápida e eficaz”. Introdução aos tipos abstratos de dados2 Quando os dados estão organizados e dispostos de forma coerente, levando em consideração o objetivo no qual foram destinados, caracterizam uma forma, uma estrutura de dados. A organização e os métodos para manipular essa estrutura de dados conferem a ela singularidade. Você sabe a diferença entre dados e informação? Usualmente, falamos as palavras dados e informação, porém, seus conceitos são completamente distintos. Os dados podem ser números, letras e palavras sem qualquer significado. A informação é quando há algum significado para o dado (Figura 1). Dados: 08 12 07 03 Informação: Idades ou Número de pessoas ou Peso de uma caixa Figura 1. Ilustração de uma lista de dados com possíveis informações as quais os dados poderiam representar. � Análise: classificar os dados de acordo com o objetivo, realizar compras no su- permercado, de acordo com seus respectivos tipos, e ordená-los em categorias e corredores faz com que o processo de compras seja mais eficaz. � Objetivo: realizar compras em um supermercado. � Dados:elementos da lista de compras (p. ex., leite, bolo, chocolate, guardanapo, etc.). � Tipos\categorias: categoria de cada corredor do supermercado (p. ex., laticínios, enlatados, etc.). � Eficaz: eficiência na realização de uma tarefa (compras em um supermercado). Quanto menor o tempo, mais eficiente é o processo e menor será o recurso ne- cessário para a sua realização. 3Introdução aos tipos abstratos de dados 2 Tipos de dados Os dados utilizados em um programa de computador, ou armazenados em um banco de dados, são classificados de acordo com os seus tipos a partir de suas particularidades e limitações. Esses tipos são necessários para definir de forma eficiente o seu processo de armazenamento e manipulação. Apesar de a afirmação anterior ser verdadeira, há linguagens de progra- mação que são fortemente tipadas e outras não. Mas o que isso significa? � Linguagens altamente tipadas: são linguagens de programação que requerem que no momento da declaração de uma variável seja informado de forma explícita o seu tipo e utilizada de acordo com a sua declaração. O programador estará limitado ao tipo definido inicialmente. � Linguagens não tipadas: são linguagens de programação que não reque- rem que no momento da declaração de uma variável seja informado de forma explícita o seu tipo. O compilador irá identificar o possível tipo da variável utilizada pelo programador e defini-la internamente, isso irá trazer liberdade ao programador durante o seu desenvolvimento. As linguagens não tipadas trazem liberdade e velocidade ao programador no desen- volvimento de seus códigos, passando a responsabilidade de definir os tipos de dados ao compilador. Essa prática geralmente irá acarretar maior consumo de memória e processamento na manipulação de dados, pois o compilador desconhece as regras de negócio aplicadas no código, assim, atribuindo tipos de dados que possivelmente irão ocupar mais memória que o necessário para o seu armazenamento e, logicamente, maior processamento em sua manipulação. De acordo com Edelweiss e Galante (2009, p. 36), podemos definir que “[...] um tipo de dado consiste na definição do conjunto de valores (denominado domínio) que uma variável pode assumir ao longo da execução de um programa e do conjunto de operações que podem ser aplicadas sobre ele”. Os dados podem ser classificados como tipos de dados primitivos, também chamados de básicos ou tipos de dados estruturados. Conforme Edelweiss e Galante (2009): Introdução aos tipos abstratos de dados4 � Os tipos de dados primitivos são compostos pelos tipos de dados indi- visíveis, logo, não podem ser decompostos nos demais tipos de dados disponíveis na linguagem de programação escolhida. Um exemplo de dado primitivo é a idade de uma pessoa, que faz parte dos números Naturais na matemática. � Os tipos de dados estruturados permitem a realização de agregação de mais de um valor em uma variável, havendo uma relação estrutural entre os elementos. A matriz utilizada na matemática representa per- feitamente esse tipo de dado, no qual cada elemento tem uma relação entre os seus vizinhos. Alocação de memória: estática e dinâmica A alocação de memória estática ocorre no momento em que realizamos a compilação e a execução do programa. Neste momento, o sistema verifica as variáveis criadas no início do programa e reserva um espaço de memória para cada uma delas de acordo com os seus respectivos tipos. Logo, a memória somente será liberada quando o programa for finalizado. A alocação de memória dinâmica ocorre durante a execução do programa, sendo realizada juntamente às operações durante a sua execução. A liberação de memória no momento do fechamento de um programa ocorre de forma automática pelo sistema operacional, porém, recomenda-se realizar no momento do fechamento a codificação dessa liberação para evitar a criação de “lixo de memória” no sistema operacional. Cada sistema operacional trabalha de uma forma diferente para executar essa liberação, no qual o Windows notoriamente a realiza de forma menos eficaz se comparado aos sistemas operacionais Linux ou MacOs. O exemplo ocorre quando utilizamos o computador por um longo período e temos a sensação de que o sistema operacional fica cada vez mais lento. Isso acontece devido à utilização de memória virtual em virtude de a memória principal estar cheia, mesmo que nenhum programa esteja em execução, logo, essa ocupação provavelmente seja resquício de variáveis de programas anteriormente finalizados. Nesses casos, será recomendado executar programas de limpeza de memória ou o reinício do sistema operacional, forçando, assim, a realocação de toda a memória do sistema operacional. 5Introdução aos tipos abstratos de dados Conforme Cormen (2002), a eficiência de um algoritmo criado para a resolução de um problema se difere de forma drástica a partir da estrutura de dados e seus métodos de manipulação, indo além da avaliação do hardware disponível no computador. Tipos de dados na prática Os tipos de dados utilizados no desenvolvimento de um software, sejam eles atribuídos diretamente no código ou pelo compilador, são extremamente parecidos entre as linguagens de programação, havendo uma infinidade de possibilidades. O Quadro 1 mostra alguns dos tipos de dados mais utilizados e suas características. Fonte: Adaptado de Schildt (1996), Silva e Oliveira (2014). Tipo Bits Faixa mínima Descrição Char 8 –127 a 127 Utilizado para armazenar um caractere da tabela ASCII, seja ele letra, número ou símbolo. Unsigned Char 8 0 a 255 Int 16 –32.767 a 32.767 Utilizado para definir uma variável inteira pertencente ao conjunto dos números inteiros da matemática. Long int 32 –2.147.483.647 a –2.147.483.647 Float 32 Seis dígitos de precisão Utilizado para definir uma variável real pertencente ao conjunto dos números reais. Double 64 Dez dígitos de precisão O tipo double é similar ao tipo float, mas com suporte a um maior número de casas decimais. Quadro 1. Tipos de dados – Padrão ANSI Introdução aos tipos abstratos de dados6 Tipos de dados abstratos Os tipos de dados abstratos (TADs) são estruturas de dados muito impor- tantes capazes de representar os tipos de dados que não foram originalmente previstos nas linguagens de programação e que geralmente são necessárias para o desenvolvimento de aplicações complexas. Essas estruturas são divi- didas em duas camadas, uma chamada de dados e outra de operações. Logo, um TAD é uma forma de definição de um novo tipo de dado em união com operações capazes de manipular esses dados. Conforme Edelweiss e Galante (2009), a característica essencial de um TAD é a separação entre o conceito e a implementação, havendo uma distinção entre a definição do tipo da variável e as suas operações. Para Edelweiss e Galante (2009, p. 38), “[...] um TAD é, portanto, uma forma de definir um novo tipo de dado juntamente com as operações que manipulam esse novo tipo de dado. As aplicações que utilizam esse TAD são denominadas clientes do tipo dado”. Formalmente, podemos definir um TAD como um par (v,o), onde v repre- senta uma ou mais variáveis e o, uma ou mais operações. Devemos salientar que essas operações realizam a manipulação das variáveis definidas pelo mesmo TAD e serão utilizadas pela aplicação. Devemos salientar que o usuário nunca terá acesso direto às variáveis, e sim às operações, também chamadas de funções, que as manipulam. Logo, devemos salientar que sempre será necessário ter pelo menos uma operação de inicialização das variáveis. As principais vantagens em fazer o uso de TADs são: � Reutilização: podemos reutilizar TADs criadas em outros programas em um novo programa sem a necessidade de realizar nova implementação. � Manutenção: podemos facilmente realizar a manutenção em uma TAD criada anteriormente ou adicionar novas operações, se necessário. 3 Recursos necessários para criar um projeto com o uso de TADs Odesenvolvimento de uma TAD envolve a correta escolha das operações mais adequadas para a sua respectiva estrutura de dados, levando em consideração o contexto aplicado, bem como a respectiva definição de comportamento de suas operações. A seguir, podemos definir algumas dicas que poderão facilitar o desenvolvimento de uma TAD: 7Introdução aos tipos abstratos de dados � Realizar a correta análise dos tipos de dados utilizados com foco no hardware e nas necessidades da aplicação. � Definir um número pequeno de operações que, combinadas, possibilitem a realização de operações mais complexas com foco na manutenção da aplicação. � Cada operação deverá ter um propósito definido, levando em conside- ração o contexto aplicado e sua futura manutenção e reutilização, sem muitos casos de exceções. Os TADs podem ser classificados como genéricos ou específicos. De acordo com Edelweiss e Galante (2009), podemos definir os tipos como: � Genéricos: estruturas de dados que podem ser utilizados para repre- sentar qualquer tipo de dados de forma generalista. O mesmo TAD poderia ser utilizado para representar uma lista de presença em uma classe ou até mesmo uma lista telefônica. � Específico: estrutura de dados definida para um domínio específico de aplicação com foco em cobrir uma necessidade não contemplada por um TAD genérico. Criaremos um TAD a partir de uma necessidade identificada. Nosso programa precisa criar um tipo de dado que represente a conta-corrente de um banco. Esta conta deverá ser capaz de realizar saques, depósitos e consultar saldo atual. 1. Identificação do problema: criar uma conta-corrente de acordo com o enunciado do problema proposto. 2. Identificação das variáveis: neste exemplo, estamos criando uma conta-corrente, logo, será necessário ter informações como saldo, número da conta e agência. ContaCorrente: Variáveis Ag: inteiro CC: inteiro Saldo: inteiro 3. Identificação das operações: neste exemplo, devemos realizar todas as operações inerentes a uma conta-corrente bancária. ContaCorrente: Operações Introdução aos tipos abstratos de dados8 ■ Função InicializaConta: Entrada: Ag, CC, Saldo Ação: inserir os respectivos dados informados pelo usuário nas variáveis. Saída: Nulo ■ Função Deposito: Entrada: ValorDepositado Ação: atualizar a variável Saldo. Saída: Nulo ■ Função Saque: Entrada: ValorSacado Ação: atualizar a variável Saldo. Saída: Nulo ■ Função Saldo: Entrada: Nulo Ação: retornar a variável Saldo ao usuário. Saída: Saldo 4. Identificação dos testes: a partir do enunciado, é possível identificar as ações a seguir: ■ Criar uma conta-corrente. ■ Realizar depósitos. ■ Realizar saques. ■ Verificar saldo. Você poderá identificar que existem funções nas quais não há qualquer saída identifi- cada. Nesses casos, recomendamos que seja inserida nessas funções uma mensagem ao usuário que informe que a operação foi realizada com sucesso. O conhecimento adquirido com o estudo das estruturas de dados, com os seus respectivos tipos abstratos e possibilidades de utilização, será de suma importância para o desenvolvimento de aplicações robustas que facilitam desde a manutenção da aplicação até o compartilhamento de informações entre os times de desenvolvimento. 9Introdução aos tipos abstratos de dados CORMEN, T. H. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 2002. EDELWEISS, N.; GALANTE, R. Estruturas de dados. Porto Alegre: Bookmann, 2009. SCHILDT, H. C: completo e total. 3. ed. São Paulo: Makron Books, 1996. SILVA, R. L. S.; OLIVEIRA, A. M. Algoritmos em C. Juiz de Fora: Rodrigo Luis de Souza da Silva, 2014. Introdução aos tipos abstratos de dados10 DICA DO PROFESSOR A utilização dos tipos adequados de dados é de extrema importância durante o desenvolvimento de uma aplicação, pois ela irá definir o consumo de memória utilizado e, assim, a eficiência do consumo de hardware durante sua utilização. Nesta Dica do Professor, veja como identificar os tipos de variáveis e suas aplicações. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) O tipo de dado que representa números é muito utilizado em programação; logo, é sua correta utilização durante o desenvolvimento de uma aplicação é fundamental. Suponha que você esteja analisando os tipos de dados para a implementação de uma aplicação voltada à contabilidade. Durante essa análise, você questiona qual tipo de dados uma variável deve utilizar para representar o número 10, visando à redução do custo de memória do computador. A) Int. B) Float. C) Long int. D) Char. E) Double. 2) Os tipos de dados booleanos têm características específicas em relação aos outros tipos de variáveis. A partir dessa afirmação, identifique a alternativa que apresenta um exemplo de dados booleanos: A) Verdadeiro ou falso. B) Rua Paulista. C) 2,5. D) 10. E) 01/12/2019. 3) Programas de computador fazem uso de diversas variáveis e operações. Em qual momento uma variável ocupa a memória do computador? A) Durante a programação. B) Durante a compilação do programa. C) Durante a execução do programa. D) Quando se finaliza o programa. E) A variável não ocupa espaço de memória. A utilização de variáveis que consomem pouca memória é de suma importância para o desenvolvimento de aplicações com hardware limitado. Por isso, você precisa poupar memória no sistema de presença de uma universidade, na qual os 4) computadores utilizados serão reciclados pelos alunos de anos iniciais. A partir das informações anteriores, qual tipo de variável deve ser utilizado para representar uma única letra do alfabeto visando à redução do custo de memória do computador? A) String. B) Char. C) Double. D) Int. E) Float. 5) Durante o desenvolvimento de uma aplicação, faz-se uso de diferentes tipos de dados. Na definição de tipos abstratos de dados (TAD), faz-se referência ao par (v,o). Qual é o significado desse par? A) (versão, operações). B) (versão, oportunidade). C) (variável, operação). D) (variável, oportunidade). E) (variável, ofício). NA PRÁTICA Diariamente surgem problemas que poderiam ser resolvidos facilmente a partir de soluções simples aplicando-se o uso de tecnologias. No entanto, nem sempre as soluções são baratas. Acompanhe, Na Prática, o caso de um analista de negócios com foco em TI que optou pelo desenvolvimento de uma aplicação com redução de custos a partir do conhecimento e da análise prévia de seu problema. SAIBA + Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Declaração de variáveis Neste vídeo, você assiste a uma explicação sobre o modo de declaração de variáveis, bem como sobre seu uso em português estruturado. Conteúdo interativo disponível na plataforma de ensino! Programa VisualG O programa VisualG é utilizado para o desenvolvimento de softwares em português estruturado. Neste link, você terá acesso a informações do software e a seu download. Conteúdo interativo disponível na plataforma de ensino! Tipos de dados Neste link, você acessa um conteúdo completo sobre os tipos de dados. Conteúdo interativo disponível na plataforma de ensino! Estrutura de Dados Homogêneas do tipo vetor (Fundamentos, definição, inicialização , atribuição, escrita) APRESENTAÇÃO Os dados existentes podem possuir natureza distinta. Por exemplo, eles podem ser números, letras, frases, imagens e até dados complexos, como registros e dicionário de dados, dependendo da linguagem de programação. Uma estrutura de dados homogênea utiliza somente um tipo de dados. Variáveis compostas por vários dados homogêneos são armazenadas em posições de memória, identificadas pelo mesmo nome e individualizadas por meio de índices, que possuem conteúdo do mesmo tipo. Para armazenar uma lista de valores do mesmo tipo em uma única variável utilizamos os vetores. Os vetores são estruturas de dadosunidimensionais ou lineares que necessitam somente de um índice para que seus elementos sejam endereçados. Nesta Unidade de Aprendizagem, você irá trabalhar com conjuntos de dados homogêneos, ou seja, variáveis que representam um conjunto de informações de mesmo tipo: os vetores. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Declarar estruturas de dados homogêneas de uma dimensão.• Diferenciar variáveis simples de variáveis que representam conjuntos de dados.• Construir algoritmos que utilizem estruturas de dados homogêneas de uma dimensão.• DESAFIO Uma companhia aérea gostaria de organizar as informações de seus voos, e você foi contratado para construir um algoritmo que receba um conjunto de códigos de voos e duração (tempo) de cada um. A companhia aérea possui 30 voos. Você deverá construir um algoritmo que manipula (lê e escreve) um conjunto de vetores; em cada posição dos vetores, teremos as informações relativas aos voos: - número do voo - tempo de duração do voo (em minutos) Bom trabalho! INFOGRÁFICO Os vetores permitem que, através de uma única variável, sejam manipulados conjuntos de dados. CONTEÚDO DO LIVRO As estruturas de dados homogêneas (vetores, arranjos) permitem utilizar variáveis que representam um conjunto de dados. Conheça um pouco mais sobre essas estruturas lendo as páginas 163 a 168 do seguinte livro: Algoritmos e programação com exemplos em Pascal e C . Boa leitura! 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programação com exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 ■ ■ Este capítulo introduz um tipo de variável estruturada denominado arranjo, que agrupa dados do mesmo tipo. Analisa os arranjos de uma dimensão, ou seja, unidimensionais, também denominados vetores. Também discute como vetores devem ser declarados e manipulados, e apresenta alguns exemplos de algoritmos de classificação e de pesquisa de dados armazenados em vetores. variáveis estruturadas: capítulo 6 arranjos unidimensionais 164 Algoritmos e Programação com Exemplos em Pascal e C Com as estruturas básicas de controle de fluxo já vistas, sequência, seleção e iteração, é pos- sível resolver praticamente qualquer problema de forma algorítmica. Entretanto, os recursos de armazenamento até agora utilizados não são adequados para soluções que envolvam grandes volumes de dados. Por exemplo, se um professor tem 30 alunos em uma turma e deseja calcular a média arit- mética dessa turma, quantas variáveis ele necessita para ler as médias dos 30 alunos? Pode usar 30, mas uma só é suficiente. Isso porque, nesse problema, as médias dos alunos, após serem lidas e acumuladas em uma variável, não precisam mais ser guardadas. Uma única variável pode ser reaproveitada para ler todas as 30 médias. A cada nova média, ao ser uti- lizada a mesma variável para nova leitura, a média anterior é perdida, ou seja, “jogada no lixo”, sem que isso afete o resultado pretendido, pois o valor anterior já foi acumulado para calcular a média. Mas, se o nosso professor desejar, além de calcular e apresentar a média da turma, também listar as médias dos alunos que forem iguais ou superiores à média da turma, quantas variá- veis ele precisará para armazenar os 30 valores? Nesse caso não há escolha, ele precisará de 30 variáveis. Se o professor quiser fazer o mesmo para sua turma em EAD (ensino a distância), com 150 alunos, precisará de 150 variáveis. Detalhe importante: cada variável deverá ter um nome diferente! Surge aí um grande problema: quanto maior o número de variáveis que um problema exige, maior é o número de nomes diferentes necessários. É claro que sempre dá para usar nomes de variáveis como val01, val02, val03, etc. Mas, além de trabalhosas, as soluções que seguem por esse caminho têm grande chance de serem indutoras de erros/ enganos devido ao número elevado de nomes semelhantes. Se pensarmos que há problemas em que o número de valores diferentes que devem permanecer armazenados por períodos relativamente longos são na ordem de centenas e até mesmo de milhares, o uso de variáveis simples para armazenar grandes volumes de dados claramente não parece ser a melhor opção de armazenamento. Este capítulo discute um tipo de variável estruturada denominado arranjo, que agrupa dados do mesmo tipo e possibilita trabalhar com grande volume de dados de forma eficiente. Ar- ranjos de uma dimensão (ou seja, unidimensionais) são apresentados e analisados aqui. São vistos também alguns exemplos de algoritmos de classificação e de pesquisa para arranjos unidimensionais. Arranjos de mais dimensões serão vistos no Capítulo 7. 6.1 arranjos Um arranjo é uma variável estruturada, formada pelo agrupamento de variáveis de mesmo tipo (inteiro, real, etc.). As variáveis que integram um arranjo compartilham um único nome e são identificadas individualmente por um índice, que é o valor que indica sua posição no agrupamento. Os índices dos arranjos geralmente são de tipos ordinais, como inteiro e ca- ractere, e podem ser tanto variáveis como constantes. Não existe uma vinculação obrigatória entre um arranjo e as variáveis ou constantes usadas para indexá-lo. Dessa forma, consideran- do um certo código, um arranjo pode ser indexado em momentos diferentes por diferentes Capítulo 6 Variáveis Estruturadas: Arranjos Unidimensionais 165 variáveis ou constantes, que podem igualmente ser usadas em outros momentos para a inde- xação de outros arranjos. A qualquer momento pode-se acessar um determinado elemento de um arranjo, sem neces- sidade de acessar antes os elementos que o precedem. O índice utilizado define o elemento sendo acessado. Um elemento de um arranjo é equivalente a uma variável simples. Assim, so- bre qualquer elemento de um arranjo podem ser efetuadas todas as operações até aqui vistas para variáveis simples – preencher o elemento por leitura ou por atribuição, utilizar seu valor em expressões aritméticas, assim como consultar seu valor para operações, testes ou saídas. A ideia base dos arranjos é por vezes utilizada em situações do mundo real como, por exem- plo, no caso do professor que não sabe o nome de seus alunos no início do ano letivo e então entrega a eles,ordenadamente, cartões numerados de 1 a 30, do aluno sentado na primeira fileira até o aluno sentado na última fileira. Concluída a entrega dos cartões, passa a referir- -se aos alunos usando o nome genérico aluno, seguido do número que consta no cartão que o aluno recebeu, que corresponde à sua posição no conjunto dos alunos da sala: aluno 10, aluno 29, etc. O conjunto de alunos da sala constitui “o arranjo” aluno, em que cada aluno é indexado por sua posição (índice) na sala. Arranjos podem ser unidimensionais (de uma só dimensão, quando precisam de um só índice para identificar seus elementos) ou multidimensionais (de duas ou mais dimensões). Os arran- jos de uma só dimensão também são chamados de vetores, e os de duas ou mais dimen- sões, de matrizes. Este capítulo discutirá os arranjos unidimensionais, e o capítulo seguinte, os arranjos multidimensionais. 6.2 vetores Um vetor é um arranjo de uma só dimensão que, portanto, necessita um só índice para acessar seus elementos. Características de um vetor: ■ nome, comum a todos os seus elementos; ■ índices que identificam, de modo único, a posição dos elementos dentro do vetor; ■ tipo dos elementos (inteiros, reais, etc.), comum a todos os elementos do vetor; ■ conteúdo de cada elemento do vetor. Na Figura 6.1 está representado graficamente um vetor de 10 elementos chamado de nota, com índices variando de 1 a 10, sendo o conteúdo do sétimo elemento igual a 8,5. 6.2.1 declaração de um vetor Em pseudolinguagem, um arranjo é declarado com o seguinte tipo: arranjo [<índice menor>..<índice maior>] de <tipo do vetor> 166 Algoritmos e Programação com Exemplos em Pascal e C onde índice menor e índice maior definem os valores limites do intervalo de índices váli- dos para acessar o vetor, bem como o tipo de índice que deve ser usado, e tipo do vetor é o tipo dos dados que podem ser armazenados no vetor. Observar que o nome da variável vetor definida com esse tipo será comum a todos os seus elementos. A declaração a seguir corresponde ao vetor da Figura 6.1, de nome nota, com 10 elementos reais acessados através dos índices de 1 a 10: Variável: nota (arranjo [1..10] de real) 6.2.2 acesso a um elemento de um vetor O acesso a um elemento de um vetor é feito indicando o nome do vetor seguido do ín- dice do elemento considerado, colocado entre colchetes. Na pseudolinguagem utilizada, os índices válidos para acessar um vetor devem estar compreendidos entre os valores dos índices definidos na sua declaração, incluindo os extremos. Assim, a referência ao sétimo elemento do vetor nota é nota[7]. Somente valores de índice válidos devem ser utilizados para acessar um vetor. Índices fora de intervalo provocam tentativas de acesso a áreas não previstas da memória, com resultados imprevisíveis e muitas vezes com reflexos aleatórios sobre o comportamento do algoritmo, gerando erros difíceis de localizar e corrigir. No caso do vetor nota, os índices válidos são os valores de 1 a 10. Para identificar o índice de um elemento de um vetor podem ser utilizadas: ■ uma constante, indicando diretamente o valor do índice. Assim, nota[7] referencia o sétimo elemento do vetor nota; ■ uma variável, sendo que o valor contido nessa variável corresponde ao índice. Por exem- plo, se, no momento do acesso, o valor da variável inteira ind for 3, então nota[ind] vai acessar o terceiro elemento do vetor nota; 1 2 3 4 5 6 7 8 9 nota Índices Nome 8,5 10 Valor figura 6.1 Características de um vetor. Capítulo 6 Variáveis Estruturadas: Arranjos Unidimensionais 167 ■ uma expressão que será avaliada, sendo seu resultado utilizado como índice. Por exem- plo, se o valor da variável inteira i for 4, então nota[i+1] se refere ao quinto elemento do vetor nota. Variáveis diferentes podem ser utilizadas como índice para acessar o mesmo vetor. No exem- plo a seguir, o vetor valor é preenchido por leitura com o auxílio da variável i (primeiro comando para/faça)e, em seguida, seu conteúdo é exibido com o auxílio da variável k (se- gundo comando para/faça). Observar o uso da constante MAX, tanto para declarar o vetor quanto para acessá-lo. Constante: MAX = 100 Variáveis: valor (arranjo [1..MAX] de inteiro) i, k (inteiro) ... para i de 1 incr 1 até MAX faça ler (valor[i]) para k de 1 incr 1 até MAX faça escrever('Valor: ', valor[k]) A mesma variável pode ser utilizada, no mesmo momento ou em momentos diferentes, para acessar vetores diferentes. Por exemplo, supondo a declaração de dois vetores utilizados em um programa para corrigir uma prova, um contendo o gabarito das questões e o outro, as respostas de um aluno (Figura 6.2): Constante: NUMQUEST = 30 Variáveis: gabarito, respostas (arranjo [1..NUMQUEST] de caractere) 1 2 3 4 5 6 7 gabarito a e b d c a a c ... 30 1 2 3 4 5 6 7 respostas a e c a c d a c ... 30 resp o sta in co rreta resp o sta in co rreta resp o sta in co rreta figura 6.2 Vetores gabarito e respostas (com respostas de um aluno). 168 Algoritmos e Programação com Exemplos em Pascal e C O vetor respostas é reaproveitado a cada novo aluno processado. A correção da prova é feita comparando cada uma das respostas de um aluno com o elemento correspondente no vetor gabarito. O comando a seguir mostra a exibição dos valores desses dois vetores, o do gabarito e aquele com os resultados de um aluno, da primeira questão até a última, o que é feito utilizando o mesmo índice para acessar os dois vetores: para k de 1 incr 1 até NUMQUEST faça escrever(gabarito[k], respostas[k]) 6.2.3 inicialização de vetores Não é necessário inicializar um vetor quando ele for totalmente preenchido por leitura, uma vez que todos os valores anteriormente armazenados nas posições de memória do vetor são descartados quando novos valores são colocados nelas. Se um vetor for criado apenas parcialmente, restando posições não ocupadas no seu início, meio ou fim, ou se for utilizado em totalizações, devem ser tomados cuidados para garantir que os valores iniciais de todas as suas posições sejam os desejados. Isso pode ser feito ou inicializando o vetor na sua totalidade antes de sua utilização, ou inicializando cada posição do arranjo imediatamente antes de seu uso. O trecho a seguir inicializa todos os elementos do vetor nota, de 10 elementos reais, com zeros: para i de 1 incr 1 até 10 faça nota[i] ← 0 No caso de vetores preenchidos progressivamente, de forma contínua, visto que o número de posições ocupadas é sempre conhecido, é desnecessário inicializá-los antes do uso, desde que sempre sejam acessadas apenas as posições efetivamente ocupadas (ver Exercícios 6.2 e 6.3, a seguir). 6.3 exemplos de uso de vetores 6.3.1 operações sobre um só vetor Os trechos de código a seguir executam algumas operações sobre um vetor inteiro de 5 ele- mentos chamado de valor: Constante: MAX = 5 Variável: valor (arranjo [1..MAX] de inteiro) Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR Assista ao vídeo para compreender melhor o que são os vetores, sua declaração e manipulação básica. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Em relação às estruturas de dados homogêneas, é INCORRETO afirmar que: A) Vetores são estruturas de dados homogêneas, também denominadas arranjos ou array (em inglês). B) Vetores somente são úteis para pequenos conjuntos de dados (menores que 10 elementos), pois, para grandes conjuntos, o ideal é utilizar diversas variáveis simples (individuais). C) Os índices dos arranjos geralmente são de tipos ordinais. D) As variáveis que integram um vetor/arranjo compartilham um único nome e são identificadas individualmente por um índice. E) Um elemento de um vetor/arranjo é equivalente a uma variável simples. 2) Um vetor é um arranjo de uma só dimensão que, portanto, necessita de apenas um índicepara acessar seus elementos. Selecione a alternativa a seguir que NÃO apresenta uma característica de um vetor. A) Nome, comum a todos os seus elementos. B) Índices que identificam, de modo único, a posição dos elementos dentro do vetor. C) Tipo dos elementos (inteiros, reais, etc.), comum a todos os elementos do vetor. D) Acesso ao conteúdo de cada elemento do vetor. E) Passagem de parâmetro complexa, pois exige a enumeração de cada elemento do vetor. 3) Considere o seguinte algoritmo em pseudocódigo: algoritmo "vetores" var valores: vetor[1..5] de real indice: inteiro inicio para indice de 1 ate 5 passo 1 faca escreva("Digite valor: ") leia(valores[indice]) fimpara fimalgoritmo Analise as alternativas a seguir e selecione a verdadeira. A) A variável "indice" pode ser do tipo real. B) A declaração "valores: vetor[1..5] de real" cria um vetor com 5 posições e já inicializa o vetor com o seguinte conjunto de valores: { 1,2,3,4,5 }. A declaração "valores: vetor[1..5] de real" cria, inicialmente, um vetor com 5 posições, indexadas pelos valores de 1 até 5, mas novos elementos são automaticamente C) adicionados, indexando novas posições, como 6, 7, 8, etc. D) Pode-se indexar o vetor "valores" acessando sua posição inicial pelo índice 0 (zero). E) Para acessar um elemento de um vetor, deve-se acessar o índice da posição desejada; para o índice, pode-se utilizar uma variável ou uma constante inteira. 4) Considere o seguinte algoritmo em pseudocódigo (os dois dígitos à esquerda identificam o número da linha do algoritmo): 01- algoritmo "vetores" 02- var 03- valores: vetor[1..5] de real 04- indice: inteiro 05- inicio 06- para indice de 1 ate 5 passo 1 faca 07- escreva("Digite valor: ") 08- leia(valores[indice]) 09- fimpara 10- para indice de 1 ate 5 passo 1 faca 11- escreval("Valor[",indice,"]: ",valores[indice]) 12- fimpara 13- fimalgoritmo Analise as alternativas a seguir e selecione a INCORRETA. A) Entre as linhas 10 e 12 realiza-se a repetição que permite escrever o valor de cada um dos elementos armazenados no vetor. B) Entre as linhas 06 e 09 realiza-se a repetição que faz a leitura de cada um dos elementos do vetor. Se forem trocados de lugar os blocos de instruções das linhas 06-09 com 10-12, o C) programa será executado da mesma forma e funcionará corretamente. D) Se a declaração da linha 03 for alterada, mudando o limite superior do arranjo, também devem ser alterados os limites superiores dos comandos "para...faça" nas linhas 06 e 10. E) O bloco de comandos das linhas 06-09 poderia ser substituído pela seguinte sequência de comandos: escreva("Digite valor: ") leia(valores[1]) escreva("Digite valor: ") leia(valores[2]) escreva("Digite valor: ") leia(valores[3]) escreva("Digite valor: ") leia(valores[4]) escreva("Digite valor: ") leia(valores[5]) Considere o seguinte algoritmo em pseudocódigo: algoritmo "vetores" var v1: vetor[1..5] de real v2: vetor[1..4] de real v3: vetor[1..9] de real indice: inteiro inicio para indice de 1 ate 5 passo 1 faca escreva("Digite valor: ") leia(v1[indice]) fimpara para indice de 1 ate 4 passo 1 faca escreva("Digite valor: ") leia(v2[indice]) 5) fimpara para indice de 1 ate 9 passo 1 faca se (indice <= 5) entao v3[indice] <- v1[indice] senao v3[indice] <- v2[indice-5] fimse fimpara para indice de 1 ate 9 passo 1 faca escreval("Valor[",indice,"]: ",v3[indice]) fimpara fimalgoritmo Analise as afirmativas a seguir e selecione a correta. A) Ao final da execução do algoritmo, os elementos do vetor v3 terão o produto dos elementos dos vetores v1 e v2. B) O vetor v3 não foi lido, pois é muito grande. C) O vetor v3 é o resultado da concatenação dos vetores v1 e v2. D) As declarações dos vetores v1, v2 e v3 está incorreta e todos os vetores deveriam ter o mesmo tamanho. E) O algoritmo precisa de um índice para acesso a cada um dos vetores, portanto, não pode utilizar uma única variável com esse fim. NA PRÁTICA Vetores são estruturas muito úteis, pois permitem a manipulação simples de um conjunto de dados. Considere que uma professora tem 20 alunos. Para cada um, ela aplica três avaliações e calcula a média de cada aluno pela seguinte fórmula: Média = (N1 * 2 + N2 * 3 + N3 * 5)/10 Assim, foi construído um algoritmo que manipula quatro vetores, um para cada nota e outro para a média de cada aluno. A professora tem uma folha para cada uma das notas, na qual há a lista de alunos e a nota obtida na avaliação. Portanto, cada vetor precisa ser lido separadamente e, depois, calcula-se a média. algoritmo "notas" var alunos, indice: inteiro nota1: vetor[1..20] de real nota2: vetor[1..20] de real nota3: vetor[1..20] de real media: vetor[1..20] de real inicio //leitura das informações de cada nota escreval("=============================================") escreval("Leitura das Informações Sobre os Alunos") escreval("=============================================") escreval("______________________________________________") escreval("______________Nota 01_________________________") escreval("______________________________________________") para indice de 1 ate 20 faca escreval("Digite a nota 1 do aluno", indice) leia(nota1[indice]) fimpara escreval("______________________________________________") escreval("______________Nota 02_________________________") escreval("______________________________________________") para indice de 1 ate 20 faca escreval("Digite a nota 2 do aluno", indice) leia(nota2[indice]) fimpara escreval("______________________________________________") escreval("______________Nota 03_________________________") escreval("______________________________________________") para indice de 1 ate 20 faca escreval("Digite a nota 3 do aluno", indice) leia(nota3[indice]) fimpara para indice de 1 ate 20 faca media[indice] <- ((nota1[indice] * 2) + (nota2[indice] * 3) + (nota3[indice] * 5))/10 fimpara escreval("=============================================") escreval("Listagem dos alunos e suas respectivas médias") escreval("=============================================") para indice de 1 ate 20 faca escreva("Aluno:",indice) escreva(" Média:",media[indice]) escreval("") fimpara escreval("=============================================") fimalgoritmo SAIBA + Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Algoritmos e programação: Vetores (Scratch) Existem variadas linguagens de programação, como C, PHP e Java, e algumas delas são utilizadas para aprendizagem, como Pascal e o Python, devido a facilidade da sua sintaxe. O Scratch é uma dessas linguagens onde são utilizados blocos lógicos, itens de som e imagem para criação de suas próprias histórias interativas, jogos e animações. Verifique no link abaixo como são criados vetores por meio dessa ferramenta. Conteúdo interativo disponível na plataforma de ensino! Algoritmos e programação: Vetores (VisuAlg) Visualg é um programa gratuito de criação, edição, interpretação e execução de algoritmos, que utiliza o português estruturado (Portugol). O Visualg é empregado no ensino de lógica de programação em várias escolas e universidades no Brasil e no exterior. Veja no vídeo do Professor André Santanchè um tutorial para criar vetores utilizando essa ferramenta. Conteúdo interativo disponível na plataforma de ensino! Lógica de Programação - Vetores - Atribuição de valores e leitura de dados Aprender a lógica de programação e a construção de algoritmos é o primeiro passo para você se tornar um excelente programador. Neste sentido, aprenda como atribuir valores aos vetores, ou seja, armazenar dados dentro dos vetores, para posteriormente, realizar a leitura desses dados Conteúdo interativo disponível na plataforma de ensino! Lógica de Programação- Vetores - Definição e declaração Uma matriz é uma coleção de variáveis de mesmo tipo, que são acessíveis por um único nome. Um vetor ou array é uma matriz de uma única dimensão, onde cada variável do vetor é acessada por meio do uso de índices. Veja no link a seguir como declarar um vetor na criação de programas. Conteúdo interativo disponível na plataforma de ensino! Lógica de Programação - Vetores - Exemplo de uso no VisualG Pratique um pouco mais verificando um exemplo prático do uso de vetores no VisualG. Acompanhe como armazenar notas e realizar o cálculo da média, exibindo o resultado na tela. Conteúdo interativo disponível na plataforma de ensino! Aplicações de Vetores APRESENTAÇÃO Um vetor é um arranjo de uma só dimensão que, portanto, necessita de um só índice para acessar seus elementos. Nesta Unidade de Aprendizagem, serão estudadas algumas aplicações de vetores (conjuntos de dados homogêneos). Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Declarar estruturas de dados homogêneas de uma dimensão.• Construir algoritmos que utilizem estruturas de dados homogêneas de uma dimensão (vetores). • Resolver problemas utilizando vetores.• DESAFIO Um funcionário precisa organizar o seu trabalho. Ele recebe um conjunto de pastas de clientes, revisa essas pastas e anota a referência de cada cliente (seu código). Ao realizar este processo, ele inverte as pastas e, por isso, precisa organizá-las na ordem correta de atendimento depois. Sendo assim, construa um algoritmo que: - Leia os códigos dos clientes, armazenando-os em um vetor de inteiros, conforme o trabalho do funcionário. - Em seguida, inverta o vetor. Para que os dados fiquem organizados da maneira que o funcionário precisa para trabalhar, utilize um procedimento para fazer a inversão do vetor. - Escreva o vetor. INFOGRÁFICO Vetores podem ser utilizados para representar informações de sistemas que precisam de conjuntos de dados. Esses conjuntos podem ser manipulados de diversas formas: ordenando os dados, unindo conjuntos de dados, verificando a interseção, invertendo, etc. CONTEÚDO DO LIVRO A representação e manipulação de coleções de itens em programas computacionais é uma tarefa presente nos mais diversos cenários. De fato, muitos são os problemas onde uma sequência de elementos precisa ser construída e informações sejam extraídas a partir de alguma computação realizada sobre ela. Embora existam várias estruturas de dados que podem ser empregadas nesses contextos, os vetores constituem uma das opções mais simples e disponíveis em praticamente todas as linguagens de programação. Neste capítulo, você conhecer os detalhes sobre como vetores são representados computacionalmente e como eles podem ser manipulados. Alguns algoritmos que são tradicionalmente implementados através de vetores serão descritos e seu funcionamento será exemplificado. Além disso, problemas comuns e presentes em cenários reais serão apresentados para que os vetores sejam vistos sob uma perspectiva mais prática. Boa leitura. ALGORITMOS E PROGRAMAÇÃO Identificação interna do documento BJN1UPS1UW-ISVYP11 OBJETIVOS DE APRENDIZAGEM > Declarar estruturas de dados homogêneas de uma dimensão. > Construir algoritmos que utilizem estruturas de dados homogêneas de uma dimensão (vetores). > Resolver problemas utilizando vetores. Introdução Uma realidade comum na construção de programas computacionais para atender a um dado cenário ou problema a ser resolvido é a possibilidade de serem usadas distintas formas de representação. As diferentes estruturas de dados oferecidas nativamente pelas linguagens de programação fazem com que as formas de des- crever um problema computacionalmente sejam ainda mais variadas. No entanto, existem estruturas que podem ser encontradas na grande maioria das linguagens, senão em todas. Isso faz com que elas componham o principal ferramental no momento de se projetar e implementar um algoritmo. Um exemplo de estrutura de dado elementar que é comumente empregada no desenvolvimento de procedimentos computacionais é conhecido como vetor. Suas características e a forma como são armazenadas em memória possibilitam um amplo espectro de aplicações. Logo, ter um conhecimento sólido sobre como manipular esse tipo de estrutura e entender como elas podem ser exploradas para descrever coleções de objetos é uma etapa essencial para a construção de algoritmos eficientes. Aplicações de vetores Thiago Nascimento Rodrigues Identificação interna do documento BJN1UPS1UW-ISVYP11 Neste capítulo, você vai estudar as principais características dos vetores e vai ter uma visão detalhada de sua representação computacional e funcionamento. Vários algoritmos serão apresentados para demonstrar cenários práticos nos quais essas estruturas de dados podem ser empregadas. Além disso, você vai reconhecer como problemas comuns podem ser representados e resolvidos por meio do uso de vetores. Estruturas de dados homogêneas e de uma dimensão Uma tarefa comum em programação é a manutenção de um conjunto numerado de objetos relacionados. Esse é o caso, por exemplo, do software de algum jogo digital que precisa manter a relação dos dez jogadores com melhor pontuação. Em lugar de utilizar dez variáveis diferentes para essa tarefa, é mais conveniente usar uma única variável que seja capaz de armazenar o inteiro conjunto de pontuações. Para a localização de cada pontuação es- pecífica, essa variável deve contar com um índice numérico para referenciar cada pontuação dentro do conjunto. De maneira análoga, um sistema de informações médicas poderia demandar o armazenamento da associação entre pacientes e leitos de um dado hospital. Como na situação anterior, não seria necessário adicionar 200 variáveis ao programa para representar os 200 leitos do hospital (GOODRICH; TAMASSIA, 2007). Para casos como os descritos, o esforço de programação pode ser oti- mizado por meio do uso de vetores. Vetores são coleções sequencialmente numeradas de variáveis de um mesmo tipo. O fato de as variáveis que com- põem um vetor serem todas do mesmo tipo faz com que ele seja classificado como uma estrutura de dados homogênea. Além disso, como a numeração dessas variáveis é feita com base no uso de apenas um único índice, vetores também são classificados como estruturas de dados unidimensionais. Logo, cada variável ou célula em um vetor tem um índice que referencia de forma única o valor nela armazenado. A Figura 1 apresenta uma visão esquemática da estrutura de um vetor. Nesse diagrama, o vetor é composto de 4 elementos e a sua primeira posição é referenciada pelo índice de valor 0. Aplicações de vetores2 Identificação interna do documento BJN1UPS1UW-ISVYP11 Figura 1. Diagrama de representação de um vetor. Fonte: Adaptada de Array in... (2021). Outra característica fundamental dos vetores é a forma como os seus elementos são armazenados na memória principal de um computador. Um vetor é uma estrutura de dados cuja alocação de dados é feita de forma contígua. Em outras palavras, os elementos de um vetor são armazenados um ao lado do outro na memória. Uma analogia para facilitar o entendimento desse tipo de alocação é comparar um vetor a uma rua repleta de casas, onde cada elemento do vetor é equivalente a uma casa e o índice é equivalente ao número da casa. Assumindo que todas as casas são do mesmo tamanho e numeradas sequencialmente de 1 a n, é possível calcular a posição exata de cada casa imediatamente a partir de seu endereço. Como vetores são estru- turas de dados de tamanho fixo, cada elemento pode ser localizado de forma eficiente por meio de seu índice ou (equivalente) endereço (SKIENA, 2008). Algumas linguagens de programação permitem que o tamanho de um vetor seja alterado de maneira eficiente conforme a necessidade, por meio do uso de vetores dinâmicos. Um cenário comum é a criação de um vetor inicialcom tamanho 1 e, sempre que há a necessidade de mais espaço, o seu tamanho é dobrado de n para 2n posições. Esse processo de duplicação envolve a alocação de um novo vetor de tamanho 2n, seguido da cópia do conteúdo do vetor antigo para a primeira metade do novo vetor e a devolução do espaço usado pelo antigo vetor para o sistema responsável pela alocação de memória. Aplicações de vetores 3 Identificação interna do documento BJN1UPS1UW-ISVYP11 Algumas vantagens advindas de os vetores serem alocados contiguamente incluem as listadas a seguir. � Acesso em tempo constante para um dado o índice — Como o índice de cada elemento mapeia diretamente para uma posição de memória ou elemento específico do vetor, o tempo para acessar dados ou va- lores arbitrários é constante, desde que os respectivos índices sejam conhecidos. � Eficiência de espaço — Vetores são compostos puramente em dados. Então, nenhum espaço extra é necessário para o armazenamento de outras informações complementares. � Localidade da memória — Linguagens de programação em geral ofe- recem mecanismos para a execução de iterações sobre os elementos de uma estrutura de dados. Vetores são adequados para esse tipo de operação, já que a alocação contígua feita por eles favorece o desem- penho na localização de dados em memória. A Figura 2 apresenta uma descrição de como os vetores são contiguamente armazenados na memória de um computador. Um vetor de 10 posições tem suas primeiras 7 posições preenchidas com dados de um mesmo tipo — ca- racteres não numéricos. Cada posição do vetor está localizada em uma região específica da memória que é identificada unicamente por um endereço — as duas primeiras posições estão alocadas nos endereços 200 e 201, respecti- vamente. No entanto, essas mesmas posições têm um índice associado para facilitar a localização dos dados no vetor. Figura 2. Alocação de um vetor na memória. Fonte: Adaptada de Introduction... (2017). Uma desvantagem no uso de vetores é a impossibilidade de ajustar seu tamanho no meio da execução de um programa. Logo, um programa que faz uso de um vetor de n posições vai falhar assim que houver a tentativa de inserir um valor na sua posição n + 1. Naturalmente, isso poderia ser contornado Aplicações de vetores4 Identificação interna do documento BJN1UPS1UW-ISVYP11 alocando um vetor suficientemente grande. No entanto, essa abordagem pode causar um uso ineficiente do espaço disponível em memória, o que, por sua vez, levaria a uma nova restrição ao que o programa é capaz de fazer. O valor do primeiro índice de um vetor varia entre as linguagens de programação. As linguagens mais populares como JavaScript, Python, Java e C/C++ fazem uso do índice 0 para indicar a primeira posição de um vetor. Por outro lado, o índice 1 é usado em linguagens como Lua, R, MatLab e Cobol. Embora as formas de se declarar um vetor variem de linguagem para linguagem, alguns elementos são comuns à maioria delas, se não todas: Tipo Nome [ Tamanho ] onde: � Tipo: tipo de dado dos valores armazenados no vetor; � Nome: nome da variável que representa o vetor; � Tamanho: número máximo de elementos comportados pelo vetor. Então, a criação de um vetor para armazenar os 10 números de um bilhete de loteria poderia ser feita como segue: inteiro bilhete[ 10 ] Nesse caso, a variável bilhete foi usada para representar o vetor de 10 posições. Além disso, como os números de um bilhete de loteria são números inteiros, o tipo de dado usado foi inteiro. O acesso a cada posição do vetor é feito informando o índice da posição. Por exemplo, se uma variável de nome “letras” for usada para representar o vetor apresentado na Figura 2, as posi- ções 1 e 5 desse vetor podem ser acessadas como letras[1] e letras[5], respectivamente. A Figura 3 descreve outro exemplo de declaração de vetor e acesso a uma de suas posições. Aplicações de vetores 5 Identificação interna do documento BJN1UPS1UW-ISVYP11 Figura 3. Acessando a posição de índice 0 do vetor arr. Fonte: Adaptada de Introduction... (2017). Neste capítulo, a declaração de vetores seguirá a notação adotada por uma linguagem de programação criada para fins didáticos e conhecida como Portugol (NICOLODI, 2017). Nessa linguagem, o índice vetor é declarado como segue: var Nome: vetor [ inicio .. fim ] de Tipo onde: � var: palavra reservada para indicar a declaração de uma variável; � vetor: palavra reservada para indicar que a variável se trata de um vetor; � inicio: índice da primeira posição do vetor; � fim: índice da última posição do vetor. Algoritmos baseados em vetores Um vetor unidimensional é comumente usado para manter uma coleção de itens na memória e para referenciar todos os itens de uma maneira uniforme. Um típico algoritmo que faz uso dessa estratégia é o algoritmo para encontrar o maior elemento de um vetor de inteiros. O código a seguir descreve uma função Maximo que percorre um vetor passado como parâmetro e localiza o maior valor dentre todos armazenados nele (ZIVIANI, 1999). É importante observar que os índices inicial e final do vetor são também informados como parâmetros da função. Aplicações de vetores6 Identificação interna do documento BJN1UPS1UW-ISVYP11 01. funcao Maximo(Vet: Vetor; inicio, fim: inteiro): inteiro 02. var i, Max: inteiro 03. inicio 04. Max ← Vet[inicio] 05. para i de inicio ate fim faca 06. se Max < Vet[i] 07. entao 08. Max ← Vet[i] 09. fimse 10. fimpara 11. retorne Max 12. fimfuncao A função Maximo utiliza uma variável auxiliar Max para armazenar o maior valor encontrado a cada iteração sobre vetor. O valor inicial dessa variável corresponde ao valor armazenado na primeira posição do vetor informado — linha 4. A partir dessa atribuição inicial, sempre que o valor armazenado em uma das demais posições do vetor é maior que o valor corrente da va- riável Max (linha 6), ela é atualizada com o novo valor encontrado (linha 8). O Quadro 1, a seguir, apresenta o resultado obtido pela execução da função sobre três vetores distintos. Supondo que os índices dos vetores informados variam de 1 a 5, o valor máximo encontrado para o primeiro vetor indicado no quadro estará armazenado na posição 1 + 2 = 3 do vetor. No segundo vetor informado, o valor máximo se encontra na primeira posição do vetor e, por isso, a variável Max não receberá nenhuma atualização durante a iteração sobre o vetor. Consequentemente, o índice do maior valor é o inicial. Por outro lado, no terceiro vetor apresentado no quadro, a variável sofre alterações em cada iteração sobre o vetor, já que os valores se encontram ordenados de forma crescente. Quadro 1. Exemplos de vetores passados para a função Maximo Vetor Valor máximo Índice do Maximo 19 23 45 28 29 45 inicio + 2 100 2 4 7 50 100 inicio 10 20 30 40 50 50 fim Aplicações de vetores 7 Identificação interna do documento BJN1UPS1UW-ISVYP11 Algoritmos cujo funcionamento é baseado no uso de vetores podem ser encontrados nos mais diversos cenários. Uma classe de algoritmos que faz uso intenso desse tipo de estrutura corresponde às diferentes técnicas para ordenação de elementos em memória. Existem diversos algoritmos projetados com essa finalidade e eles implementam estratégias com diferentes níveis de complexidade. No entanto, todos eles resolvem um mesmo tipo de problema: dado um vetor com elementos dispostos em uma ordem qualquer, o objetivo é reorganizar os elementos do vetor de forma que todos eles fiquem em ordem crescente (ou decrescente). Por exemplo, para um vetor de 6 posições composto pelos elementos { 5, 3, 1, 2, 4, 0 }, um algoritmo de ordenação deve reorganizar esses elementos para que, ao término do procedimento, o vetor resultante seja da forma { 0, 1, 2, 3, 4, 5 }. Esse tipo de problema é encontrado em muitos contextos práticos nos quais alguma ordem entre os dados ma- nipulados precisa ser estabelecida. O procedimento a seguir descreve um dos algoritmos mais simples desenvolvidospara a ordenação de um vetor de números inteiros (ZIVIANI, 1999). 01. procedimento Ordena(var Vet: vetor; ini, fim: inteiro) 02. var i, j, min, aux: inteiro 03. inicio 04. para i de ini ate fim - 1 faca 05. min ← i 06. para j de i + 1 ate fim faca 07. se Vet[j] < Vet[min] 08. entao 09. min ← j 10. fimse 11. fimpara 12. aux ← Vet[min] 13. Vet[min] ← Vet[i] 14. Vet[i] ← aux 15. fimpara 16. fim O algoritmo acima tem seu funcionamento baseado em duas operações principais: 1. seleção do menor elemento do vetor (linhas 05–11); 2. troca do menor elemento com o primeiro elemento do vetor (linhas 12–14). Aplicações de vetores8 Identificação interna do documento BJN1UPS1UW-ISVYP11 Essas duas operações são executadas inicialmente para os primeiros fim - 1 elementos do vetor. Em seguida, elas são repetidas para os fim - 2 elementos, depois para fim - 3 elementos e assim até que reste apenas um elemento. Ao término do procedimento, os elementos do vetor original estarão ordenados de forma crescente. O Quadro 2, a seguir, detalha como o vetor passado como parâmetro para o procedimento Ordena é alterado na primeira iteração e mostra como os seus elementos ficam organizados após o término dessa iteração. Quadro 2. Primeira iteração do procedimento Ordena Vet i j min Operação 5 3 1 2 4 0 1 2 1 3 é menor que 5; atualiza min 5 3 1 2 4 0 1 3 2 1 é menor que 3; atualiza min 5 3 1 2 4 0 1 4 3 2 é maior que 1; não atualiza min 5 3 1 2 4 0 1 5 3 4 é maior que 1; não atualiza min 5 3 1 2 4 0 1 6 3 0 é menor que 1; atualiza min 5 3 1 2 4 0 1 - 6 Troca 0 e 5 de posição 0 3 1 2 4 5 2 3 2 Início da segunda iteração A variável min é responsável por armazenar o índice do menor valor encontrado em uma dada iteração do laço mais externo (comando da linha 4). O seu valor inicial é sempre o valor referenciado pelo índice i de cada iteração. Portanto, na primeira iteração, o valor de i é 1; consequentemente, o valor de min é Vet[1], ou seja, 5. O índice i delimita o índice de início de cada iteração. O índice j executa a varredura do vetor em cada iteração, iniciando do valor armazenado em i até o fim do vetor. Logo, nessa primeira iteração, j vai começar a partir do índice 2 e vai até o índice 6 (final do vetor). Sempre que o valor armazenado na posição j for menor do que o valor na posição referenciada pela variável min, isso vai indicar que um novo mínimo foi encontrado. Por isso, a variável min é atualizada como o índice do novo mínimo. Quando j finaliza a varredura do vetor, o menor valor encontrado é realocado para a primeira posição do vetor. Aplicações de vetores 9 Identificação interna do documento BJN1UPS1UW-ISVYP11 Solução de problemas com vetores Existem cenários em que o uso de vetores é particularmente a solução mais natural de ser empregada. Esse é o caso de uma empresa que precisa computar a média salarial de seus funcionários e determinar quanto cada valor se desvia dessa média. Esse mesmo problema pode ser observado no contexto de um professor que precisa determinar o desempenho médio da sua turma e iden- tificar os alunos que mais destoam do comportamento mediano. O algoritmo a seguir descreve como um certo número de valores inteiros pode ser lido, como a média aritmética desses valores é encontrada e como determinar o desvio de cada valor da média obtida (TENEMBAUM; LANGSAM; AUGENSTEIN, 1995). Esse algoritmo pode ser empregado tanto nos cenários descritos quanto em outros envolvendo o cálculo de um valor mediano. 01. procedimento media(qtdValores: inteiro) 02. var valores: vetores[1 .. qtdValores] 03. var inteiro: i, total 04. var real: media, dif 05. inicio 06. para i de 1 ate i < qtdValores faca 07. leia(valores[i]) 08. total ← total + valores[i] 09. fimpara 10. media ← total / qtdValores 11. para i de 1 ate i < qtdValores faca 12. dif ← valores[i] - media 13. escreval(valores[i], dif) 14. fimpara 15. escreval("A media: ", media) 16. fim O programa acima usa dois grupos de qtdValores. O primeiro grupo é o conjunto de valores inteiros informados pelo usuário e é representado pelo vetor valores; o segundo grupo é o conjunto de diferenças que são valores sucessivos atribuídos à variável dif no segundo laço. Uma questão que naturalmente surge é: por que usar um vetor para armazenar todos os valores do primeiro grupo simultaneamente, enquanto uma única variável é utilizada para guardar um valor do segundo grupo de cada vez? Cada diferença é calculada (linha 12), impressa (linha 13) e nunca é necessária novamente. Sendo assim, a variável dif pode ser utilizada para armazenar a diferença entre o próximo inteiro e a média. No entanto, os inteiros originais, que são os Aplicações de vetores10 Identificação interna do documento BJN1UPS1UW-ISVYP11 valores do vetor valores, precisam todos ser mantidos na memória. Embora cada um possa ser somado ao total à medida em que são informados pelo usuário, eles precisam ser mantidos até que a média seja calculada. Somente a partir daí é que o programa pode computar a diferença entre o valor e a média obtida. Portanto, é preciso que um vetor seja utilizado. Evidentemente, poderiam ser usadas tantas variáveis quanto o valor passado através do parâmetro qtdValores para armazenar os inteiros. Entretanto, a vantagem de um vetor é que possibilita ao programador declarar somente um identificador e obter ainda assim uma grande quantidade de espaço na memória. Além disso, quando usado dentro de um laço, o vetor também permite que o programador referencie cada elemento de uma maneira uniforme em vez de obrigá-lo a codificar um comando para cada elemento. Outro contexto em que vetores são comumente empregados é na mode- lagem de listas de itens em memória. Conforme definido por Szwarcfiter e Markenzon (2010), uma lista reúne informações sobre um conjunto de elemen- tos que apresentam alguma forma de relação entre si. O conceito de listas está presente em vários cenários reais, como a representação da lista dos funcionários de uma empresa, uma lista de itens a serem comprados, itens de um estoque, notas de alunos, etc. De maneira mais formal, uma lista L é um conjunto de n ≥ 0 elementos onde as seguintes propriedades são observadas: � se n > 0, L[1] é o primeiro elemento; � para 1 ≤ k ≤ n, o item L[k] é precedido pelo item L[k – 1]. Uma das operações mais frequentes realizadas sobre listas é a operação de busca por um determinado elemento. Além disso, a maneira mais simples de se implementar o conceito de listas em um programa computacional é por meio de vetores. O algoritmo a seguir realiza a busca de um elemento passado como parâmetro (chave) em um vetor também informado. 01. funcao busca(Lista: vetor; ini, fim, chave: inteiro): logico 02. var encontrou: logico 03. var i: inteiro 04. inicio 05. encontrou ← FALSO 06. i ← ini 07. enquanto i ≤ fim faca 08. se Lista[i] = chave Aplicações de vetores 11 Identificação interna do documento BJN1UPS1UW-ISVYP11 09. entao 10. encontrou ← VERDADEIRO 11. i ← fim + 1 12. senao 13. i ← i + 1 14. fimse 15. fimenquanto 16. retorne encontrou 17. fimfuncao É importante observar que, para cada elemento da lista (posições do vetor), o algoritmo apresentado realiza dois testes. Primeiro, ele sempre verifica se a variável i atingiu a última posição vetor (linha 7). Quando isso acontece, o laço é interrompido e o valor da variável encontrado é retornado. O segundo teste (linha 8) é realizado no interior do laço que percorre o vetor. Esse teste verifica se o elemento na posição corrente do vetor corresponde ao valor procurado. Quando essa condição é satisfeita, a variável i é atualizada para um valor que extrapola o tamanho do vetor (linha 11). Isso vai ocasionar a interrupção do laço. Além disso, a variável encontrado recebe um valor lógico indicando o sucesso da busca (linha 10). Neste capítulo, foi possível conhecer em detalhes como os vetores sãorepresentados na memória de um computador e como eles podem ser mani- pulados por meio de algoritmos. A estrutura sequencial dos seus dados possi- bilita que muitos cenários reais possam ser modelados computacionalmente e soluções eficientes possam ser construídas. Alguns algoritmos tradicionais foram explorados e foi demonstrado como vetores são comumente utilizados na obtenção do valor máximo de um conjunto e na ordenação de elementos. Finalmente, alguns cenários práticos foram apresentados permitindo desen- volver uma visão mais aplicada dessa poderosa estrutura de dados. Aplicações de vetores12 Identificação interna do documento BJN1UPS1UW-ISVYP11 Referências ARRAY IN Data Structures: What is, Concept, Insert/Delete Operations Example. Guru99, Ahemdabad, 2021. Disponível em: https://www.guru99.com/array-data-structure.html. Acesso em: 12 abr. 2021. GOODRICH, M. T.; TAMASSIA, R. Estruturas de dados e algoritmos em Java. 4. ed. Porto Alegre: Bookman, 2007. 600 p. INTRODUCTION to Arrays. GeeksforGeeks, Noida, 27 Oct. 2017. Disponível em: https:// www.geeksforgeeks.org/introduction-to-arrays/. Acesso em: 12 abr. 2021. NICOLODI, A. C. Manual do Visualg 3.0. Visualg3, Gaspar, 2017. Disponível em: http:// manual.visualg3.com.br/doku.php. Acesso em: 12 abr. 2021. SKIENA, S. S. The algorithm design manual. 2. ed. London: Springer, 2008. 730 p. SZWARCFITER, J.; MARKENZON, L. Estrutura de dados e seus algoritmos. 3. ed. Rio de Janeiro: LTC, 2010. 320 p. TENENBAUM, A. M.; LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de dados usando C. São Paulo: Makron Books, 1995. 884 p. ZIVIANI, N. Projeto de algoritmos com implementações em Pascal e C. 4. ed. São Paulo: Pioneira, 1999. 267 p. Leituras recomendadas ALVES, G. F. O. O que são Vetores e Matrizes (arrays). Dicas de Programação, São José dos Campos, 13 maio 2013. Disponível em: https://dicasdeprogramacao.com.br/o-que- -sao-vetores-e-matrizes-arrays/. Acesso em: 12 abr. 2021. BERTOL, O. F. Vetores – Parte 1. Revista easy Java Magazine, Rio de Janeiro, n. 16, 2012. Disponível em: https://www.devmedia.com.br/vetores-revista-easy-java-magazine-16- -parte-1/23878. Acesso em: 12 abr. 2021. CASAVELLA, E. Vetores – arrays em linguagem C. Intellectuale Tecnologia e Treinamento, São Paulo, mar. 2012. Disponível em: http://linguagemc.com.br/vetores-ou-arrays-em- -linguagem-c/. Acesso em: 12 abr. 2021. Os links para sites da web fornecidos neste capítulo foram todos testados, e seu funcionamento foi comprovado no momento da publicação do material. No entanto, a rede é extremamente dinâmica; suas páginas estão constantemente mudando de local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade sobre qualidade, precisão ou integralidade das informações referidas em tais links. Aplicações de vetores 13 Identificação interna do documento BJN1UPS1UW-ISVYP11 Identificação interna do documento BJN1UPS1UW-ISVYP11 Identificação interna do documento BJN1UPS1UW-ISVYP11 Identificação interna do documento BJN1UPS1UW-ISVYP11 Identificação interna do documento BJN1UPS1UW-ISVYP11 Nome do arquivo: UA_2152_20210929160920162873.pdf Data de vinculação ao processo: 29/09/2021 16:09 Processo: 475394 DICA DO PROFESSOR A seguir, serão abordadas algumas aplicações de vetores. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS Considere o seguinte objetivo: construir um algoritmo que leia um vetor G[13] que é o Gabarito de um teste da loteria esportiva, contendo os valores 1 (coluna , 2 (coluna , e 3 (coluna do meio). Ler, a seguir, para cada apostador, o número de seu cartão e um vetor Resposta R[13]. Verificar, para cada apostador, o número de acertos e escrever o número do apostador e seu número de acertos. Se tiver 13 acertos, acrescentar a mensagem "Ganhador, parabéns!". Analise a implementação a seguir, feita para atender a essa necessidade: algoritmo "loteria" var G: vetor[1..13] de real R: vetor[1..13] de real indice, cartao, acertos: inteiro procedimento lerG inicio para indice de 1 ate 13 passo 1 faca escreva("Jogo(",indice,"): ") leia(G[indice]) fimpara fimprocedimento procedimento lerR inicio para indice de 1 ate 13 passo 1 faca escreva("Jogo(",indice,"): ") leia(R[indice]) 1) se (R[indice] = G[indice]) entao acertos <- acertos + 1 fimse fimpara fimprocedimento inicio lerG() repita escreva("Digite cartao do apostador: ") leia(cartao) se (cartao <> 0) entao acertos <- 0 lerR() escreval("Acertos: ",acertos) se (acertos = 13) entao escreval("GANHADOR, PARABÉNS!") fimse fimse ate (cartao = 0) fimalgoritmo Assinale a alternativa INCORRETA: A) As rotinas lerG e lerR são muito semelhantes, ambas leem um vetor, mas não realizam exatamente o mesmo procedimento. B) A declaração G: vetor[1..13] de real R: vetor[1..13] de real pode ser substituída por G, R: vetor[1..13] de real C) O algoritmo será repetido infinitamente. D) A variável "indice" poderia ser declarada como variável local nos procedimentos lerG e lerR, sem que isso comprometesse a execução do programa. E) O valores digitados para os vetores de gabarito e de repostas não são consistidos, portanto, poderiam ser digitados valores diferentes de 1, 2 ou 3, que deveriam somente ser aceitos. Considere o seguinte algoritmo em pseudocódigo: algoritmo "faz" var V: vetor[1..10] de real procedimento T(var a,b : real) var aux : real inicio aux <- a a <- b b <- aux fimprocedimento procedimento X var indice : inteiro inicio para indice de 1 ate 10 passo 1 faca escreva("Elemento(",indice,"): ") leia(V[indice]) fimpara fimprocedimento procedimento Y var i,j : inteiro inicio para i de 1 ate 10 passo 1 faca para j de 1 ate 9 passo 1 faca 2) se (V[j] > V[j+1]) entao T(V[j],V[j+1]) fimse fimpara fimpara fimprocedimento procedimento Z var indice : inteiro inicio para indice de 1 ate 10 passo 1 faca escreval("V(",indice,"): ",V[indice]) fimpara fimprocedimento inicio X() Y() Z() fimalgoritmo Analise as seguintes alternativas e selecione a CORRETA: A) O procedimento Z lê os elementos de um vetor. B) O procedimento Y ordena o vetor em ordem decrescente. C) O procedimento Z ordena o vetor em ordem crescente. D) O procedimento X ordena o vetor em ordem decrescente. E) O procedimento Y ordena o vetor em ordem crescente. 3) Uma professora deseja um programa para lhe auxiliar a calcular a média das notas de seus alunos. Ela possui 25 alunos e três notas para cada aluno, sendo que a média é calculada pela média aritmética simples das três notas. A partir das notas, ela precisa saber o maior valor e a média de cada uma delas. Além disso, precisa saber a maior média e a média das médias. Analise as alternativas a seguir e selecione aquela que tem a declaração de variáveis mais completa e adequada para atender a necessidade da professora. A) var Nota1, Nota2, Nota3, Media: vetor[1..25] de inteiro SomaN1, SomaN2, SomaN3, SomaMedia, MediaN1, MediaN2, MediaN3, MediaMedia : inteiro MaiorN1, MaiorN2, MaiorN3, MaiorMedia : inteiro indice : inteiro B) var Nota1, Nota2, Nota3, Media: vetor[1..25] de real SomaN1, SomaN2, SomaN3, SomaMedia, MediaN1, MediaN2, MediaN3, MediaMedia : real indice : inteiro C) var Nota1, Nota2, Nota3, Media: vetor[1..25] de real SomaN1, SomaN2, SomaN3, SomaMedia, MediaN1, MediaN2, MediaN3, MediaMedia : real MaiorN1, MaiorN2, MaiorN3, MaiorMedia : real indice : inteiro D) var Nota1, Nota2, Nota3, Nota4, Nota5, Nota6, Nota7, Nota8, Nota9, Nota10, Nota11, Nota12, Nota13, Nota14, Nota15, Nota16, Nota17, Nota18, Nota19, Nota20, Nota21, Nota22, Nota23, Nota24, Nota25, Media: vetor[1..3] de real Somatorio, Maior : real indice : inteiro var E) Nota1, Nota2, Nota3, Nota4, Nota5, Nota6, Nota7, Nota8, Nota9, Nota10, Nota11, Nota12, Nota13, Nota14, Nota15, Nota16, Nota17, Nota18,
Compartilhar