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

11 comentários:

  1. 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!

    ResponderExcluir
  2. É 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.

    ResponderExcluir
  3. 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.

    ResponderExcluir
  4. O c progressivo é muito bom, sempre estudo com ele.

    Como uso o netbeans(ubuntu) precisei fazer algumas modificações (por causa da sintaxes) para o programa rodar:

    -- Em vez do 1º For, usei o laço while
    -- Troquei de get para fgets
    -- Inclui também o getchar(); depois do scanf() para a nota de física. O getchar(); fará com que um '\n', correspondente ao ENTER que o usuário pressiona depois de digitar o número, não seja abandonado no buffer de entrada. E assim esperar pelos próximos dados do usuário.

    Rodou uma beleza!

    #include

    int main(void) {

    struct estudantes {
    char nome[30];
    float matematica, fisica, media;
    };

    struct estudantes alunos[5];

    int count=0;

    while (count < 5) {

    fflush(stdin);
    printf ("\n Nome do aluno %d: ", count+1);
    fgets (alunos[count].nome,30, stdin);

    printf("Nota de matematica: ");
    scanf("%f", &alunos[count].matematica);

    printf("Nota de fisica: ");
    scanf("%f", &alunos[count].fisica);
    getchar();
    alunos[count].media = (alunos[count].matematica + alunos[count].fisica)/2;
    count++;
    }
    printf(" Exibindo nomes e medias ");

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

    ResponderExcluir
  5. #include
    #include
    #include
    #include

    /*Criando a struct */
    struct aluno
    {
    char nome[50];
    int matricula;
    };

    /*Criando a variável aluno que será do
    tipo struct ficha_de_aluno */
    aluno va[5];
    int i;


    int verficaraluno(int cont, int pmatricula){
    int alunoexistente=0;
    int i;

    for(i=1;i<=cont-1;i++){
    if (pmatricula==va[i].matricula){
    alunoexistente=1;
    break;
    }
    }
    return alunoexistente;
    }



    void gravaraluno(){
    int vmatricula;
    char vnome[50];
    /* gravando um vetor de fichaaluno */
    i=1;
    system("cls");
    printf("\n---------- Cadastro de aluno -----------\n\n\n");

    printf("Nome do %i aluno ......: ",i);
    fflush(stdin);
    fgets(va[i].nome,50,stdin);

    printf("Matricula do %i aluno ......: ",i);
    scanf("%i", &va[i].matricula);

    i++;

    while (i<=3){
    system("cls");
    printf("\n---------- Cadastro de aluno -----------\n\n\n");

    printf("Nome do %i aluno ......: ",i);
    fflush(stdin);
    fgets(vnome,50,stdin);


    printf("Matricula do %i aluno ......: ",i);
    scanf("%i", &vmatricula);

    if (verficaraluno(i,vmatricula)==1){
    printf("Aluno existente!!!");
    getch();
    }
    else{
    strcpy(va[i].nome, vnome);
    va[i].matricula=vmatricula;
    i++;
    }
    }
    }

    void mostraraluno(){
    system("cls");
    for (i=1;i<=3;i++){
    printf("\n\n --------- Lendo os dados da struct ---------\n\n");
    printf("Nome ...........: %s \n", va[i].nome);
    printf("Matricula .....: %i \n", va[i].matricula);
    }

    }



    main(){
    gravaraluno();
    mostraraluno();
    getch();
    }

    ResponderExcluir
  6. 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!

    ResponderExcluir
  7. Gabriella, é só declarar um método ou funcão assim: while (getchar() != '\n');

    ResponderExcluir
  8. Como ficaria se eu fosse usar typedef struct?

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

    ResponderExcluir
    Respostas
    1. 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

      Excluir
  10. 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);

    }

    ResponderExcluir

É quase impossível criar centenas de páginas voltadas para programação C e não cometer algum erro.

- Se notar algum conceito, letra ou trecho de código errado, deixe sua correção

- Se perceber uma maneira melhor ou mais eficiente de fazer algo, deixe sua ideia

- Se algo não ficar claro ou for confuso, nos avise

Aos poucos vamos aumentando e melhorando a qualidade de nosso material, e para isso contamos com sua ajuda.