Fala Galera!!!! No último artigo da série ESTRUTURAS DE DADOS eu apresentei a vocês o conceito de REGISTROS, utilizando Pascal. Hoje mostrarei a vocês como implementar esse conceito de REGISTROS na linguagem C. Nos próximos artigos mostrarei outras formas de se usar Structs, por isso é importante vocês seguirem a ordem de publicação Se desejarem, no meu SLIDESHARE tem vários slides da Linguagem C, Pascal, Java, entre outros materiais que preparei para as minhas aulas. Fiquem à vontade para utilizá-los e não esqueçam de os referenciar se usar em algum trabalho.
Struct
Em Linguagem C Registros são chamados de Estruturas e a palavra-chave é Struct. Em termos gerais o comportamento não é diferente dos Registros em Pascal, afinal, Registros é um conceito de programação que é implementado pelos compiladores de cada linguagem de programação. Nas próximas subseções, o recurso de Struct será explicado de forma bem detalhada, leia com bastante atenção ok?!
Definindo uma Estrutura
Uma estrutura pode ser definida de formas diferentes. No corpo da estrutura encontram-se os membros, ou seja, as variáveis de diversos tipos que comporão esse tipo de dado heterogêneo definido pelo usuário. Depois de definida uma estrutura, uma (ou mais) variável do tipo estrutura deve ser definida, para permitir a manipulação dos membros da estrutura.
Exemplo 1
Neste exemplo o nome, ou Etiqueta (TAG), da estrutura é colocado logo em seguida da palavra-chave Struct. A Etiqueta da estrutura é nomeada como ALUNO. Ao final da estrutura, são declaradas várias variáveis do tipo da estrutura, isto é, aluno_especial, aluno_regular e aluno_ouvinte, são variáveis do tipo aluno.
struct aluno {
int codigo;
char nome[200];
float nota;
};
struct aluno aluno_especial, aluno_regular, aluno_ouvinte;
Dessa forma a sintaxe é a seguinte:
struct etiqueta{
tipo var1;
tipo var2;
.
.
.
tipo varN;
};
struct etiqueta var1, var2, ..., varN;
Exemplo 2
Neste exemplo o nome da estrutura é colocado ao final, logo em seguida ao fechamento da estrutura, isto é, a Etiqueta da estrutura é nomeada depois. Após a declaração da estrutura, são definidas as várias variáveis do tipo da estrutura.
struct {
int codigo;
char nome[200];
float nota;
} aluno, aluno_especial, aluno_regular, aluno_ouvinte;
Dessa forma a sintaxe fica:
struct {
tipo var1;
tipo var2;
.
.
.
tipo varN;
} var1, var2, ..., varN;
Exemplo 3
Neste exemplo, usei a palavra-chave Typedef para definir uma estrutura, antes da palavra-chave Struct. O nome da estrutura é colocado ao final, logo em seguida ao fechamento da estrutura. Após a declaração são definidas várias variáveis do tipo da estrutura.
typedef struct {
int codigo;
char nome[200];
float nota;
} aluno;
aluno aluno_especial, aluno_regular, aluno_ouvinte;
Assim a sintaxe fica da seguinte forma:
typedef struct {
tipo var 1;
tipo var 2;
.
.
.
tipo varN;
} etiqueta;
etiqueta var1, var2, ..., varN;
Acessando os membros da Estrutura
Para acessar os membros da estrutura, quando ela é diretamente referenciada, devemos utilizar o Ponto, que também é chamado de operador de seleção direta, veja:
aluno_especial.codigo aluno_especial.nome aluno_especial.nota
Atribuindo valores aos membros da Estrutura
Você pode atribuir valores aos membros das estruturas diretamente, e em qualquer parte do programa, conforme a seguir:
aluno_especial.codigo = 10; strcpy(aluno_especial.nome, "Manoel"); aluno_especial.nota = 10.0;
Para atribuir um valor a uma string é necessário utilizar a função Strcpy (CPY = copiar; STR = string). A função copiará o que está dentro das aspas duplas para o membro STRING da estrutura.
Inicializando a Estrutura
Como já foi mencionado em artigos anteriores, é sempre importante inicializar as variáveis que serão utilizadas em nosso programa, com as estruturas não é diferente. Você pode fazer isso de duas formas: ou atribui valores padrão diretamente aos membros da estrutura, ou então cria uma função, que será chamada no programa principal, para fazer isso por você.
aluno_especial.codigo = 0; strcpy(aluno_especial.nome, "\0"); aluno_especial.nota = 0.0;
//FUNÇÃO PARA INICIALIZAR UMA ESTRUTURA SIMPLES
void inicializa(){
aluno_especial.codigo = 0;
strcpy(aluno_especial.nome, "\0");
aluno_especial.nota= 0.0;
}
Imprimindo os membros da Estrutura
Você pode imprimir os membros da estrutura em qualquer parte do programa que desejar. Se for preciso imprimir todos os membros da Estrutura de uma única vez, então é melhor criar uma função para isto.
printf(" \n %d ", aluno_especial.codigo);
printf(" \n %s ", aluno_especial.nome);
printf(" \n %.2f ", aluno_especial.nota);
void imprimir(Aluno aluno_regular){
printf(" \n %d ", aluno_especial.codigo);
printf(" \n %s ", aluno_especial.nome);
printf(" \n %.2f ", aluno_especial.nota);
}
Note que a função de impressão é do tipo Void mas tem um argumento, isto é, é definida uma variável do tipo da estrutura, significando que, ao chamar a função, você deverá passar como parâmetro a estrutura que está trabalhando. A chamada fica da seguinte forma:
imprimir(aluno_especial);
Obtendo Valores do Teclado
Para obter dados do teclado devemos utilizar o Scanf, tomando cuidado quando formos usar strings. Podemos obter dados do teclado em qualquer parte do programa, assim como também podemos definir uma função para realizar este trabalho.
printf(" Digite o código do aluno especial: ");
scanf("%d%*c", &aluno_especial.codigo);
printf(" Digite o nome do aluno especial: ");
scanf("%s%*c", &aluno_especial.nome);
printf(" Digite a nota do aluno especial: ");
scanf("%f%*c", &aluno_especial.nota);
void cadastrar(Aluno aluno_especial){
printf(" Digite o código do aluno especial: ");
scanf("%d%*c", &aluno_especial.codigo);
printf(" Digite o nome do aluno especial: ");
scanf("%s%*c", &aluno_especial.nome);
printf(" Digite a nota do aluno especial: ");
scanf("%f%*c", &aluno_especial.nota);
}
Observe que na função cadastrar e imprimir exemplificados aqui é passado como parâmetro (por valor) a variável do tipo estrutura. Em algumas ocasiões você precisará fazer desta forma, em outras, talvez você não tenha que passar a estrutura como parâmetro.
Exemplo 1
Neste exemplo demonstro como definir e utilizar uma Struct diretamente no programa principal.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
typedef struct
{
int codigo;
char nome[200];
float nota;
}Aluno;
Aluno aluno_especial;
int main()
{
setlocale(LC_ALL,"portuguese");
aluno_especial.codigo = 0;
strcpy(aluno_especial.nome, "NULL");
aluno_especial.nota = 0.0;
printf(" \n O código do aluno especial é: %d ", aluno_especial.codigo);
printf(" \n O nome do aluno especial é: %s ", aluno_especial.nome);
printf(" \n A nota do aluno especial é: %.2f ", aluno_especial.nota);
printf(" \n \n");
printf(" Digite o código do aluno especial: ");
scanf("%d%*c", &aluno_especial.codigo);
printf(" Digite o nome do aluno especial: ");
scanf("%s%*c", &aluno_especial.nome);
printf(" Digite a nota do aluno especial: ");
scanf("%f%*c", &aluno_especial.nota);
printf(" \n O código do aluno especial é: %d ", aluno_especial.codigo);
printf(" \n O nome do aluno especial é: %s ", aluno_especial.nome);
printf(" \n A nota do aluno especial é: %.2f ", aluno_especial.nota);
printf(" \n ");
return 0;
}
Exemplo 2
Neste exemplo demonstro como definir e utilizar uma Struct aplicando o conceito de modularização, isto é, usando funções para poder reutilizar trechos de códigos em outras partes do programa.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
typedef struct Aluno
{
int codigo;
char nome[200];
float nota;
} Aluno;
Aluno aluno_especial;
void menu();
void inicializar();
void imprimir();
void cadastrar();
int main()
{
setlocale(LC_ALL,"portuguese");
menu();
return 0;
}
void menu()
{
int opcao;
do
{
printf(" \n Opções: ");
printf(" \n 1. Inicializar a Estrutura" );
printf(" \n 2. Imprimir a Estrutura" );
printf(" \n 3. Cadastrar Aluno Especial" );
printf(" \n 4. Para sair. \n " );
printf(" \n Digite a opção desejada: ");
scanf("%d%*c", &opcao);
switch(opcao)
{
case 1:
inicializar();
break;
case 2:
imprimir();
break;
case 3:
cadastrar();
break;
default:
printf(" \n Opção não existente. ");
break;
}
}
while(opcao!=4);
}
void inicializar()
{
aluno_especial.codigo = 0;
strcpy(aluno_especial.nome, "NULL");
aluno_especial.nota = 0.0;
}
void cadastrar()
{
printf(" Digite o código do aluno especial: ");
scanf("%d", &aluno_especial.codigo);
printf(" Digite o nome do aluno especial: ");
scanf("%s", &aluno_especial.nome);
printf(" Digite a nota do aluno especial: ");
scanf("%f", &aluno_especial.nota);
}
void imprimir()
{
printf(" \n O código do aluno especial é: %d ", aluno_especial.codigo);
printf(" \n O nome do aluno especial é: %s ", aluno_especial.nome);
printf(" \n A nota do aluno especial é: %.2f ", aluno_especial.nota);
printf(" \n \n");
}
Conclusão
Dessa forma, termino aqui a primeira parte da explicação sobre Structs. Os exemplos que apresentei aqui utilizaram Structs de forma simples. Nos próximos artigos demonstrarei outras formas de se utilizar as Structs. Fiquem atentos.
Exercícios
- Desenvolva um programa em C para vendas de passagens de ônibus. Defina uma STRUCT, crie o menu de opções e todas as funções necessárias para manipular esta STRUCT.










