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 (Vetor de Struct) 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.
Vetor de Struct: Conceito e Representação
A Figura 1 ilustra como um vetor de registros pode ser representado.

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:
typedef struct {
char nome[200];
int idade;
float salario;
} Funcionario;
Funcionario func[10];
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”.
for(i=0; i<10; i++) {
strcpy(func[i].nome, "NULL");
func[i].idade = 0;
func[i].salario = 0.0;
}
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;
for(i=0; i<10; i++) {
printf(" Digite nome do funcionário: ");
scanf("%s%*c", &func[i].nome);
printf(" Digite a idade do funcionário: ");
scanf("%d%*c", &func[i].idade);
printf(" Digite o salário do funcionário: ");
scanf("%f%*c", &func[i].salario);
}
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.
for(i=0; i<10; i++) {
printf(" \n O nome do funcionário é: %d ", func[i].nome);
printf(" \n A idade do funcionário é: %s ", func[i].idade);
printf(" \n O salário do funcionário é: %.2f ", func[i].salario);
}
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 Struct
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.
printf(" \n Digite um nome: ");
scanf("%s%*c", nome);
for(i=0; i<10; i++) {
if(strcmp(nome, func[i].nome)== 0) {
printf("\n Registro encontrado! ");
posicao = i;
} else {
posicao = -1;
}
}
if(posicao = -1) {
printf(" \n Registro não encontrado! ");
} else {
printf(" \n Registro Encontrado: ");
printf(" \n O nome do funcionário é: %s ", func[posicao].nome);
printf(" \n A idade do funcionário é: %d ", func[posicao].idade);
printf(" \n O salário do funcionário é: %.2f ", func[posicao].salario);
}
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.
for(i=0; i<10; i++) {
if((func[i].idade>=18)&(func[i].idade<=30)) {
printf(" \n O nome do funcionário é: %s ", func[i].nome);
printf(" \n A idade do funcionário é: %d ", func[i].idade);
printf(" \n O salário do funcionário é: %.2f ", func[i].salario);
printf(" \n ------------------------------------------------------------------------");
} else {
posicao = -1;
}
}
if(posicao = -1){
printf("\n Não há registros com esta configuração!");
}
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?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <string.h>
typedef struct {
int codigo;
char nome[200];
float nota;
} Aluno;
Aluno aluno_especial[5];
char nome[200];
int posicao;
int main() {
int i = 0;
setlocale(LC_ALL,"portuguese");
for(i=0; i<5; i++) {
aluno_especial[i].codigo = 0;
strcpy(aluno_especial[i].nome, "NULL");
aluno_especial[i].nota = 0.0;
}
for(i=0; i<5; i++) {
printf(" \n O código do aluno especial é: %d ", aluno_especial[i].codigo);
printf(" \n O nome do aluno especial é: %s ", aluno_especial[i].nome);
printf(" \n A nota do aluno especial é: %.2f ", aluno_especial[i].nota);
printf(" \n ------------------------------------------------------------------------");
}
printf(" \n \n");
for(i=0; i<5; i++) {
printf(" Digite o código do aluno especial: ");
scanf("%d%*c", &aluno_especial[i].codigo);
printf(" Digite o nome do aluno especial: ");
scanf("%s%*c", &aluno_especial[i].nome);
printf(" Digite a nota do aluno especial: ");
scanf("%f%*c", &aluno_especial[i].nota);
printf(" \n ------------------------------------------------------------------------\n");
}
for(i=0; i<5; i++) {
printf(" \n O código do aluno especial é: %d ", aluno_especial[i].codigo);
printf(" \n O nome do aluno especial é: %s ", aluno_especial[i].nome);
printf(" \n A nota do aluno especial é: %.2f ", aluno_especial[i].nota);
printf(" \n ------------------------------------------------------------------------");
}
printf(" \n ");
printf(" \n Digite um nome: ");
scanf("%s%*c", nome);
for(i=0; i<5; i++) {
if(strcmp(nome, aluno_especial[i].nome)== 0) {
printf("\n Registro encontrado! ");
posicao = i;
} else {
posicao = -1;
}
}
if(posicao = -1) {
printf(" \n Registro não encontrado! ");
} else {
printf(" \n Nome Encontrado");
printf(" \n Nome é: %s", nome);
printf(" \n O código do aluno especial é: %d ", aluno_especial[posicao].codigo);
printf(" \n O nome do aluno especial é: %s ", aluno_especial[posicao].nome);
printf(" \n A nota do aluno especial é: %.2f ", aluno_especial[posicao].nota);
printf(" \n ------------------------------------------------------------------------");
}
for(i=0; i<5; i++) {
if((aluno_especial[i].nota>=4)&(aluno_especial[i].nota<=7)) {
printf(" \n O código do aluno especial é: %d ", aluno_especial[i].codigo);
printf(" \n O nome do aluno especial é: %s ", aluno_especial[i].nome);
printf(" \n A nota do aluno especial é: %.2f ", aluno_especial[i].nota);
printf(" \n ------------------------------------------------------------------------");
} else {
posicao = -1;
}
}
if(posicao = -1) {
printf("\n Não há registros com esta configuração!");
}
return 0;
}
Conclusão
Bom, acho que deu pra vocês conseguirem uma noção de tudo o que podem fazer com vetor de struct, 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é!
Para saber mais, continue acessando a série de Estrutura de Dados no link.











