Você está na página 1de 70

Programao II

Estruturas. Enumerao. Vectores de estruturas.

Programao II EE 2009/2010 1
Introduo
Nos tipos de dados estudados em Programao I,
nomeadamente nos vectores e matrizes,
podemos armazenar vrios elementos, mas esses
elementos tm que ser todos do mesmo tipo.
Exemplos:
int v[20];
float matriz[5][10];

2
Introduo
No caso de pretendermos agrupar numa nica
varivel, a seguinte informao, relativa a um
funcionrio:

nome (do tipo string)

morada (do tipo string)

salrio (do tipo float)

nmero de filhos (do tipo int)

3
Introduo
Ser possivel, na linguagem C, armazenar
numa nica varivel dados de tipos
diferentes?

4
Introduo
Na linguagem C, possvel armazenar
numa nica varivel dados de tipos
diferentes usando ESTRUTURAS (structs)

5
Estrutura (struct)
 Uma estrutura uma coleco de uma ou mais
variveis agrupadas sob um mesmo nome.

 Cada varivel de uma estrutura denominada


por campo.

6
Definio e declarao
struct <nome da estrutura>
{
<tipo1> <varivel1>;
campo
<tipo2 <varivel2>;
...
<tipoN> <varivelN>;
}<lista de variveis>;

7
Definio e declarao
 Nota Importante: o <nome da estrutura>
pode ser omitido, caso seja declarada uma
<lista de variveis> e vice-versa. No entanto,
no se pode omitir ambas.

Apenas definio Definio e declarao


struct aluno struct
{ {
int numero; int x, y;
char nome[80], escola[50], curso[50], morada[80]; } p1, p2;
};

8
Exemplo definio da
estrutura funcionario
struct funcionario Nome da estrutura
{
char nome[80], morada[50];
float salario;
int numfilhos; campo
};

Nota: a definio de estruturas dever ser efectuada fora da funo


main, na zona de declaraes
9
Exemplo definio da
estrutura aluno
struct aluno Nome da estrutura
{ campo
int numero;
char nome[80], morada[50], curso[40];
};

10
Exemplo definio da
estrutura coordenadas
struct coordenadas Nome da estrutura
{
int x, y;
};
campo

11
Declarao de variveis
 Aps a definio da estrutura e para a podermos
manipular necessrio declararmos variveis do
tipo da estrutura definida.

 A declarao efectuada da seguinte forma:

struct <nome da estrutura> variavel1, variavel2,..., variavelN;

12
Exemplos
 struct funcionario f, gerente;

 struct aluno a;
varivel
 struct coordenadas ponto;

13
Declarao e iniciao de
variveis
struct aluno a= {1000,
"Pedro Silva ",
"Rua das Flores, 2400 Leiria",
"Eng. Informtica"
};

14
Acesso aos campos de uma
estrutura
efectuado utilizando o operador .

Sintaxe:
varivel_estrutura.campo

15
Acesso aos campos de uma
estrutura - Exemplo
struct funcionario f;

 f.numfilhos = 2;
 strcpy(f.nome, "Ana Sousa");
 scanf("%f", &f.salario);
 printf("Salario = %f\n", f.salario);

16
Acesso aos campos de uma
estrutura - Exemplos
struct aluno a;

 a.numero = 1102;
 printf("O nome %s\n", a.nome);
 gets(a.morada);

17
Estruturas compostas
struct data{
int dia, mes, ano;
};

struct aluno{
int numero;
char nome[80], morada[50], curso[40];
struct data datanasc;
};

18
Acesso aos campos de uma
estrutura - Exemplos
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);

19
Declarao e iniciao de
variveis
struct aluno a= {1000,
"Pedro Silva",
"Rua das Flores, 2400 Leiria",
"Eng. Informtica",
{1, 3, 1980}
};

20
Atribuio de estruturas
struct aluno a, b;
....
a = b;

 Tambm possvel a atribuio campo a


campo:
a.numero = b.numero;
strcpy(a.nome, b.nome);

21
Declarao de ponteiro para
estrutura
struct nomeDaEstrutura *ponteiroParaEstrutura;

Exemplo:
struct aluno *p;

22
Acesso aos campos

ponteiroparaestrutura->campo

Ou

(*ponteiroparaestrutura).campo

