Estrutura de Dados –Registros ( structsdiegoaddan/Aula5Structs... · 2014-10-15 · Uma estrutura...

27
Computação 2 Aula 5 Estrutura de Dados – Registros (structs) Diego Addan [email protected]

Transcript of Estrutura de Dados –Registros ( structsdiegoaddan/Aula5Structs... · 2014-10-15 · Uma estrutura...

Computação 2

Aula 5

Estrutura de Dados – Registros (structs)

Diego [email protected]

Estruturas ou Registros (structs)

� Uma estrutura (registro) é uma coleção de variáveisreferenciadas por um nome, fornecendo uma maneiraconveniente de se ter informações relacionadasagrupadas.

� Uma definição de estrutura forma um modelo quepode ser usado para criar variáveis de estruturas.

� As variáveis que compreendem a estrutura sãochamadas membros da estrutura (elementos oucampos).

Estruturas ou Registros (structs)

� Resumindo: uma estrutura ou registro é uma variávelcomposta que contém diversas variáveis (chamadas decampos ou elementos), usualmente de tiposdiferentes, mas que são logicamente relacionadas.

� Podemos comparar uma estrutura com uma ficha quepossui todos os dados sobre uma determinadaentidade, por exemplo:

�Registro de alunos (Nome, curso, RA, disciplinas, médias deprovas, etc...)

�Registro de clientes (Nome, endereço, telefone, email , etc...)

Declaração de uma estrutura (struct)

� Para declarar uma estrutura utilizamos a palavrareservada struct, da seguinte forma:

� Sintaxe:

struct identificador_da_estrutura {

<tipo> nome_1;

<tipo> nome_2;

<tipo> nome_3;

...

<tipo> nome_n;

};

< tipo > - representa qualquer um dos tipos básicos (int, float, char, double) ou tipo anteriormente definido.

Declaração de uma estrutura (struct)

� struct identificador_da_estrutura {

<tipo> nome_1;

<tipo> nome_2;

<tipo> nome_3;

...

<tipo> nome_n;

};

� Observe que a definição termina com um ponto e virgula, pois a

definição de uma estrutura é um comando. Além disso, oidentificador(nome) da estrutura indica um especificador de tipo.

Declaração de uma estrutura (struct)

� struct identificador_da_estrutura {

<tipo> nome_1;

<tipo> nome_2;

<tipo> nome_3;

...

<tipo> nome_n;

};

� Na sintaxe acima descrita, nenhuma variável foideclarada de fato, apenas a forma dos dados foi definida.Para declarar uma variável do tipo struct definido,seguimos a seguinte forma:

struct identificador_da_estrutura nomes_variáveis;

Declaração de uma estrutura (struct)

� A declaração do formato de uma estrutura pode ser feita dentro da nafunção main() ou fora dela. Usualmente, ela é feita fora da função main,como mostrado a seguir :

#include <stdio.h>

struct identificador_da_estrutura {

<tipo> nome_1;

<tipo> nome_2;

<tipo> nome_3;

...

<tipo> nome_n;

};

// struct identificador_da_estrutura nomes_variáveis;

void main() {

struct identificador_da_estrutura nomes_variáveis;

....

}

Declaração de uma estrutura (struct)

� Exemplo:

#include <stdio.h>

struct ficha{

char nome[30];

char endereco[50];

char fone[10];

int idade;

};

// struct ficha clientes;

void main() {

struct ficha clientes;

....

}

Declaração de uma estrutura (struct)

� Também é possível declarar uma ou mais variáveis ao definir aestrutura, como mostrado a seguir:

#include <stdio.h>

struct identificador_da_estrutura {

<tipo> nome_1;

<tipo> nome_2;

<tipo> nome_3;

...

<tipo> nome_n;

} nomes_variáveis;

void main() {

....

}

Declaração de uma estrutura (struct)

� Exemplo:

#include <stdio.h>

struct ficha{

char nome[30];

char endereco[50];

char fone[10];

int idade;

} clientes, aluno;

void main() {

...

}

Utilizando os elementos de estruturas (struct)

� Para acessar ou modificar os elementos (campos) de uma estruturautilizamos o operador . (ponto). O nome do identificador da estruturaseguido por um ponto e pelo nome do elemento (campo) acessa oumodifica individualmente esse elemento.

� Sintaxe

identificador_estrutura.nome_do_campo

� Exemplo

#include <stdio.h>

struct ficha{

char nome[30];

float media;

};

void main() {

struct ficha aluno;

aluno.media = 6.5

strcpy ( aluno.nome, “Joao Silva” );

}

Utilizando os elementos de estruturas (struct)

� Podemos usar os campos de uma estrutura em qualquer comando queusaríamos uma variável simples.

#include <stdio.h>

struct ficha{

char nome[30];

float media;

};

void main() {

struct ficha aluno;

printf(“Digite o nome do aluno\n”);

scanf(“%s”, aluno.nome);

printf(“Digite a media do aluno\n”);

scanf (“%i”, &aluno.media);

printf(“O aluno %s tem media igual a %f \n ”, aluno.nome, aluno.media);

}

Vetor de estruturas (struct)

� Podemos declarar um vetor de estruturas, para isso primeirodefinimos um tipo estrutura e então declaramos uma variável vetordesse tipo.

#include <stdio.h>

struct ficha{

char nome[30];

float media;

};

void main() {

struct ficha aluno[10];

int i;

for (i = 0; i < 10; i++) {

printf(“Digite o nome do aluno\n”);

scanf(“%s”, aluno[i].nome); //utilizar os índices para acessar a posição desejada

printf(“Digite a media do aluno\n”); //igual vetor e matriz que conhecemos

scanf (“%i”, &aluno[i].media);

printf(“O aluno %s tem media igual a %f \n ”, aluno[i].nome, aluno[i].media);

}

}

Passando estruturas para funções

� As estruturas podem ser passados como parâmetros deuma função, como qualquer outro tipo.

� A estrutura deve ser declarado antes da função.

� O parâmetro formal recebe uma cópia da estrutura, damesma forma que em uma atribuição envolvendoestruturas.

� Podemos passar por parâmetro apenas um campo(elemento) da estrutura para uma função como umavariável simples.

� Podemos passar uma estrutura inteira como parâmetropara uma função.

� Podemos passar um vetor de estruturas comoparâmetro para uma função.

#include < stdio.h>

struct Pessoa{

int dia;int mes;int ano;int idade;

};

int main(){

struct Pessoa Einstein, Newton;

Einstein.dia = 14;Einstein.mes = 3;Einstein.ano = 1879;

Newton.dia = 4;Newton.mes = 1;Newton.ano = 1643;

Einstein.idade = Calc_Idade ( Einstein.ano, 2014 );Newton.idade = Calc_Idade ( Newton.ano, 2014);

printf ( " A idade de Einstein seria %d \n", Einstein.idade );printf ( " A idade de Newton seria %d \n", Newton.idade );

return 0;}

Struct - Exemplo 1

int Calc_Idade (int a_pessoa, int a_atual ){

int id;

id = a_atual – a_pessoa;

return id;}

#include < stdio.h>

struct Pessoa{

int dia;int mes;int ano;int idade;

};

int main(){

struct Pessoa Einstein, Newton;

Einstein.dia = 14;Einstein.mes = 3;Einstein.ano = 1879;

Newton.dia = 4;Newton.mes = 1;Newton.ano = 1643;

Einstein.idade = Calc_Idade ( Einstein, 2014 );Newton.idade = Calc_Idade ( Newton, 2014);

printf ( " A idade de Einstein seria %d \n", Einstein.idade );printf ( " A idade de Newton seria %d \n", Newton.idade );

return 0;}

Struct - Exemplo 2

int Calc_Idade (struct pessoa p, int a_atual ){

int id;

id = a_atual – p.ano;

return id;}

#include <stdio.h>#include <string.h>struct Pessoa{

char nome[30];int dia;int mes;int ano;int idade;

};

int main() {struct Pessoa Lista_Genios[2];

strcpy ( Lista_Genios[0].nome, “ Albert Einstein” );Lista_Genios[0].dia = 14;Lista_Genios[0].mes = 3;Lista_Genios[0].ano = 1879;

strcpy ( Lista_Genios[1].nome, “ Isaac Newton” );Lista_Genios[1].dia = 4;Lista_Genios[1].mes = 1;Lista_Genios[1].ano = 1643;

Lista_Genios[0].idade = Calc_Idade (Lista_Genios[0], 13,05,2014);Lista_Genios[1].idade = Calc_Idade (Lista_Genios[1],13,05,2014);

printf(" A idade de %s seria %d \n", Lista_Genios[0].nome,Lista_Genios[0].idade );

printf(" A idade de %s seria %d \n", Lista_Genios[1]..nome, Lista_Genios[1].idade );

return 0;}

Struct - Exemplo 3

int Calc_Idade (struct Pessoa p, int d, int m, int a){

int idade = a - p.ano;if ( p.mes > m ){

idade = idade - 1;}else{

if (p.mes == m){ if ( p.dia > d)

{idade = idade - 1;

}}

}return idade;

}

#include <stdio.h>#include <string.h>

struct Pessoa{

char nome[30];int dia;int mes;int ano;int idade;

};

int main(){

struct Pessoa Lista_Genios[2]

strcpy ( Lista_Genios[0].nome, “ Albert Einstein” );Lista_Genios[0].dia = 14;Lista_Genios[0].mes = 3;Lista_Genios[0].ano = 1879;

strcpy ( Lista_Genios[1].nome, “ Isaac Newton” );Lista_Genios[1].dia = 4;Lista_Genios[1].mes = 1;Lista_Genios[1].ano = 1643;

Lista_Genios[0].idade = Calc_Idade (Lista_Genios[0], 8, 2, 2007);Lista_Genios[1].idade = Calc_Idade (Lista_Genios[1], 8, 2, 2007);

printf(" A idade de %s seria %d \n", Lista_Genios[0].nomeLista_Genios[0].idade );

printf(" A idade de %s seria %d \n", Lista_Genios[1]..nome Lista_Genios[1].idade );

getchar();return 0;

}

Exemplo 4 - Struct

int Calc_Idade (struct Pessoa p, int dia, int mes, int ano){

int idade = ano - p.ano;if ( p.mes > mes ){

idade = idade - 1;}else{

if (p.mes == mes){ if ( p.dia > dia)

{idade = idade - 1;

}}

}return idade;

}

p é um parâmetro por valor aqui...

#include <stdio.h>

struct Pessoa{

char nome[30];int dia;int mes;int ano;int idade;

};

int main(){

struct Pessoa Einstein, Newton;

strcpy ( Einstein.nome, "Albert Einstein" );Einstein.dia = 14;Einstein.mes = 3;Einstein.ano = 1879;

strcpy ( Newton.nome, "Newton");Newton.dia = 4;Newton.mes = 1;Newton.ano = 1643;

Calc_Idade ( &Einstein, 28, 9, 2007 );Calc_Idade ( &Newton, 28, 9, 2007 );

printf(" A idade de %s seria %d \n", Einstein.nomeEinstein.idade );

printf(" A idade de %s seria %d \n", Newton.nome Newton.idade );

getchar();return 0;

}

Exemplo 3 - Struct

void Calc_Idade (struct Pessoa *p, int dia, int mes, int ano){

(*p).idade = ano - (*p).ano;

if ( (*p).mes > mes ){

(*p).idade = (*p).idade - 1;}else{

if ( (*p).mes == mes ){ if ( (*p).dia > dia )

{(*p).idade = (*p).idade - 1;

}}

}}

p é um parâmetro por referência aqui...

Usa-se a forma (*p).variável

#include <stdio.h>

struct Pessoa{

char nome[30];int dia;int mes;int ano;int idade;

};

int main(){

struct Pessoa Einstein, Newton;

strcpy ( Einstein.nome, "Albert Einstein" );Einstein.dia = 14;Einstein.mes = 3;Einstein.ano = 1879;

strcpy ( Newton.nome, "Newton");Newton.dia = 4;Newton.mes = 1;Newton.ano = 1643;

Calc_Idade ( &Einstein, 28, 9, 2007 );Calc_Idade ( &Newton, 28, 9, 2007 );

printf (" A idade de %s seria %d \n", Einstein.nomeEinstein.idade );

printf (" A idade de %s seria %d \n", Newton.nome Newton.idade );

getchar();return 0;

}

Exemplo 4 - Struct

void Calc_Idade (struct Pessoa *p, int dia, int mes, int ano){

p->idade = ano – p->ano;

if ( p->mes > mes ){

p->idade = p->idade - 1;}else{

if ( p->mes == mes ){ if ( p->dia > dia )

{p->idade = p->idade - 1;

}}

}}

p é um parâmetro por referência aqui...

Em vez da forma (*p).variável ,usa-se mais a forma p->variável.

Exemplo 5 - Struct

#include <stdio.h>#include <stdlib.h>

struct Pessoa{

int idade;char nome [ 100 ];char sexo;

};

int quantidmaior (struct Pessoa fs[], int tam, float med){

int quant = 0;

int cont = 0;

for ( cont = 0; cont < tam; cont = cont + 1 ){

if ( fs[cont].idade > med){

quant = quant + 1; }

}

return quant;}

int main(){

struct Pessoa Funcs[3];

int quant, contaid = 0;float media;

printf ( " Programa dos dados de funcionários. \n \n \n" );

int cont;for ( cont = 0; cont < 3; cont = cont +1 ){

printf (" Digite o nome do funcionario número %i: \n", cont+1 );fflush ( stdin );gets ( Funcs[ cont].nome );

printf ( " Digite a idade do funcionario número %i: \n", cont+1);fflush ( stdin );scanf ( "%i", & Funcs[cont].idade );

printf ( " Digite o sexo (f/m) do funcionario número %i: \n", cont+1 );fflush ( stdin );scanf ( "%c", & Funcs[cont].sexo);contaid = contaid + Funcs[cont].idade;

printf ("\n");}

media = (float) contaid/cont;

quant = quantidmaior (Funcs, cont, media);

printf ( " A média de idade é %.2f: \n", media );printf ( " A quantidade de funcionário com idada acima da média é %i: \n", quant );

printf ("\n \n"); system ("Pause");return 0;

}

Typedef

� Utilizado em C para redefinir um tipo de dadoatribuindo-lhe um novo nome.

� Você não cria uma nova classe de dados, mas define umnovo nome para um tipo já existente.

� Isso pode ser útil em casos de programas grandes, ondea alteração do tipo de uma determinada variável paraoutra acarretaria na alteração de muitas variáveis.

� Sintaxe

typedef tipo novonome;

Typedef

� Sintaxe

typedef tipo novonome;

� Exemplo:#include <stdio.h>

typedef float nota;

void main () {

nota P1;

printf ("Digite a nota 1\n");

scanf ("%f", &P1);

printf ("A nota 1 foi %f\n", P1)

}

Typedef

� Com o typedef é possível referenciar uma estrutura dedados dentro de outra (struct dentro de struct).

typedef struct data {unsigned short dia;unsigned short mes;unsigned int ano;unsigned int idade;

} Data;

typedef struct aniversario {char nome[50];Data nascimento;

} Aniversario;

int main () {

Aniversario Einstein, Newton;

Einstein.nascimento.dia = 14;Einstein.nascimento.mes = 3;Einstein.nascimento.ano = 1879;

Newton.nascimento.dia = 4;Newton.nascimento.mes = 1;Newton.nascimento.ano = 1643;

Einstein.nascimento.idade = Calc_Idade ( Einstein, 2011 );Newton.nascimento.idade = Calc_Idade ( Newton, 2011 );

printf ( " A idade de Einstein seria %d \n", Einstein.nascimento.idade );printf ( " A idade de Newton seria %d \n", Newton.nascimento.idade );

getchar();return 0;

}

Typedef - Exemplo 1

int Calc_Idade (Aniversario p, int a){

int idad;

idad = a - p.nascimento.ano;

return idad;}

Exercícios

1) Faça um programa que realize o cadastro decontas bancárias com as seguintes informações:número da conta, nome do cliente e saldo. Obanco permitirá o cadastramento de apenasquinze contas e não poderá haver mais que umaconta com o mesmo número. Crie o menu deopções a seguir:

1) Cadastrar conta;

2) Fazer movimentações na conta (saque e deposito);

3) Buscar cliente por conta e mostrar as informações;

4) Excluir uma conta;

5) Sair.

Exercícios

2) Faça um programa que efetue reservas depassagens áreas de determinada companhia. Oprograma deverá ler os números dos aviões e onumero de lugares disponíveis em cada avião. Oprograma deverá mostrar o seguinte menu deopções:

1) Cadastrar os números dos aviões;

2) Cadastrar o número de lugares disponíveis em cada avião;

3) Reservar passagem (escolher o avião e o lugar);

4) Consultar por avião;

5) Sair.