Prévia do material em texto
Vetores de Registros Apresentação Implementar cadastros em sistemas é atividade comum para quem trabalha com desenvolvimento de softwares. No geral, todo sistema precisa de um ou mais cadastros para armazenar uma pequena ou grande relação de itens. Na linguagem C, é possível implementar cadastros com base no conceito de registros, que podem agrupar variáveis de diferentes tipos como um único elemento composto, o qual, por sua vez, pode ser armazenado em vetores para formar grandes conjuntos de dados. Nesta Unidade de Aprendizagem, você vai estudar sobre a declaração e a manipulação de vetores de registros, bem como sobre o desenvolvimento de um pequeno cadastro em um vetor de registros. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Identificar vetores de registros.• Manipular vetores de registros.• Desenvolver um pequeno cadastro em um vetor de registros.• Desafio Implementar sistemas que manipulam cadastros de itens é uma atividade básica de qualquer profissional que trabalha com desenvolvimento de softwares. Cadastros, em geral, são constituídos de estruturas heterogêneas que compreendem elementos compostos por atributos de diversos tipos, como registros. Nesse contexto, este Desafio propõe a implementação de um cadastro de alunos de uma academia, contendo os seguintes atributos: matrícula, nome, número de celular, peso e altura. O cadastro deve armazenar os dados em um vetor de registros com, no máximo, 500 posições. São métodos que devem ser implementados neste Desafio: inicializar o vetor;• incluir aluno;• excluir aluno;• imprimir relação de alunos;• realizar busca de aluno por nome;• imprimir os dados dos alunos.• Infográfico Um vetor de registros é uma estrutura utilizada para armazenar elementos que têm atributos de diversos tipos. Existem várias finalidades para o uso de vetores de registros, mas principalmente para a manipulação de dados com atributos heterogêneos, como cadastros em geral. Por meio dessa estrutura, é possível acessar registros em qualquer posição do vetor, bem como manipular seus atributos de forma individual ou agrupada. Veja no Infográfico a ilustração de um vetor de registros e a composição da estrutura que define o vetor de dados compostos heterogêneos. Conteúdo do livro No desenvolvimento de sistemas, analistas e programadores implementam as mais variadas rotinas, sendo uma das mais comuns a implementação de cadastros. De um modo geral, cadastros manipulam dados que servem de apoio para diversas atividades, como vender e entregar produtos, prestar serviços, etc. No capítulo Vetores de registros, da obra Estrutura de dados, você verá que a linguagem C fornece, como recurso para cadastros, a implementação de registros, que agrupa variáveis de diversos tipos como um único elemento composto, que pode ser manipulado por meio de vetores para formar dados de cadastros para inúmeras funcionalidades. Boa leitura. ESTRUTURA DE DADOS Maurício de Oliveira Saraiva Vetores de registros Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Identificar vetores de registros. � Manipular vetores de registros. � Desenvolver um pequeno cadastro em um vetor de registros. Introdução Implementar cadastros em sistemas são atividades comuns para quem trabalha com desenvolvimento de software. Em geral, todo sistema precisa de um ou mais cadastros, seja para armazenar uma pequena relação ou grandes quantidades de itens. Na linguagem C, é possível implementar cadastros com base no conceito registros, que podem agrupar variáveis de diferentes tipos como um único elemento composto, que pode ser armazenado em vetores para formar os dados de inúmeros cadastros. Neste capítulo, você estudará sobre a declaração e a manipulação de vetores de registros, bem como o desenvolvimento de um pequeno cadastro em um vetor de registros. Vetores de registros Um registro, ou simplesmente estrutura, é um agrupamento de variáveis rela- cionadas entre si que podem ser referenciadas como um único elemento. As variáveis desse elemento construído podem ser de diferentes tipos, montando, assim, um tipo composto heterogêneo (CELES; CERQUEIRA; RANGEL, 2004). A Figura 1 ilustra uma estrutura chamada Produto, que é composta por quatro atributos: codigo, descricao, preco e quantidade. Com base nessa estrutura, é possível armazenar as informações de um produto contendo os dados necessários. Figura 1. Exemplo de um registro. Na linguagem C, um registro pode ser criado por meio da instrução struct (SCHILDT, 1997): Nesse exemplo, a estrutura Produto é um registro composto de quatro vari- áveis de diversos tipos primitivos: codigo como um número inteiro, descricao como uma cadeia de caracteres, preco como um número real e quantidade como outro número inteiro. No entanto, em relação ao armazenamento de informações, um registro é como uma simples variável, isto é, ele guarda apenas uma informação, mesmo que essa informação seja composta de vários itens, como os atributos do cadastro de um produto (SCHILDT, 1997). Para armazenar mais de um registro, é preciso declarar um vetor ou array de elementos que sejam do tipo desse registro. Assim, em um cadastro de produtos, é possível armazenar dados de vários produtos (DEITEL; DEITEL, 2011). Vetores de registros2 Registros normalmente são usados para compor a base de dados de sistemas de informação para atender a determinados domínios de aplicação, como cadastro de produtos de um supermercado e cadastro de alunos de uma academia de ginástica, entre outros. Para declarar um vetor da estrutura Produto, visando armazenar até mil produtos, utilizamos as seguintes instruções na linguagem C: � A instrução define especifica uma espécie de constante, que armazena o tamanho do vetor. � A segunda instrução especifica a declaração de um vetor, de mil elemen- tos, que vai armazenar em cada célula as informações de cada produto. Usar a instrução #define para especificar o tamanho de um vetor faz parte das boas práticas de programação, pois facilita a manutenção no código em caso de necessidade de redimensionamento do array. A visualização lógica de um array de registros pode ser realizada de duas formas: em formato de cadeia, cujos elementos encontram-se dispostos lado a lado, conforme apresentado na Figura 2; e em formato de tabela de banco de dados, em que os elementos estão dispostos um abaixo do outro, conforme ilustrado na Figura 3. 3Vetores de registros Figura 2. Ilustração de um array de registros como uma cadeia. Figura 3. Ilustração de um array de registros como tabela de um banco de dados. Podemos, ainda, declarar mais de um vetor para a mesma estrutura de registros. Isso é possível porque a instrução struct funciona como um tipo composto e permite a declaração de inúmeras estruturas, que representam o conjunto de itens daquele tipo de registro (CELES; CERQUEIRA; RANGEL, 2004). Nesses exemplos, criamos três vetores com tamanhos diferentes para a estrutura Produto. Cada vetor poderá armazenar seus dados de forma independente, ou compartilhar dados entre si, pois todos possuem o mesmo formato, baseado na estrutura Produto. Vetores de registros4 Manipular vetores de registros Você viu que um vetor de registros é um conjunto de elementos de um tipo com- posto, que pode conter variáveis de diversos tipos primitivos em cada elemento, sendo que cada um desses elementos pode ser manipulado individualmente. Para manipular um elemento de um array de registros individualmente, você precisa identificar a estrutura e a respectiva variável, bem como a posição do array que será indexada por seu índice. Conforme apresentado na seção anterior, a seguinte instrução define a estrutura Produto que contém quatro variáveis. No exemplo apresentado, atribuímos valores diretamente à posição 1 do vetor Produto. Em um sistema desenvolvido para o usuário final, a entradade dados deve ser realizada diretamente pelo teclado, a partir dos comandos de leitura definidos pela instrução scanf da linguagem C. 5Vetores de registros Como o vetor de registros é indexado, é possível imprimir as informações de determinado registro por meio de seu índice, conforme a seguinte instrução: Percorrer um vetor de registros É possível percorrer um array de registros por meio de um laço de repetição. Para isso, podemos usar qualquer tipo de estrutura de repetição, como while, do while ou for, este último sendo o mais comum para estruturas de tamanho fixo, como um vetor (SCHILDT, 1997). Em um array de registros, é recomendado inicializar todos os registros do vetor antes de utilizá-lo. Isso evita que o sistema apresente algum dado incorreto, devido à alocação de um espaço de memória que possa conter alguma informação desatualizada. Nesse sentido, você verá, agora, como construir um laço de repetição e definir valores iniciais para cada registro. Além de evitar alguma sujeira da memória, é possível identificar as posições do array que ainda não estejam ocupadas, para gravar um novo registro ou atualizar um existente. Uma vez que o vetor de registros seja inicializado e que alguns dados tenham sido gravados, você pode imprimir a relação completa de registros armazenados ou localizar algum registro específico, como o nome ou o código de um produto. Vetores de registros6 Esse laço de repetição percorre o vetor de registros desde a posição zero até o valor definido em MAX menor um, isso porque todo array na linguagem C inicia seu índice em zero. No entanto, nem todas as posições do vetor podem estar ocupadas e isso faria os registros sem valor serem exibidos, poluindo a tela do relatório. Veja um exemplo de relatório total na Figura 4. Figura 4. Relatório total de registros do vetor. Para resolver essa questão, colocamos uma instrução condicional no laço de repetição que identifica apenas os registros que receberam alguma in- formação, para evitar que a listagem apresente aqueles registros que foram somente inicializados. Nesse caso, usamos a instrução strcmp da biblioteca <string.h>, que realiza a comparação entre duas variáveis que representam strings ou cadeia de caracteres. 7Vetores de registros Observe, na Figura 5, um exemplo de relatório de registros com valor do vetor. Figura 5. Relatório de registros com valor do vetor. Usamos essa mesma técnica para localizar e imprimir um ou mais registros específicos do vetor pela busca por um campo, que não seja seu índice, como a descrição de um produto. No exemplo a seguir (ilustrado na Figura 6), a busca é realizada por Azeite Oliva por meio de um laço de repetição while. Figura 6. Pesquisa de um registro no vetor. Vetores de registros8 Desenvolver um pequeno cadastro em um vetor de registros Nesta seção, você verá a implementação, em linguagem C, dos principais métodos de um pequeno cadastro, como inclusão. Para isso, criaremos um vetor de registros com base na estrutura Produto, apresentada nas seções anteriores. Inicialmente, declaramos as bibliotecas necessárias, o número máximo de elementos do cadastro e a estrutura do produto, que contém os atributos codigo, descricao, preco e quantidade. O cadastro de produtos precisará de algumas ações, como inicializar o vetor, incluir, alterar e excluir itens, além de imprimir a relação de produtos cadastrados, conforme os seguintes protótipos declarados. A definição do vetor de registros é realizada pela instrução a seguir. Isso reserva na memória a quantidade de espaço necessária para armazenar os registros da estrutura Produto. Na sequência, serão apresentadas as imple- mentações dos métodos que manipulam o cadastro de produtos. 9Vetores de registros O método inicializar atribui valores iniciais para cada variável dos registros do vetor. Isso é importante para identificar quais posições do vetor estarão ocupadas ou livres para receber os dados dos produtos. O método incluir grava os dados do produto no vetor, na posição indicada pelo parâmetro codigo. Neste exemplo, utilizamos o código do produto como índice do vetor, mas poderia ser outro valor. Além disso, essa função faz a verificação para garantir que o código não seja maior que o limite do vetor, que a posição do vetor esteja livre e que a quantidade do produto não seja negativa. Vetores de registros10 O método alterar modifica os dados de um produto no vetor, na posição indicada pelo parâmetro codigo. Esse método também verifica o tamanho do vetor e se a posição do array está ocupada, pois não é possível alterar um produto que não esteja cadastrado, bem como avalia se a quantidade do produto não é menor que zero. O método excluir redefine os valores iniciais para a posição indicada no vetor. Isso faz o sistema considerar que aquele registro foi excluído, e que a posição poderá ser ocupada por outro produto. 11Vetores de registros O método imprimir realiza a impressão dos dados do vetor na tela por meio de um laço de repetição. No entanto, imprime apenas as células que possuem alguma informação preenchida no campo descricao, conforme está apresentado no código a seguir. Por fim, o método main realiza a chamada dos métodos para manipular o cadastro de produtos. Para isso, chama a inicialização do vetor por meio do método inicializar e, depois, inclui três produtos. Após, tenta incluir outro produto em uma posição ocupada e imprime a relação de produtos cadastrados. Finalmente, altera um produto e exclui outro. Vetores de registros12 O resultado da execução do programa está ilustrado na Figura 7. Figura 7. Resultado da execução do programa. CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados. São Paulo: Campus, 2004. DEITEL, P. J.; DEITEL, H. M. C: como programar. 6. ed. Rio de Janeiro: Pearson, 2011. SCHILDT, H. C: completo e total. 3. ed. São Paulo: Makron Books, 1997. 13Vetores de registros Dica do professor Registros na linguagem C são utilizados para definir dados compostos por variáveis que podem ser de diversos tipos, com a finalidade de implementar cadastros, por exemplo. No entanto, para armazenar diversos registros, é preciso utilizar uma estrutura de armazenamento composta, como um vetor. Por meio de vetores, é possível manipular os registros em diversas operações, como inclusão, alteração e exclusão, e, assim, implementar sistemas mais complexos. Assista ao vídeo para conhecer a utilização de vetores de registros. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/0aba7088731cacb4a96d8a11799c227f Exercícios 1) Assinale a alternativa que representa corretamente o conceito de registro. A) É um tipo de dado construído, que pode ser composto por variáveis de diferentes tipos. B) É um agrupamento de variáveis definido como um tipo de dado homogêneo. C) É uma relação de elementos indexados por um índice. D) É um tipo de dado primitivo da linguagem C. E) É um agrupamento de variáveis indexadas por um índice. 2) Considerando a seguinte estrutura que representa um registro de livro na linguagem C, marque a alternativa que declara corretamente um vetor 1000 posições deste registro. typedef struct { char isbn; char titulo[50]; char autor[50] float preco; int paginas; } Livro; A) Livro[1000] livro; B) livro[1000] Livro; C) Livro livro[1000]; D) livro Livro[1000]; E) livro Livro(1000); 3) Considerando um vetor de registros de uma estrutura nomeada como “aluno”, que tem o atributo “nome” como uma variável do registro, indique a alternativa que representa a forma correta de atribuição de “Joao” para essa variável na posição 1 do vetor, com base na linguagem C. typedef struct { long matricula; char nome[50]; int turma; } aluno; aluno a1[100]; A) a1[1].nome= “Joao”; B) a1.nome[1]= “Joao”; C) strcpy(a1[1].nome, “Joao”); D) strcpy(a1.nome[1],“Joao”); E) strcmp(a1.nome[1], “Joao”); Analise o seguinte código baseado na linguagem C e marque a alternativa que representa o objetivo da função xxxxx. typedef struct { long matricula; int turma; } Aluno; Aluno aluno[100]; 4) void xxxxx(long matricula, int turma) { int i; for (i= 0; i < 100; i++) { if (aluno[i].matricula == matricula) aluno[i].turma= turma; return 1; } } Return 0; } A) Incluir um registro a partir da matrícula que é passada por parâmetro. B) Alterar um registro a partir da matrícula que é passada por parâmetro. C) Excluir um registro a partir da matrícula que é passada por parâmetro. D) Imprimir um registro a partir da matrícula que é passada por parâmetro. E) Pesquisar no vetor qual registro tem a matrícula que foi passada por parâmetro. 5) Sendo um vetor de registros uma estrutura fixa, que reserva espaço na memória para a quantidade de elementos informados na sua declaração, o que é preciso fazer antes de utilizá-lo, visando manter a confiabilidade de dados para incluir, alterar e excluir registros? A) Inicializar o vetor com valores padrões, que devem ser diferentes dos dados que serão armazenados. B) Ordenar o vetor em ordem crescente da primeira variável. C) Incluir e excluir em todas as posições para garantir que os dados não contenham alguma sujeira da memória. D) Imprimir a relação de registros para verificar se o vetor contém o tamanho declarado. E) Não é preciso fazer nenhuma ação no vetor antes de utilizá-lo, pois já é criado pronto para o uso. Na prática No desenvolvimento de softwares, é comum um sistema apresentar uma funcionalidade principal, normalmente com uma relação direta com o negócio da organização que o utiliza, como uma companhia que vende passagens aéreas ou uma empresa de logística que acompanha as entregas em tempo real. Esses exemplos apresentam sistemas complexos, que têm inúmeras funcionalidades. No entanto, mesmo sistemas pequenos ou pequenas funcionalidades podem apresentar certo nível de complexidade devido à sua integração com outras partes do sistema ou até com outros sistemas. Nesse contexto, apresentamos o caso de Joaquino, que está iniciando sua carreira no desenvolvimento de sistemas em um supermercado. Em seus primeiros dias de trabalho, Joaquino percebeu que o supermercado tinha um sistema que atua principalmente nos caixas, registrando as vendas e emitindo as notas fiscais. Assim, acreditava que o sistema era simples, contendo alguns cadastros e a parte de vendas dos caixas. No entanto, ao se reunir com a equipe de desenvolvimento, responsável pela manutenção do sistema, percebeu que o processo era bem mais complexo do que pensava e que o sistema tinha integração com diversas outras funcionalidades: cadastro de produtos,• cadastro de categoria de produto,• cadastro de tipo de produto,• cadastro de tributação de produto,• pesquisa de produto em estoque,• identificação do preço de produtos,• baixa de produto no estoque,• inclusão de produto em estoque,• definição de desconto para os produtos,• modificação do preço de produtos,• cálculo do valor da venda com impostos e descontos,• cálculo de previsão de reposição de estoque,• identificação dos produtos mais vendidos,• alerta de estoque baixo de produtos,• identificação dos horários de maior movimento,• relação dos produtos consumidos por dia da semana e do mês.• O que Joaquino aprendeu ao se reunir com a equipe de desenvolvimento? Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://statics-marketplace.plataforma.grupoa.education/sagah/12c7e8df-8df1-463d-a39e-c8fa59c4afe8/bc86ed5f-829a-46cd-b89c-1a6f59d88fbf.jpg Saiba + Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: [C] Aula 37 - Arrays de Structs Assista ao vídeo para conhecer mais sobre vetor de registros (Array de structs). Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. Programar em C - Vetores de Estruturas - Aula 44 Assista ao vídeo para saber mais sobre vetor de estruturas em C. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. Programar em C - Revisão Estruturas - Aula 45 Assista ao vídeo para saber mais sobre a implementação de funções com vetor de estruturas em C. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://www.youtube.com/embed/tbvo4QFyzqQ https://www.youtube.com/embed/r_4gWu3AYwE https://www.youtube.com/embed/jsMxEWCGpmk