23
Acesso aos campos - Exemplos
struct aluno *p;
...
p->nome ou (*p).nome
p ->morada (*p). morada
p ->curso (*p). curso
p ->datanasc.dia (*p). datanasc.dia
p ->datanasc.mes (*p). datanasc.mes
p ->datanasc.ano (*p). datanasc.ano
24
Acesso aos campos - Exemplos
 gets(p->nome);
 scanf("%d", &p->numero);
 gets(p->morada);
 gets(p->curso);
 scanf("%d", &p->datanasc.dia);
 scanf("%d", &p->datanasc.mes);
 scanf("%d", &p->datanasc.ano);
 printf("%d %s %s %s %d %d %d", p->numero,
p->nome, p->morada, p->curso, p->datanasc.dia,
p->datanasc.mes, p->datanasc.ano);

25
Funes: Passagem de parmetros por
referncia de estruturas
Nas funes a passagem de parmetros de estruturas deve ser
efectuada por referncia porque:
 A passagem de parmetros de uma estrutura por valor
implicaria a cpia de toda a informao contida nessa estrutura,
sendo um factor de atraso no desempenho do programa.

 Utilizando passagem de parmetros por referncia todo o


processo se torna mais rpido porque, em vez de ser efectuada
a cpia de toda a informao contida na estrutura, passado
apenas o endereo do local onde est a informao.

26
Exerccio
a) Declare a estrutura relogio que permita armazenar a
informao relativa s horas, aos minutos e aos segundos.

b) Elabore as seguintes funes:


inicia_relogio que efectua a leitura, a partir do teclado,
das horas, dos minutos e dos segundos.

mostra_relogio que mostra no cran a informao relativa


s horas, minutos e segundos.

actualiza_relogio que permite acrescentar um segundo ao


instante actual.

27
Exerccio
c) Elabore um programa que permita:

- Efectuar a leitura da informao relativa a um relgio, ou


seja, as horas, minutos e segundos;

- Actualizar esta informao;

- Mostrar no cran a informao actualizada.

28
Tipos de dados definidos pelo
programador
A linguagem C permite definir novos nomes para um
dado tipo.
Tipo de dados j existente Novo nome para o tipo
Sintaxe:
typedef <tipo> <novo_nome_tipo>;

Nota1: Tenha em ateno que a utilizao do operador typedef


no efectua a criao de um novo tipo, mas apenas, a definio de
mais um nome que identifica esse tipo.

Nota2: A definio de novos nomes para um determinado tipo de


dados deve ser efectuada fora das funes.
29
Tipos de dados definidos pelo
programador - Exemplos
 typedef int t_idade;

Declarao de variveis:
t_idade x, y, z;

 typedef float t_vector[100];

Declarao de variveis:
t_vector v, v1;

30
Tipos de dados definidos pelo
programador - Estruturas
typedef struct {
<tipo1> <variavel1>;
...
<tipoN> <variavelN>;
}t_estrutura;

Declarao de variveis:
t_estrutura x, y;

Nota:
A utilizao do typedef particularmente conveniente na definio de
estruturas, pois evita a necessidade de escrever struct
nomedaestrutura sempre que a estrutura seja referenciada.

31
Tipos de dados definidos pelo
programador - Exemplos
 typedef struct{
char nome[80], morada[50];
float salario;
int numfilhos;
} t_funcionario;

Declarao de variveis:

t_funcionario f, gerente;

tipo varivel

32
Tipos de dados definidos pelo
programador - Exemplos
typedef struct {
int dia, mes, ano;
}t_data;

typedef struct {
int numero;
char nome[80], morada[50], curso[40];
t_data datanasc;
}t_aluno;

33
Definio de uma Enumerao
 Na linguagem C uma enumerao
um conjunto de constantes inteiras com
um dado nome.

34
Definio e declarao de
enumeraes
enum <nome da enumerao>
{
<nome 1> [=<valor],
<nome 2 [=<valor],
...
<nome N> [=<valor],
}<lista de variveis>;

Nota: no caso de ser omitido o <valor> de um dos nomes, este


toma o valor seguinte ao valor atribudo ao ltimo nome. Por
omisso, o primeiro nome de uma enumerao toma o valor 0.

35
Definio e declarao de
enumeraes
 Nota: o <nome da enumerao> pode ser
omitido, caso seja declarada uma <lista de
variveis> e vice-versa. No entanto, no se
pode omitir ambas.
Apenas definio Definio e declarao

enum estacao {Primavera, Verao, Outono, enum {Primavera, Verao, Outono,


Inverno}; Inverno} e, e1;

