Vectores	
  e	
  Matrizes	
  
Escola	
  Secundária	
  Filipa	
  de	
  Vilhena	
  
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…	
  
¡  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	
  
¡  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	
  
¡  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.	
  
§  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.	
  
tipo	
  nome_variavel	
  [nº_elementos]	
  
	
  
Exemplo:	
  
	
  
int	
  codigo[6];	
  
	
  ou	
  
int	
  codigo[]={123,435,234,987,657,354};	
  
	
  ou	
  
int	
  codigo[6]={123,435,234};	
  
	
  	
  
A	
  expressão	
  	
  
	
  
int	
  codigo[6];	
  
	
  
Reserva	
  seis	
  posições	
  de	
  memória	
  de	
  tipo	
  int	
  
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	
  
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.	
  
¡  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…	
  
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];	
  
	
   	
   	
  }	
  
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.	
  	
  
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];	
  
	
   	
   	
  }	
  
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.	
  
	
  
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	
  
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…	
  
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	
  	
  
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	
  
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	
  
	
  
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?	
  	
  
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:	
  
	
  
	
  
	
  
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	
  …	
  
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”);	
  
}	
  
 
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:	
  
	
  	
  
	
  
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;	
  
§  …	
  
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	
  
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”}	
  
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	
  …	
  
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.	
  
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)	
  
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”;	
  
	
  }	
  
}	
  
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’.	
  
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	
  …	
  
	
  
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…	
  
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”);	
  
}	
  	
  
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	
  …	
  
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,…	
  

mod4-estruturas-dadosestaticas-ordenacao

  • 1.
    Vectores  e  Matrizes   Escola  Secundária  Filipa  de  Vilhena  
  • 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.  
  • 7.
    tipo  nome_variavel  [nº_elementos]     Exemplo:     int  codigo[6];    ou   int  codigo[]={123,435,234,987,657,354};    ou   int  codigo[6]={123,435,234};      
  • 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,…