You are on page 1of 28

Pontifcia

Universidade Catlica do Rio Grande do Sul


Faculdade de Informtica - FACIN

LAPRO I
Prof. Dr. Rafael Garibotti

v Baseado no material cedido pelos Profs. Dr. Marco Mangan e Dr. Matheus Trevisan

AULA SOBRE:

REGISTROS E TIPOS ESPECIAIS

TIPOS ESPECIAIS

TIPOS ESPECIAIS
typedef
Criao de novos tipos de variveis.
typedef <tipo> <definio>

Exemplo:
#include <stdio.h>
int main ( ) {
typedef float real;
typedef float real_vec[10]; //Tipos podem ser vetores
real x;
real_vec y;
x=3.14;
y[0]=3.14;
printf("Variavel: %f, Vetor: %f\n", x, y[0]);
return 0;
}

TIPOS ESPECIAIS
enum
Atribuir valores inteiros sequenciais a constantes.
Usados quando se conhece o conjunto de valores que a varivel pode assumir.
enum <definio> { <valor0>, <valor1>, ... };

Exemplo:
#include <stdio.h>
int main ( ) {
enum dias {
seg, ter, qua, qui, sex, sab, dom
};
enum dias d1;
d1=seg;
printf ("%d\n", d1); // 0
d1++;
if (d1==ter)
printf ("%d\n", d1); // 1
return 0;
}

TIPOS ESPECIAIS
enum
Exemplo (atribuio de valores):
#include <stdio.h>
int main ( ) {
enum cores{
verde=1, azul=2,
amarelo, // valor anterior + 1
vermelho=7
};
enum cores c1;
c1=amarelo;
while(1) {
if (c1==vermelho) break;
else {
printf("Cor= %d\n",c1);
c1++;
}
}
return 0;
}

REGISTRO

MOTIVAO
Vetores e matrizes
Estruturas de dados homogneas.
Armazenam vrios valores, mas todos de um mesmo tipo (int, float, etc.).
Problemas reais
Colees de dados que so de tipos diferentes
Exemplo (Ficha de cadastro de um cliente):

Nome: string
Endereo: string
Telefone: string
Salrio: float
Idade: int

FICHA
Nome: ____________
Endereo: _________
Telefone: __________
Salrio: ___________
Idade: ____________

REGISTRO
Registro (ou struct)
Tipo de dado estruturado heterogneo.
Coleo de variveis referenciadas por um mesmo label.
Permite agrupar dados de diferentes tipos numa mesma estrutura.
Cada componente pode ser de um tipo diferente.
Componentes referenciados por um nome.
Elementos do registro.
Campos ou membros da struct.
5

REGISTRO
Campo (Field)
Conjunto de caracteres com o mesmo significado.
Exemplo: nome.
Registro (Struct ou Record)
Conjunto de campos relacionados.
Exemplo: nome, endereo, telefone, salrio e idade de uma pessoa.
FICHA
Nome: ____________
Endereo: _________
Telefone: __________
Salrio: ___________
Idade: ____________

Registro
Campos

STRUCT
A palavra reservada struct indica ao compilador que est sendo criada uma estrutura.
Uma estrutura deve ser declarada aps incluir as bibliotecas e antes da funo main.
Sintaxe:
// Bibliotecas
struct <identificador_da_struct>{
tipo <nome_var_campo1>;
tipo <nome_var_campo2>;
};
int main ( ) {
struct <identificador_da_struct> <var1>, <var2>;
// Comandos
return 0;
}

STRUCT
Se o compilador C for compatvel com o padro C ANSI.
Informao contida em uma struct pode ser atribuda a outra struct do mesmo tipo.
No necessrio atribuir os valores de todos os elementos/campos
separadamente.
Exemplo: <var1> = <var2>;
Todos os campos de <var1> recebero os valores correspondentes dos campos
de <var2>.
Para acessar os campos da struct.
Utiliza-se o nome da varivel struct, seguido de ponto, seguido do nome do campo.
Exemplo: <var1>.<nome_varivel_campo2>;
8

STRUCT
Exemplo (formas de utilizao):
Um struct endereo que guarda os elementos nome, rua, cidade, estado e cep.
struct endereco{
char nome[30];
char rua[40];
long int cep;
};
struct endereco info_end;

OU

typedef struct {
char nome[30];
char rua[40];
long int cep;
} endereco;
endereco info_end;
9

STRUCT
J vimos que:
Para acessar membros de uma struct usamos
nome_var.nome_membro

Portanto, considerando o exemplo anterior:


Para inicializar o cep da varivel info_end.
info_end.cep=123456;
scanf("%d", &info_end.cep);

Para obter o nome da pessoa e escrever na struct.


gets(info_end.nome);

Para imprimir o endereo.


printf("%s", info_end.rua);
10

STRUCT
Exemplo:
#include <stdio.h>
struct aluno {
char nome[40];
float P1;
float P2;
float T;
int faltas;
};
int main() {
struct aluno joao, maria;
joao.P1 = 9.5;
joao.P2 = 8.5;
joao.T = 9.0;
joao.faltas = 4;
maria = joao;
printf("%d\n", maria.faltas);
return 0;
}

