► Até agora todos os nossos dados eram armazenados em variáveis simples, isto é, variáveis do tipo char, int, float ou double. ► Aprendemos também a armazenar conjuntos de valores em arrays e matrizes que têm a capacidade de guardar um conjunto de dados do mesmo tipo. ► Vamos agora aprender a utilizar estruturas. 1 Estruturas ► Definição: Estrutura é um conjunto de uma ou várias variáveis (normalmente chamadas de campos ou membros) agrupadas sobre um único nome. ► As estruturas podem conter elementos com qualquer tipo de dados válido em C (tipos básicos (int, float, char, double), arrays, matrizes, strings, apontadores, ou mesmo outras estruturas) 2 Estruturas ► Exemplos de estruturas conhecidas: A data O Bilhete de identidade Data Bilhete de identidade ano Nome mês dia Nr. de BI Data de nascimento Nome dos pais Data de validade Morada … 3 Estruturas ► Por exemplo: Qual a composição de um contacto de uma lista telefónica? Resposta: Nome Número de Telemóvel Morada 4 Estruturas - Declaração ► Declaração de uma estrutura em C struct nome_da_estrutura { tipo1 variável1; tipo2 variável2; … tipoN variávelN; }; Nunca esquecer o ; a seguir ao fecho da chaveta. 5 Estruturas – Declaração de variáveis ► Ao declarar uma estrutura apenas está a informar o compilador de que existe um novo tipo de dados. Não está ainda a declarar nenhuma variável desse novo tipo de dados. ► Declaração de variáveis do tipo de uma estrutura: struct nome_da_estrutura nome_da_variável; OU struct nome_da_estrutura { tipo1 variável1; tipo2 variável3; … tipoN variávelN; }nome_da_variável, nome_da_variável1; 6 Estruturas – exemplos struct data { int ano, dia; char mes[11]; }; struct data dt; Por uma questão de lógica, não deve definir variáveis com o mesmo nome da estrutura. 7 Estruturas – exemplos struct bi { int nr; char nome[101], morada[301]; struct data data_nascimento; float altura; }bilhete_identidade; A estrutura bi, tem um membro que é uma estrutura 8 Estruturas – exemplos ► Defina agora uma estrutura e uma variável para um registo com os seguintes dados: Nome Idade Profissão Salário 9 Estruturas – exemplos /* declaração da estrutura */ struct dados { char nome[101], profissao[101]; int idade float salario; }; /* declaração da variável */ struct dados dados_pessoais; 10 Acesso aos membros de uma estrutura ► Depois de criada uma estrutura e uma variável desse novo tipo de dados, será necessário aceder aos membros da estrutura para que possamos atribuir, alterar, visualizar ou remover informações a esses membros. struct data { int ano, dia; char mes[11]; }; struct data dt; dt é do tipo struct data, logo possui os membros: ano, dia e mês. Para aceder aos membros de uma estrutura usase o operador . (ponto) Neste caso, para aceder aos membros da variável dt faria: dt.ano dt.dia dt.mes 11 Acesso aos membros de uma estrutura struct data { int ano, dia; char mes[11]; }; struct data dt; main() { printf(“introduza o dia: ”) scanf(“%d”, &dt.dia); dt.ano=2007; strcpy(dt.mes, “janeiro”); printf(“ %d - %s - %d ”, dt.dia, dt.mes, dt.ano); } 12 Onde se definem as estruturas? ► Para que as estruturas sejam conhecidas em todo o programa devem ser definidas fora de toda as funções após a inclusão das bibliotecas, ou numa biblioteca que seja incluída no programa. ► Se definir uma estrutura dentro de uma função, a estrutura apenas vai ser conhecida nessa função. 13 #include<stdio.h> #include<stdlib.h> al é uma variável do tipo struct aluno struct aluno { int numero; char nome[101]; }; struct aluno al; main() { printf("Introduza o número: "); scanf("%d", &al.numero); printf("Introduza o nome: "); scanf("%s", al.nome); /* ou - gets(al.nome)*/ printf("\n\t %d - %s\n\n\n",al.numero, al.nome); } system("pause"); 14 Estruturas ► As grandes vantagens da utilização de estruturas são visíveis quando é necessário o armazenamento de grandes quantidades de informação, pois reduz a quantidade de variáveis necessárias. ► Imagine agora que queria armazenar o número e o nome de 23 alunos. O que seria necessário? 15 #include<stdio.h> #include<stdlib.h> al é um array de estruturas struct aluno { int numero; char nome[101]; }; struct aluno al[3]; main() { int i; /* leitura do array */ for(i=0;i<3;i++) { printf("Introdiza o número: "); scanf("%d", &al[i].numero); printf("Introduza o nome: "); scanf("%s", al[i].nome); } /* ou - gets(all[i].nome); */ /* impressão do array */ for(i=0;i<3;i++) { printf("\n\t %d - %s\n\n\n",al[i].numero, al[i].nome); } } system("pause"); 16 Estruturas e Funções ► Revisão: A passagem de parâmetros para uma função pode ser feita: ►Por Valor É enviado o valor do argumento para a função; A função recebe esse valor no parâmetro definido, ou seja, a função fica com uma “cópia” do valor original. ►Por Referência É enviado para a função o endereço de memória do(s) argumento(s). A função recebe nos parâmetros definidos os endereços de memória dos argumentos, ou seja, “a localização na memória” dos valores dos argumentos. 17 Estruturas – passagem por valor #include<stdio.h> #include<stdlib.h> struct pessoa { char nome[101]; int idade; }; void mostrar (struct pessoa ps) main() { struct pessoa p; { strcpy(p.nome, “Maria”); puts(ps.nome); p.idade=16; printf(“\n %d \n“,ps.idade); mostrar(p); } system(“pause”); } 18 Estruturas – passagem por referência #include<stdio.h> #include<stdlib.h> struct pessoa (*ps).idade equivale a ps->idade { gets(ps->nome); char nome[101]; scanf("%d", &ps->idade); int idade; }; main() void ler (struct pessoa *ps) { { } struct pessoa p; printf("Nome: "); ler(&p); gets((*ps).nome); puts(p.nome); printf("Idade: "); printf(“\n %d \n“,p.idade); scanf("%d", &(*ps).idade); system(“pause”); } 19 Estruturas – return ► Se por algum motivo numa função necessitar de devolver uma variável do tipo struct, bastará: struct nome_estrutura (….) { struct nome_estrutura nome_variável; … … return nome_variável; } Por vezes utiliza-se esta técnica quando é necessário de devolver (retornar) mais do que um valor para a função invocadora. 20