Você está na página 1de 9

Unidade 4 –Criação de Tipos de dados

1. Introdução

o Muitas vezes é necessário manipular dados complexos que


seriam difíceis de representar usando apenas os tipos primitivos
(exemplo: char, int, double, float) ou até mesmo dos que derivam
dos primitivos como strings, vetores e matrizes. Para isso, há, em
C, três tipos de dados que podem ser definidos pelo usuário: a)
estruturas (struct); b) uniões (union) e c) enumerações (enum).
o As estruturas e uniões são compostas por várias variáveis
(escolhidas pelo programador), por isso são ditos definidos pelo
usuário. As enumerações são tipos cujos valores devem
pertencer a um conjunto definido pelo programador.

2. Estruturas (struct em C)
o Estruturas podem agrupar diferentes variáveis de diferentes tipos
tais como int, char, float, double, vetores, matrizes, strings,
ponteiros ou até mesmo outras estruturas.
o Uma Estrutura é portanto um conjunto de uma ou mais variáveis
agrupadas e representadas sob um único nome. A ideia é que
armazene os dados de uma mesma entidade, por exemplo no
caso de uma ficha pessoal é necessário guardar o nome, telefone
e endereço de uma pessoa: a ficha seria então seria uma
estrutura. A estrutura serve então para agrupar um conjunto de
dados diferentes, formando um novo tipo de dados

• Declaração de Estruturas:
o A declaração básica de Estruturas pode ser feita através da
seguinte sintaxe:

struct nome_da_estrutura {
tipo_1 var_1;
tipo_2 var_2; ...
tipo_n var_n;
};
o A declaração de uma estrutura corresponde somente à definição
de um novo tipo (isto é, da sua estrutura). Nela não está implícita
a declaração de variáveis do tipo estrutura.

o Exemplo 1: Suponha que queiramos armazenar os dados


relativos a um individuo, como mostrado a seguir:
int idade;
char Nome[60];
char est_civil, sexo;

o 1ª Possibilidade (declarar logo a variável que pertence ao


novo tipo criado):
struct Dados {
int idade;
char est_civil, sexo, nome[20];
} pessoa;

o A definição da estrutura Dados (struct Dados) indica que a


partir daquele momento o compilador passa a conhecer um
outro tipo, chamado struct Dados, que é composto por um
inteiro, dois caracteres e um vetor de 20 caracteres. E uma
variável pessoa do tipo Dados.

o 2ª possibilidade: Pode-se também declarar uma variável do


tipo estrutura usando o struct em uma linha qualquer do
programa. No exemplo anterior a declaração da variável
pessoa poderia ser feita do seguinte modo:

struct Dados pessoa2;

onde pessoa2 é uma variável do tipo “Dados”


ver exemploEstruturas1.c completo em
https://replit.com/@AleksandraSilva/exemploEstruturas1 que
mostra as duas possibilidades acima

o A definição de uma estrutura pode ser feita sem indicar o seu


nome, mas nesses casos, todas as variáveis destas estruturas
tem que ser declaradas no momento da definição, como no
Exemplo2 a seguir.
o Exemplo 2: Faça uma estrutura (sem indicar o seu nome) para
armazenar as coordenadas (x,y) de um ponto e declare duas
variáveis desse novo tipo.
struct {
float x;
float y;
} p1, p2;

ver exemploEstruturas2.c completo em


https://replit.com/@AleksandraSilva/exemploEstruturas2

• Acesso aos dados em Estruturas:


