Como já mostramos como declarar uma struct e declarar
variáveis do tipo struct que criamos, vamos aprender como acessar.
- Baixe o conteúdo do site: Apostila de C
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:
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!
É 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.
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.
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;
}
#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();
}
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!
Gabriella, é só declarar um método ou funcão assim: while (getchar() != '\n');
Como ficaria se eu fosse usar typedef struct?
o post é antigo mais torcendo para que alguem leia...
tem como fazer com que esta struct exiba todos dados em ordem crescente?
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);
}
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
Postar um comentário