Vetor de Struct

bubble sort

Oi pessoal! Nos últimos artigos que publiquei na Série Estruturas de Dados, falei sobre como o conceito de Registros é implementando em C. Também dei início aos algoritmos de Ordenação com Bubble Sort. Hoje demonstrarei como criar um vetor de Registros em C, da mesma forma que mostrei como isso é feito em Pascal. No próximos artigos será primordial que vocês saibam este conceito para conseguir acompanhar. Tudo bem? Vamos começar.

Conceito e Representação

A Figura 1 ilustra como um vetor de registros pode ser representado.

Exemplo de Vetor de struct
Exemplo de Vetor de Estruturas

Observe que cada posição do vetor armazena um conjunto de informações diferentes. Neste exemplo, cada posição está armazenando um tipo string (nome da pessoa), um tipo inteiro (idade) e um tipo float (salário). A declaração da estrutura ficará da seguinte forma:

Observe que a linha 6 é a que cria de fato o vetor. Neste exemplo é criado um vetor de 10 posições para armazenar o nome, idade e o salário de um funcionário. Agora vamos ver como manipular esse vetor de estruturas.

Inicializando o Vetor de Estrutura

Sempre antes de usar uma estrutura, e particularmente um vetor de estruturas, devemos inicializá-la, isto é, atribuir aos seus membros os valores padrão (default) de cada tipo de dado. O código abaixo mostra como isso é feito no exemplo da nossa Figura 1. Note que uma função da biblioteca string foi utilizada aqui, STRCPY. Essa função copia um valor para uma variável de cadeia de caracteres. Aqui, estou copiando o valor NULL para o membro nome da estrutura funcionário. Os outros membros você pode acessar normalmente e diretamente, usando o operador direto "ponto".

Preenchendo o Vetor de Estrutura

Depois de inicializado o vetor da estrutura, ai sim podemos inserir informações ali. Para isso precisaremos de um for para armazenar cada estrutura em uma posição. O código abaixo ilustra como armazenar as informações do nosso funcionário. Dentro do for colocamos os comandos de leitura e escrita, necessários para pedir ao usuário o que ele deve digitar e depois armazenar o que foi digitado. Note que para armazenar, precisamos utilizar a sintaxe:

&nome_vetor_struct[indice].nome_membro_struct;

Imprimindo o Vetor de Estrutura

Para imprimir também precisaremos de um for para percorrer todas as posições desse vetor. Cada passagem no for será impresso o conteúdo de uma posição do vetor na tela. A sintaxe que você deve usar aqui é a seguinte:

printf( "\n TEXTO %_" , nome_vetor_struct[indice].nome_membro_struct);

Não esqueça de colocar o tipo de dado que deverá ser impresso, isto é, substitua %_ pelo correspondente (exemplo: %d para inteiro), isso é o que chamamos de saída formatada (cabe um artigo só pra falar disso!!). Também não esqueça de por um texto bem claro para o usuário, de forma que ele entenda a informação.

Acessando e Modificando um membro individualmente

Se  for necessário acessar um membro de forma individual, você pode fazer isto da seguinte forma:

nome_vetor_struct[indice].nome_membro_struct

Exemplo:

func[5].nome = "Cecília";

Cinco é a posição do vetor que você quer modificar.

Imprimindo um membro individualmente

Se  for necessário acessar um membro de forma individual, você pode fazer isto da seguinte forma:

printf(" \n TEXTO ", nome_vetor_struct[indice].nome_membro_struct);

Exemplo:

printf(" \n A idade do (a) Funcionário (a) é %d :", func[5].idade);

Cinco é a posição do vetor que você quer apresentar na tela.

Buscando um elemento no Vetor de Estruturas

Você também pode procurar por um valor no vetor de estruturas. Por exemplo, você pode fazer uma pesquisa pela idade, pelo salário ou pelo nome, portanto, você pode fazer uma pesquisa por qualquer um dos membros da estrutura. Entretanto, é necessário tomar cuidado quando for buscar por uma string. Primeiro vou mostrar como fica o código no caso de uma busca por uma string, em nosso caso, vamos procurar pelo membro nome.

Vamos ver o que está acontecendo neste código. Primeiro é solicitado ao usuário que digite um nome para a busca. Este nome será armazenado em uma variável chamada nome, que foi declarada anteriormente no programa.

Como o nome terá de ser procurado neste vetor, então um for será usado para percorrer esse vetor e analisar, posição a posição, se o nome digitado pelo usuário está ali ou não. Dessa forma, a string digitada pelo usuário será comparada com a string armazenada na posição i do vetor.

Uma função chamada strcmp(string1, string2); da biblioteca de strings é utilizada para fazer a comparação da primeira string com a segunda string. Aqui a variável nome será comparada com o nome que está armazenado em cada uma das posições do vetor (func[i].nome).

Quando o resultado dessa comparação for igual a zero, significa que a string foi encontrada em uma determinada posição do vetor. Mas, se o resultado for diferente de zero, então, a string não foi encontrada. Portanto um if é usado dentro do for para fazer essa verificação: if(strcmp(nome, func[i].nome)== 0).

