Como acessar, alterar e ler os elementos de uma struct em C


Como já mostramos como declarar uma struct e declarar variáveis do tipo struct que criamos, vamos aprender como acessar.

Como escrever e ler elementos de uma struct em C


Vamos pegar nosso exemplo do tipo “struct Funcionario”.
Criamos 3 funcionários desse tipo, e todos eles terão os mesmos elementos internos, com os mesmos nomes: idade, nome e salario.

Se tem o mesmo nome, como vamos diferenciar esses elementos, então?
Pelo nome da variável do tipo “struct Funcionario”.

Para acessar o elemento ‘elemento’ da struct de nome “MinhaStruct”, usamos a sintaxe:
MinhaStruct.elemento

Apenas isso, basta botar um ponto após o nome que você escolheu para a struct.
Após isso, estamos acessando normalmente a variável:
chefe.idade -> é um inteiro como outro qualquer.
empregado1.nome -> é uma string como outra qualquer.
secretaria.salario -> é um float como outro qualquer.

Vamos mostrar, com o exemplo resolvido e comentado a seguir, que colocando o nome da struct, o ponto e o nome da variável, é como se tivéssemos acessando as variáveis de maneira normal, a única diferença é que essas variáveis estão dentro de uma struct.

Exemplo: Como declarar, preencher e acessar elementos de uma struct em C
Defina uma struct para tratar de alunos. Dentro dessa struct, crie uma variável para armazenar o nome do aluno, e outras para armazenar as notas de Matemática, Física e a média dessas duas notas.
Após definir a struct, crie três variáveis do tipo struct que você criou.
Preencha os nomes e notas dos alunos, calculando automaticamente a média deles.
Depois exiba tudo isso.

Após definir a struct com o nome “Alunos” e seus elementos pedidos no enunciado da questão, vamos declarar 5 variáveis do tipo “struct Alunos”.
Pode ser os nomes que você quiser, como: aluno1, aluno2, aluno3, aluno4, aluno5 ou qualquer outra coisa.

Mas você é um programador C, e é melhor que isso, estudou pelo curso C Progressivo, então você não pode perder tempo à toa. Vamos usar criar um vetor de elementos do tipo “struct Alunos”!

Vamos chamar esse vetor de ‘alunos’, assim teremos os elementos: alunos[0], alunos[1], ..., alunos[4]. Isso facilita pois podemos usar loopings para tratar essas variáveis, pois basta mudarmos o índice para mudar a variável do vetor.

O primeiro looping é para preencher os elementos das structs que representam os alunos.
Primeiro pedimos o nome, usando a função gets(), que recebe uma string como argumento.
No nosso caso, a string é: alunos[índice].nome
Isso porque declaramos a string de nome ‘nome’ dentro da struct Alunos.

Os números: alunos[índice].matematica e alunos[índice].fisica, são floats como outros quaisquer que já trabalhamos, então podemos usar a nossa velha conhecida função scanf().

E para calcular a média?
Ué, alunos[índice].media é um float como outro qualquer. Então somamos os floats que armazenam as notas de Matemática e Física de qualquer aluno, dividimos por 2 e temos a média de cada aluno.

Em seguida, apenas mostramos esses dados.
Veja como fica nosso código C:

#include <stdio.h>
int main(void)
{
    struct Alunos
    {
        char nome[30];
        float matematica, fisica, media;
    };

    struct Alunos alunos[5];
    int count;
for(count = 0 ; count < 5 ; count++) { fflush(stdin); printf("\nNome do aluno %d: ", count+1); gets(alunos[count].nome); printf("Nota de matematica: "); scanf("%f", &alunos[count].matematica); printf("Nota de fisica: "); scanf("%f", &alunos[count].fisica); alunos[count].media = (alunos[count].matematica + alunos[count].fisica)/2; } printf("\nExibindo nomes e medias:\n"); for(count = 0 ; count < 5 ; count++) { printf("\nAluno %d\n", count+1); printf("Nome: %s\n",alunos[count].nome); printf("Media: %.2f\n", alunos[count].media); } return 0; }

5 comentários:

Anônimo disse...

Faltou declarar "count" ates do primeiro struct e por um "getch();" antes de return(0); mas o programa depois destas alterações rodou normalmente.

Gostei muito das apostilas, as aulas foram ótimas....

Parabéns!

Richard Lopes disse...

É preciso adicionar o método getchar();
depois do método scanf(); para a nota de física, para que o método gets(); não fique pegando o carácter '\n' como nome do aluno 2 a 5.

Anônimo disse...

Olá!

Como faço para ler um struct dentro de outro?
Ex:
Escreva um programa que crie uma lista de 20 alunos, onde os nós são do tipo Aluno (definido
abaixo). Peça para ser digitada a matrícula e o nome dos 20 alunos. Para cada um, verificar se o
aluno já está na lista: se estiver, imprimir o seu nome; se não estiver, inseri-lo na lista. Não há dois
alunos com a mesma matrícula.

struct aluno
{
int matricula;
char nome[30];
};

struct Lista
{
struct aluno vetor[MAX];
int num;
};

struct Lista l[2];

int i;

for(i=0;i<2;i++)
{
printf("Aluno %d", i+1);
printf("\nRegistro:"); scanf("%d",&l[i].vetor);
num = i;
}

COMO FAÇO PARA A PARTE DA MAIN SER LIDA CERTO?

Obrigada e parabéns pelo blog.

Gabriella Lopes disse...

Boa tarde!
Qual a necessidade de limpar o buffer dentro do laço FOR?
Li também que não é recomendado usar o fflush ou fpurge por motivos de portabilidade. Qual o melhor método para limpar o buffer?

Obrigada!

Nato disse...

o post é antigo mais torcendo para que alguem leia...
tem como fazer com que esta struct exiba todos dados em ordem crescente?

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.