36
Definio de enumeraes:
exemplos
 enum dia_semana {segunda, terca, quarta, quinta,
sexta, sabado, domingo};
/* Internamente efectuada a atribuio:
segunda = 0, ..., domingo = 6, o que permite
comparar dois elementos do tipo enum dia_semana */

 enum zona {norte = 1, centro, sul};


/* centro = 2 e sul = 3*/

37
Definio de enumeraes:
exemplos
 enum serie {A = 65, B, C, D, E, F};

 enum saltos {quatro = 4, sete = 7, mdoze = -12};


/* No respeita a ordem*/

 enum sexo {feminino, masculino};

38
Enumerao: declarao de
variveis
 Aps a definio de uma enumerao e para a
podermos manipular necessrio declaramos variveis
do tipo da enumerao definida.

 A declarao de variveis efectuada da seguinte


forma:

enum <nome da enumerao> var1, var2, ...;

39
Enumerao: declarao de
variveis
Exemplos:
 enum dia_semana d1, d2;
 enum sexo s;
 enum serie s1; varivel

40
Enumerao: declarao e
iniciao de variveis
Exemplo:
enum dia_semana d1 = terca;
ou
enum dia_semana d1 = (enum dia_semana) 1;
Exemplo:
enum sexo s = masculino;
ou Operao de casting

enum sexo s = (enum sexo) 1;

41
Enumerao: atribuio
enum dia_semana d1, d2;
enum sexo s;
Operao de casting
 Exemplos:
 s = (enum sexo) 1;  s = masculino;
 d1 = terca;  d1 = (enum dia_semana) 1;
 d2 = d1;

Operao de casting

42
Enumerao: escrita e leitura
 Exemplos:
 printf("%d", d1);
 scanf ("%d", &d1);

Nota: deve efectuar proteco dos dados de entrada


de forma a que o valor lido, a partir do teclado, esteja
compreendido entre 0 e 6

43
Enumerao: Escrita
switch(d1)
{
case 0: printf("Segunda feira");
break;
case 1: printf("Tera feira");
break;
....
case 6: printf("Domingo");
break;
}

44
Enumerao: Escrita
switch(d1)
{
case segunda: printf("Segunda feira");
break;
case terca: printf("Tera feira");
break;
....
case domingo: printf("Domingo");
break;
}

45
Enumerao e typedef
 Pode-se tambm utilizar o typedef para dar um
outro nome a uma enumerao:

typedef enum {...} <novo_nome_tipo>;

46
Enumerao e typedef:
Exemplos
 typedef enum {Falso, Verdade} t_booleano;

Declarao de variveis:
t_booleano var1, var2;

 typedef enum {feminino, masculino} t_sexo;

Declarao de variveis:
t_sexo s, sx;

47
Enumerao e typedef:
Exemplos
typedef struct {
int dia, mes, ano;
}t_data;

typedef enum {feminino, masculino} t_sexo;

typedef struct {
int numero;
char nome[80], morada[50], curso[40];
t_data datanasc;
t_sexo sexo;
}t_aluno;

48
Enumerao - Exerccio
Considere a seguinte declarao:

typedef enum {segunda, terca, quarta, quinta, sexta, sabado,


domingo} t_dia_semana;

Elabore as seguintes funes:

 ler_dia_semana - que efectua a leitura a partir do teclado


de um dia da semana.

 mostra_dia_semana que mostra no cr o dia da


semana.

49
Enumerao - Exerccio
 Elabore um programa que efectue a leitura, a partir
do teclado, de um dia da semana e mostre no cran
esse dia.

50
Vectores de Estruturas - Introduo
Considere as seguintes declaraes:
typedef struct {
int dia, mes, ano;
}t_data;

typedef enum {feminino,masculino} t_sexo;

typedef struct {
int numero;
char nome[80], morada[50], curso[40];
t_data datanasc;
t_sexo sexo;
}t_aluno;
51
Vectores de Estruturas - Introduo
t_aluno a;
Varivel a do tipo t_aluno

 A varivel a permite armazenar a


informao relativa a um aluno...
 E se pretendermos armazenar a
informao relativa a 100 alunos ?...

52
Vectores de Estruturas - Introduo
 Declaramos 100 variveis do tipo
t_aluno?

Ou

 Declaramos um vector com capacidade


para armazenar a informao relativa
aos 100 alunos?

53
Vectores de Estruturas
t_aluno v[100];
n mximo de elementos
varivel
tipo dos elementos do vector

0 1 2 3 ... 97 98 99