Quando a comparação bater, observe que um printf apresenta uma mensagem de alerta para o usuário, avisando que o registro foi encontrado, e uma outra variável chamada posição, é setada com o valor de i. Dessa forma a posição em que a string foi encontrada é guardada, podendo ser usada em outras partes do programa.  Quando a comparação não bater, então a variável posição é setada com o valor -1, que é um valor que não existe no vetor, isto é, o vetor guarda posições de zero a nove (dez posições), não existe posição -1.

Lembre-se, um for está sendo percorrido, não é legal ficar mostrando mensagens para o usuário a cada passagem pelo for, então é melhor guardar o que é importante e imprimir o necessário fora dele.

É exatamente isso o que acontece em seguida. Um if é adicionado logo depois do for para verificar se posição é -1 ou não. Se for posição for igual a -1, então o registro não foi encontrado, caso contrário, é impresso o valor da posição da estrutura. Para que isso seja possível, a variável i, que seria o índice do vetor, é substituída pela variável posição, que contém o valor exato da posição em que o nome foi encontrado.

Buscando faixas de valores

Agora que vocês já sabem como procurar por um registro especifico usando uma string, vou mostrar pra vocês outras coisas interessantes que vocês podem fazer. Por exemplo, listar todas as pessoas com idade entre 18 e 30 anos.

Exemplo Completo

Vou deixar um exemplo completo, mas referente à outra estrutura, assim vocês podem aproveitar para analisar o código e verificar se aprenderam, ok?

Conclusão

Bom, acho que deu pra vocês conseguirem uma noção de tudo o que podem fazer com vetores de estruturas, não? Se tiverem dúvidas, por favor, deixem aí nos comentários, que eu responderei com o maior prazer! Nos próximos artigos veremos alguns outros detalhes importantes sobre Estrururas em C. Até!

Outros artigos da série

<< Algoritmos de Ordenação: Bubble SortEstruturas Aninhadas >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Vetor de Struct
Comentários:
Notificações
Notificar
guest
13 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Juliano
Juliano
10/06/2020 13:49

Muito bom.
Na linha 68 do exemplo temos um detalhe a ser melhorado "==".

Bruno
Bruno
07/01/2020 07:41

Como faz na parte de ir buscar um elemento do vetor de estrutura caso existisse elementos iguais e Mostar a informação dos dois elementos iguais?

Bruno
Bruno
06/01/2020 22:02

Olá
Como é que eu faço para pesquisar um nome
Por exemplo a minha ideia é pesquisar por um nome e aparecer a informação dessa pessoa com esse nome, mas também caso haja mais que uma pessoa com o mesmo nome também queria que aparece a informação dessa pessoa
Exemplo: procurar nome José e aparecer todos os Jose's dessa lista e toda a informação de cada deles
Gostava de ajuda nisso
Obrigado

Rickson Monteiro
Rickson Monteiro
17/06/2019 21:47

Boa Noite! Como posso apagar uma "ficha" ou dado de uma posição de um vetor de struct?

Frank William
Frank William
Reply to  Rickson Monteiro
12/07/2019 16:51

Olha... fiz um modelinho basico pra ti entender. Esta em C. #include #include #include #define MAX 3 main(){ struct ficha{//Estrutura do struct ficha int num; char nome[50]; float nota; }; struct ficha aluno[MAX];//Cria Variavel aluno do tipo ficha int i, tem, opcao, excluir = 0; for(i=0; i<MAX; i++){//Como ja inicia com lixo, esse for zera tudo. aluno[i].num = 0; strcpy(aluno[i].nome, "NULL"); aluno[i].nota = 0.0; } do{//Menu de Opções printf("Selecione Uma Opção\n"); printf("1 - Cadastra Ficha\n"); printf("2 - Exclui Ficha\n"); printf("3 - Visualiza todas as fichas\n"); printf("4 - Sair\n"); scanf("%i", &opcao); switch(opcao){ case 1://Preenche o struct for(i=0; i<MAX; i++){ printf("Digite a… Leia mais »

Felipe
Felipe
21/11/2018 17:52

Se eu precisar saber o tamanho do vetor de structs o que eu deveria utilizar strlen ou sizeof? e como eu poderia fazer isso? Muito obrigado pela explicação

Nahim
Nahim
25/04/2018 16:33

Poste uma por favor sobre structs utilizando ponteiro e função tb, no mesmo programa.

Higor
Higor
01/04/2018 21:52

Muito bom, excelente explicação !!

Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 
NVIDIA JETSON – A Inteligência Artificial na palma de sua mão

Data: 08/07 às 14:00h Apoio: Arrow | NVIDIA
 
INSCREVA-SE AGORA »



 
close-link

WEBINAR
 
Redes Mesh para Monitoramento
e Controle de Sensores

Data: 15/07 às 14:00h Apoio: Artimar| Microchip| Tecsus
 
INSCREVA-SE AGORA »



 
close-link