Baixe o app para aproveitar ainda mais
Prévia do material em texto
LAPRO I Prof. Dr. Rafael Garibotti Pontifícia Universidade Católica do Rio Grande do Sul Faculdade de Informática - FACIN v Baseado no material cedido pelos Profs. Dr. Marco Mangan e Dr. Matheus Trevisan REGISTROS E TIPOS ESPECIAIS AULA SOBRE: TIPOS ESPECIAIS TIPOS ESPECIAIS 1 typedef Ø Criação de novos tipos de variáveis. typedef <tipo> <definição> Ø 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 2 enum Ø Atribuir valores inteiros sequenciais a constantes. Ø Usados quando se conhece o conjunto de valores que a variável pode assumir. enum <definição> { <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 3 enum Ø Exemplo (atribuição 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 MOTIVAÇÃO 4 Ø Vetores e matrizes ü Estruturas de dados homogêneas. ü Armazenam vários valores, mas todos de um mesmo tipo (int, float, etc.). Ø Problemas reais ü Coleções de dados que são de tipos diferentes ü Exemplo (Ficha de cadastro de um cliente): • Nome: string • Endereço: string • Telefone: string • Salário: float • Idade: int FICHA Nome: ____________ Endereço: _________ Telefone: __________ Salário: ___________ Idade: ____________ REGISTRO 5 Registro (ou struct) Ø Tipo de dado estruturado heterogêneo. Ø Coleção de variáveis 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. REGISTRO 6 Ø Campo (Field) ü Conjunto de caracteres com o mesmo significado. • Exemplo: nome. Ø Registro (Struct ou Record) ü Conjunto de campos relacionados. • Exemplo: nome, endereço, telefone, salário e idade de uma pessoa. FICHA Nome: ____________ Endereço: _________ Telefone: __________ Salário: ___________ Idade: ____________ Campos Registro STRUCT 7 Ø A palavra reservada struct indica ao compilador que está sendo criada uma estrutura. Ø Uma estrutura deve ser declarada após incluir as bibliotecas e antes da função 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 8 Ø Se o compilador C for compatível com o padrão C ANSI. ü Informação contida em uma struct pode ser atribuída a outra struct do mesmo tipo. ü Não é necessário atribuir os valores de todos os elementos/campos separadamente. ü Exemplo: <var1> = <var2>; • Todos os campos de <var1> receberão os valores correspondentesdos campos de <var2>. Ø Para acessar os campos da struct. ü Utiliza-se o nome da variável struct, seguido de ponto, seguido do nome do campo. ü Exemplo: <var1>.<nome_variável_campo2>; STRUCT 9 Ø Exemplo (formas de utilização): ü Um struct endereço 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; typedef struct { char nome[30]; char rua[40]; long int cep; } endereco; endereco info_end; OU STRUCT 10 Ø Já vimos que: ü Para acessar membros de uma struct usamos nome_var.nome_membro Ø Portanto, considerandoo exemplo anterior: ü Para inicializar o cep da variável 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 endereço. printf("%s", info_end.rua); STRUCT 11 Ø 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; } STRUCT 12 Ø Exemplo: #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; // inicialização dos campos de e1 strcpy(e1.rua, "Avenida Ipiranga"); e1.num = 1234; strcpy(e1.cep, "90000-123"); strcpy(e1.cidade_estado, "Porto Alegre / RS"); ... ... // inicialização 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"); // 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; } VETOR DE REGISTRO 13 Ø Vetores de registros podem ser definidos como vetores de tipos básicos. Ø Para manipular os dados do vetor, devem ser fornecidos o índicee o campo. Ø Exemplo: #include <stdio.h> #include <string.h> /* Usar as declarações 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; } ESTRUTURAS E FUNÇÕES PASSANDO ARGUMENTOS PARA FUNÇÕES 14 Ø Pode-se passar para uma função um elemento de uma estrutura, a própria estrutura ou o endereçoda estrutura. ü Para passar o elemento i da variável um que é uma estrutura, seria: funcao(um.i); ü Para passar toda a estrutura, seria: funcao(um); ü Para passar o endereço da estrutura, seria: funcao(&um); PASSANDO ELEMENTOS 15 Ø 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 função f1, a chamada de f1 seria: f1(exemplo.x, exemplo.y); Ø A definição da função teria que receber 2 parâmetros, um char e um int: void f1(char x, int y){ ... } PASSANDO A ESTRUTURA 16 Ø Para passar a estrutura inteira, seria: f2(exemplo); Ø A definição 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'; } PASSANDO O ENDEREÇO 17 Ø Para passar o endereçoda estrutura seria (passagem de parâmetros por referência): f3(&exemplo); Ø Na definição da função teria que receber um parâmetro que é um ponteiro para a estrutura enviada. Desta maneira se teria: void f3(s1 *param) { ... } PASSANDO O ENDEREÇO 18 Ø Para acessar a variável 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 -> x = 'c'; param -> y = 2; param -> z = 2.3; param -> s[0] = 'a'; param -> s[1] = 'b'; param -> s[2] = 'c'; } ESTRUTURAS ANINHADAS ESTRUTURAS ANINHADAS 19 Ø Utilizar typedef para realizar a definição 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 denascimento que é do tipo data. #include <stdio.h> #include <string.h> typedef struct { int dia; int mes; int ano; } DATA; … ESTRUTURAS ANINHADAS 20 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; } ATIVIDADE LABORATÓRIO 21 Ø As atividades do laboratório da aula de hoje estão no Moodle.
Compartilhar