Struct – Registros em Linguagem C

PSEUDOCODIGO bubble sort switch case
Este post faz parte da série Estruturas de Dados

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

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

Estruturas de Dados

Introdução a Registros Algoritmos de Ordenação: Bubble Sort
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
32 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
josue
josue
31/10/2022 10:47

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

selton melo
selton melo
08/07/2022 13:43

muito boa explicação

augusto alberto augusto
augusto alberto augusto
23/04/2022 05:50

material bem nutrido, estas de paranbens

Jonatas S. Andrade
Jonatas S. Andrade
27/03/2020 12:38

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!

Jonas Barbosa
Jonas Barbosa
26/01/2020 18:34

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 »

Victor Hugo
Victor Hugo
16/12/2019 21:32

Formidável sua explicação sobre Struct. Obrigado.

alex
alex
03/11/2019 12:33

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 »

Rafael
Rafael
25/09/2019 14:53

Como dizem na minha terra: é de “encher os olhos”. Parabéns!!!

Lucian
Lucian
18/06/2019 20:34

Excelente conteudo

Julio Cesar
Julio Cesar
14/05/2019 01:10

Quantas variaveis cabe dentro da struct?

Home » Software » Struct – Registros em Linguagem C

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: