Вы находитесь на странице: 1из 56

Estruturas de Dados e

Algoritmos
Captulo 1

Introduo Linguagem C++ Revises


Adaptao dos slides de Paulo Peixoto (DEEC-FCTUC, 2010/11)

MiEEC
Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Programao em C++ Reviso


Definio de Variveis
Controlo do Fluxo de Execuo
Tabelas e strings
Estruturas Elementares de Dados

Ficheiros
Ponteiros
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Variveis
Tipos de dados bsicos:
char
int
float
double

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

Estruturas de Dados e Algoritmos, 2015/16

Variveis
Qualificadores
signed (por defeito, por omisso)

unsigned
short
long

Exemplos:
unsigned char, short int, long int, unsigned long
int, long double, etc.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Variveis
Tipo Dado

Espao Ocupado

Intervalo (gama de valores)

char

8 bits

-128 a 127

unsigned char

8 bits

0 a 255

short int

16 bits

-32.768 a 32.767

unsigned short int

16 bits

0 a 65535

int

32 bits

-2.147.483.648 a 2.147.483.647

unsigned int

32 bits

0 a 4.294.967.295

long int

64 bits

-9.223.372.036.854.775.808 a
+9.223.372.036.854.775.808

unsigned long int

64 bits

0 a 18.446.744.073.709.551.616

float

32 bits

3.4x10-38 a 3.4x10+38

double

64 bits

1.7x10-308 a 1.7x10+308

long double (extended)

80 bits

3.4x10-4932 a 3.4x10+4932

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Variveis
int main() {

int main() {
char c = A,c1 = 34;
int i = 2015, j = 0x16;
float PI = 3.141;
double d = 123E-20;

char c;
int i;
float f;
double d;

short int a, b;
unsigned long n, m;

short int a = 1234567890;


unsigned int v = -100;
...

}
...
}
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Variveis
Atribuies
int x, y, z;

char h=F;
int a = 18, b = 4;
int c, d;

x = y = 10;

// y=10 -> x=10

float z = 18.0, x, y;

z = y++;

// z=10 -> y=11

z++;

// z=10+1=11

c = a / b;

// c = 4

y--;

// y=11-1=10

d = a % b;

// d = 2

z = ++x;

// x=11 -> z=11

x = z / b;

// x = 4.5

x = -x;

// x=-11

y = a / b;

// y = 4.0

x = x + y - (z--);

a *= b;

// a = 72

h -= 5;

// h = A

// x=-11+10-11=-12 -> z=10

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Variveis
Converses de tipos (casts, moldagens)
Permitem converter variveis para tipos diferentes.

int a = 18;

float x = 5.75;

float x, y, z;

int a, b;

x = a / 5;

// x = 3.0

a = (int) x;

// a = 5

y = (float) a/5; // y = 3.6

a = x;

// a = 5

z = a / 5.0;

b = (int) (x+0.5);// b = 6

// z = 3.6

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Programao em C++ Reviso


Definio de Variveis
Controlo do Fluxo de Execuo

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

Estruturas de Dados e Algoritmos, 2015/16

Controlo de Fluxo
Execuo de um programa:
int main() {
<declarao de variveis>
<instruo>

<instruo>
...
<instruo>
<instruo>
}
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

