Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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:

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.

Unknown disse...

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

Anônimo disse...

#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();
}

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

Anônimo disse...

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

Gabi 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?

Unknown 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);

}

Unknown 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