180 likes | 303 Views
Nivelamento de C: Tipos Estruturados de Dados. CONTEÚDO (1) Estruturas (2) Typedef (3) Inicializando valores (4) Passagem de parâmetro (5) Atribuição (6) Vetor de estruturas (7) Vetor de estrutura como parâmetro. (1) Estruturas. Para que servem as estruturas?. Objetivo
E N D
Nivelamento de C:Tipos Estruturados de Dados CONTEÚDO (1) Estruturas (2) Typedef (3) Inicializando valores (4) Passagem de parâmetro (5) Atribuição (6) Vetor de estruturas (7) Vetor de estrutura como parâmetro
(1)Estruturas Para que servem as estruturas? • Objetivo • Agrupa elementos de tipos diferentes Ex: cliente(CPF,nome,dataNasc,endereço) • Sintaxe: struct nome_do_tipo_da_estrutura { tipo_1 nome_1; tipo_2 nome_2; ... tipo_n nome_n; } variáveis_estrutura; • Ex1: struct ePessoa{ char cpf[15]; char nome[30]; } p1,p2,p3; Declaração de variáveis é opcional
(1)Estruturas Acesso aos elementos de uma estrutura • Ex2: struct eEndereco{ char rua[50]; int rua; char bairro[20]; char cidade[20]; char sigla_estado[3]; long int cep; }; • Ex3: struct eCliente{ char idade; char nome[30]; struct eEndereco end; } c1,c2,c3; É possível usar uma estrutura dentro da outra • Mas como acessar os campos de c1, c2 e c3?
(1)Estruturas Acesso ao elementos de uma estrutura • Ex2: struct eEndereco{ char rua[50]; int rua; char bairro[20]; char cidade[20]; char sigla_estado[3]; long int cep; }; • Ex3: struct eCliente{ char idade; char nome[30]; struct eEndereco end; } c1,c2,c3; • Mas como acessar o endereço de c3? É possível usar uma estrutura dentro da outra • Mas como acessar os campos de c1, c2 e c3? • variável.nomeDoCampo • Ex: • c1.idade = 22; • scanf(“%d”,&c2.idade); • if (c1.idade>c2.idade) printf(“C1 eh mais velho”);
(1)Estruturas Acesso aos elementos de uma estrutura • Ex2: struct eEndereco{ char rua[50]; int rua; char bairro[20]; char cidade[20]; char sigla_estado[3]; long int cep; }; • Ex3: struct eCliente{ char idade; char nome[30]; struct eEndereco end; } c1,c2,c3; • Mas como acessar o endereço de c3? • variável.nomeDaEstrutura.nomeDoCampo • Ex: • c3.end.rua = 440; • strcpy(c3.end.rua, “Av. Argemiro de Figueiredo”); • strcpy(c3.end.sigla_estado, “PB”); • cep=58043000; • scanf(“%s”,&c3.end.bairro); É possível usar uma estrutura dentro da outra • Mas como acessar os elementos de c1, c2 e c3? • variável.nomeDoCampo • Ex: • c1.idade = 22; • scanf(“%d”,&c2.idade); • if (c1.idade>c2.idade) printf(“C1 eh mais velho”);
(1)Estruturas Auto-avaliação • Faça um programa que define dois pontos a(float x, float y) e b(float x , float y) usando estruturas. Seu programa deverá ler as coordenadas de a e b, e imprimir na tela a distância entre esses dois pontos. • Distância(a,b) = raizQuadrada( (xa-xb)2 + (ya-yb)2 ) • Use a biblioteca math.h para usar a função para calcular a raiz quadrada do argumento: sqrt()
Ex4: (1)Estruturas Exemplo de programa (1) Também é possível declarar variáveis assim: struct nomeDaEstrutura nomeDaVariavel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2425 26 #include <stdio.h> #include <string.h> struct eEndereco{ char rua[50]; int rua; char bairro[20]; char cidade[20]; char sigla_estado[3]; long int cep; }; struct eCliente{ char cpf[15]; char nome[30]; struct eEndereco endereco; }; • main (void) { • struct eCliente ficha, ficha2; • strcpy (ficha.nome,"Luiz Osvaldo Silva"); • ficha.telefone=4921234; • strcpy (ficha.endereco.rua,"Rua do Hospício"); • ficha.endereco.numero=10; • strcpy (ficha.endereco.bairro,“Bessa"); • strcpy (ficha.endereco.cidade,“João Pessoa"); • strcpy (ficha.endereco.sigla_estado,“PB"); • ficha.endereco.CEP=31340230; • } pág 2 pág 1 (2) Porém, é muito chato usar a palavra struct o tempo inteiro para declarar variáveis
(2)Typedef Declarando tipos em C • Objetivo • Declara novos tipos no seu programa Ex1: typedef int tInteiro; tInteiro i,j=0; • Sintaxe: typedef antigoNome novoNome; • Ex2: (simplificando uma estrutura) 1 2 3 struct ePessoa{ int idade; char nome[30]; }p1; struct ePessoa p2; typedef struct ePessoa{ int idade; char nome[30]; }tPessoa; tPessoa p1,p2; typedef struct { int idade; char nome[30]; }tPessoa; tPessoa p1,p2;
(2)Typedef Declarando tipos em C • Objetivo • Declara novos tipos no seu programa Ex: typedef int tInteiro; tInteiro i,j=0; • Sintaxe: typedef antigoNome novoNome; • Ex1: (simplificando uma estrutura) O nome da estrutura pode ainda ser retirado 1 2 3 struct ePessoa{ int idade; char nome[30]; }p1; struct ePessoa p2; typedef struct ePessoa{ int idade; char nome[30]; }tPessoa; tPessoa p1,p2; typedef struct { int idade; char nome[30]; }tPessoa; tPessoa p1,p2; variável vira tipo O acesso às variáveis p1 e p2 é o mesmo nas três declarações: p1.idade = p2.idade; mais simples de declarar
(3)Inicializando valores Para facilitar a depuração, inicialize valores... • É possível inicializar valores nas variáveis estruturadas • Ex1: #include <stdio.h> typedef struct { char cpf[15]; char nome[30]; char estadoCivil; }tPessoa; main(){ tPessoa p1 = {“03043120412”,“Fred”,’S’}; printf(“O %s tem o estado civil %c”, p1.nome,p1.estadoCivil); }
(4)Passagem de parâmetro Passagem de estruturas como parâmetro de função • Objetivo • Usar estruturas como parâmetro de função Ex: float area(tCirculo c); // cabeçalho de uma função que recebe // um tCirculo (que é um tipo estruturado) • Ex: typedef struct { float raio; }tCirculo; int area(tCirculo c){ return (3.1416 * c.raio * c.raio); } main(){ tCirculo circulo = {2}; printf(“A area do meu circulo vale %.1f”,area(circulo)); %.1f, indica a impressão de uma casa decimal
(4)Passagem de parâmetro Auto-avaliação • Adapte seu programa anterior (slide 8) para escrever uma função. Também re-escreva as estruturas dos pontos usando typedef. Em seguida escreva uma função que receba dois pontos a e b, e retorne a distância entre eles. • float distancia(tPonto a, tPonto b); //seu protótipo
(5)Atribuição Atribuição de estruturas • Objetivo • Atribuir uma estrutura a outra é possível em C • Os valores dos campos são copiados um-a-um • Ex: #include <stdio.h> typedef struct { char cpf[15]; char nome[30]; char estadoCivil; }tPessoa; main(){ tPessoa p1, p2 = {“03043120412”,”Fred”,’S’}; p1 = p2; // nessa instrução, todos os campos de p2 são copiados nos campos de p1 }
(6)Vetor de estrutura Criando vetores de tipos estruturados de dados • Objetivo • Criar um vetor com elementos de tipo estruturado Ex: tPessoa vetor[2]; // vetor com 2 elementos do tipo tCliente • Ex1: #include <stdio.h> typedef struct { int idade; char nome[30]; char estadoCivil; }tPessoa; main(){ tPessoa vetor[2]; vetor[0].idade = 27; strcpy(vetor[0].nome, “Fred”); vetor[0].estadoCivil = ‘S’; vetor[1] = vetor[0]; // lembre-se que é possível fazer uma atribuição entre estruturas } // (veja slide anterior). Não estou atribuindo um vetor a outro!
(6)Vetor de estrutura Outro exemplo... • Ex2: (programa que procura os casados no vetor) #include <stdio.h> typedef struct { char cpf[15]; char nome[30]; char estadoCivil; }tPessoa; main(){ int i; tPessoa vetor[2] = { {“03043120412”,”Fred”,’S’}, {“02783819190”,”Fechine”,’C’} }; for (i=0;i<2;i++){ if (vetor[i].estadoCivil==‘C’) printf(“%s eh casado”, vetor[i].nome); } } Veja como inicializar valores na declaração de vetores
(6)Vetor de estrutura Auto-avaliação • Faça um programa que declare e inicialize um vetor de três pessoas. Seu programa deverá percorrer o vetor de pessoas, e imprimir na tela o CPF de Adail. typedef struct { char cpf[15]; char nome[30]; char estadoCivil; }tPessoa; tPessoa pessoas[3] = { {“03043120412”,”Fred”,’S’}, {“02934526234”,”Adail”,’C’} {“02783819190”,”Valneide”,’C’} }; • Faça uma pequena modificação no programa anterior, e imprima na tela os CPF das pessoas que começam pela letra ‘F’ Dica: pessoas[i].nome representa a string do elemento de índice i. Lembre-se que uma string é um vetor de caracteres, logo para acessar o primeiro elemento dessa string, basta usar pessoas[i].nome[0]
(7)Vetor de estrutura como parâmetro Vetor de estrutura passado como parâmetro de uma função • Chegamos ao nosso objetivo final dessa aula: • Passar como parâmetro de uma função, um vetor de elementos do tipo estruturado Ex: void imprimeMaisVelho(tPessoas vetor[]); • Ex: (função que vai imprimir na tela o nome da pessoa mais velha) void imprimeMaisVelho(tPessoa vetor[]){ int i, maior=0, indiceMaior=0; for (i=0;i<N;i++){ if (vetor[i].idade > maior) { indiceMaior = i; maior = vetor[i].idade; } } printf("A pessoa mais velha eh %s", vetor[indiceMaior].nome); } #include <stdio.h> #include <conio.h> #define N 3 typedef struct { int idade; char nome[30]; char estadoCivil; }tPessoa; main(){ tPessoa pessoas[3] = { {27,"Fred",'S'}, {45,"Beltrano",'C'}, {32,"Cicrano",'C'} }; imprimeMaisVelho(pessoas); getch(); } <pág1> <pág2> <pág3>
(7)Vetor de estrutura como parâmetro Auto-avaliação • Adapte seu programa anterior (slide 18) para escrever as funções abaixo: /********* IMPRIMIR CPF PROCURANDO NOME ***************** * Objetivo: Função que procura um nome dentro do vetor, se encontrado imprime o CPF na tela * Entrada: um vetor de pessoas (tPessoa vet[]) de tamanho N e o nome a ser procurado (char nome[]) * Retorno: nenhum * Saida: impressão na tela do CPF do nome procurado */ a) void imprimirCPF(tPessoa vet[], char nome[]); /********* IMPRIMIR CPF PROCURANDO A PRIMEIRA LETRA DO NOME ***************** * Objetivo: Função que procura um nome (começado por uma letra específica) dentro do vetor, se encontrado imprime o CPF na tela * Entrada: um vetor de pessoas (tPessoa vet[]) de tamanho N e a letra inicial da(s) pessoa(s) a ser(em) procurada(s) * Retorno: nenhum * Saida: impressão na tela do CPF do nome procurado */ b) void imprimirCPF2(tPessoa vet[], char letraInicial);