Bom dia!
Preciso fazer o seguinte:
Cadastrar pessoas com idades e comorbidades diferentes e preciso que o sistema encontre pessoas acima de 65 anos e com comorbidades e salve em um arquivo de texto.
Consigo fazer isso utilizando essa estrutura?
Oi Mirian, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Consegue sim!!!!
bom dia pode me ajudar nesse exercício Usando o tipo de estrutura definido crie e inicialize uma tabela com os dados de todos os vôos de um aeroporto e codifique uma rotina para exibi-la em vídeo
2 respostas
Curtir
Responder
Compartilhar
boa noite pode me ajudar por favor
Oi Lucas. Td bem? Espero que sim. Desculpa mas só vi hoje seus comentários. Você pode seguir os tutoriais aqui que conseguirá fazer ta bom. [ ]s
Excelente explicação, me ajudou muito!
Oi Lucas, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado.
Bom dia Professora Elaine!,
Aonde exatamente eu poderia declarar um vetor de struct que será usado em mais de uma função?
Ex :
Eu tenho uma função que cadastra cliente, e outra que exibe os clientes cadastrados.
Para eu usar o mesmo vetor de struct em ambas funções, o ideal seria declarar antes da função principal main?
Agradeço quem puder ajudar.
Oi Robert obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Você deve declarar no inicio do programa para que ele seja de uso global! Ou você poderia criar uma função que cria essa estrutura e então chamar a função onde quiser! [ ]s
Muito bom.
Na linha 68 do exemplo temos um detalhe a ser melhorado “==”.
Oi Juliano, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Vou conferir ta bom.
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?
Oi Bruno, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Acho que ja respondi isso né?
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
Oi Bruno, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Pra usar a busca vc precisa de um algoritmo de busca em vetor. Isso é estrutura mais avançada, eu acho que deve ter algo aqui no site, de outro autor sobre o assunto. Você deverá buscar o que está procurando passando por cada uma das posições do vetor e comparando se o que está dentro da posição é igual ou não. Se for igual, então você achou o que procura, caso contrário você deverá continuar a busca até encontrar. Precisará usar FOR… Leia mais »
Boa Noite! Como posso apagar uma “ficha” ou dado de uma posição de um vetor de struct?
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 »
Obrigada pela ajuda!!!
Deu certo?
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
OI Felipe! Para trazer algo novo e diferente, dê uma olhada neste link que é de um dos maiores fóruns de programação aqui do Brasil tá bom. É legal interagir nos fóruns também. Tiramos nossas dúvidas, e podemos ajudar com as dúvidas de outras pessoas, é bem legal.
https://pt.stackoverflow.com/questions/143457/sizeof-ou-strlen
Poste uma por favor sobre structs utilizando ponteiro e função tb, no mesmo programa.
OI!!!! Vou retomar as postagens sobre esses assuntos ok! Obrigada
Muito bom, excelente explicação !!
Obrigada!!!!