Академический Документы
Профессиональный Документы
Культура Документы
Algoritmos
Captulo 1
MiEEC
Mestrado integrado em Engenharia Eletrotcnica e de Computadores
Ficheiros
Ponteiros
1. Introduo Linguagem C++ Revises
Variveis
Tipos de dados bsicos:
char
int
float
double
Variveis
Qualificadores
signed (por defeito, por omisso)
unsigned
short
long
Exemplos:
unsigned char, short int, long int, unsigned long
int, long double, etc.
Variveis
Tipo Dado
Espao Ocupado
char
8 bits
-128 a 127
unsigned char
8 bits
0 a 255
short int
16 bits
-32.768 a 32.767
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
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
80 bits
3.4x10-4932 a 3.4x10+4932
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;
}
...
}
1. Introduo Linguagem C++ Revises
Variveis
Atribuies
int x, y, z;
char h=F;
int a = 18, b = 4;
int c, d;
x = y = 10;
float z = 18.0, x, y;
z = y++;
z++;
// z=10+1=11
c = a / b;
// c = 4
y--;
// y=11-1=10
d = a % b;
// d = 2
z = ++x;
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
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
a = x;
// a = 5
z = a / 5.0;
b = (int) (x+0.5);// b = 6
// z = 3.6
Controlo de Fluxo
Execuo de um programa:
int main() {
<declarao de variveis>
<instruo>
<instruo>
...
<instruo>
<instruo>
}
1. Introduo Linguagem C++ Revises
10
Instruo if
if (<condio>){
Se <condio> for
verdadeira ento executa
o 1 bloco de instrues.
<instruo>
<instruo>
} else {
<instruo>
<instruo>
11
Condies
Exemplos de condies:
(a == b), (a <= b), (a != b), (a < b)
Variveis booleanas:
bool v;
v = (a == b);
v = false;
1. Introduo Linguagem C++ Revises
12
Instruo if Exemplo 1
#include <iostream>
using namespace std;
//=========================================================
int main() {
int a, b;
if (b > a)
else
}
//=========================================================
13
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
}
//===============================================
1. Introduo Linguagem C++ Revises
14
Operador Ternrio
Forma geral deste operador:
<condio> ? <expresso1> : <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;
15
Instruo switch
switch ( <valor> ) {
case <valor1>:
<comandos1>;
break;
case <valor2>:
<comandos2>;
break;
...
case <valorK>:
<comandosK>;
break;
default:
<comandosDefault>;
}
1. Introduo Linguagem C++ Revises
16
17
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
<<
<<
<<
<<
<<
<<
<<
<<
<<
<<
0;
1;
2;
3;
4;
5;
6;
7;
8;
9;
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
0123456789 */
123456789 */
23456789 */
3456789 */
456789 */
56789 */
6789 */
789 */
89 */
9 */
18
<condio>
<bloco_instrues>
<bloco_instrues>
<condio>;
19
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
20
21
Ciclo for
<bloco_instrues>
Executa <inicializao>
Reavalia <condio>.
22
23
**********
**********
**********
**********
**********
...
24
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
25
break; }
26
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
27
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
28
29
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};
30
Tabelas
Para aceder a cada elemento individualmente basta
indicar o seu <ndice>:
<nome_variavel> [ <ndice> ];
Exemplo:
double pressao[5]={0, 1, 2, 3, 4};
pressao[1]=15.8;
pressao[0] = (pressao[2] + pressao [3]) / 2;
// 2.5
31
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;
}
32
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
33
Tabelas Multidimensionais
<tipo> <nome> [ <dim1> ][ <dim2> ]...[ <dimN> ];
T[0]
T[1]
T[2]
T[3]
34
35
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
36
Strings em C
Ler/Escrever Strings:
gets(string); : L uma string do teclado, no verifica compr.
37
Strings em C
Outras funes:
strlen(string)
strcpy(dest, org)
strcat(dest, org)
strcmp(str1, str2)
38
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;
}
39
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]
40
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
41
42
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>;
43
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;
44
45
46
Ficheiros
47
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.
48
Ficheiros
A leitura/escrita em ficheiros semelhante
entrada/sada de dados atravs do teclado/ecr.
49
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;
}
//---------------------------------------------------------
50
Ficheiros
Por omisso:
O ficheiro aberto em modo de texto (como ficheiro de texto).
51
Ficheiros
Modo
Significado
ios::out
ios::in
ios::app
ios::trunc
ios::ate
ios::binary
52
Ficheiros Abertura
ios::out | ios::trunc);
ios::app);
ios::app | ios::binary);
53
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");
54
linha do ficheiro.
55
56
57
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;
}
fich.close();
return 0;
...
}
58
put pointer
eof
59
60
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;
int main() {
Tprod produto;
char cod[10];
double preco;
bool encontrado;
eof
if(!f) {
cout << Erro: abrir << endl;
return -1;
}
int idx = 0;
encontrado = false;
f.seekg(0, ios::beg);
...
61
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;
}
62
Ficheiros
Ponteiros
1. Introduo Linguagem C++ Revises
63
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
64
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!
px = &x;
cout << *px;
*px = x * (*px); //x fica com 9
cout << *px;
return 0;
}
65
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...;
66
Ponteiros
Os ponteiros so muito
utilizados para manipular
tabelas
5
4
3
2
1
pt = t;
cout << *(pt+3); << endl;
cout << pt[3];
67
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
68
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
69
70
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
Libertar memria:
free(p);
1. Introduo Linguagem C++ Revises
71
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])
72
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
73
ADM em C++
Alocar memria:
int *p1;
TProd *p2;
p1 = new int[100];
p2 = new TProd[5];
// aloca 5 estruturas
Libertar memria:
delete []p1;
delete []p2;
74
75
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
76
77
<nome>([<lista_parmetros>]) {
<bloco_instrues>
[return <expresso>;]
}
78
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;
z = soma( 8 , 4 );
z = soma(8,4);
cout << O Resultado " << z;
return 0;
}
//===================
1. Introduo Linguagem C++ Revises
79
80
81
Funo main( )
Exemplo da funo main():
int main(int argc, char *argv[ ]);
82
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;
...
}
83
84
85
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;
}
//===================================================
86
23456789
num=2
int main( ) {
int num = 2;
escreveDigitos(num);
cout << endl << num=
<< num << endl;
}
87
23456789
num=10
int main( ) {
int num = 2;
escreveDigitos(num);
cout << endl << num=
<< num << endl;
}
88
23456789
num=10
int main( ) {
int num = 2;
escreveDigitos(&num);
cout << endl << num=
<< num << endl;
}
89
Funes Exemplos 3 e 4
void troca (int &x, int &y)
{
int temp;
temp = x;
x = y;
y = temp;
temp = *x;
*x = *y;
*y = temp;
...
...
90
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;
}
//=====================================
seguinte= (1+16)*5 = 85
y = 80
z = 85
91
92
}
...
int tempAnuais[52][Dias];
calculaMediaSemanal(tempAnuais, 52);
1. Introduo Linguagem C++ Revises
93
94
Permite que a
funo aparea no
lado esquerdo de
uma atribuio.
95
96
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;
}
97
98
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
99
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
100
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 .
101
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.
102
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;
103
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
104
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;
return soma;
}
105
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;
106
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
= 6
fat(2)
2 *
fat(1)
1 *
= 2
fat(0)
= 1
107
Funes Recursividade
Vantagens
Permite obter uma soluo mais elegante nalguns problemas.
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.
108
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
escreveNasteriscos(5)
*
*
*
*
*
(n=5)
(n=4)
(n=3)
(n=2)
(n=1)
(n=0)
109
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
110
2. Algoritmos de Ordenao e
Pesquisa
111