com licença, e desculpe pelo incomodo mas to com dificuldades de interpretar um tópico de meu trabalho sobre registros em c, o tópico é “principais funções/comandos”, ai eu queria saber se struct possui principais funções ou comandos ?ja tentei consultar vários locais mas ainda assim não consigo
Josué! Milhões de desculpas. Só agora estou vendeo seu comentário. Acho que a essa altura você já resolveu isso né?
muito boa explicação
Milhões de desculpas. Só agora estou vendeo seu comentário. Muito obrigada =)
material bem nutrido, estas de paranbens
Milhões de desculpas. Só agora estou vendeo seu comentário. Muito obrigada =)
De longe a melhor explicação sobre struct em C que já encontrei, incluindo as fontes em inglês.
Primeira visita ao blog, já foi favoritado. Obrigado pelo material de qualidade!
Oi Jonatas, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. [ ]s
Cara professora Gatto, Gostaria de criar um índice remissivo, no caso, da Ethica de Baruch de Spinoza, material de estudo do meu segundo ano de Teologia. Preciso construir um índice remissivo, do arquivo que listo à seguir: ARQUIVO ORIGINAL: 0001 PARS PRIMA 0002 DE DEO 0003 DEFINITIONES 0004 I. Per causam sui intelligo id cujus essentia involvit existentiam sive id cujus natura non potest concipi nisi existens. 0005 II. Ea res dicitur in suo genere finita quæ alia ejusdem naturæ terminari potest. Exempli gratia corpus dicitur finitum quia aliud semper majus concipimus. Sic cogitatio alia cogitatione terminatur. At corpus non… Leia mais »
Oi Jonas, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Pq vc precisa criar esse índice é para um texto? Se for para um texto seu, como um TCC ou algo do tipo, eu acho que você poderia usar o LATEX, que faz isso automático. Não entendi bem o contexto, se puder explicar melhor, talvez eu possa ajudar melhor. [ ]s
Formidável sua explicação sobre Struct. Obrigado.
Oi Victor, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. [ ]s
Nao consigo fazer esse exercicio.struct”.Com base nisso, suponha que é necessário armazenar informações relacionadas à veículos, totalizando, no máximo, 10 veículos. Para cada veículo, deverão ser fornecidos os seguintes dados:- marca do veículo- modelo – ano de fabricação- placa (formato XXX-YYYY; onde X denota as letras e Y denota os números da placa).O sistema deverá oferecer, ao usuário, as seguintes funcionalidades:- Listar os veículos cadastrados;- Inserir um novo veículo;- Listar os veículos filtrando-se por ano de fabricação;- Listar os veículos com o ano de fabricação acima de um certo valor especificado pelo usuário. – Listar os veículos filtrando-se pelo modelo.O… Leia mais »
Oi Alex, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. Qual é exatamente a sua dificuldade? [ ]s
Como dizem na minha terra: é de “encher os olhos”. Parabéns!!!
Oi Rafael, obrigada pelo seu comentário e desculpe pela demora pra responder. Ando bem ocupada com o doutorado. [ ]s
Excelente conteudo
Obrigada!
Quantas variaveis cabe dentro da struct?
Não sei se entendi extamente a sua pergunta, mas vamos lá. Acredito que você possa incluir tantas quantas precisar, desde que haja memória suficiente para alocar tudo. Porém, vou consultar o pessoal aqui pra ver o que eles tem em mente ok. Obrigada pela pergunta.