TeSP Redes e Sistemas Informáticos Luís Correia
Até agora aprendemos que podemos armazenar vários elementos, mas esses elementos têm que ser todos do mesmo tipo Exemplos: int v[20]; float matriz[5][10]; Como armazenar informação relativa p.e. a um funcionário? 2
No caso de pretendermos agrupar numa única variável, a seguinte informação, relativa a um funcionário: nome (do tipo string) morada (do tipo string) salário (do tipo float) número de filhos (do tipo int) Como fazer? 3
Na linguagem C é possível armazenar numa única variável tipos de dados diferentes Para isso utilizam-se ESTRUTURAS (structs) 4
Uma estrutura é uma coleção de uma ou mais variáveis agrupadas sob um mesmo nome Cada variável de uma estrutura é denominada por campo 5
A definição de estruturas deverá ser efetuada fora da função main, na zona de declarações struct <nome da estrutura> { <tipo1> <variável1>; <tipo2> <variável2>;... <tipon> <variáveln>; }; Nome da estrutura Campos 6
struct funcionario { char nome[80], morada[50]; float salario; int numfilhos; }; Nome da estrutura Campos 7
Após a definição da estrutura e para a podermos manipular é necessário declararmos variáveis do tipo da estrutura definida A declaração é efetuada da seguinte forma: struct <nome da estrutura> variavel1; Nota: a declaração é feita dentro da função main, ou de outras funções implementadas 8
Apenas declaração: struct funcionario f, gerente; struct aluno a; struct coordenadas ponto; variáveis Declaração e iniciação: struct aluno a= {1000, "Pedro Silva ", "Rua das Flores, 2400 Leiria", CET-IMRSI" }; 9
É efetuado utilizando o operador. (ponto) Sintaxe: Exemplo: variável_estrutura.campo struct funcionario f; f.numfilhos = 2; strcpy(f.nome, "Ana Sousa"); scanf("%f", &f.salario); printf("salario = %f\n", f.salario); 10
As estruturas compostas possuem campos cujo o tipo de dados são também estruturas Exemplo: struct data { int dia, mes, ano; }; struct aluno { int numero; char nome[80], morada[50], curso[40]; struct data datanasc; }; 11
Exemplo: struct aluno a; a.datanasc.dia = 10; a.datanasc.mes = 3; a.datanasc.ano = 1975; printf("%d %d %d", a.datanasc.dia, a.datanasc.mes, a.datanasc.ano); scanf("%d", &a.datanasc.dia); 12
Exemplo: struct aluno a= {1000, "Pedro Silva", "Rua das Flores, 2400 Leiria", CET IMRSI", {1, 3, 1980} }; Estrutura do tipo DATA 13
Exemplo: struct aluno a, b;... a = b; ATENÇÃO: As estruturas tem de ser do mesmo tipo! Também é possível a atribuição campo a campo: a.numero = b.numero; strcpy(a.nome, b.nome); 14
A linguagem C permite definir novos nomes para um dado tipo Sintaxe: typedef <tipo> <novo_nome_tipo>; Nota1: Tenha em atenção que a utilização do operador typedef não efetua a criação de um novo tipo, mas apenas, a definição de mais um nome que identifica esse tipo Nota2: A definição de novos nomes para um determinado tipo de dados deve ser efetuada fora das funções 15
Exemplos Definição do nome: typedef int t_idade; Declaração de variáveis: t_idade x, y, z; Definição do nome: typedef float t_vector[100]; Declaração de variáveis: t_vector v, v1; 16
Definição da estrutura: typedef struct { <tipo1> <variavel1>;... <tipon> <variaveln>; }t_estrutura; Declaração de variáveis: t_estrutura x, y; Nota: A utilização do typedef é particularmente conveniente na definição de estruturas, pois evita a necessidade de escrever struct nomedaestrutura sempre que a estrutura seja referenciada. 17
Exemplo 1: typedef struct{ char nome[80], morada[50]; float salario; int numfilhos; } t_funcionario; Declaração de variáveis: t_funcionario f, gerente; tipo variável 18
Exemplo 2: typedef struct { int dia, mes, ano; }t_data; typedef struct { int numero; char nome[80], morada[50], curso[40]; t_data datanasc; }t_aluno; 19
a) Declare a estrutura T_RELOGIO que permita armazenar a informação relativa às horas, aos minutos e aos segundos. b) Elabore as seguintes funções: inicia_relogio que efetua a leitura, a partir do teclado, das horas, dos minutos e dos segundos. mostra_relogio que mostra no écran a informação relativa às horas, minutos e segundos. 20
#include <stdio.h> #include <stdlib.h> typedef struct { int horas; int minutos; int segundos; }T_RELOGIO; int main(int argc, char *argv[]) { T_RELOGIO relogio; relogio = inicia_relogio(); mostra_relogio(relogio); getch(); return 0; } void mostra_relogio(t_relogio relogio); T_RELOGIO inicia_relogio(); void mostra_relogio(t_relogio relogio) { } printf("a hora inserida foi: %dh%dm%ds", relogio.horas, relogio.minutos, relogio.segundos); 21
T_RELOGIO inicia_relogio() { T_RELOGIO rel; printf("insira as horas:\n"); scanf("%d", &rel.horas); printf("insira os minutos:\n"); scanf("%d", &rel.minutos); printf("insira os segundos:\n"); scanf("%d", &rel.segundos); } return rel; 22
t_aluno a; Variável a do tipo t_aluno A variável a permite armazenar a informação relativa a um aluno... E se pretendermos armazenar a informação relativa a 100 alunos?... 23
Declaramos 100 variáveis do tipo t_aluno? OU Declaramos um vetor com capacidade para armazenar a informação relativa aos 100 alunos? 24
t_aluno v[100]; variável tipo dos elementos do vector nº máximo de elementos 0 1 2 3... 97 98 99... v[0] v[1] V[2] v[3]... V[97] V[98] V[99] 25
Sintaxe: nomedovector[posição do elemento].campo Exemplos: v[3].numero = 1000; strcpy(v[3].nome, "Rui Sousa"); strcpy(v[3].morada, "Leiria"); strcpy(v[3].curso, "Eng. Inf"); v[3].datanasc.dia = 5; v[3].datanasc.mes = 2; v[3].datanasc.ano = 1974; 26
Exemplos: printf("%d %s %s %s %d %d %d", v[3].numero, v[3].nome, v[3].morada, v[3].curso, v[3].datanasc.dia, v[3].datanasc.mes, v[3].datanasc.ano); scanf("%d", &v[3].numero); gets(v[3].nome); scanf ("%d", &v[3].datanasc.dia); 27
t_aluno a;... v[3] = a; A variável v tem de ser do tipo t_aluno 28
Conteúdo retirado de: Slides Linguagem C, Micaela Esteves, DEI-ESTG Slides Programação I, Vítor Távora, DEI-ESTG Slides, Programação - Eng. Automóvel, DEI ESTG Damas, Luís Linguagem C, Editora FCA, 1999 29