10

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Instruo if
if (<condio>){

Se <condio> for
verdadeira ento executa
o 1 bloco de instrues.

<instruo>
<instruo>

} else {
<instruo>

Seno executa o 2 bloco


de instrues.

<instruo>

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

11

Estruturas de Dados e Algoritmos, 2015/16

Condies
Exemplos de condies:
(a == b), (a <= b), (a != b), (a < b)

Operadores lgicos && (AND), || (OR), ! (NOT):


(a == b) && (b == c)
(a < b) || (a > c)

(a < b) && !(a > c)

(a < b) && (a <= c)

Variveis booleanas:
bool v;

// vale true ou false

v = (a == b);
v = false;
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

12

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Instruo if Exemplo 1
#include <iostream>
using namespace std;
//=========================================================
int main() {
int a, b;

cout << Introduza dois nmeros: ;


cin >> a;
cin >> b;

if (b > a)
else

cout << O segundo nmero o maior << endl;

cout << O primeiro nmero o maior (ou igual) << endl;

}
//=========================================================

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

13

Estruturas de Dados e Algoritmos, 2015/16

Instruo if Exemplo 2
#include <iostream>
using namespace std;
//===============================================
int main() {

int temp;
cout << Introduza a temperatura atual: ;
cin >> temp;
if (temp < 30) {
if (temp > 20)
} else

// aqui as chavetas so necessrias...


cout << "Temperatura Agradvel << endl;

cout << "Temperatura muito Quente << endl;

}
//===============================================
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

14

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Operador Ternrio
Forma geral deste operador:
<condio> ? <expresso1> : <expresso2>

Se a <condio> for verdadeira ento avaliada a <expresso1>,


seno avaliada a <expresso2>.

Exemplo:
Ao calcular-se o valor absoluto de um nmero, este operador
permite um cdigo mais compacto do que com if...else :
if (a>=0) vabs_a = a;
else vabs_a = -a;

vabs_a = (a>=0) ? a : -a;

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

15

Estruturas de Dados e Algoritmos, 2015/16

Instruo switch
switch ( <valor> ) {

Resultado da expresso <valor>


comparado sequencialmente com o
resultado das expresses frente das
clusulas case, <valor1>, <valor2>,
..., <valorK>.

Se se verificar igualdade num case


ento o bloco de instrues respetivo,
e.g. <comandosK>, executado at
encontrar a instruo break.

Se no existir break na clusula


selecionada, so executados, por
ordem, os comandos das clusulas
seguintes at se encontrar break ou
terminar o switch.

Se no se verificar nenhum dos case


ento executada a clusula default,
caso exista.

case <valor1>:

<comandos1>;
break;
case <valor2>:
<comandos2>;
break;
...
case <valorK>:
<comandosK>;
break;
default:
<comandosDefault>;
}
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Instruo switch Exemplo 1


char c;
cout << Introduza um carter: ;
cin >> c;
switch( c ) {
case '.':
cout << Ponto." << endl;
break;
case ',':
cout << Vrgula." << endl;
break;
case ::
cout << Dois pontos." << endl;
break;
case ;:
cout << Ponto e vrgula. " << endl;
break;
default :
cout << No pontuao. " << endl;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

17

Estruturas de Dados e Algoritmos, 2015/16

Instruo switch Exemplo 2


...
switch( c) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
break;
}
...

cout
cout
cout
cout
cout
cout
cout
cout
cout
cout

1. Introduo Linguagem C++ Revises

<<
<<
<<
<<
<<
<<
<<
<<
<<
<<

0;
1;
2;
3;
4;
5;
6;
7;
8;
9;

/*
/*
/*
/*
/*
/*
/*
/*
/*
/*

0123456789 */
123456789 */
23456789 */
3456789 */
456789 */
56789 */
6789 */
789 */
89 */
9 */

Rui P. Rocha, DEEC-FCTUC

18

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ciclos while e do...while

<condio>
<bloco_instrues>

<bloco_instrues>
<condio>;

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

19

Estruturas de Dados e Algoritmos, 2015/16

Ciclo while Exemplo


#include <iostream>
using namespace std;
//===============================================
int main() {

int i;
int n;
int fat = 1;
cout << Introduza um nmero inteiro no negativo: ;
cin >> n;
// calcula fatorial
i = 1;
while (i <= n) {
fat *= i;
i++;
}
cout << Fatorial: << fat << endl;
}
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

20

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ciclo do...while Exemplo


#include <iostream>
using namespace std;
//===============================================
int main() {
int i, n, fat = 1;
// L nmero inteiro positivo
do {
cout << Introduza um nmero inteiro no negativo: ;
cin >> n;
} while (n<0); //repete leitura enquanto valor errado...
// calcula fatorial
i = 1;
while (i <= n) {
fat *= i;
i++;
}
cout << Fatorial: << fat << endl;
}
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

21

Estruturas de Dados e Algoritmos, 2015/16

Ciclo for
<bloco_instrues>

Executa <inicializao>

Avalia <condio>: se true executa


<bloco_instrues>, seno termina o ciclo.

Aps executar <bloco_instrues>, executa


<atualizao>.

Reavalia <condio>.

Repete at que <condio> seja false.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

22

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ciclo for Exemplo 1


#include <iostream>
using namespace std;
//===============================================
int main() {
int i;
int n;
int fat = 1;
cout << Introduza um nmero inteiro no negativo: ;
cin >> n;
for (i = 2; i <= n; i++) fat *= i;
cout << Fatorial de << n << = << fat << endl;
}
//===============================================
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

23

Estruturas de Dados e Algoritmos, 2015/16

Ciclo for Exemplo 2


...
//escreve 5 linhas de 10 asteriscos

for (lin = 0; lin < 5; lin++) {


for (col = 0; col < 10; col++) {
cout << *;
}
cout << endl;
}

**********
**********
**********
**********
**********

...

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

24

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Instruo break
Permite interromper de imediato a execuo de um
ciclo ou de uma clusula da instruo switch.
#include <iostream>
using namespace std;
//========================
int main() {
int i;

0 1 2 3 4 Fim

for (i = 0; i < 10; i++) {


if (i == 5) break;
cout << i << ;
}
cout << Fim << endl;
}
//========================

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

25

Estruturas de Dados e Algoritmos, 2015/16

Instruo break Exemplo


Determinar se um inteiro ou no um nmero primo:
#include <iostream>
using namespace std;
//==================================================
int main() {
int i, n;
bool primo = true;
cout << Introduza um nmero inteiro no negativo: ;
cin >> n;

for (i = 2; i <= n / 2; i++) {


if (n % i == 0) { primo = false;
}

break; }

if (primo) cout << O nmero << n << primo << endl;


else cout << O nmero << n << no primo << endl;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

26

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Instruo continue
Permite interromper a execuo do bloco de instrues
de um ciclo passando de imediato iterao seguinte.
#include <iostream>
using namespace std;
//=========================
int main() {
int i;

0 1 2 3 4 6 7 8 9 Fim

for (i = 0; i < 10; i++) {


if (i == 5) continue;
cout << i << ;
}
cout << Fim << endl;
}
//=========================

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

27

Estruturas de Dados e Algoritmos, 2015/16

Instruo continue
A sua m utilizao pode dar origem a ciclos infinitos,
por exemplo:
#include <iostream>
using namespace std;
//=========================
int main() {
int i=0;

0 1 2 3 4

while (i < 10) {


if (i == 5) continue;
cout << i << ;
i++;
}
cout << Fim << endl;
}
//=========================
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

28

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Programao em C++ Reviso


Definio de Variveis
Controlo do Fluxo de Execuo
Tabelas e strings

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

29

Estruturas de Dados e Algoritmos, 2015/16

Tabelas
Para guardar na memria vrias (ou muitas) variveis
do mesmo tipo podemos utilizar tabelas.
<tipo_dados> <nome_variavel> [ <nmero_elementos> ];

Exemplos:
int notas[100];
float medias[20];
double temperaturas[5]={17.5, 18.3, 25.6, 30.4, 28.5};

double maisTemperats[]={17.5, 18.3, 25.6, 30.4, 28.5};

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

30

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Tabelas
Para aceder a cada elemento individualmente basta
indicar o seu <ndice>:
<nome_variavel> [ <ndice> ];

com <ndice> compreendido entre 0 e <nmero_elementos> -1.


Cuidado! No ultrapassar estes limites! Erro grave!

Exemplo:
double pressao[5]={0, 1, 2, 3, 4};
pressao[1]=15.8;
pressao[0] = (pressao[2] + pressao [3]) / 2;

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

// 2.5

Rui P. Rocha, DEEC-FCTUC

31

Estruturas de Dados e Algoritmos, 2015/16

Tabelas Exemplo 1
#include <iostream>
using namespace std;
const int MAX_NOTAS = 50;
//===================================================================
int main() {
int notas[MAX_NOTAS], i = 0;
float media = 0.0;
// le dados e soma-os (na var media); i=n de dados lidos
do {
cout << Escreva a nota << i+1 << : (0 p/ terminar) << endl;
cin >> notas[i];
media += notas[i];
if(notas[i] != 0) i++;
// o 0 para terminar no conta
} while ( (notas[i] != 0) && (i < MAX_NOTAS) );
// calcula e mostra media
if (i > 0) media = media / i;
cout << A mdia das notas introduzidas : << media << endl;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

32

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Tabelas Exemplo 2
#include <iostream>
using namespace std;
const int MAX_NOTAS = 50;
//============================================================
int main() {
int notas[MAX_NOTAS], i = 0;
float media = 0.0;
// le dados e soma-os (na var media)
do {
cout << Escreva a nota << i+1 << : (0 p/ terminar) << endl;
cin >> notas[i];
if (notas[i] == 0) break;
media += notas[i];
i++;
} while (i < MAX_NOTAS);
// calcula e mostra media
if (i > 0) media = media / i;
cout << A mdia das notas introduzidas : << media << endl;
}
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

33

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Tabelas Multidimensionais
<tipo> <nome> [ <dim1> ][ <dim2> ]...[ <dimN> ];

Ex. (uma matriz 4 x 4):


int T[4][4];

T[0]

T[1]

T[2]

T[3]

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

34

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Tabelas Multidimensionais Ex.


#include <iostream>
using namespace std;
int main() {
double T[4][4] = { {5, 7, 8, 4}, // 1 linha (linha 0)
{5, 6, 7, 3},
// 2 linha (linha 1)
{2, 0, 5, 1},
// 3 linha (linha 2)
{4, 3, 8, 9} }; // 4 linha (linha 3)
double max = T[0][0]; // 1 elem da tabela <- importante
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (T[i][j] > max) max = T[i][j];
}
}
cout << O maior valor na matriz : << max << endl;
return 0;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

35

Estruturas de Dados e Algoritmos, 2015/16

Strings em C
As strings so sequncias ou cadeias de carateres.
So representadas em C por tabelas de carateres que
utilizam o carcter especial '\0' (carter terminador)
para marcar o fim da sequncia.
Exemplos:
char s1[6]={T,e,s,t,e,\0};
char s2[]=Teste;

// igual a s2[6]=Teste;

char s3[100]=Teste;
char cidades[4][10]={ "Coimbra", "Aveiro,
"Porto", "Lisboa };
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

36

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Strings em C
Ler/Escrever Strings:
gets(string); : L uma string do teclado, no verifica compr.

puts(string); : Escreve uma string na consola

scanf(%s, string); : l at delimitador (espao, \n, )

printf(%s, string); : escreve at encontrar \0

cin.getline(string, compr [,carter_delimitador]);

cout << string;

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

37

Estruturas de Dados e Algoritmos, 2015/16

Strings em C
Outras funes:
strlen(string)

Devolve o comprimento da string.

strcpy(dest, org)

Copia uma string para outra.

strcat(dest, org)

Concatena (junta, soma) duas strings.

strcmp(str1, str2)

Compara duas strings (<0, =0, >0).

Todas estas funes esto definidas na biblioteca


<cstring> (<string.h>) e assumem strings definidas
como tabelas de carateres com a utilizao de\0
como carter terminador (strings C).
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

38

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Strings em C Exemplo 1
#include <iostream>
#include <cstring>
using namespace std;

AMARAR
O nome codificado : #M#R#R

int main() {
char s1[100] ,s2[100];
int i;
cout << Escreva um nome: ;
cin.getline(s1, 100);
strcpy(s2, s1);
for(i = 0; i < strlen(s2); i++) {
if (s2[i] == A) s2[i] = #;
}
cout << O nome codificado : << s2 << endl;
return 0;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

39

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Strings em C Exemplo 2
Abel Joana To'
t[0][0]
#include <iostream>
#include <cstring>
t[1][0]
using namespace std;
//--------------------------------------------------int main() {
char tab2D[3][21] = { "Abel", "Joana", "To'"};
for (int i=0; i<3; ++i)
cout << tab2D[i] << "
";
cout << endl << endl;

t[0][1] t[0][2]
t[1][1] t[1][2]

char tab3D[2][3][21]={ { "t[0][0]", "t[0][1]", "t[0][2]" },


{ "t[1][0]", "t[1][1]", "t[1][2]" } };
for (int i=0; i<2; ++i) {
for (int j=0; j<3; ++j) cout << tab3D[i][j] << "
";
cout << endl;
}
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

40

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Strings em C++
Definidas na biblioteca <string>, facilitam a
manipulao de strings atravs de diversas funes.
Principal vantagem: no se define o tamanho da string na sua
declarao, podendo o seu tamanho variar dinamicamente.

Exemplo:
string s = Teste;

string t = s, u;
char inicial = s.at(0);
cin >> u;

getline(cin, s);
cout << s;

//primeiro carter
//l string sem espaos

//l string com espaos


//escreve string na consola

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

41

Estruturas de Dados e Algoritmos, 2015/16

Programao em C++ Reviso


Definio de Variveis
Controlo do Fluxo de Execuo
Tabelas e Strings
Estruturas Elementares de Dados

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

42

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Estruturas (structs)
Permite agrupar vrios tipos de variveis numa nica
varivel composta (ficha / record).
struct <nome_tipo_estrutura> {
<tipo1> <nome1>;
<tipo2> <nome2>;

...
<tipoN> <nomeN>;
}<nomes_de_variveis>;

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

43

Estruturas de Dados e Algoritmos, 2015/16

Estruturas (structs)
Cada elemento do tipo estrutura denominado campo
(field) ou membro (member) da estrutura.

Exemplos:
struct Tipo_Endereco {
string rua;
int numero;
string localidade, cod_postal;
int telefone;
};
struct
int
int
int
};
1. Introduo Linguagem C++ Revises

Tipo_Data {
dia;
mes;
ano;

Rui P. Rocha, DEEC-FCTUC

44

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Estruturas (struct) Exemplo 1


struct Tipo_FichaPessoal {
string nome;
struct Tipo_Endereco endereco;
struct Tipo_Data dataNascimento;
};
struct Tipo_FichaPessoal empregados[40];
empregados[5].nome = Adolfo Formiga;
empregados[5].endereco.rua = Rua Escura;
empregados[5].endereco.numero = 7;
empregados[5].endereco.localidade = Terreola;
empregados[5].endereco.cod_postal = 3070-123;
empregados[5].endereco.telefone = 123456789;
empregados[5].dataNascimento.dia = 29;
empregados[5].dataNascimento.mes = 2;
empregados[5].dataNascimento.ano = 1964;
empregados[6] = empregados[5];
empregados[6].nome = Joaquina Formiga;

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

45

Estruturas de Dados e Algoritmos, 2015/16

Estruturas (struct) Exemplo 2


#include <iostream>
using namespace std;
struct Complexo {
double r, i;
};
int main() {
Complexo z1, z2, z3={0,0}; // inicializao como nas tabelas
cout << Introduza o primeiro nmero complexo: << endl;
cin >> z1.r >> z1.i;
cout << Introduza o segundo nmero complexo: << endl;
cin >> z2.r >> z2.i;
z3.r = z1.r * z2.r z1.i * z2.i;
z3.i = z1.r * z2.i + z1.i * z2.r;
cout << Produto= << z3.r << + << z3.i << j << endl;

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

46

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Programao em C++ Reviso


Definio de Variveis
Controlo do Fluxo de Execuo
Tabelas e Strings
Estruturas Elementares de Dados

Ficheiros

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

47

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros
As variveis armazenadas na memria do computador
so volteis, i.e. o seu tempo de vida termina com o
programa.
A informao guardada nas variveis do programa perdida
quando o programa termina.

Os ficheiros permitem armazenar dados de forma


persistente e mais permanente, ex. no disco rgido de
um computador.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

48

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros
A leitura/escrita em ficheiros semelhante
entrada/sada de dados atravs do teclado/ecr.

Para se aceder a ficheiros no programa necessrio


incluir a biblioteca <fstream>:
#include <fstream>

Define algumas classes de objetos para gesto de ficheiros.


ofstream : para escrever informao num ficheiro.
ifstream : para ler informao de um ficheiro.
fstream : para leitura/escrita.

A sua utilizao muito semelhante a cin e cout.


1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

49

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Exemplo 1
#include <iostream>
#include <fstream>
using namespace std;
//--------------------------------------------------------int main() {
ofstream fich("Teste.txt");
if (!fich) { // Verifica se ficheiro aberto
cout << "Erro ao abrir o ficheiro para escrita!" << endl;
return -1;
}
fich << "Isto um teste de escrita em ficheiro..." << endl;
fich.close();
return 0;
}
//---------------------------------------------------------

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

50

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros
Por omisso:
O ficheiro aberto em modo de texto (como ficheiro de texto).

Se um ficheiro para escrita no existir, ento criado um novo


ficheiro.
Se um ficheiro para escrita existir, apagada toda a
informao previamente existente.

possvel modificar estes comportamentos assumidos


por omisso atravs do parmetro opcional <modo> :
ofstream <descritor>(<nome_ficheiro>, <modo>);

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

51

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros
Modo

Significado

ios::out

Abre um ficheiro para escrita.

ios::in

Abre um ficheiro para leitura.

ios::app

Abre um ficheiro para adicionar (fazer append de) informao. Cada


nova insero ser adicionada a seguir ao final do ficheiro.

ios::trunc

Trunca (apaga) o ficheiro existente (comportamento por omisso).

ios::ate

Abre o ficheiro sem o truncar mas permite escrever em qualquer ponto


do ficheiro, inicialmente no fim do ficheiro (at the end).

ios::binary

Abre o ficheiro em modo binrio, i.e. trata a informao contida no


ficheiro como informao binria e no texto. Desta forma, possvel
armazenar os dados no seu formato interno. Por exemplo um float
ser armazenado no seu formato interno atravs de 4 bytes em vez de
ser armazenado como uma string.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

52

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Abertura

Para abrir um ficheiro para escrita truncando toda a informao que j


exista anteriormente pode utilizar-se qualquer das seguintes instrues:
ofstream fich(NomeFicheiro");
fstream fich("NomeFicheiro",

ios::out | ios::trunc);

Para abrir um ficheiro para escrita mantendo a informao previamente


existente deve-se utilizar a seguinte instruo:
ofstream fich("NomeFicheiro",

ios::app);

Para abrir um ficheiro para escrita binria mantendo a informao


anterior:
ofstream fich("NomeFicheiro",

ios::app | ios::binary);

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

53

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Abertura e Fecho

Para abrir um ficheiro para leitura pode utilizar-se qualquer das seguintes
linhas de cdigo:
ifstream fich("NomeFicheiro");
fstream fich("NomeFicheiro",
ifstream fich;

ios::in);

fich.open("NomeFicheiro");

Para abrir um ficheiro para leitura/escrita em modo binrio:


fstream fich("NomeFicheiro", ios::in | ios::out | ios::binary);

Muito Importante Quando o programa j no precisa de manipular um


ficheiro que tenha sido aberto, deve usar a instruo:
fich.close();

// flush dos dados, liberta os recursos

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

54

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Mtodos p/ Leitura


Operador >> L do ficheiro dados de tipos bsicos (valores
singulares, logo, no aplicvel a estruturas e tabelas).

get() Devolve um carter lido a partir do ficheiro.

get(char &c) L um carter do ficheiro e guarda-o na var. c.

get(char *buffer, int compBuffer, char delim=\n) L

uma srie de carateres do ficheiro e armazena-os na tabela


buffer at se atingir o tamanho indicado por compBuffer, ou
at ser lido um carter igual a delim, ou at se atingir o final do
ficheiro.

getline(char *buffer, int compBuffer) L e devolve uma

linha do ficheiro.

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

55

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Mtodos p/ Leitura

ignore(int conta=1, int delim=in::eof) L e descarta

conta carateres do ficheiro, ou at encontrar um carter igual a


delim.

peek() Devolve o prximo carcter do ficheiro mas no o

remove do buffer de entrada.

unget() Coloca o ltimo carter lido de volta no buffer de

entrada do ficheiro. Este carter ser o prximo a ser lido do


ficheiro.

read(char *buffer, int conta) Permite ler informao de

ficheiros com dados de tipos no bsicos, em modo binrio. O


nmero de bytes a ler especificado por conta e os bytes lidos
so guardados na tabela buffer.

gcount() Devolve o nmero de bytes lidos pelo ltimo read().


1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

56

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Mtodos p/ Escrita


Operador << Escreve no ficheiro dados de tipos bsicos (no
aplicvel a estruturas e tabelas).

put(char ch) Escreve um carter (o carter ch) no ficheiro.

write(char *buffer, int conta) Permite escrever

informao em ficheiros com dados de tipos no bsicos, em


modo binrio. O nmero de bytes escritos especificado por
conta e os bytes guardados na tabela buffer so escritos no
ficheiro.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

57

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Exemplo 2
#include <iostream>
#include <fstream>
using namespace std;
//---------------------------------int main() {
// inicializa contadores
int cEspacos=0, cCarat=0, cFrases=0;
// abre ficheiro
ifstream fich("Teste.txt");
char c;
if (!fich) {
cout << "Erro ao abrir ficheiro
<< endl;
return -1;
}

...// l ficheiro e conta


while ( (c = fich.get()) != eof ) {
switch (c) {
case ' ': cEspacos++; break;
case '\n':
case '\t': break;
case '.': cFrases++; break;
default: cCarat++;
}
}
// mostra resultado
cout << "Existem:" << endl
<< cEspacos << espaos" << endl
<< cCarat << carteres" << endl
<< cFrases << frases" << endl;

fich.close();
return 0;

...
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

58

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Ficheiros Acesso Aleatrio


At aqui, s vimos formas de leitura/escrita sequencial.
Mas possvel fazer o acesso aleatrio a ficheiros.
Definio de posio de leitura/escrita no ficheiro:
0
get pointer

put pointer
eof

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

59

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Acesso Aleatrio


Ponteiros para leitura/escrita no ficheiro:
seekg(pos) Ajusta o ponteiro para leitura na posio absoluta

pos a partir do incio do ficheiro (seek get pointer).


seekg(offset, dir) Ajusta o ponteiro para leitura na posio

relativa offset, definida de acordo com dir:

ios::beg offset a partir do incio (beginning) do ficheiro;


ios::cur offset relativo posio atual (current);
ios::end offset a partir do fim (end) do ficheiro.

O mesmo vlido para seekp() (o homlogo para escrita).


tellg() , tellp() Devolvem a posio dos ponteiros para

leitura e escrita, respetivamente.


1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

60

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Exemplo 3
#include <fstream>
#include <iostream>
#include <cstring>
struct TProd{
char cod [10];
double preco;
};

...
cout << "Introduza o novo preo do
produto: ";
cin >> preco;

fstream f(produtos.bin", ios::in |


ios::out | ios::binary);

int main() {
Tprod produto;
char cod[10];
double preco;
bool encontrado;

eof

cout << "Introduza o cdigo do


produto a alterar: ";
cin.getline(cod,10);
...

if(!f) {
cout << Erro: abrir << endl;
return -1;
}
int idx = 0;
encontrado = false;
f.seekg(0, ios::beg);
...

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

61

Estruturas de Dados e Algoritmos, 2015/16

Ficheiros Exemplo 3
...
while(!f.eof()) {
f.read ((char*)&produto,
sizeof (TProd));
if (f.gcount() == sizeof(TProd)) {
if (strcmp(produto.cod, cod)==0)
{
produto.preco = preco;
f.seekp(idx*sizeof(TProd));
f.write ((char*)&produto,
sizeof (TProd));
encontrado = true;
break;
}
}
idx++;
}
...
1. Introduo Linguagem C++ Revises

...
if(!encontrado) {
cout << "Produto " << cod << "
no foi encontrado! < endl;
strcpy(produto.cod, cod);
produto.preco=preco;
f.clear();
// reset flags
f.seekp(0, ios::end);
f.write ((char*)&produto,
sizeof(TProd));
}
f.close();
return 0;
}

Rui P. Rocha, DEEC-FCTUC

62

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Programao em C++ Reviso


Definio de Variveis
Controlo do Fluxo de Execuo
Tabelas e Strings
Estruturas Elementares de Dados

Ficheiros
Ponteiros
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

63

Estruturas de Dados e Algoritmos, 2015/16

Ponteiros
Memria

int a;
int *pa;
...
a=2003;
pa=&a;

pa 5000
0
a 0
2003
1999

6000
5000

*pa=1999;
// guarda o inteiro 1999 no endereo de
// memria dado por pa (5000 no exemplo).
0000

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

64

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ponteiros
Uma varivel pode ser
utilizada diretamente atravs
do seu nome ou ento
indiretamente atravs de um
ponteiro.

#include <iostream>
using namespace std;
//-----------------int main() {
double x = 3;
double *px;

Erro
grave!

cout << *px;

Convm inicializar sempre os


ponteiros. A inicializao fazse usando o operador de
endereo & ou a constante
NULL (endereo 0, ou seja o
ponteiro no aponta para
nada).

px = &x;
cout << *px;
*px = x * (*px); //x fica com 9
cout << *px;
return 0;
}

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

65

Estruturas de Dados e Algoritmos, 2015/16

Ponteiros
Podemos fazer atribuies e comparaes entre
ponteiros:
int a = 5, b = 1;
int *p1,*p2;
p1 = &a;
p2 = p1;
b = *p2;

// p2 <- &a
// b <- a

p2 = &b;
if (p1 == p2)
cout << Ponteiros Iguais...;

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

66

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Ponteiros
Os ponteiros so muito
utilizados para manipular
tabelas

possvel usar tambm a


notao vetorial para
ponteiros:

int t[5] = {1, 2, 3, 4, 5};


int *pt;
pt = t;
// pt=&t[0]
pt++;
// 2 elemento
pt = &t[3]; // 4 elemento
pt--;
// 3 elemento
cout << *(pt+3); // ERRO!

int t[5] = {1, 2, 3, 4, 5};


int *pt;

5
4
3
2
1

pt = t;
cout << *(pt+3); << endl;
cout << pt[3];

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

67

Estruturas de Dados e Algoritmos, 2015/16

Ponteiros e Estruturas
struct TProd{
char cod[10];
double preco;
};
TProd produto={BMW S3, 40000};
TProd *p = &produto;
cout << p->cod << endl;
// (*p).cod
cout << p->preco << endl; // (*p).preco

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

68

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Ponteiros e Strings
#include <iostream>
using namespace std;
int main() {
char s[20];
char *p;
cout << Introduza uma string: ;
cin.getline(s,20);
p = s;
while (*p != \0) p++;
cout << Comprimento = << p-s;
return 0;

\0
e
t
s
e
T

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

69

Estruturas de Dados e Algoritmos, 2015/16

Alocao Dinmica de Memria


(ADM)
Quando a quantidade de elementos varivel, o uso
de tabelas pode desperdiar memria, j que nem
todas as suas posies so necessariamente
ocupadas.

Soluo: Alocar dinamicamente a memria em funo


das necessidades.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

70

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

ADM em C
Alocar memria:
int *p;
p = malloc(100*sizeof(int)); // aloca 100 inteiros
p = calloc(100,sizeof(int)); // idem e inicializa a 0

Deve-se verificar o valor de p. Se for igual a NULL ento o


processo de alocao de memria falhou.

Libertar memria:
free(p);
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

71

Estruturas de Dados e Algoritmos, 2015/16

ADM em C Exemplo
#include <iostream>
using namespace std;
//-----------------------------------------------------int main() {
int *tabela, numElem, i;
cout << "Quantos elementos tem a tabela?");
cin >> numElem;
tabela = (int *) calloc(numElem, sizeof(int));

//ou sizeof(tab[0])

for(i = 0; i < numElem; i++){


cout << Introduza o elemento << (i+1) << : ;
cin >> tabela[i];
}
...
// parte do cdigo que manipula a tabela
free(tabela);
return 0;

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

72

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Exemplo sem ADM


#include <iostream>
using namespace std;
const int MAX_NOTAS=50;
//-----------------------------------------------------int main() {
int notas[MAX_NOTAS];
int i=0;
float media=0.0;

do{
cout << Escreva o valor da nota << i+1 << : (0 p/ terminar)
<< endl;
cin >> notas[i];
media += notas[i];
i++;
}while ( (notas[i-1]!=0) && (i < MAX_NOTAS) );
if (i == MAX_NOTAS) media = media / i;
else media = media / (i - 1);
cout << A mdia das notas introduzidas : << media << endl;
}
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

73

Estruturas de Dados e Algoritmos, 2015/16

ADM em C++
Alocar memria:
int *p1;

TProd *p2;

p1 = new int[100];

// aloca 100 inteiros

p2 = new TProd[5];

// aloca 5 estruturas

Deve-se verificar o valor devolvido e guardado no ponteiro. Se


for igual a NULL ento a alocao de memria falhou.

Libertar memria:
delete []p1;

delete []p2;

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

74

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

ADM em C++ Exemplo


#include <iostream>
using namespace std;
int main() {
int *notas;
int i, numNotas;
float media=0.0;
cout << Quantas notas vai introduzir?; cin >> numNotas;
notas = new int[numNotas];
if (notas!=NULL) {
for(i = 0; i < numNotas; i++) {
cout << Escreva o valor da nota << i+1 << : << endl;
cin >> notas[i];
media += notas[i];
}
media /= numNotas;
cout << A mdia das notas introduzidas : << media << endl;
}
delete [ ] notas;
}
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

75

Estruturas de Dados e Algoritmos, 2015/16

Funes em C++
Conceitos Bsicos
Variveis Globais versus Variveis Locais
Passagem de Parmetros

Tpicos Avanados:
Funes que Devolvem uma Referncia
Parmetros com Valor por Defeito
Sobrecarga de Funes
Recursividade
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

76

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Conceitos Bsicos


As funes permitem estruturar um programa de uma forma mais
modular, atravs da sua diviso em tarefas mais simples, tirando
partido de todo o potencial que uma linguagem estruturada
permite.
Uma funo constituda por um bloco de instrues que pode
ser executado a partir de qualquer outra parte do programa.

Diviso do programa em funes permite:


Organizar melhor o cdigo, tornando-o mais legvel.
Utilizar o mesmo cdigo em vrios locais e/ou em vrios programas.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

77

Estruturas de Dados e Algoritmos, 2015/16

Funes Conceitos Bsicos


Estrutura sinttica da implementao de uma funo:
<tipoDadosDevolvido>

<nome>([<lista_parmetros>]) {

<bloco_instrues>

[return <expresso>;]
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

78

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Funes Exemplo 1
#include <iostream>
using namespace std;
//===================
int soma(int a, int b) {
int r;
r = a + b;
return r;
}
//===================
int main () {
int z;

int soma (int a, int b)

z = soma( 8 , 4 );

z = soma(8,4);
cout << O Resultado " << z;
return 0;
}
//===================
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

79

Estruturas de Dados e Algoritmos, 2015/16

Funes que No Devolvem Valor


O tipo void :
Uma funo pode no devolver qualquer valor. Diz-se neste
caso que devolve void, e a funo no tem (e no pode ter)
qualquer instruo do tipo return <expresso>.
void escreveCodigo(char c) {
cout

<< "O cdigo ASCII de << c

<< << (int)c << endl;


return; // facultativo aqui
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

80

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes sem Parmetros


Uma funo pode tambm no ter qualquer parmetro
de entrada:
Nesse caso, a lista de parmetros deve ser deixada vazia, i.e.
(), ou ento conter a palavra reservada void.
#include <iostream>
using namespace std;
//==============================
void escreveLinha(void) { // tambm podia ser void escreveLinha()
cout << #############################################";
}
//==============================
int main () {
escreveLinha();
return 0;
}
//==============================

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

81

Estruturas de Dados e Algoritmos, 2015/16

Funo main( )
Exemplo da funo main():
int main(int argc, char *argv[ ]);

argc nmero de parmetros;


argv tabela de strings (estilo C) com o valor dos vrios
parmetros, sendo que argv[0] contm o nome do
programa.
Exemplo: se executar o programa prog.exe na linha de
comandos atravs do comando prog.exe 20 2 15, ento:
argc = 4
argv[0]=prog.exe, argv[1]=20, argv[2]=2,
argv[3]=15.
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

82

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Funes Escopo das Variveis


Variveis Globais:
visveis em qualquer
parte do programa.

Variveis Locais:
visveis apenas dentro da
funo ou bloco onde so
declaradas.

#include <iostream>
int inteiro;
char carater;
char string[15];
int funcao(int a, int b) {
int ano;
char letra;
double media;
...
}

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

83

Estruturas de Dados e Algoritmos, 2015/16

Funes Escopo das Variveis


Cuidados a ter com Variveis Globais:
Evitar usar variveis globais: tornam as funes menos imunes
ou dependentes de informao manipulada fora da funo.
Usar preferencialmente passagem de parmetros s funes.

Us-las apenas em casos estritamente necessrios:


Quando o uso de variveis locais e de parmetros da funo no
permite resolver o problema.
Quando existe a necessidade de representar dados globais a
utilizar em vrias partes do programa.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

84

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Escopo das Variveis


Cuidados a ter com Variveis Locais:
So visveis apenas na funo/no bloco onde so declaradas.
So criadas no incio da execuo da funo/do bloco e
destrudas quando esta(e) termina.
O seu tempo de vida no o tempo de vida do programa.
O seu valor no preservado de uma chamada funo para a
chamada seguinte mesma funo!

Ter em ateno a confuso que pode resultar do facto de


haver variveis locais e globais com o mesmo nome.

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

85

Estruturas de Dados e Algoritmos, 2015/16

Funes Exemplo 2
include <iostream>
using namespace std;
//===================================================
int a, b = 10, c; // variveis globais
//===================================================
int func(int c) {
int a = 7, b; // variveis locais
cout << b << endl;
b = a + c;
// a e b -> variveis locais; parmetro c
return b;
}
//===================================================
int main(){
c = func(10);
cout << a << " " << b << " " << c;
return 0;
}
//===================================================

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

86

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Passagem de Parmetros


Em C++, os parmetros so normalmente passados
funo por valor; portanto passada uma cpia.
void escreveDigitos(int num){
while (num < 10)
cout << num++;
}

23456789
num=2

int main( ) {
int num = 2;
escreveDigitos(num);
cout << endl << num=
<< num << endl;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

87

Estruturas de Dados e Algoritmos, 2015/16

Funes Passagem de Parmetros


Em C++, os parmetros tambm podem ser passados
funo por referncia. Neste caso, passada uma
referncia (um ponteiro) para a varivel original.
void escreveDigitos(int &num){
while (num < 10)
cout << num++;
}

23456789
num=10

int main( ) {
int num = 2;
escreveDigitos(num);
cout << endl << num=
<< num << endl;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

88

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Passagem de Parmetros


Os parmetros podem ainda ser passados funo
por ponteiro. Neste caso, passado explicitamente um
ponteiro para a varivel original.
void escreveDigitos(int *num){
while (*num < 10)
cout << (*num)++;
}

23456789
num=10

int main( ) {
int num = 2;
escreveDigitos(&num);
cout << endl << num=
<< num << endl;
}

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

89

Estruturas de Dados e Algoritmos, 2015/16

Funes Exemplos 3 e 4
void troca (int &x, int &y)
{
int temp;

void troca (int *x, int *y)


{
int temp;

temp = x;
x = y;
y = temp;

temp = *x;
*x = *y;
*y = temp;

...

...

int a = 10, b = 20;


troca(a, b);
...

int a = 10, b = 20;


int *p = &b;
troca(&a, p);
...

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

90

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Funes Exemplo 5
#include <iostream>
using namespace std;
//=====================================
void multiplosVizinhos(int multiploDe, int num, int &anterior, int &seguinte)
{
anterior = (num/multiploDe)*multiploDe;
seguinte = (1+num/multiploDe)*multiploDe;
}
multiploDe = 5
//=====================================
num = 83
int main() {
int x = 83, y, z;
multiplosVizinhos (5, x, y, z);
cout << Anterior=" << y << ", Seguinte=" << z;
return 0;

}
//=====================================

(83/5) -> 16;


anterior = 16*5 = 80

seguinte= (1+16)*5 = 85
y = 80
z = 85

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

91

Estruturas de Dados e Algoritmos, 2015/16

Funes Passagem de Parmetros


Passagem de tabelas como parmetros:
As tabelas so sempre passadas por ponteiro.
float calculaMedia(int vetor [ ], int n) {
float soma = 0.0;
int i;
for(i = 0; i < n; i++) soma += vetor[i];
return(soma / n);
}
...
int tempFevereiro[28];
cout << calculaMedia(tempFevereiro, sizeof(tempFevereiro));
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

92

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Passagem de Parmetros


Passagem de tabelas multidimensionais:
Tem de se definir o tamanho de todas as dimenses exceto a 1.
const int Dias=7;
void calculaMediaSemanal(int tab[ ][Dias], int nSemanas) {
int soma, i, j;
for (i = 0; i < nSemanas; i++) {
for(j = 0, soma=0; j < Dias; j++) soma+=tab[i][j];
cout << A Temp. mdia na semana << i+1
<< foi << ((float) soma) / Dias << endl;
}

}
...
int tempAnuais[52][Dias];
calculaMediaSemanal(tempAnuais, 52);
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

93

Estruturas de Dados e Algoritmos, 2015/16

Funes Variveis por Referncia


Varivel por referncia
Representa um nome alternativo (um alias) para uma varivel.
Apenas tem sentido se for inicializada aquando da declarao.
int a;
int &ra = a; // ra a mesma coisa que a
ra = 2015;

// a mesma coisa que a = 2015

int *pa = &ra;


// a mesma coisa que pa = &a
int &rb = ra; // rb a mesma coisa que a e ra

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

94

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Variveis por Referncia


Uma funo pode
devolver uma
referncia!

int tab[5]; // varivel global


int invalido;
int& elemento(int indice) {
if( (indice>=0) && (indice<5) )
return tab[indice];
else return invalido;
}
...
elemento(2) = 5; // <=> tab[2]=5;
elemento(8) = 1; // <=> invalido=1;

Permite que a
funo aparea no
lado esquerdo de
uma atribuio.

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

95

Estruturas de Dados e Algoritmos, 2015/16

Funes Variveis por Referncia


Usar com cuidado funes que devolvem referncias!
Exemplo:
int& funcao(void)
{
int i = 50;
return i;
}

Esta funo no vai funcionar conforme se pretendia porque


devolvida uma referncia para uma varivel local cujo tempo de
vida termina com o fim da execuo da funo.
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

96

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Inicializ. Parmetros


Parmetros com valor por defeito
Pode ser especificado na declarao da funo valores a
utilizar por omisso para um ou mais parmetros.

Exemplo:

#include <iostream>
using namespace std;
//===========================
int divide(int a, int b = 10) {
int r;
r = a/b;
return r;
}
//===========================
int main() {
cout << divide (60,3) << endl;
cout << divide (16) << endl;
return 0;
}

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

97

Estruturas de Dados e Algoritmos, 2015/16

Funes Inicializ. Parmetros


Algumas regras para parmetros com valor por defeito
Se um parmetro for inicializado por defeito, todos os que se
lhe seguem tambm tm de ser inicializados.

Se for omitido um parmetro na chamada funo, ento


tambm tm de ser omitidos todos os restantes.
A inicializao no tem de ser feita atravs de uma constante;
pode ser uma expresso, desde que no sejam utilizados
outros parmetros ou variveis locais da funo.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

98

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Sobrecarga
Pode-se definir funes com o mesmo nome desde que
difiram na sua lista de parmetros.
Diz-se que o nome da funo est sobrecarregado
(overloaded).

Exemplo:
double maximo(double a, double b);
int maximo(int a, int b);
double maximo(double tab[ ], int tamanho);
int maximo(int tab[ ], int tamanho);
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

99

Estruturas de Dados e Algoritmos, 2015/16

Funes Sobrecarga
#include <iostream>
using namespace std;
//==============================
int maximo(int a, int b) {
return (a>=b?a:b);
}
//==============================
double maximo(double a, double b) {
return (a>=b?a:b);
}
//==============================
int main () {
int x = 3, y = 4;
double z = 2.5, w = 1.3;
cout << maximo(x, y) << endl;
cout << maximo(z, w) << endl;
return 0;

}
//==============================
1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

100

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
Quando se implementa um algoritmo para um dado
problema, a soluo pode ter duas formas distintas:
Forma Fechada: a soluo para o problema no segue a
estrutura do prprio problema.
Ex. a soma dos n primeiros inteiros: S(n)=((1+n)/2)*n .

Forma Aberta: a soluo depende da soluo de um


problema semelhante mas mais simples ou reduzido.
Ex. a soma dos n primeiros inteiros: S(n) = n + S(n-1) .

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

101

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
A linguagem C++ permite implementar funes
recursivas que representam solues de forma aberta.
Para isso, possvel uma funo chamar-se a si prpria.

Estrutura de uma funo recursiva:


Caso Elementar caso que pode ser resolvido de imediato.
Fundamental para que a recursividade no se repita infinitamente,
ex. S(1)=1.

Caso Geral caso cuja resoluo depende da resoluo de


um caso mais simples/reduzido, ex. S(3)=3+S(2).
if (<condicao_paragem>)
// caso elementar
Devolve de imediato soluo do caso elementar
else
// caso geral
Simplifica o problema chamando recursivamente a funo

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

102

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
Exemplo 1: escrever funo que calcula a soma dos
primeiros n inteiros, ex. somaN(4) = 1+2+3+4 = 10
Caso Elementar: ocorre quando n==1, ou seja quando se
pretende somar os primeiros 1 nmeros inteiros (somaN(1)).
if (n == 1) return 1;

Caso Geral: a soma dos primeiros n inteiros igual a n mais a


soma dos primeiros n-1 inteiros, i.e. somaN(n)=n+somaN(n-1).
A chamada recursiva funo somaN(n-1) aproxima-nos do caso
elementar somaN(1).

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

103

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
Exemplo 1: escrever funo que calcula a soma dos
primeiros n inteiros, ex. somaN(4) = 1+2+3+4 = 10
10

somaN(4)
int somaN (int n)
{
if ( n == 1 ) // Caso Elementar
return 1;
else
// Caso Geral
return ( n + somaN(n - 1) ) ;
}

4 + somaN(3)

= 10

3 + somaN(2) = 6
2 + somaN(1) = 3

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

104

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
Exemplo 1: escrever funo que calcula a soma dos
primeiros n inteiros, sem usar recursividade.
int somaN (int n)
{
int i, soma=0;
for (i = 1; i <= n; i++)
soma += i;

int somaN (int n)


{
return ( n*(1+n)/2.0 );
}

return soma;
}

1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Rui P. Rocha, DEEC-FCTUC

105

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
Exemplo 2: escrever funo que calcula o fatorial de
um inteiro n, ex. fat(3) = 3 * 2 * 1 = 6
Caso Elementar: ocorre para n==0 porque, por definio 0!=1
(fat(0)).
if (n == 0) return 1;

Caso Geral: o fatorial de n igual a n vezes o fatorial de n-1,


i.e. fat(n) = n * fat(n-1).

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

106

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Funes Recursividade
Exemplo 2: escrever funo que calcula o fatorial de
um inteiro n, ex. fat(3) = 3 * 2 * 1 = 6
6

fat(3)
3 *
unsigned long int fat(unsigned int n)
{
if ( n == 0 ) // Caso Elementar
return 1;
else
// Caso Geral
return ( n * fat(n - 1) ) ;
}
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

= 6

fat(2)

2 *

fat(1)
1 *

= 2

fat(0)

= 1

Rui P. Rocha, DEEC-FCTUC

107

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
Vantagens
Permite obter uma soluo mais elegante nalguns problemas.

Evita a necessidade de se controlar manualmente uma srie


de variveis normalmente associadas aos algoritmos
convencionais.

Desvantagens
Gera funes cuja execuo tende a ser mais lenta devido
utilizao massiva da pilha de valores (stack).
O debug de funes recursivas mais difcil e erros na sua
implementao resultam facilmente na situao stack overflow.

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

108

Estruturas de Dados e Algoritmos, 2015/16

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Funes Recursividade
O Caso Elementar pode significar simplesmente no
fazer nada e terminar imediatamente a funo:
void escreveNasteriscos(int n) {
// Escreve linha vertical com n asteriscos
if ( n <= 0 ) // Caso Elementar: nada
faz
else { // Caso Geral
cout << * << endl;
escreveNasteriscos(n 1);
}
}
void escreveNasteriscos(int n) {
// Escreve linha vertical com n asteriscos
if ( n > 0 ) { // Caso Geral
cout << * << endl;
escreveNasteriscos(n 1);
}
}
1. Introduo Linguagem C++ Revises

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

escreveNasteriscos(5)

*
*
*
*
*

(n=5)
(n=4)
(n=3)
(n=2)
(n=1)
(n=0)

Rui P. Rocha, DEEC-FCTUC

109

Estruturas de Dados e Algoritmos, 2015/16

Funes Recursividade
Exemplo 3: escrever funo que inverta a ordem dos
carateres de uma string (estilo C++)
// Funo recursiva que faz o trabalho
string invString(string s, int i1, int i2 {
if (i1 >= i2) return s; // Caso Elementar
else { // Caso Geral
char temp = s[i1];
// troca carateres
s[i1] = s[i2];
// nas posies
s[i2] = temp;
// i1 e i2
return invString(s,i1+1,i2-1);
}
}
// Sobrecarga do nome da funo
string invString(string s)
{ return invString(s, 0, s.length()-1); }
...
string texto = Inverte-me;
cout << texto << endl << invString(texto);
1. Introduo Linguagem C++ Revises

Inverte-me
em-etrevnI

Rui P. Rocha, DEEC-FCTUC

110

Mestrado integrado em Engenharia Eletrotcnica e de Computadores

Estruturas de Dados e Algoritmos, 2015/16

2. Algoritmos de Ordenao e
Pesquisa

A partir da prxima aula

1. Introduo Linguagem C++ Revises

Rui P. Rocha, DEEC-FCTUC

111