15 de jun. de 2010

Trabalhando com Structs em C

image

Structs são “tipos definidos pelo programador”. Quando definimos uma variável na linguagem C, é necessário identificar seu tipo, como por exemplo:

int nota = 100;

Porém, você já parou em pensou em criar uma variável do tipo Aluno? Isso parece confuso, mas pare e pense: Quais são as características de um aluno? Poderiam ser: Nome, Registro Acadêmico (RA), Notas dos bimestres.

Tendo em mente essa linha de raciocínio, poderíamos criar um programa no qual as variáveis fossem declaradas normalmente. Porém a linguagem C (e muitas das linguagens modernas) permite que nós criemos “grupo/agrupamento de variáveis”.

Assim uma struct (estrutura em inglês) agrupa várias variáveis em uma só.

Sua forma geral, em C, seria:

struct NomeDoTipo
{
    tipoA variavel1;
    tipoB variavel2;
    …
    tipoN variavelN;
};

Vejamos o caso do Aluno como ficaria:

struct Aluno
{
    char nome[50];
    char RA[10];
    int nota1;
    int nota2;
    int nota3;
    int nota4;
};

Após definirmos o tipo com a struct, podemos usá-lo para declarar variáveis… Normalmente:

Aluno aluno1;
Aluno aluno2;
int resultado;

Para manipular esta variável com um tipo definido pelo programador, temos que acessar as variáveis internas com um ponto (.). Simples assim:

#include <stdio.h>
#include <string.h>

struct Aluno
{
    char nome[50];
    char RA[10];
    float nota1;
    float nota2;
    float nota3;
    float nota4;
};

void main()
{
    Aluno aluno1;
    strcpy(aluno1.nome, "Esfigoberto");
    strcpy(aluno1.RA, "123456789");
    aluno1.nota1 = 10;
    aluno1.nota2 = 9;
    aluno1.nota3 = 9;
    aluno1.nota4 = 10;

    printf("%s", aluno1.nome);
    printf("\n%s", aluno1.RA);
    printf("\n%f", aluno1.nota1);
    printf("\n%f", aluno1.nota2);
    printf("\n%f", aluno1.nota3);
    printf("\n%f", aluno1.nota4);

    getchar();
}

Olha como funciona normalmente:

image

Vale lembrar que podemos usar struct dentro de struct! Parece complicado, mas não é. Pelo contrário, é uma mão na roda. Vamos melhorar este exemplo do Aluno, as notas farão parte de uma struct Notas, veja:

#include <conio.h>
#include <stdio.h>
#include <string.h>

struct Notas
{
    float nota1;
    float nota2;
    float nota3;
    float nota4;
};

struct Aluno
{
    char nome[50];
    char RA[10];
    Notas notas;
};

void main()
{
    Aluno aluno1;
    strcpy(aluno1.nome, "Esfigoberto");
    strcpy(aluno1.RA, "123456789");
    aluno1.notas.nota1 = 10;
    aluno1.notas.nota2 = 9;
    aluno1.notas.nota3 = 9;
    aluno1.notas.nota4 = 10;

    printf("%s", aluno1.nome);
    printf("\n%s", aluno1.RA);
    printf("\n%f", aluno1.notas.nota1);
    printf("\n%f", aluno1.notas.nota2);
    printf("\n%f", aluno1.notas.nota3);
    printf("\n%f", aluno1.notas.nota4);

    getchar();
}

E continua executando redondinho:

image

… E agora com um código mais organizado. Alias é este um dos princípios: Organização, Modularização e Reuso.

Agora ficam alguns exercícios para serem resolvidos:

1) Dada a estrutura de um carro abaixo:
image
Faça um programa em C, usando struct, que leia um vetor com 100 registros e apresente os seguintes relatórios:
    a) Código, marca e modelo de todos os veículos amarelos;
    b) Código, marca, modelo, cor e ano de todos os veículos ordenados pelo ano de fabricação;
    c) Marca e modelo de todos os carros agrupados (ordenados) por tipo de combustível;
    d) Marca e modelo do carro azul mais velho;

2) Faça um programa em C que cadastre um conjunto de 30 posições contendo em cada uma o seguinte registro de funcionário: Código, Nome, Endereço, Salário, Data de Nascimento; Veja a figura abaixo a organização da struct:

clip_image001

Restrições:
• O código deverá ser gerado automaticamente pelo programa (auto-numeração) não podendo haver duplicidade;
• O campo Endereço é dividido entre Rua, Número, Bairro e CEP.
• O campo Data de Nascimento dividido entre Dia, Mês e Ano.

Apresente os seguintes relatórios:
• Relatório Geral de Funcionários em ordem Alfabética:
image

• Relatório Geral de Funcionários agrupado por ano de Nascimento:

image

 

Espero que aproveitem :)

1 comentários:

Anônimo disse...

Muito bom!