Struct - Registros em Linguagem C

Operações relacionais e lógicas Operações Aritméticas variáveis Tipos de dados Estruturas Aninhadas algoritmos

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.

Outros artigos da série

<< Introdução a RegistrosAlgoritmos de Ordenação: Bubble Sort >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Elaine Cecília Gatto
Bacharel em Engenharia de Computação. Mestre em Ciência da Computação. Doutoranda em Ciência da Computação. Co-fundarora e Líder das #GarotasCPBr. Pesquisadora Convidada no Grupo de Pesquisa: "Artes em Tecnologias Emergentes" do Programa de Pós Graduação em Design na UNESP Campus Bauru. Cantora, Docente no Magistério Superior, Geek, Nerd, Otaku e Gamer. Apaixonada por Michael Jackson, Macross, Rocky Balboa, Séries, Filmes, Cervejas e Vinhos. Mais informações sobre mim você encontra em: http://lattes.cnpq.br/8559022477811603.

11
Deixe um comentário

avatar
 
8 Comment threads
3 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
9 Comment authors
LucianJulio CesarManoel VitorFrank WilliamElaine Cecília Gatto Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Lucian
Visitante
Lucian

Excelente conteudo

Julio Cesar
Visitante
Julio Cesar

Quantas variaveis cabe dentro da struct?

Manoel Vitor
Visitante
Manoel Vitor

Parabens pelo blog doutora!

Frank William
Visitante
Frank William

Muito legal, show... Gostei, mas na função cadastrar(), acredito que não deve usar o scanf por que se alguém manda um nome composto tipo o meu Frank William, ja buga... ai se trocar pelo fgets fica show.
Tipo:

void cadastrar()
{
printf(" Digite o código do aluno especial: ");
scanf("%d", &aluno_especial.codigo);

printf(" Digite o nome do aluno especial: ");
fflush(stdin);
fgets(aluno_especial.nome, 200, stdin);

printf(" Digite a nota do aluno especial: ");
scanf("%f", &aluno_especial.nota);
}

andre
Visitante
andre

faltou o #include

andre
Visitante
andre

tentei executar este modelo e deu varios erros; jdoodle.c: In function 'menu': jdoodle.c:31:9: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration] printf(" \n Opções: "); ^~~~~~ jdoodle.c:31:9: warning: incompatible implicit declaration of built-in function 'printf' jdoodle.c:31:9: note: include '' or provide a declaration of 'printf' jdoodle.c:4:1: +#include jdoodle.c:31:9: printf(" \n Opções: "); ^~~~~~ jdoodle.c:37:9: warning: implicit declaration of function 'scanf' [-Wimplicit-function-declaration] scanf("%d%*c", &opcao); ^~~~~ jdoodle.c:37:9: warning: incompatible implicit declaration of built-in function 'scanf' jdoodle.c:37:9: note: include '' or provide a declaration of 'scanf' jdoodle.c: In function 'cadastrar': jdoodle.c:66:5: warning: incompatible implicit declaration of built-in function 'printf' printf(" Digite o código do… Leia mais »

Gilsoney
Visitante
Gilsoney

Perfeito! Obrigado por esta postagem!

Wendell Silva
Visitante
Wendell Silva

Artigo interesse; direto ao ponto central da ideia de registros com vários exemplos introdutórios. Uma dica de edição para os próximos artigos: ao se referir a uma palavra chave em C, use uma fonte de tamanho fixo (Courier New, por exemplo) em vez de colocar tudo em maiúsculas o que talvez possa confundir os não iniciados. No mais, parabéns!

Elaine Cecília Gatto
Visitante
Elaine Cecília Gatto

Oi Wendell!!!! Obrigada pela sugestão, já vou corrigir isto neste artigo e nos próximos. Fico feliz por ter gostado. É importantíssimo este feedback. Até a próxima. [ ]s