...

v[0] v[1] V[2] v[3] ... V[97] V[98] V[99]

54
Vectores de Estruturas acesso aos
campos de um elemento

nomeDoVector[posio do elemento].campo

55
Vectores de Estruturas acesso aos
campos de um elemento: 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;

56
Vectores de Estruturas acesso aos
campos de um elemento: 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);

57
Vectores de Estruturas acesso aos
campos de um elemento: Exemplos
 scanf("%d", &v[3].numero);
 gets(v[3].nome);
 gets( v[3].morada);
 gets(v[3].curso);
 scanf ("%d", &v[3].datanasc.dia);
 scanf ("%d", &v[3].datanasc.mes);
 scanf ("%d", &v[3].datanasc.ano);

58
Vectores de Estruturas
atribuio
t_aluno a;

...

v[3] = a;

59
Vectores de Estruturas Escrita no
ecr de toda a informao
int i;
...
for (i=0; i<100; i++)
printf("%d %s %s %s %d %d %d",
v[i].numero, v[i].nome, v[i].morada,
v[i].curso, v[i].datanasc.dia, v[i].datanasc.mes,
v[i].datanasc.ano);

60
Vectores de Estruturas Leitura a
partir do teclado de toda a informao
for (i=0; i<100; i++)
{
scanf("%d", &v[i].numero);
gets(v[i].nome);
gets( v[i].morada);
gets(v[i].curso);
scanf ("%d", &v[i].datanasc.dia);
scanf ("%d", &v[i].datanasc.mes);
scanf ("%d", &v[i].datanasc.ano);
}

61
Exerccio
a) Considere as seguintes declaraes:
typedef struct {
int dia, mes, ano;
}t_data;

typedef enum {feminino, masculino} t_sexo;

typedef struct {
int numero;
char nome[80], morada[50], curso[40];
t_data datanasc;
t_sexo sexo;
}t_aluno;
62
Exerccio
Declare uma estrutura de dados que permita
armazenar os seguintes dados relativos a uma
turma:
 Nome da turma

 Nmero de alunos que existem actualmente na


turma

 Informao sobre os alunos da turma (mximo 30


alunos)

63
Exerccio (continuao)
b) Elabore as seguintes funes:
 ler_data: que permite efectuar a leitura, a partir do
teclado, dos dados relativos a uma data;

 mostra_data: que mostra no ecr os dados


relativos a uma data;

 ler_sexo: que permite efectuar a leitura a partir do


teclado da informao relativa ao sexo;

 mostra_sexo: que mostra no ecr a informao


relativa ao sexo;
64
Exerccio (continuao)
 ler_aluno: que permite efectuar a leitura, a partir
do teclado, dos dados de um aluno;

 mostra_aluno: que mostra no ecr os dados de um


aluno;

 ler_turma: que permite efectuar a leitura, a partir


do teclado, dos dados de uma turma;

 mostra_turma: que mostra no ecr os dados de


uma turma.

65
Exerccio (continuao)
 inserir_aluno: insere um aluno na turma, caso seja
possvel;

 posicao_aluno_turma_num: devolve a posio do


aluno no vector; Caso no encontre devolve 1; A
pesquisa deve ser realizada pelo nmero do aluno;

 posicao_aluno_turma_nome: devolve a posio


do aluno no vector; Caso no encontre devolve 1; A
pesquisa deve ser realizada pelo nome do aluno;

 consultar_aluno: consulta dados do aluno por


nmero ou por nome;
66
Exerccio (continuao)
 remover_aluno: remove um aluno do vector de
alunos

 alterar_aluno: altera dados de um aluno

 percentagem_sexo: devolve a % de alunos de


determinado sexo;

 listar_curso: lista no ecr os alunos de um


determinado curso

67
Exerccio (continuao)
 calcular_idade: devolve a idade de um aluno;

 listar_idades: mostra o nome e a idade de todos


os alunos;

 media_idades: devolve a mdia de idades dos


alunos;

68
Exerccio (continuao)
 menu: mostra no ecr as seguintes opes:
 Inserir
 Listar
 Consultar
 Remover
 Alterar
 % sexo
 Alunos de um curso
 Idade dos alunos e mdia de idades
 Sair

69
Exerccio (continuao)
 menu_turma: permite executar as
opes do menu

c) Elabore um programa que permita a


um utilizador realizar a gesto de uma
turma de alunos utilizando as opes
do menu anterior.

70

Você também pode gostar