Professional Documents
Culture Documents
LAPRO I
Prof. Dr. Rafael Garibotti
v Baseado no material cedido pelos Profs. Dr. Marco Mangan e Dr. Matheus Trevisan
AULA SOBRE:
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
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;
}
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 ELEMENTOS
Exemplo:
typedef struct{
char x;
int y;
float z;
char s[10];
} s1;
s1 exemplo;
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);
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:
#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