Prévia do material em texto
<p>ESTRUTURA</p><p>DE DADOS</p><p>Maurício de Oliveira Saraiva</p><p>Vetores de registros</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Identificar vetores de registros.</p><p>� Manipular vetores de registros.</p><p>� Desenvolver um pequeno cadastro em um vetor de registros.</p><p>Introdução</p><p>Implementar cadastros em sistemas são atividades comuns para quem</p><p>trabalha com desenvolvimento de software. Em geral, todo sistema precisa</p><p>de um ou mais cadastros, seja para armazenar uma pequena relação ou</p><p>grandes quantidades de itens. Na linguagem C, é possível implementar</p><p>cadastros com base no conceito registros, que podem agrupar variáveis</p><p>de diferentes tipos como um único elemento composto, que pode ser</p><p>armazenado em vetores para formar os dados de inúmeros cadastros.</p><p>Neste capítulo, você estudará sobre a declaração e a manipulação</p><p>de vetores de registros, bem como o desenvolvimento de um pequeno</p><p>cadastro em um vetor de registros.</p><p>Vetores de registros</p><p>Um registro, ou simplesmente estrutura, é um agrupamento de variáveis rela-</p><p>cionadas entre si que podem ser referenciadas como um único elemento. As</p><p>variáveis desse elemento construído podem ser de diferentes tipos, montando,</p><p>assim, um tipo composto heterogêneo (CELES; CERQUEIRA; RANGEL,</p><p>2004).</p><p>A Figura 1 ilustra uma estrutura chamada Produto, que é composta por</p><p>quatro atributos: codigo, descricao, preco e quantidade. Com base nessa</p><p>estrutura, é possível armazenar as informações de um produto contendo os</p><p>dados necessários.</p><p>Figura 1. Exemplo de um registro.</p><p>Na linguagem C, um registro pode ser criado por meio da instrução struct</p><p>(SCHILDT, 1997):</p><p>Nesse exemplo, a estrutura Produto é um registro composto de quatro vari-</p><p>áveis de diversos tipos primitivos: codigo como um número inteiro, descricao</p><p>como uma cadeia de caracteres, preco como um número real e quantidade</p><p>como outro número inteiro.</p><p>No entanto, em relação ao armazenamento de informações, um registro</p><p>é como uma simples variável, isto é, ele guarda apenas uma informação,</p><p>mesmo que essa informação seja composta de vários itens, como os atributos</p><p>do cadastro de um produto (SCHILDT, 1997).</p><p>Para armazenar mais de um registro, é preciso declarar um vetor ou array de</p><p>elementos que sejam do tipo desse registro. Assim, em um cadastro de produtos,</p><p>é possível armazenar dados de vários produtos (DEITEL; DEITEL, 2011).</p><p>Vetores de registros2</p><p>Registros normalmente são usados para compor a base de dados de sistemas de</p><p>informação para atender a determinados domínios de aplicação, como cadastro de</p><p>produtos de um supermercado e cadastro de alunos de uma academia de ginástica,</p><p>entre outros.</p><p>Para declarar um vetor da estrutura Produto, visando armazenar até mil</p><p>produtos, utilizamos as seguintes instruções na linguagem C:</p><p>� A instrução define especifica uma espécie de constante, que armazena</p><p>o tamanho do vetor.</p><p>� A segunda instrução especifica a declaração de um vetor, de mil elemen-</p><p>tos, que vai armazenar em cada célula as informações de cada produto.</p><p>Usar a instrução #define para especificar o tamanho de um vetor faz parte das boas</p><p>práticas de programação, pois facilita a manutenção no código em caso de necessidade</p><p>de redimensionamento do array.</p><p>A visualização lógica de um array de registros pode ser realizada de duas</p><p>formas: em formato de cadeia, cujos elementos encontram-se dispostos lado</p><p>a lado, conforme apresentado na Figura 2; e em formato de tabela de banco</p><p>de dados, em que os elementos estão dispostos um abaixo do outro, conforme</p><p>ilustrado na Figura 3.</p><p>3Vetores de registros</p><p>Figura 2. Ilustração de um array de registros como uma cadeia.</p><p>Figura 3. Ilustração de um array de registros como tabela de um banco de dados.</p><p>Podemos, ainda, declarar mais de um vetor para a mesma estrutura de</p><p>registros. Isso é possível porque a instrução struct funciona como um tipo</p><p>composto e permite a declaração de inúmeras estruturas, que representam o</p><p>conjunto de itens daquele tipo de registro (CELES; CERQUEIRA; RANGEL,</p><p>2004).</p><p>Nesses exemplos, criamos três vetores com tamanhos diferentes para</p><p>a estrutura Produto. Cada vetor poderá armazenar seus dados de forma</p><p>independente, ou compartilhar dados entre si, pois todos possuem o mesmo</p><p>formato, baseado na estrutura Produto.</p><p>Vetores de registros4</p><p>Manipular vetores de registros</p><p>Você viu que um vetor de registros é um conjunto de elementos de um tipo com-</p><p>posto, que pode conter variáveis de diversos tipos primitivos em cada elemento,</p><p>sendo que cada um desses elementos pode ser manipulado individualmente.</p><p>Para manipular um elemento de um array de registros individualmente,</p><p>você precisa identificar a estrutura e a respectiva variável, bem como a posição</p><p>do array que será indexada por seu índice. Conforme apresentado na seção</p><p>anterior, a seguinte instrução define a estrutura Produto que contém quatro</p><p>variáveis.</p><p>No exemplo apresentado, atribuímos valores diretamente à posição 1 do</p><p>vetor Produto. Em um sistema desenvolvido para o usuário final, a entrada</p><p>de dados deve ser realizada diretamente pelo teclado, a partir dos comandos</p><p>de leitura definidos pela instrução scanf da linguagem C.</p><p>5Vetores de registros</p><p>Como o vetor de registros é indexado, é possível imprimir as informações</p><p>de determinado registro por meio de seu índice, conforme a seguinte instrução:</p><p>Percorrer um vetor de registros</p><p>É possível percorrer um array de registros por meio de um laço de repetição.</p><p>Para isso, podemos usar qualquer tipo de estrutura de repetição, como while,</p><p>do while ou for, este último sendo o mais comum para estruturas de tamanho</p><p>fixo, como um vetor (SCHILDT, 1997).</p><p>Em um array de registros, é recomendado inicializar todos os registros</p><p>do vetor antes de utilizá-lo. Isso evita que o sistema apresente algum dado</p><p>incorreto, devido à alocação de um espaço de memória que possa conter</p><p>alguma informação desatualizada.</p><p>Nesse sentido, você verá, agora, como construir um laço de repetição e</p><p>definir valores iniciais para cada registro. Além de evitar alguma sujeira da</p><p>memória, é possível identificar as posições do array que ainda não estejam</p><p>ocupadas, para gravar um novo registro ou atualizar um existente.</p><p>Uma vez que o vetor de registros seja inicializado e que alguns dados</p><p>tenham sido gravados, você pode imprimir a relação completa de registros</p><p>armazenados ou localizar algum registro específico, como o nome ou o código</p><p>de um produto.</p><p>Vetores de registros6</p><p>Esse laço de repetição percorre o vetor de registros desde a posição zero até</p><p>o valor definido em MAX menor um, isso porque todo array na linguagem C</p><p>inicia seu índice em zero. No entanto, nem todas as posições do vetor podem</p><p>estar ocupadas e isso faria os registros sem valor serem exibidos, poluindo a</p><p>tela do relatório. Veja um exemplo de relatório total na Figura 4.</p><p>Figura 4. Relatório total de registros do vetor.</p><p>Para resolver essa questão, colocamos uma instrução condicional no laço</p><p>de repetição que identifica apenas os registros que receberam alguma in-</p><p>formação, para evitar que a listagem apresente aqueles registros que foram</p><p>somente inicializados.</p><p>Nesse caso, usamos a instrução strcmp da biblioteca <string.h>, que</p><p>realiza a comparação entre duas variáveis que representam strings ou cadeia</p><p>de caracteres.</p><p>7Vetores de registros</p><p>Observe, na Figura 5, um exemplo de relatório de registros com valor do</p><p>vetor.</p><p>Figura 5. Relatório de registros com valor do vetor.</p><p>Usamos essa mesma técnica para localizar e imprimir um ou mais registros</p><p>específicos do vetor pela busca por um campo, que não seja seu índice, como</p><p>a descrição de um produto. No exemplo a seguir (ilustrado na Figura 6), a</p><p>busca é realizada por Azeite Oliva por meio de um laço de repetição while.</p><p>Figura 6. Pesquisa de um registro no vetor.</p><p>Vetores de registros8</p><p>Desenvolver um pequeno cadastro</p><p>em um vetor de registros</p><p>Nesta seção, você verá a implementação, em linguagem C, dos principais</p><p>métodos de um pequeno cadastro, como inclusão. Para isso, criaremos</p><p>um vetor</p><p>de registros com base na estrutura Produto, apresentada nas seções anteriores.</p><p>Inicialmente, declaramos as bibliotecas necessárias, o número máximo</p><p>de elementos do cadastro e a estrutura do produto, que contém os atributos</p><p>codigo, descricao, preco e quantidade.</p><p>O cadastro de produtos precisará de algumas ações, como inicializar o</p><p>vetor, incluir, alterar e excluir itens, além de imprimir a relação de produtos</p><p>cadastrados, conforme os seguintes protótipos declarados.</p><p>A definição do vetor de registros é realizada pela instrução a seguir. Isso</p><p>reserva na memória a quantidade de espaço necessária para armazenar os</p><p>registros da estrutura Produto. Na sequência, serão apresentadas as imple-</p><p>mentações dos métodos que manipulam o cadastro de produtos.</p><p>9Vetores de registros</p><p>O método inicializar atribui valores iniciais para cada variável dos registros</p><p>do vetor. Isso é importante para identificar quais posições do vetor estarão</p><p>ocupadas ou livres para receber os dados dos produtos.</p><p>O método incluir grava os dados do produto no vetor, na posição indicada</p><p>pelo parâmetro codigo. Neste exemplo, utilizamos o código do produto como</p><p>índice do vetor, mas poderia ser outro valor. Além disso, essa função faz a</p><p>verificação para garantir que o código não seja maior que o limite do vetor, que</p><p>a posição do vetor esteja livre e que a quantidade do produto não seja negativa.</p><p>Vetores de registros10</p><p>O método alterar modifica os dados de um produto no vetor, na posição</p><p>indicada pelo parâmetro codigo. Esse método também verifica o tamanho</p><p>do vetor e se a posição do array está ocupada, pois não é possível alterar</p><p>um produto que não esteja cadastrado, bem como avalia se a quantidade do</p><p>produto não é menor que zero.</p><p>O método excluir redefine os valores iniciais para a posição indicada no</p><p>vetor. Isso faz o sistema considerar que aquele registro foi excluído, e que a</p><p>posição poderá ser ocupada por outro produto.</p><p>11Vetores de registros</p><p>O método imprimir realiza a impressão dos dados do vetor na tela por</p><p>meio de um laço de repetição. No entanto, imprime apenas as células que</p><p>possuem alguma informação preenchida no campo descricao, conforme está</p><p>apresentado no código a seguir.</p><p>Por fim, o método main realiza a chamada dos métodos para manipular o</p><p>cadastro de produtos. Para isso, chama a inicialização do vetor por meio do</p><p>método inicializar e, depois, inclui três produtos. Após, tenta incluir outro</p><p>produto em uma posição ocupada e imprime a relação de produtos cadastrados.</p><p>Finalmente, altera um produto e exclui outro.</p><p>Vetores de registros12</p><p>O resultado da execução do programa está ilustrado na Figura 7.</p><p>Figura 7. Resultado da execução do programa.</p><p>CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados. São Paulo:</p><p>Campus, 2004.</p><p>DEITEL, P. J.; DEITEL, H. M. C: como programar. 6. ed. Rio de Janeiro: Pearson, 2011.</p><p>SCHILDT, H. C: completo e total. 3. ed. São Paulo: Makron Books, 1997.</p><p>13Vetores de registros</p>