2. Estruturas
de
Dados
Já
percebemos
que
ao
executar
um
programa
os
valores
lidos
sucessivamente
“limpam”
o
valor
anterior
da
variável
utilizada…
E
se
pretendermos
guardar
t e m p o r a r i a m e n t e
u m
determinado
conjunto
de
valores?
Como
fazemos?
Armazenar…
3. ¡ Arrays
ou
Vectores
¡ São
cadeias
de
variáveis
do
mesmo
tipo,
relacionados
entre
si
e
que
ocupam
determinada
posição
indicada
por
um
índice
§ Arrays
de
inteiros
§ Arrays
de
reais
§ Arrays
de
strings
§ …
¡ São
variáveis
indexadas,
com
um
número
fixo
de
elementos
do
mesmo
tipo
èESTRUTURAS
DE
DADOS
ESTÁTICAS
4. ¡ Arrays
ou
Vectores
¡ São
cadeias
de
variáveis
do
mesmo
tipo,
relacionados
entre
si
e
que
ocupam
determinada
posição
indicada
por
um
índice
§ Arrays
de
inteiros
§ Arrays
de
reais
§ Arrays
de
strings
§ …
¡ São
variáveis
indexadas,
com
um
número
fixo
de
elementos
do
mesmo
tipo
èESTRUTURAS
DE
DADOS
ESTÁTICAS
5. ¡ Unidimensionais
-‐
vectores
Arrays
unidimensionais
-‐
Vectores
§ Os
elementos
de
um
vector
são
sempre
armazenados
em
posições
contíguas
da
memória.
§ Os
elementos
de
um
vector
declarado
mas
não
inicializado
contêm
valores
aleatórios.
§ O
índice
do
primeiro
elemento
de
um
vector
é
sempre
ZERO.
6. § Se
o
número
de
inicializações
for
menor
que
o
número
de
elementos
do
vector,
os
elementos
em
falta
são
inicializados
com
o
valor
zero.
§ É
possível
declarar
um
vector
sem
indicar
o
número
de
elementos
que
irá
conter,
desde
que
estes
sejam
colocados
na
inicialização.
§ Não
se
podem
declarar
vectores
sem
dimensão.
8. A
expressão
int
codigo[6];
Reserva
seis
posições
de
memória
de
tipo
int
9. A
expressão
int
codigo[]={123,435,234,987,657,354};
Reserva
seis
posições
de
memória
de
tipo
int
e
atribui-‐
lhes
valores.
O
compilador
dimensiona
o
vector
com
o
nº
de
elementos
atribuídos
10. A
expressão
int
codigo[6]={123,435,234};
Reserva
seis
posições
de
memória
de
tipo
int
e
atribui
valores
aos
três
primeiros.
O
compilador
dimensiona
o
vector
com
o
nº
de
elementos
referido…
6.
11. ¡ Exemplo:
#include
<iostream>
using
namespace
std;
main(
)
{
int
i,
a[6];
a[0]=
2;
a[1]=
8;
a[2]=
5;
a[3]=
3;
a[4]=
4;
a[5]=
6;
for(i=0;
i<6;
i++)
{
cout<<“a[“<<i<<“]
=
“<<a[i]<<“n”;
}
system(“PAUSE”);
}
Recordam-‐se
dos
ciclos
de
repetição?
Vamos
usá-‐los
para
percorrer
o
vector…
12. Tem
de
ser
feita
elemento
a
elemento.
Sem
recurso
a
ciclos
Exemplo:
a[0]=
2;
a[1]=
8;
a[2]=
5;
a[3]=
3;
a[4]=
4;
a[5]=
6;
Com
recurso
a
ciclos
Exemplo:
for(i=0;
i<7;
i++)
{
cin>>a[i];
}
13. função
srand()
e
rand()
#include
<stdlib.h>
#include
<iostream>
using
namespace
std;
main(
)
{
int
i,
vector[10];
srand(time(NULL));
for(i=0;i<10;i++)
{
vector[i]=rand();
}
cout<<“Numeros
aleatorios
positivosn";
for(i=0;i<10;i++)
{
cout<<"vector["<<i<<"]="<<vector[i]<<"tn";
}
system("PAUSE");
}
Gera
números
aleatórios
e
armazena-‐os
num
vector.
14. Valor
Valor
Valor
Valor
Valor
Valor
Valor
Valor
Valor
¡ Cada
elemento
do
vector
tem
de
ser
tratado
individualmente.
Sem
recurso
a
ciclos
Exemplo
soma
=
a[0]
+
a[1]
+
a[2]
+
a[3]
+
a[4]
+
a[5];
Com
recurso
a
ciclos
Exemplo
soma=0;
for(i=0;
i<7;
i++)
{
soma
=
soma
+
a[i];
}
15. Actividade
1:
Comecemos
por
treinar
a
escrita
/
leitura
de
valores
de
e
para
um
vector
de
inteiros:
§ Peça
ao
utilizador
para
introduzir
20
valores
que
deverão
ser
guardados
num
vector;
§ Limpe
o
ecrã
no
da
introdução
dos
valores;
§ Imprima
os
valores
que
o
utilizador
introduziu
por
ordem
de
introdução
e
o
índice
correspondente;
§ No
final
imprima
também
a
soma
de
todos
os
valores:
Actividade
2:
Crie
um
programa
que
permita
a
introdução
de
n
(máximo
100)
valores
inteiros,
este
número
é
definido
pelo
utilizador.
Em
seguida,
deverá
imprimi-‐los
pela
ordem
inversa
da
introdução.
16. Actividade
3:
Crie
um
programa
que
leia
a
pontuação
dos
16
clubes
da
1ª
Liga,
época
2012
/2013…
que
visionários…
depois
de
fazer
a
leitura
dos
pontos
(sem
tendências
clubísticas
:o)
deve
dizer
quem
é
o
Campeão
e
o
último
classificado,
com
os
respectivos
pontos.
Deve
também
escrever
qual
a
média
de
pontos
dessa
época.
Dica:
Utilize
dois
vectores,
um
para
os
pontos
(inicialmente
vazio)
e
outro
para
o
nome
das
equipas
(que
deve
ser
inicializado
com
o
nome
das
equipas).
Faça
corresponder
a
primeira
posição
do
vector
de
pontos
com
a
primeira
posição
do
vector
equipas,
ou
seja:
Vector
Pontos
49
49
35
…
15
14
Vector
Equipas
FC
Porto
SL
Benfica
P.
Ferreira
…
Beira-‐Mar
Moreirense
Índice
0
1
2
…
15
16
Índice
0
1
2
…
15
16
17. Actividade
4:
Implemente
um
programa
que
peça
ao
utilizador
o
número
de
elementos
de
um
vector
e
o
preencha.
No
final,
o
mesmo
vector
deve
ter
os
seus
elementos
pela
ordem
inversa.
Input:
Número
de
Elementos
do
vector:
3
Indíce
0:
1
Indíce
1:
2
Indíce
2:
3
Output:
Elementos
pela
ordem
inversa:
3
2
1
Sugestão:
utilize
uma
variável
auxiliar
para
efectuar
a
troca…
18. Actividade
5:
Faça
um
programa
como
o
anterior,
mas
em
que
os
valores
invertidos
são
colocados
num
outro
vector
inicialmente
vazio.
Input:
Número
de
Elementos
do
vector:
3
Indíce
0:
1
Indíce
1:
2
Indíce
2:
3
Output:
vector
um:
1
2
3
vector
dois:
3
2
1
19. Actividade
6:
Implemente
um
programa
em
que
são
dados
dois
vectores
diferentes
com
o
mesmo
tamanho
(5
elementos)
em
que
o
seu
conteúdo
deve
ser
trocado,
ou
seja,
no
final
os
valores
do
vector
dois
devem
estar
no
vector
um
e
vice-‐versa.
Inicialmente:
vector
1:
0
1
2
3
4
vector
2:
5
6
7
8
9
Output:
vector
1:
5
6
7
8
9
vector
2:
0
1
2
3
4
20. Uma
dimensão
já
começa
a
ser
pouco
para
nós
e
oferece
pouco
desafio…
…
mas,
apesar
de
as
3
dimensões
(3D)
estarem
na
moda,
também
é
demais
e
é
preciso
óculos
…
…
fiquemos
então
pelas
duas
dimensões,
que
é
como
quem
diz,
pelas:
Matrizes
(ou
Arrays
/
Vectores
Bidimensionais)
Como
será
então
a
representação
de
uma
matriz
tendo
em
conta
que
tem
duas
dimensões???
Algum
iluminado???
Alguém???
§ Duas
dimensões
(linhas
e
colunas);
§ Disposição
faz
lembrar
tabela;
§ Podem
ser
vistas
como:
vector
de
vectores;
§ Todos
os
elementos
são
do
mesmo
tipo;
§
…
Colunas
Linhas
21. Exemplo
da
declaração
de
um
array
bidimensional:
int
b[2][3]
Qual
o
nome
do
array???
Quantas
linhas
e
colunas
o
compõe???
Trata-‐se
de
uma
matriz
de
nome
b
com
2
linhas
e
3
colunas…
Quantos
elementos
/
valores
pode
conter
/
guardar?
6,
como???
Fácil:
2
linhas
x
3
colunas
=
6
“células”
Como
se
pode
aceder
a
cada
um
dos
elementos
do
vector???
Ainda
mais
fácil:
Colunas
L
i
n
h
a
0
1
2
0
b[0][0]
b[0][1]
b[0][2]
1
b[1][0]
b[1][1]
b[1][2]
Com
base
nesta
matriz:
Qual
o
valor
de
b[0][2]???
Qual
o
valor
de
b[2][0]???
Qual
o
valor
de
b[1][0]???
Como
acede
ao
valor
56?
E
1?
22. Coloca-‐se
agora
uma
questão
pertinente???
Como
percorrer
os
elementos
de
uma
matriz???
Boa
pergunta,
quase
que
parecia
minha…
O
raciocínio
é
simples,
se
num
vector
se
utilizava
um
ciclo
for…
…
numa
matriz
utilizam-‐se
dois:
§ Um
para
percorrer
as
linhas;
§ Outro
para
percorrer
todas
as
respectivas
células
dessa
linha
(colunas).
Ou
seja:
23. Já
sei
o
que
estão
a
pensar…
e
não,
não
tenho
nenhum
dom
adivinhatório,
mas
desta
vez
é
fácil:
“E
o
C++
Professor(a)???
Vamos
traduzir
isto
para
a
nossa
linguagem,
o
C++
…”
Declaração
da
matriz
e
de
duas
variáveis
para
percorrer
o
vector
(linhas
e
colunas):
§ int
b[2][3]
(tipo_vector[num_linhas][num_colunas]);
§ int
i,
j;
(em
que
i
vai
ser
a
variável
que
controla
as
linhas
e
j
as
colunas,
podem
ter
outro
nome).
Agora
está
na
altura
de
aplicar
todos
os
seus
conhecimentos
de
vectores
para
percorrer
a
matriz,
não
se
esqueça
…
dois
ciclos:
§ O
mais
exterior
para
as
linhas:
for(i
=
0;
i
<
2;
i++)
{
§ O
mais
interior,
para
as
colunas
de
cada
linha:
for(j
=
0;
j
<
2;
j++)
{
Isto
já
merece
uma
traçagem
não
acham???
Bem,
eu
acho
…
24. Que
tal
um
exemplo???
Já
dava
uma
ajudinha,
não
é
verdade???
Uma
mãozinha,
quiçá
duas
…
Então
cá
vai
um
exemplo,
é
só
passar
meus
senhores
…
é
só
passar
…
int
main
(
)
{
int
mat
[5][3]
int
n
,m;
for
(n
=
0;
n
<
5;
n++)
{
for
(m
=
0;
m
<
3;
m++)
{
mat
[n]
[m]
=
(n
+
1)
*
(m
+
1);
}
}
system(“PAUSE”);
}
25.
Atividade
7:
Escreva
um
programa
que
atribua
os
números
do
Euromilhões
a
uma
matriz
e
os
imprima
como
se
tratasse
de
um
boletim.
Output:
§ São
50
números;
§ Cada
linha
tem
6
números;
§ Começa
do
número
um:
26. Atividade
8:
Imagine
que
vai
ao
cinema
com
uns
amigos
para
ver
o
filme
Rango,
acabadinho
de
estrear.
Ao
pedir
os
bilhetes,
a
meninada
bilheteira
diz-‐lhe
que
os
lugares
são
marcados
e
começa
a
marcá-‐
los
à
mão
numa
folhinha
de
papel.
Que
tal
dar-‐lhe
uma
mãozinha???
Nada
de
ideias…
e
não,
não
é
a
preencher
a
grelha
que
a
menina
tem
à
frente.
Para
fazerem
mesmo
sucesso
e
a
impressionarem,
que
me
dizem
a
chegarem
no
dia
a
seguir
com
um
programa
que
permite:
§ Marcar
lugares;
§ Desmarcar
lugares;
§ Apresentar
planta
do
cinema;
§ …
27. Atividade
9:
Imagine
que
os
Professores
de
PSI
estão
cansados
de
programar…só
mesmo
em
imaginação
:o)
mas
pretendem
um
programinha
que
registe
as
notas
dos
alunos
do
turno
aos
módulos
da
disciplina.
Ajude
os
Professores
na
elaboração
desse
programa
utilizando
uma
matriz:
§ Preencher
inicialmente
a
matriz
com-‐1
(módulo
não
dado);
§
Utilizador
pode
preencher
as
notas
por
aluno,
por
módulo,
ou
especificando
um
determinado
aluno
/módulo
(psi[alu][mod]);
§
Se
nota
<
10
é
colocado
0
na
célula
da
matriz
senão
é
colocada
a
nota
entre
10
e
20;
§ Deve
ser
possível
ter
acesso
a
informação
como:
ü
Módulos
em
atraso
de
um
aluno
qualquer;
ü
Média
dos
alunos
(ou
de
um
aluno);
ü
Média
de
Módulos
(ou
de
um
módulo);
ü
Módulos
com
maior
sucesso
/
dificuldades;
Módulos
Num
do
Aluno
Mód
1
Mód
2
…
0
13
0
-‐1
1
12
0
-‐1
2
14
15
-‐1
…
…
…
-‐1
12
0
0
-‐1
28. Atividade
9
-‐
Sugestões
Sugestão
de
Menus
:
1.
Preencher
Matriz
1.1
Por
Módulo
1.2
Por
Aluno
1.3
Aluno
/
Módulo
2.
Estatísticas
Alunos
2.1
Média
Todos
Alunos
2.2
Média
Aluno
2.3
Aluno
com
Mais
/
Menos
Módulos
2.4
Nota
Mais
Alta
/
Baixa
de
Aluno
3.
Estatísticas
Módulos
3.1
Média
Todos
Módulos
3.2
Média
Módulo
3.3
Módulo
com
Maior
/
Menor
Aproveitamento
3.4
Alunos
que
(Não)
Fizeram
Módulo
4.
Visualizar
Resultados
5.
Sair
Valores
da
Matriz:
1.
Inicialmente
tudo
a
-‐1
(módulo
não
leccionado)
2.
0
representa
módulo
não
feito
(0
<
nota
<
10)
3.
Nota
entre
10
e
20,
é
a
nota
final
ao
módulo
Utilize
vectores
para
guardar
nomes
e
designação
de
módulos
e
não
os
apresentar
como
valores
entre
0
e
…
nomes[10]
=
{“Tiago”,
“Pedro”,
…,
“Nuno”}
modulos[5]
=
{“Mod1”,
“Mod2”,
…
“Mod5”}
29. Já
têm
utilizado
um
pseudo
tipo
de
dados,
string,
em
alguns
programas
elaborados
nas
aulas.
No
entanto,
será
esta
a
forma
mais
correcta
de
declarar
uma
string???
Não…
Uma
string
não
é
mais
que
um
vector
de
caracteres
(o
que
já
não
é
pouco),
pelo
que
deve
ser
declarada
como:
char
s[número
de
caracteres
máximo
da
string];
Outra
forma
de
criar
uma
string
é
inicializá-‐la
aquando
da
sua
declaração:
char
s[
]
=
{‘P’,
‘S’,
‘I’,
‘0’};
Ou
char
s[
]
=
“PSI”;
Notas:
Apesar
de
PSI
ter
3
caracteres,
a
string
terá
tamanho
4;
A
2ª
forma
não
precisa
do
‘0’
no
final
porque
ao
usar
aspas
ele
é
colocado
no
final
de
forma
automática;
O
‘0’
indica
o
fim
da
string,
uma
vez
que
se
pode
inicializar
string
com
mais
posições
que
as
utilizadas
…
30. Vejamos
então
o
seguinte
exemplo…
Uma
string
(str)
de
20
caracteres:
§
char
str[20]={’B’,’o’,’m’,’
’,’d’,’i’,’a’,’
’,’m’,’u’,’n’,’d’,’o’,’0’};
§
char
str[20]="Bom
dia
mundo";
Um
outro
aspecto
importante,
não
se
pode
fazer
atribuição
directa
de
uma
string
a
um
array:
str
=
“Bom
Dia
Mundo”;
str[
]
=
“Bom
Dia
Mundo”;
Só
pode
ser
feita
na
declaração
(inicialização)
ou
e
uma
das
formas
que
vamos
ver
mais
à
frente.
31. Podem
ser
utilizadas
as
funções
normais
de
input
e
output
,
ou
seja,
cin
e
cout…
Senão,
vejamos
a
seguinte
declaração:
char
s[8]
=
“PSI2013”;
A
instrução
cout
<<
s;
Faz
aparecer
/
escrever
no
ecrã:
PSI2013
O
mesmo
aconteceria,
mas
em
linhas
diferentes,
com:
for(i=0;
i
<
5;
i++)
{
//
caracter
a
caracter
cout
<<
s[i]
<<
endl;
}
Para
fazer
a
leitura
de
uma
string
para
um
array,
poderíamos
fazer:
cin
>>
s;
(Problema
a
nível
dos
espaços
entre
as
palavras)
32. Actividade
10:
Observe
com
atenção
o
seguinte
programa
e
a
utilização
de
strings
/
arrays
de
caracteres:
#include<iostream>
using
namespace
std;
Int
main()
{
char
discip[4]
=
“PSI”,
nome[20];
cout
<<
discip;
cout
<<
endl
<<
“Escreva
o
seu
nome:
”
<<
endl;
cin>>nome;
cout
<<
discip
<<
“
…
Is
Simply
The
Best
…”
<<
endl;
for
(int
i=0;i<4;i++)
{
cout<<nome[i]<<“n”;
}
}
33. Será
que
a
implementação
anterior
tem
problemas???
Nunca
vos
enganamos,
mas
desta
vez
há
que
admitir
que
existem
pequenos
bugs…propositados…
§
Se
o
número
de
caracteres
introduzidos
for
superior
à
capacidade
do
array
;
§
No
caso
de
o
utilizador
escrever
palavras
separadas
por
espaço,
o
programa
só
reconhece
a
primeira
(entende
o
espaço
como
separador
de
dados
diferentes).
Então,
como
podemos
manipular
estas
strings???
§
Existe
uma
biblioteca
que
contém
conjunto
de
funções
que
permitem
manipular
strings:
<string.h>
§
A
Maioria
das
funções
anteriores
partem
do
princípio
que
na
última
posição
"válida“
está
o
caracter
especial,
ou
seja,
null
ou
’0’.
34. Pode
efectuar
a
leitura
a
partir
do
teclado
com
a
instrução
gets(string)-‐>lê
string
a
partir
do
teclado
(incluir
a
biblioteca
<stdio.h>)
Actividade
11
:
Escreva
um
programa,
que
utiliza
a
instrução
anterior,
para
ler
o
nome
completo
da
pessoa
a
partir
do
teclado
e
que
depois
o
imprima
numa
mensagem
de
boas
vindas.
#include
<iostream>
#include
<stdio.h>
using
namespace
std;
main
()
{
char
nome[100];
cout
<<
"n
Escreva
o
seu
nome:
";
gets(nome);
system(“CLS");
cout
<<"Olá,
"
<<
nome
<<
endl;
system("PAUSE");
}
Para
ler
a
string
pode-‐se
utilizar:
cin.getline(array,
tamanho)
Nota:
Ver
referências
…
35. Se
incluir
a
biblioteca
<string.h>
terá
acesso
a
um
conjunto
de
funções
que
operam
directamente
sobre
strings,
como
por
exemplo:
§
strcopy(str_destino,
str_origem)
-‐>
copia
a
string
de
origem
para
a
string
de
destino,
ou
seja:
str_destino
=
str_origem;
§
strcat(str1,
str2)-‐>
acrescenta
/
concatena
a
string2
à
string1;
§
strlen(str)-‐>
mede
o
comprimento
da
string
e
retorna
o
número
de
caracteres
que
a
compõe.
§
strcmp(str1,str2)-‐>
compara
as
duas
strings,
str1
e
str2.
Se
as
strings
forem
iguais,
devolve
o
valor
0.
Entre
outras…
36. Actividade
12:
Passe
o
programa
que
se
segue
e
observe
os
resultados
da
aplicação
das
funções
anteriores:
#include<iostream>
#include<string.h>
intmain
(
)
{
char
string1[50]
=
“Aula
de
PSI
10!!!!”,
string2[50];
int
n
;
strcpy(string2,
string1);
if(strcmp(string2
,string1)
==
0)
{
cout
<<
“As
strings
sao
iguais…”
<<
endl;
}
n
=
strlen(string1)
;
cout<<“A
string1
tem
“
<<
n
<<
“
caracteres.”
<<
endl
;
system(“PAUSE”);
}
37. Actividade
13:
Implemente
um
programa,
em
que
utilizando
as
várias
funções
da
biblioteca
string,
e
que:
§
peça
ao
utilizador
para
inserir
uma
password
(utilizando
a
função
gets);
§
após
a
introdução
da
password,
o
ecrã
é
limpo;
§
é
dado
o
número
de
caracteres
da
password
inserida
pelo
utilizador;
§
se
password
do
utilizador:
§ igual
à
do
sistema,
devolve:
“Password
Correcta”;
§ senão,
devolve:
“Password
Inválida”;
Devem
ser
dadas
ao
utilizador
3
oportunidades
para
adivinhar
a
password,
senão
…
38. Actividade
14:
¡ Elabore
um
programa
que
leia
suas
palavras
do
utilizador.
O
programa
deve
determinar
se
as
palavras
são
iguais.
Se
não
forem,
deve
determinar
qual
delas
tem
maior
número
de
caracteres.
Actividade
15:
¡ Imagine
que
quer
saber,
para
fins
estatísticos,
qual
o
número
de
espaços
em
branco,
vogais
e
consoantes
que
estão
presentes
numa
frase
escrita
pelo
utilizador.
Faça
uma
implementação.
Actividade
16:
¡ E
que
tal
inverter
uma
string
com
um
máximo
de
20
caracteres
que
o
utilizador
introduz???
Actividade
17:
¡ Verifique
se
uma
palavra
é
um
palíndromo,
ou
seja,
palavra
que
se
lê
da
mesma
forma
da
direita
para
a
esquerda
e
da
esquerda
para
a
direita.
Por
exemplo:
ovo,
radar,
salas,
sopapos,…