o Exemplo 3: Faça uma estrutura denominada ponto para
armazenar as coordenadas (x,y) de um ponto e declare 2
variáveis desse novo tipo (ponto). Após isso, atribua valores às
coordenadas x e y dessas 2 novas variáveis e mostre na tela
(console) os valores atribuídos.
struct ponto {
float x;
float y;
} p1, p2;
p1.x = 2.0;
p1.y = 1.0;
p2.x = 4.0;
p2.y = 3.0;
printf ("a coordenada x do primeiro ponto
eh=%.1f",p1.x);
printf ("\na coordenada y do primeiro ponto
eh=%.1f",p1.y);
printf ("\na coordenada x do segundo ponto
eh=%.1f",p2.x);
printf ("\na coordenada y do segundo ponto
eh=%.1f",p2.y);

ver exemploEstruturas3.c completo em


https://replit.com/@AleksandraSilva/exemploEstruturas3

o Exemplo 4: Exercício Proposto


Criar uma estrutura capaz de armazenar datas com 3 campos
(dia, mês e ano) em que dia e ano são inteiros e mês é uma string
de 20 caracteres. Receber do usuário dia, mês e ano e após isso
imprimir no seguinte formato: “a data digitada é 23/julho/2020”
(por exemplo)
ver resolução do Exercício exemploEstruturas4.c em
https://replit.com/@AleksandraSilva/exemploEstruturas4

• Carga Inicial Automática de dados em


Estruturas:
Exemplo 5:
struct Data
{
int Dia, Ano; char Mes[20];
};

int main()
{
struct Data d1 = {23,1957,"Jan"};
printf("Data inicial e:");
printf("%d/%s",d1.Dia,d1.Mes);
printf("/%d\n",d1.Ano);
printf("Entre com o dia:");
scanf("%d",&d1.Dia);
printf("Entre com o mes:");
scanf("%s",d1.Mes);
printf("Entre com o ano:");
scanf("%d",&d1.Ano);
printf("A data digitada e:");
printf("%d/%s/%d\n",d1.Dia,d1.Mes,d1.Ano);
return 0;
}

ver exemplo completo – exemploEstruturas5.c em


https://replit.com/@AleksandraSilva/exemploEstruturas5

• Criação de novos nomes para tipos


existentes:

A utilização da palavra reservada typedef estabelece um


sinônimo para qualquer conjunto de palavras, por exemplo:
typedef float real;
O tipo float passa também a ser representado pela palavra real.
Pode-se então declarar uma variável utilizando as duas palavras:
float e real.

Exemplo6:
typedef float Real; // redefinindo o nome do
tipo float -> Real
typedef int inteiro; // redefinindo o nome do
tipo int -> Inteiro

struct Data
{
inteiro cod; // cod do tipo inteiro
Real valor; // valor do tipo Real
};

int main()
{
struct Data d1;
printf("Entre com o codigo do Produto:");
scanf("%d",&d1.cod);
printf("Qual o valor do Produto?");
scanf("%f",&d1.valor);
return 0;
}

Ver exemplo completo em


https://replit.com/@AleksandraSilva/exemploNovoNomePraTipo-Com-
Typedef

A utilização da palavra reservada typedef também pode ser


usada no momento da criação de uma estrutura. Veja o
exemplo a seguir.

Exemplo7:

#include <stdio.h>
typedef struct // Cria uma STRUCT para armazenar
os dados
{
float Peso; // define o campo Peso
int Idade; // define o campo Idade
float Altura; // define o campo Altura
} Pessoa; // Define o nome do novo tipo criado
...

Ver exemplo completo em


https://replit.com/@AleksandraSilva/exemploEstruturas6-
ComTypeDef

• Matrizes de Estruturas:

o Em C também temos a possibilidade de criar uma matriz


unidimensional de uma certa estrutura. Veja o exemplo a
seguir:

Exemplo8: Criar uma estrutura para armazenar peso, idade e


altura de 10 pessoas. Receber do usuário o peso, idade e altura
das 10 pessoas. Após o recebimento dos dados, imprima na tela
todos os pesos, todas as idades e todas as alturas das pessoas
(obedecendo essa sequência).
struct // Cria uma STRUCT para armazenar os
dados de uma pessoa
{
float Peso; // define o campo Peso
int Idade; // define o campo Idade
float Altura; // define o campo Altura
} Povo[10]; // Define uma variavel vetor de 10
posicoes

int main()
{
int i;
for (i=0; i<10;i++){
printf("Entre com o peso da pessoa %d =
", i+1);
scanf("%f",&Povo[i].Peso);
printf("Entre com a idade da pessoa %d =
", i+1);
scanf("%d",&Povo[i].Idade);
printf("Entre com a altura pessoa %d =
", i+1);
scanf("%f",&Povo[i].Altura);
}
printf("RELATORIO GERENCIAL");
printf("\n \n PESOS");
printf("\n ---------------------");
for (i=0; i<10;i++){
printf("\n Peso da pessoa %d = %.2f",
i+1,Povo[i].Peso);
}
printf("\n \n IDADES");
printf("\n ---------------------");
for (i=0; i<10;i++){
printf("\n Idade da pessoa %d = %d",
i+1,Povo[i].Idade);
}
printf("\n \n ALTURAS");
printf("\n ---------------------");
for (i=0; i<10;i++){
printf("\n Altura da pessoa %d = %.2f",
i+1,Povo[i].Altura);
}
return 0;
}

Ver exemplo completo em


https://replit.com/@AleksandraSilva/exemploMatrizDeEstruturas

Outra forma de criar uma matriz unidimensional de uma estrutura


pode ser visto em
https://replit.com/@AleksandraSilva/exemploMatrizDeEstrutura-1

• Estruturas e Funções:
o Passagem de Structs por Parâmetro
Para passar uma struct por valor basta declará-la como um dos
parâmetros, como no exemplo a seguir:

#include <stdio.h>

typedef struct Pessoa {// Cria uma STRUCT para


armazenar os dados de uma pessoa
float Peso; // define o campo Peso
int Idade; // define o campo Idade
float Altura; // define o campo Altura
} Pessoa; // Define o nome do novo tipo criado
void ImprimePessoa (Pessoa P) // declara o
parâmetro como uma struct
{
printf("Idade: %d Peso: %f Altura: %f\n",
P.Idade, P.Peso, P.Altura);
}

int main()
{
Pessoa Joao, P2;
Pessoa Povo[10];

Joao.Idade = 15;
Joao.Peso = 60.5;
Joao.Altura = 1.75;

Povo[4].Idade = 23;
Povo[4].Peso = 75.3;
Povo[4].Altura = 1.89;

P2 = Povo[4];
P2.Idade++;

// chama a função que recebe a struct como


parâmetro
ImprimePessoa(Joao);
ImprimePessoa(Povo[4]);
ImprimePessoa(P2);
return 0;
}

Ver exemplo completo em


https://replit.com/@AleksandraSilva/exemploEstruturas-E-Funcao-1

o Retorno de Structs em Funções


Como uma struct define um tipo de dado, este tipo pode ser
retornado em uma função, da mesma forma que ocorre com
qualquer outro tipo de dado. No exemplo a seguir, a função
retorna uma struct que conterá, em seus campos, os dados
que foram recebidos por parâmetro.

typedef struct // Cria uma STRUCT para armazenar


os dados de uma pessoa
{
float Peso; // define o campo Peso
int Idade; // define o campo Idade
float Altura; // define o campo Altura
} Pessoa; // Define o nome do novo tipo criado

Pessoa SetandoPessoa(int idade, float peso,


float altura)
{
Pessoa P;
P.Idade = idade;
P.Peso = peso;
P.Altura = altura;
return P; // retorna P, contendo os dados
passados por parametro
}
void ImprimePessoa(Pessoa P) // declara o
parametro como uma struct
{
printf("Idade: %d Peso: %f Altura: %f\n",
P.Idade, P.Peso, P.Altura);
}

int main()
{
Pessoa Joao,Rayssa;

Joao = SetandoPessoa(15,60.5,1.75); //
atribui o retorno da funcao à uma variavel
struct ->Joao
Rayssa = SetandoPessoa(13,45,1.48); //
atribui o retorno da funcao à uma variavel
struct ->Rayssa
ImprimePessoa(Joao); // chama a funcao que
irá imprimir os dados da variavel Joao
ImprimePessoa(Rayssa); // chama a funcao que
irá imprimir os dados da variavel Rayssa
return 0;
}

Ver exemplo completo em


https://replit.com/@AleksandraSilva/exemploEstrututuras-E-
Funcao-2

Você também pode gostar