11

STRUCT
Exemplo:

...
// inicializao dos campos de e2
strcpy(e2.rua, "Rua Lima e Silva");
e2.num = 1987;
strcpy(e2.cep, "90000-345");
strcpy(e2.cidade_estado, "Porto Alegre / RS");

#include <stdio.h>
#include <string.h>
struct endereco {
char rua[40];
int num;
char cep[10];
char cidade_estado[40];
};
int main() {
struct endereco e1;
struct endereco e2;

// exibe os dados
printf("\n%s %d", e1.rua, e1.num);
printf("\n%s, %s\n", e1.cep, e1.cidade_estado);
printf("\n%s %d", e2.rua, e2.num);
printf("\n%s, %s\n\n", e2.cep, e2.cidade_estado);
return 0;
}

// inicializao dos campos de e1


strcpy(e1.rua, "Avenida Ipiranga");
e1.num = 1234;
strcpy(e1.cep, "90000-123");
strcpy(e1.cidade_estado, "Porto Alegre / RS");
...

12

VETOR DE REGISTRO
Vetores de registros podem ser definidos como vetores de tipos bsicos.
Para manipular os dados do vetor, devem ser fornecidos o ndice e o campo.
Exemplo:
#include <stdio.h>
#include <string.h>
/* Usar as declaraes anterioes das structs */
int main() {
struct aluno Turma380[28];
struct endereco vetorEndAmigos[100];
strcpy(Turma380[0].nome, Fulano);
Turma380[0].P1 = 9.5;
Turma380[0].P2 = 8.5;
Turma380[0].T = 9.0;
Turma380[0].faltas = 4;
strcpy(vetorEndAmigos[0].rua, Carlos Gomes);
strcpy(vetorEndAmigos[1].rua, Goethe);
return 0;
}

13

ESTRUTURAS E FUNES

PASSANDO ARGUMENTOS PARA FUNES


Pode-se passar para uma funo um elemento de uma estrutura, a
prpria estrutura ou o endereo da estrutura.
Para passar o elemento i da varivel um que uma estrutura, seria:
funcao(um.i);

Para passar toda a estrutura, seria:


funcao(um);

Para passar o endereo da estrutura, seria:


funcao(&um);
14

PASSANDO ELEMENTOS
Exemplo:
typedef struct{
char x;
int y;
float z;
char s[10];
} s1;
s1 exemplo;

Para passar elementos x e y da estrutura para a funo f1, a chamada de f1 seria:


f1(exemplo.x, exemplo.y);

A definio da funo teria que receber 2 parmetros, um char e um int:


void f1(char x, int y){
...
}

15

PASSANDO A ESTRUTURA
Para passar a estrutura inteira, seria:
f2(exemplo);

A definio da f2 seria:
void f2(s1 param){
//para acessar os valores seria
param.x = 'c';
param.y = 2;
param.z = 2.3;
param.s[0] = 'a';
param.s[1] = 'b';
}
16

PASSANDO O ENDEREO
Para passar o endereo da estrutura seria (passagem de
parmetros por referncia):
f3(&exemplo);

Na definio da funo teria que receber um parmetro


que um ponteiro para a estrutura enviada. Desta
maneira se teria:
void f3(s1 *param) {
...
}
17

PASSANDO O ENDEREO
Para acessar a varivel x de param seria: (*param).x, para simplificar
a escrita os compiladores substituem o * pelo operador seta (->) e
pode-se acessar x como: param->x = c.
void f3(s1
param ->
param ->
param ->
param ->
param ->
param ->
}

*param){
x = 'c';
y = 2;
z = 2.3;
s[0] = 'a';
s[1] = 'b';
s[2] = 'c';
18

ESTRUTURAS ANINHADAS

ESTRUTURAS ANINHADAS
Utilizar typedef para realizar a definio de tipos e utilizar os tipos criados dentro de
novas estruturas.
Exemplo:

Definir o tipo estrutura DATA, contendo os elementos dia, mes e ano.


Definir o tipo estrutura DADOS contendo o nome, cpf e data de nascimento que do tipo data.

#include <stdio.h>
#include <string.h>
typedef struct {
int dia;
int mes;
int ano;
} DATA;

19

ESTRUTURAS ANINHADAS
typedef struct{
char nome[30];
long cpf;
DATA data_nascimento;
} DADOS;
int main(){
DADOS a, b;
strcpy(a.nome, "Pedro Silva");
a.data_nascimento.dia = 12;
a.data_nascimento.mes = 8;
a.data_nascimento.ano = 1999;
a.cpf = 12345;
b = a;
printf("Nome: %s", b.nome);
printf("\nData de Nascimento: %d, %d, %d\n", b.data_nascimento.dia,
b.data_nascimento.mes, b.data_nascimento.ano);
return 0;
}

20

ATIVIDADE

LABORATRIO
As atividades do laboratrio da aula de hoje esto no Moodle.

21

You might also like