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; }

8 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!

Gabriela Torres Agostinho disse...

Como ficaria se eu fosse usar typedef struct?

Nato disse...

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

leandro amorim disse...

Pessoal boa noite! Eu preciso fazer um programa em C++ usando funções, structs e apontadores, mas não estou conseguindo terminar. Alguém poderia me ajudar por gentileza?

#include

using namespace std;



struct contato {
string nome;
string telefone;
};

void menu(){
cout<<"----------Menu---------"<>agenda[tam].nome;
cout<< " Informe o número: "<>tam;

contato*agenda = new contato[tam];


int valor;

Do { menu();
cin>>valor;
switch (valor){
case 1: AdicionarContato();
break;
case 2: PesquisarContato();
break;
case 3: RemoverContato();
break;
case 4: ListarAgenda();
break;
case 0: cout<<" Saindo "<<endl;
default: cout<< " Opção inválida ";

}
}while(valor != 0);

}

vitor de oliveira disse...

Você tem que usar o bubble short, eu tô no celular e é ruim de digitar, mas vc faz assim.

For(i=0;icont[j])
troca=i;
I=j
J=troca;
}}}

Depende do exemplo mas o grosso é isso, desculpa se ficou malfeito, pelo celular é muito ruim

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.