Professional Documents
Culture Documents
Aviso de licena de utilizao: Este documento pode ser utilizado livremente para fins
no comerciais, permitido aos seus utilizadores, copiar, distribuir e exibir publicamente os
seus contedos, desde que sejam ressalvados os direitos de autor do mesmo, nomeadamente,
dever ser sempre includa esta pgina em todas as cpias.
Paulo Baltarejo e Jorge Santos, 2006
ii
ndice
1 Programao em C/C++
1.1 Histria da linguagem C/C++ . . . . . . . . . . . . . . . . . .
1.2 Estrutura de um programa em C++ . . . . . . . . . . . . . .
1.3 Criao de um programa em C++ . . . . . . . . . . . . . . . .
1.4 Modelo de compilao da linguagem C++ . . . . . . . . . . .
1.5 Variveis, Tipos de dados e Constantes . . . . . . . . . . . . .
1.5.1 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.2 Tipos de dados . . . . . . . . . . . . . . . . . . . . . .
1.5.3 Declarao de variveis . . . . . . . . . . . . . . . . . .
1.5.4 Constantes . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.4.1 Literais . . . . . . . . . . . . . . . . . . . . .
1.5.4.2 Definidas . . . . . . . . . . . . . . . . . . . .
1.5.4.3 Declaradas . . . . . . . . . . . . . . . . . . .
1.6 Estruturas de controlo . . . . . . . . . . . . . . . . . . . . . .
1.6.1 Instrues de Sequncia . . . . . . . . . . . . . . . . .
1.6.1.1 Operadores aritmticos . . . . . . . . . . . . .
1.6.1.2 Operadores relacionais e lgicos . . . . . . . .
1.6.2 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . .
1.6.2.1 Distncia euclidiana entre dois pontos . . . .
1.6.2.2 Determinar permetro e rea de circunferncia
1.6.3 Exerccios Propostos . . . . . . . . . . . . . . . . . . .
1.6.3.1 Calcular ndice de massa corprea (IMC) . . .
1.6.3.2 Converter horas, minutos e segundos . . . . .
1.6.3.3 Teorema de Pitgoras . . . . . . . . . . . . .
1.6.3.4 Converter temperaturas . . . . . . . . . . . .
1.6.4 Instrues de Deciso . . . . . . . . . . . . . . . . . . .
1.6.4.1 Deciso binria . . . . . . . . . . . . . . . . .
1.6.4.2 Deciso mltipla . . . . . . . . . . . . . . . .
1.6.5 Prioridade dos operadores . . . . . . . . . . . . . . . .
1.6.6 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . .
1.6.6.1 Distncia euclidiana entre dois pontos . . . .
1.6.6.2 Classificar em funo da mdia . . . . . . . .
1.6.6.3 Determinar o mximo de 3 valores . . . . . .
1.6.6.4 Determinar tringulo vlido . . . . . . . . . .
1.6.7 Exerccios Propostos . . . . . . . . . . . . . . . . . . .
1.6.7.1 Classificar tringulo . . . . . . . . . . . . . .
1.6.7.2 Diviso . . . . . . . . . . . . . . . . . . . . .
1.6.7.3 Resolver equao da forma ax2 + bx + c = 0 .
iii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
3
4
4
5
6
6
8
8
9
10
11
11
12
13
16
16
17
17
17
18
18
18
18
18
19
21
22
22
23
23
24
25
25
25
25
1.7
1.8
25
26
26
26
27
27
28
28
30
30
31
32
32
33
34
34
35
35
35
35
35
35
35
36
36
36
36
36
38
41
41
42
43
44
45
46
46
46
47
47
47
48
48
48
48
49
1.8.2
1.8.3
1.8.4
1.9
1.10
1.11
1.12
1.13
1.14
49
50
51
51
52
52
52
53
53
55
55
58
58
58
58
59
60
61
62
63
63
68
68
68
68
68
68
68
69
72
72
73
74
74
79
79
81
83
83
85
86
86
86
90
91
vi
Lista de Figuras
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
vii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
4
38
40
41
42
43
45
48
49
53
60
69
70
73
80
83
91
92
93
viii
Lista de Tabelas
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
Palavras reservadas . . . . . . . . . . . . . . . . . . . .
Tipos de dados . . . . . . . . . . . . . . . . . . . . . .
Caracteres especiais . . . . . . . . . . . . . . . . . . . .
Exemplo operadores compostos . . . . . . . . . . . . .
Operadores aritmticos . . . . . . . . . . . . . . . . . .
Operadores aritmticos compostos . . . . . . . . . . . .
Operadores de incremento (modo prefixo e sufixo) . . .
Operadores relacionais . . . . . . . . . . . . . . . . . .
Exemplos de operadores relacionais . . . . . . . . . . .
Operadores lgicos . . . . . . . . . . . . . . . . . . . .
Exemplos de operadores lgicos . . . . . . . . . . . . .
Tabelas de verdade: conjuno, disjuno e negao . .
Operadores de manipulao de bits . . . . . . . . . . .
Tabela de verdade dos operadores de manipulao bits
Relao de precedncia dos operadores . . . . . . . . .
ndice de massa corprea . . . . . . . . . . . . . . . .
ix
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
7
9
12
13
13
14
14
14
15
15
15
16
16
22
26
Resumo
Estes apontamentos tm como objectivo principal apoiar os alunos que pretendam
aprender programao de computadores utilizando a linguagem C++, em particular
aqueles que frequentam a disciplina de Introduo Informtica do Ano 0 leccionada
no Instituto Superior de Engenharia do Porto (ISEP).
A estrutura destes apontamentos foi definida de acordo com a abordagem de
aprender-por-exemplo, pelo que, os conceitos so apenas introduzidos de acordo
com a necessidade de explicar a resoluo de um determinado programa. De forma
a suportar esta abordagem apresentado um grande nmero de exerccios resolvidos.
xi
xii
Captulo 1
Programao em C/C++
1.1
O C uma linguagem de programao imperativa (procedimental) tpica. Foi desenvolvida em 1970 por Dennis Ritchie para utilizao no sistema operativo Unix.
Esta linguagem particularmente apreciada pela eficincia e a mais utilizada na
escrita de software para sistemas operativos e embora menos, no desenvolvimento
de aplicaes. A sua utilizao tambm comum no ensino, apesar de no ser a
linguagem inicial para iniciados.
De acordo com Ritchie, o desenvolvimento inicial da linguagem C aconteceu nos
laboratrios da AT&T entre 1969 e 1973. O nome "C"foi escolhido porque algumas
das suas caractersticas derivavam de uma linguagem j existente chamada "B".
Em 1973, a linguagem C tornou-se suficientemente poderosa para suportar a
escrita de grande parte do kernel do Unix que tinha sido previamente escrito em
cdigo assembly.
Em 1978, Ritchie e Brian Kernighan publicaram a primeira edio do livro "The
C Programming Language"[Kernighan e Ritchie, 1988] que durante muitos anos
funcionou como a especificao informal da linguagem (K&R C). Posteriormente
a segunda verso versou sobre a especificao ANSI C. A especificao K&R C
considerado o conjunto mnimo obrigatrio que um compilador da linguagem deve
implementar.
O C++ [Stroustrup, 2000], pronunciado "c mais mais", uma linguagem de
programao genrica que suporta tanto os paradigmas da programao estruturada
(procedimental) como o orientado ao objecto. A partir de 1990, o C++ tornou-se
uma das linguagens de programao mais populares.
Bjarne Stroustrup desenvolveu o C++ (originalmente designado "C com classes") nos laboratrios da Bell em 1983, como um melhoramento da linguagem C.
Este melhoramentos incluram: adio de classes, funes virtuais, sobrecarga de
operadores, mltipla herana, templates e tratamento de excepes.
O standard do C++ foi ratificado em 1998 como ISO/IEC 14882:1998, sendo
que a verso actual, de 2003, o ISO/IEC 14882:2003.
1.2
// o meu p r i m e i r o programa em
#i n c l u d e <i o s t r e a m . h>
int main ( )
{
cout<<"Bom d i a Mundo ! " ;
return 0 ;
}
C++
1.3
Erros de
execuo
Erros de
compilao
Escrita do
cdigo-fonte
Compilao
Link ing
ficheiro
objecto
.obj ou .o
ficheiro
cdigo-fonte
.cpp ou .cc
ficheiros de
cabealhos
.h
Execuo
ficheiro
executvel
.exe
bibliotecas
.lib
Dependncia
funcional
Fluxo dados
1.4
Pr-processador
Erros de
compilao
Compilador
Assem bler
ficheiro
cdigo-fonte
(alterado)
.cpp ou .cc
ficheiro
cdigo-fonte
.cpp ou .cc
cdigo
assembly
Link er
ficheiro
objecto
.obj ou .o
ficheiros de
cabealhos
.h
bibliotecas
.lib
1.5
1.5.1
Variveis
10
return 0 ;
11
12
Da mesma forma que esta pessoa guardou temporariamente os valores em memria o computador tambm tem capacidade para isso, para tal foi necessrio definir
algumas variveis.
Um varivel uma poro de memria que permite armazenar um determinado
valor. Cada varivel tem um identificador e o tipo de dados. O identificador permite
referir de forma nica uma varivel enquanto que tipo de dados til para a optimizao do cdigo pois diferentes tipos de dados requerem quantidade distintas de
memria. Por exemplo, no cdigo do programa da listagem 1.2, os identificadores
utilizados: a, b e result so do tipo inteiro (int).
Na escolha de identificadores aquando da definio das variveis, o programador
deve obedecer a conjunto de regras para que estes sejam vlidos, a saber:
Ser uma sequncia de uma ou mais letras, dgitos e/ou carcter "underscore"(_),
iniciada obrigatoriamente por letra ou "underscore";
Os espaos no podem fazer parte de um identificador;
Embora o comprimento de um identificador no seja limitado, alguns compiladores s identificam os primeiros 32 caracteres, sendo o resto ignorado;
No podem ser iguais a qualquer palavra reservada da linguagem C++. A
tabela 1.1 apresenta as palavras reservadas segundo a norma ANSI-C++.
Um outro aspecto a ter em considerao na definio de um identificador,
que a linguagem C++ sensvel capitalizao, isto , faz a distino entre letras
5
1.5.2
Tipos de dados
Aquando da declarao de uma varivel, o compilador da linguagem C++ necessita, por uma questo de optimizao de cdigo, de saber qual o tipo da referida
varivel de forma a reservar em memria apenas o espao estritamente necessrio.
Por exemplo, para armazenar uma letra no necessrio tanto espao como para
armazenar um nmero real.
Notese que a memria do computador esta organizada em bytes, sendo que um
byte a unidade mnima para atribuio de memria. Com um byte possvel
armazenar:
Um nmero sem sinal entre 0 e 255;
Um nmero com sinal entre -128 a 127;
Um carcter simples.
No entanto, em muitas situaes ser necessrio armazenar valores superiores
capacidade de um byte, para este efeito existem outros tipos de dados. A tabela 1.2
apresenta os tipos dados fundamentais em C++, espao necessrio (em bytes) e a
gama de valores respectivos.
Note-se que efectivamente em C++ os caracteres so armazenados como um
valor numrico, de acordo com a norma ASCII2 .
1.5.3
Declarao de variveis
A utilizao de uma varivel num programa C++ requer a sua declarao prvia.
Considere-se os exemplos constantes no excerto de cdigo da listagem 1.3.
Listing 1.3: Declarao de variveis
1
{
// D e c l a r a o de v a r i v e i s
int a ;
2
3
Tam.
1
short
long
int
float
double
4
8
long double
10
bool
wchar_t
1
2
Descrio
Caracter ou inteiro de 8 bits
de comprimento
Inteiro de 16 bits de comprimento
Inteiro de 32 bits de comprimento
Nmero real
Nmero real, virgula flutuante, dupla preciso
Nmero real longo, virgula
flutuante, dupla preciso
Valores lgicos - booleanos
Caracter extendido, necessrio para a representao de
caracteres internacionais
Gama de valores
c/sinal: -128 a 127 e
s/sinal: 0 a 255
c/sinal: -32768 a 32767 e
s/sinal: 0 a 65635
c/sinal: -2147483648 a
2147483647 e s/sinal: 0 a
42949967295
ver short e long
3.4e38
1.7e308
1.2e4932
true e false
Caracteres (incluindo internacionais)
long int s a l d o ;
f l o a t media ;
double r a i z ;
bool s e n t i n e l a ;
char t e c l a ;
...
4
5
6
7
8
9
10
// D e c l a r a o de v a r i v e i s
// mais do que uma v a r i v e l por l i n h a
int x , y , z ;
f l o a t area , p e r i m e t r o ;
...
11
12
13
14
15
16
// D e c l a r a o de v a r i v e i s
// mais do que uma v a r i v e l por l i n h a
// e com i n i c i a e s
bool ePrimo=f a l s e ;
int nDiv =0, produto =1;
long double numero =1.0 , f a c t o r i a l = 1 . 0 ;
char _ 1 l e t r a= a , _ 2 l e t r a= b ;
17
18
19
20
21
22
23
24
1.5.4
Constantes
Uma constante qualquer identificador que tem um valor fixo, portanto que no
pode ser alterada durante a execuo do programa. Num programa em C++ podem
coexitir trs tipos de constantes: literais, definidas e declaradas.
1.5.4.1
Literais
Um literal uma qualquer identificador com o valor fixo e podem ser divididos em:
nmeros inteiros, nmeros reais, caracteres e cadeias de caracteres3
Nmeros inteiros - so constantes numricas que identificam nmeros na
base decimal. Note-se que para expressar uma constante numrica no necessrio escrever aspas(") ou qualquer outro caracter especial.
1776
707
-203
Quando escrito 1776 num programa est-se a referir ao valor numrico 1776
(mil setecentos e setenta e seis).
Alm da base decimal possvel utilizar a notao octal ou hexadecimal. Para
a notao octal precede-se o numero do caracter 0 (zero) e para hexadecimal
precede-se o nmero dos caracteres 0x(zero e x).
De seguida so apresentadas vrias formas de representar o mesmo valor, neste
caso o 75 (setenta e cinco).
Valor
75
0113
0x4b
Notao
decimal
octal
hexadecimal
Numeros Reais
Expressam nmeros com dcimas e/ou expoente. Podem incluir um ponto
decimal, o caracter e (que expressa "10 elevado a X", onde X um valor
inteiro) ou ambos.
3
Do anglo-saxnico String.
Valor
3.14159
6.022 1023
1.6 1019
2
3.0
Estas so cinco formas vlidas de representar nmeros reais em C++. Respectivamente, o valor de , o nmero de Avogadro, a carga elctrica de um
electro (extremamente pequena), raiz de dois e o numero trs expresso como
decimal;
Caracteres e strings
Tambm existem constantes no numricas, como a seguir se exemplifica:
z
p
"Ol Mundo!"
"Como ests?"
As primeiras duas expresses representam caracteres simples enquanto as outras duas representam strings (cadeia de caracteres). Para os caracteres simples usada a plica () e para as strings so usados as aspas (").
Existem caracteres especiais que no podem ser expressos sem ser no cdigo
fonte do programa, como por exemplo, nova linha (\n) ou tabulao (\t).
Todos so precedidos pela barra "\". A tabela 1.3 seguinte apresenta a lista
dos caracteres especiais.
Tabela 1.3: Caracteres especiais
Caracter
\n
\r
\t
\b
\
\"
1.5.4.2
Significado
nova linha
cursor para 1coluna
tabulao
backspace
plica simples
aspas simples
Definidas
Para alm dos literais existem constantes que podem ser declaradas pelo programador, podendo ser definidas atravs de uma directiva de pr-processamento #define
ou atravs da palavrachave const (ver seco 1.5.4.3).
A seguir apresenta-se a forma como definir uma constante atravs da directiva
de prprocessamento #define e cuja a sintaxe a seguinte:
#define <identificador> <expresso>
9
#include<i o s t r e a m . h>
#define PI
4 #define NEWLINE
3
3.14159265
\n
5
6
7
8
9
int main ( )
{
int r a i o =3;
double a r e a C i r c ;
10
a r e a C i r c = r a i o r a i o PI ;
cout<<" Raio=" << r a i o << " Area=" ;
cout<< a r e a C i r c << NEWLINE;
11
12
13
14
r a i o =5;
a r e a C i r c = r a i o r a i o PI ;
cout<<" Raio=" << r a i o << " Area=" ;
cout<< a r e a C i r c << NEWLINE;
15
16
17
18
19
return 0 ;
20
21
1.5.4.3
Declaradas
1.6
Estruturas de controlo
1.6.1
Instrues de Sequncia
As instrues de sequncia so instrues atmicas (simples) permitem a leitura/escrita de dados, bem como o clculo e atribuio de valores. Todas as instrues so
executadas pela ordem apresentada no programa.
O programa da listagem 1.5 codifica em C++ um algoritmo cujo objectivo
cambiar euros em dlares considerando a taxa de converso 1.17.
Listing 1.5: Cambiar euro para dlar
#include<i o s t r e a m . h>
const double taxa = 1 . 1 7 ;
3 int main ( )
4 {
5
double valorEuro , v a l o r D o l a r ;
6
cout<<" I n t r o d u z a o v a l o r em e u r o s=" ;
7
c i n >>v a l o r E u r o ;
8
v a l o r D o l a r=v a l o r E u r o taxa ;
9
cout<<" Valor em d o l a r = "<<v a l o r D o l a r <<e n d l ;
1
2
10
return 0 ;
11
12
11
Operadores aritmticos
Resultado
O valor da varivel c ser 10
Nome
soma
subtraco
multiplicao
diviso
resto da diviso inteira
Exemplo
a+b
a-b
a*b
a/b
a%b
Resultado
18
8
65
2.6
5
Nome
soma/atribuio
subtrao/atribuio
multiplicao/atribuio
diviso/atribuio
resto diviso inteira/atribuio
incremento
decremento
Exemplo
a+=b
a-=b
a*=b
a/=b
a%=b
a++
b
Significado
a=a+b
a=a-b
a=a*b
a=a/b
a=a%b
a=a+1
b=b-1
Nesta seco so apresentados os operadores relacionais e lgicos utilizados na linguagem C++, bem como exemplos da sua utilizao.
13
Resultado
O valor final de a ser 4 e o de b tambm
O valor final de a ser 3 e o de b 4
Operadores relacionais
A tabela 1.8 apresenta os operadores relacionais da linguagem C++. Os operadores
relacionais avaliam a comparao entre duas expresses. O resultado dessa comparao um valor do tipo bool que pode ser true ou false, obviamente de acordo
com o resultado da comparao.
Tabela 1.8: Operadores relacionais
Smbolo
<
>
==
!=
Significado
menor que
maior que
menor ou igual que
maior ou igual que
igual
diferente
Na tabela 1.9 apresenta-se alguns exemplos da utilizao dos operadores relacionais nos quais se consideram os valores a=5; b=6; c=7;.
Tabela 1.9: Exemplos de operadores relacionais
Exemplo
(7==5)
(a!=b)
(a<=7)
((a*b)>=c)
Resultado
falso
verdade
verdade
verdade
Operadores lgicos
A tabela 1.10 apresenta os operadores lgicos da linguagem C++
O resultado das operaes com os operadores lgicos tambm verdade ou falso.
O operador !, colocado esquerda da expresso, inverte o valor lgico da mesma.
Isto , se a expresso verdadeira passa a falsa e viceversa. A tabela 1.11 apresenta
alguns exemplos da utilizao dos operadores lgicos.
De seguida so apresentadas as tabelas de verdades das operaes lgicas: conjuno, disjuno e negao (tabela 1.12).
14
Significado
conjuno
disjuno
negao
Resultado
falso
verdade
falso
falso
Operador ternrio
O operador ternrio ou condicional avalia uma expresso e devolve diferentes valores
de acordo com a avaliao da expresso. A sintaxe deste operador a seguinte:
<condio> ? <resultado1> : <resultado2>
Se a <condio> verdade ento o operador vai devolver o <resultado1>. Caso
contrrio devolve o <resultado2>. Por exemplo:
int x;
x=(7==5 ? 4 : 3);
A varivel x vai ficar com o valor 3, uma vez que 7 diferente de 5.
bool x;
x=(5>3 ? true : false);
Neste caso atribuda varivel x o valor verdade.
Operadores manipulao bits
Os operadores de manipulao de bits aplicam-se apenas a expresses numricas
inteiras.
O operador um operador unrio e complementa (os bits 1s passam a 0s e
viceversa) todos os bits da varivel que estiver colocada ao seu lado direito. Os
operadores de deslocamento executam os deslocamento do operando colocado sua
Tabela 1.12: Tabelas de verdade: conjuno, disjuno e negao
a
0
0
1
1
b
0
1
0
1
a && b
0
0
0
1
a
0
0
1
1
15
b
0
1
0
1
a || b
0
1
1
1
a
0
1
!a
1
0
&
|
>>
<<
Significado
Complemento (not)
Conjuno (and)
Disjuno inclusiva (or)
Disjuno exclusiva (xor)
Deslocamento direita (shift)
Deslocamento esquerda (shift)
b
1
0
1
0
a & b
1
0
0
0
a | b
1
1
1
1
a b
0
1
1
0
1.6.2
Exerccios Resolvidos
Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de instrues sequenciais.
1.6.2.1
#include<i o s t r e a m . h>
#include<math . h>
3
4
5
6
int main ( )
{
int x1 , y1 , x2 , y2 ;
16
7
8
9
10
11
12
13
14
15
16
17
1.6.2.2
O programa da listagem 1.7 permite determinar o permetro e rea de uma circunferncia, a partir do valor do raio.
Listing 1.7: rea e permetro de um circunferncia
#include <i o s t r e a m . h>
#include <math . h>
3 const double p i = 3 . 1 4 1 5 ;
4 int main ( )
5 {
6
double area , p e r i m e t r o ;
7
int r a i o ;
1
2
cout<<" I n t r o d u z a o v a l o r do r a i o : " ;
c i n >>r a i o ;
a r e a=p i pow ( r a i o , 2 ) ;
p e r i m e t r o=2 p i r a i o ;
cout<<" Area : "<<area<<e n d l ;
cout<<" P e r i m e t r o : "<<p e r i m e t r o <<e n d l ;
9
10
11
12
13
14
15
return 0 ;
16
17
1.6.3
Exerccios Propostos
55kg
peso
=
= 20, 14
2
altura
1, 67m 1, 67m
17
Escreva um programa que a partir de um determinado nmero de segundos calcula o nmero de horas, minutos e segundos correspondentes. Conforme o seguinte
exemplo:
8053s = 2h + 14m + 13s
1.6.3.3
Teorema de Pitgoras
Converter temperaturas
1.6.4
9 tempC
5
(1.6.2)
Instrues de Deciso
Deciso binria
A deciso binria permite bifurcar a execuo de um programa em dois fluxos distintos, para tal utilizada instruo if. Esta instruo pode ser utilizada de duas
formas: if e if-else.
No primeiro caso, se a condio for verdadeira executado o bloco-instrues
caso contrrio nada acontece:
if (<condio>)
{
<bloco-instrues>
}
No caso do <bloco-instrues> ser constitudo por uma s instrues no
necessrio delimitar essa instruo por chavetas ({ e }).
A listagem 1.8 apresenta um programa codificado em C++, cujo objectivo
escrever no ecr que o aluno foi aprovado no caso da nota ser superior a 9.5 valores.
18
#i n c l u d e <i o s t r e a m . h>
int main ( )
{
double nota ;
cout<<" I n t r o d u z a nota : " ;
c i n >>nota ;
i f ( nota >=9.5)
cout<<"O a l u n o f o i aprovado " ;
return 0 ;
10
11
12
return 0 ;
13
14
1.6.4.2
Deciso mltipla
#include<i o s t r e a m . h>
2
3
4
5
6
7
int main ( )
{
int num1 , num2 , num3 , maximo ;
cout<<" I n t r o d u z a numero1 , numero2 e numero3 : " ;
c i n >>num1>>num2>>num3 ;
i f (num1>=num2)
{
i f (num1>=num3)
maximo=num1 ;
}
e l s e // s e num1<num2
{
i f (num2>=num3)
maximo=num2 ;
else
maximo=num3 ;
}
cout<<"O numero maior e : "<<maximo ;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
return 0 ;
23
24
20
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main ( )
{
char l e t r a ;
cout<<" I n t r o d u z a l e t r a (L/D/F ) : " ;
c i n >>l e t r a ;
switch ( l e t r a )
{
case L :
cout<<" L i g a r " ;
break ;
case D :
cout<<" D e s l i g a r " ;
break ;
case F :
cout<<" Furar " ;
break ;
default :
cout<<" Operacao i n v a l i d a " ;
}
22
return 0 ;
23
24
1.6.5
3
4
5
Operador
(, ), [, ], ->, ., sizeof
++, -
!
&,*
(tipo de dados)
+, *, /, %
+, < <, > >
6
7
8
9
10
11
&&, ||
?, :
=, +=, -=, *=, /=, %=,
> >=, < <=, &=, =, |=
,
12
Descrio
incremento/decremento
complemento para um
negao
referncia/ponteiro
converso de tipos de dados
sinal
operadores aritmticos
operadores aritmticos
operador de deslocamento
(bit a bit)
operadores relacionais
operadores relacionais
operadores de manipulao
de bits
operadores lgicos
condicional
atribuio
vrgula, separador
Sentido
No entanto pode-se resolver algumas dvidas em relao precedncia e sequncia de avaliao com a utilizao de parntesis((,)).
1.6.6
Exerccios Resolvidos
Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de instrues de deciso.
1.6.6.1
p
(x2 x1 )2 + (y2 y1 )2
(1.6.3)
22
int main ( )
{
int x1 , y1 , x2 , y2 ;
double d i s t a n c i a ;
cout<<" Coordenadas ponto1 ( x/y ) : " ;
c i n >>x1>>y1 ;
cout<<" Coordenadas ponto2 ( x/y ) : " ;
c i n >>x2>>y2 ;
12
13
14
i f ( ( int ) d i s t a n c i a ==0)
cout<<"Os p ont o s s a o c o i n c i d e n t e s "<<e n d l ;
else
cout<<" D i s t a n c i a="<<d i s t a n c i a <<e n d l ;
return 0 ;
15
16
17
18
19
20
1.6.6.2
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
int main ( )
{
int mat , por , ing , geo ;
double media ;
cout<<" I n t r o d u z a a s n o t a s ( mat/ por / i n g / geo ) : " ;
c i n >>mat>>por>>ing>>geo ;
media=(double ) ( mat+por+i n g+geo ) / 4 ;
10
i f ( media >=9.5)
cout<<" Aprovado "<<e n d l ;
else
cout<<" Reprovado "<<e n d l ;
return 0 ;
11
12
13
14
15
16
1.6.6.3
#include<i o s t r e a m . h>
2
3
int main ( )
23
{
int A, B, C, maximo ;
cout<<" I n t r o d u z a numero1 , numero2 , numero3 : " ;
c i n >>A>>B>>C;
i f (A>=B)
{
i f (A>=C)
maximo=A;
}
else
{
i f (B>=C)
maximo=B ;
else
maximo=C;
}
cout<<"O numero maior e : "<<maximo ;
return 0 ;
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<i o s t r e a m . h>
#include<math . h>
3
4
5
6
7
8
9
10
11
12
13
int main ( )
{
int x1 , y1 , x2 , y2 , x3 , y3 ;
double lado1 , lado2 , l a d o 3 ;
cout<<" Coordenadas ponto1 ( x/y ) : " ;
c i n >>x1>>y1 ;
cout<<" Coordenadas ponto2 ( x/y ) : " ;
c i n >>x2>>y2 ;
cout<<" Coordenadas ponto3 ( x/y ) : " ;
c i n >>x3>>y3 ;
14
15
16
17
18
19
20
24
21
22
23
24
25
26
27
1.6.7
Exerccios Propostos
Classificar tringulo
Classificar um tringulo quanto aos lados, sendo que um tringulo com todos lados
iguais designado Equiltero, com todos os lados diferentes entre si designado
Escaleno e caso tenha apenas dois lados iguais entre si, designa-se Issceles.
1.6.7.2
Diviso
Escreva um programa que dados dois valores, divide o primeiro pelo segundo. Note
que no possvel fazer a diviso por zero, neste caso deve ser apresentada a mensagem adequada.
1.6.7.3
b binmio
x =
2a
1.6.7.4
(1.6.4)
(1.6.5)
(1.6.6)
(1.6.7)
Sugesto: Tentar a resoluo com as estruturas se-ento-seno e alternativamente utilizar a estrutura de mltipla deciso.
25
peso
55kg
=
= 20, 14
2
altura
1, 67m 1, 67m
IMC
At 18,5 (inclusive)
De 18,5 a 25 (inclusive)
De 25 a 30 (inclusive)
Acima de 30
Interpretao
Abaixo do peso normal
Peso normal
Acima do peso normal
Obesidade
Um ano bissexto se divisvel por 4, excepto se, alm de ser divisvel por 4, for
tambm divisvel por 100. Ento ele s bissexto se tambm for divisvel por 400.
Escrever um programa que leia o valor de um ano e escreva se o ano ou no
bissexto.
1.6.7.7
Parque de estacionamento
1.6.8
Instrues de Repetio
Instruo do-while
O ciclo do-while um ciclo condicional que executa a iterao enquanto uma condio for verdadeira. Esta condio avaliada no fim. A seguir apresenta-se a
sintaxe da estrutura do-while. O controlo do ciclo processa-se da seguinte forma.
O <bloco-instrues> sempre executado pelo menos uma vez de pois avaliada
a <condio>. Caso o resultado da avaliao seja verdade o ciclo continua at que
o resultado da avaliao seja falso. Portanto quando o resultado da avaliao da
condio for falso o ciclo termina.
do
{
<bloco-instrues>
}
while (<condio>);
Considere-se o seguinte exemplo em cuja utilizao da estrutura do-while permite garantir que o valor da nota introduzida est situado entre 0 e 20.
O programa da listagem 1.16 apresenta uma soluo para o problema anterior
utilizando a estrutura do-while. Neste programa o ciclo executado uma vez e
caso o valor introduzido pelo utilizador (armazenado na varivel nota) seja inferior
a 0 ou superior a 20 a ciclo continua at que o valor da nota seja vlido, isto , entre
0 e 20.
Listing 1.16: Exemplo da instruo do-while
1
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
int main ( )
{
int nota ;
do
{
cout<<" I n t r o d u z i r nota e n t r e 0 20: " ;
c i n >>nota ;
}
while ( nota <0 | | nota >20);
12
return 0 ;
13
14
27
Instruo while
O ciclo while tambm um ciclo condicional que realiza a iterao enquanto uma
determinada condio for verdadeira. A condio avaliada no inicio da iterao.
Por isso, o ciclo while pode no realizar nenhuma iterao. A seguir apresentase
a sintaxe da estrutura while. O controlo do ciclo processase da seguinte forma.
A avaliao da condio feita no inicio e caso o resultado da seja verdade ento
o <bloco-instrues> executado. No caso do resultado ser falso ento o ciclo
termina.
while (<condio>)
{
<bloco-instrues>
}
Considere-se o seguinte exemplo em cuja utilizao da estrutura while permite
calcular e escrever a tabuada de um nmero. A seguir apresentase uma possvel
codificao (1.17) em C++ do problema anterior. Neste exemplo o ciclo while vai
fazer 10 iteraes, uma vez que a varivel i iniciada a 1, em cada iterao esta
incrementada em um valor e o ciclo s termina quando a varivel i for >10.
Listing 1.17: Exemplo da instruo while
1
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
14
int main ( )
{
int numero , r e s u l t a d o , i ;
cout<<" I n t r o d u z a o numero : " ;
c i n >>numero ;
i =1;
while ( i <=10)
{
r e s u l t a d o=numero i ;
cout<<numero<<" "<<i <<" = "<<r e s u l t a d o <<e n d l ; ;
i ++;
}
15
return 0 ;
16
17
1.6.8.3
Instruo for
O ciclo for bastante verstil porque aceita tanto iteraes fixas como condicionais.
Esta instruo constituda por trs elementos (todos opcionais). O primeiro elemento a iniciao das variveis de controlo das iteraes. A iniciao s acontece na
primeira iterao. O segundo elemento a condio de controlo das iteraes. Uma
iterao s acontece se a condio for verdadeira. A condio sempre avaliada.
O terceiro elemento usado para actualizar as variveis de controlo do ciclo. Este
elemento no executado na primeira iterao, s nas subsequentes. Um aspecto
muito importante que a avaliao acontece sempre depois dos outros elementos.
28
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
int main ( )
{
int soma=0, i ;
fo r ( i =1; i <=100; i ++)
soma+=i ;
cout<<soma ;
return 0 ;
}
Instruo break
A instruo break permite sair de um ciclo mesmo que a condio ainda seja verdadeira. O cdigo 1.19 apresenta um exemplo de um ciclo que interrompido pela
instruo break. O ciclo comea com a varivel n =10 e enquanto n for >0 vai executar o bloco de instrues. De cada iterao a varivel n decrementada numa
unidade. O bloco de instrues tem uma estrutura de deciso que quando o n for
igual a 3 vai escrever uma mensagem no ecr e executar a instruo break. O que
significa que o ciclo vai terminar quando a varivel n 3, portanto maior que 0.
Listing 1.19: Exemplo da instruo break
1
2
3
4
5
6
7
8
int main ( )
{
int n ;
fo r ( n=10; n>0; n)
{
c o u t << n << " , " ;
29
9
10
11
12
13
}
return 0 ;
14
15
16
Instruo continue
A instruo continue faz com que o ciclo passa para a iterao seguinte e as instrues que esto a seguir no sejam executadas. A listagem seguinte apresenta um
exemplo com a instruo continue. Neste exemplo todos os nmeros 10 a 1 so
escritos no ecr com excepo do 5. Isto porque, quando n igual a 5 a instruo
continue executada e por conseguinte a linha de cdigo cout < < n < < ", ";
no executada.
Listing 1.20: Exemplo da instruo continue
1
2
3
4
5
6
7
8
9
10
11
12
13
int main ( )
{
int n ;
fo r ( n=10; n>0; n)
{
i f ( n==5)
continue ;
c o u t << n << " , " ;
}
return 0 ;
}
1.6.9
Exerccios Resolvidos
Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de instrues cclicas. Nas solues so exploradas
situaes com utilizao simples dos ciclos e/ou imbricados.
1.6.9.1
#include<i o s t r e a m . h>
2
3
int main ( )
30
{
int lim1 , lim2 , min , max , soma , i ;
cout<<" I n t r o d u z a numero1 : " ;
c i n >>l i m 1 ;
cout<<" I n t r o d u z a numero2 : " ;
c i n >>l i m 2 ;
i f ( lim2>l i m 1 )
{
min=l i m 1 ;
max=l i m 2 ;
}
else
{
min=l i m 2 ;
max=l i m 1 ;
}
soma=0;
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
return 0 ;
27
28
1.6.9.2
n=0 1
factorial(n) =
n 1 n factorial(n 1)
Exemplo: factorial(5)=5*4*3*2*1=120
Listing 1.22: Calcular factorial de um nmero
1
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
int main ( )
{
int f a c t o r i a l , i , numero ;
cout<<" I n t r o d u z a numero : " ;
c i n >>numero ;
f a c t o r i a l =1;
fo r ( i =1; i<=numero ; i ++)
f a c t o r i a l = i ;
11
12
13
return 0 ;
14
15
31
Um nmero primo se for apenas divisvel por si prprio e pela unidade, por exemplo: 11 nmero primo (visto que apenas divisvel por 11 e por 1), enquanto que
21 no primo, pois tem os seguintes divisores: 1,3,7 e 21. O programa da listagem
1.23 permite determinar se um nmero ou no primo.
Listing 1.23: Determinar se um nmero primo
1
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main ( )
{
int i , numero ;
bool primo=true ;
cout<<" I n t r o d u z a numero : " ;
c i n >>numero ;
i =2;
while ( primo==true && i <=(numero / 2 ) )
{
i f ( numero%i ==0)
primo=f a l s e ;
i ++;
}
i f ( ! primo )
cout<<"O numero "<<numero<<" nao e primo "<<e n d l ;
else
cout<<"O numero "<<numero<<" e primo "<<e n d l ;
20
return 0 ;
21
22
1.6.9.4
O programa da listagem 1.24 permite ler o nmero e a idade de uma srie de pessoas.
Este programa deve terminar quando for introduzido o nmero da pessoa = 0. No
final deve ser mostrado o nmero e idade da pessoa mais nova.
Listing 1.24: Pessoa mais nova
1
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
int main ( )
{
int numero , idade , menorNumero=0, menorIdade =0;
bool p r i m e i r o=true ;
do
{
cout<<" I n t r o d u z a numero : " ;
c i n >>numero ;
i f ( numero >0)
{
cout<<" I n t r o d u z a a i d a d e : " ;
32
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
}
}
while ( numero ! = 0 ) ;
29
30
31
32
i f ( primeiro )
cout<<"Nao foram i n s e r i d o s e l e m e n t o s "<<e n d l ;
else
{
cout<<"O numero e i d a d e da p e s s o a mais nova : " ;
cout<<menorNumero<<" , "<<menorIdade<<e n d l ;
}
return 0 ;
33
34
35
36
37
38
39
40
41
1.6.9.5
O programa da listagem 1.25 permite ler as notas de portugus obtidas pelos elementos de uma turma. Este programa termina quando for introduzido o numero
do aluno 0. No final deve ser mostrado o nmero do aluno melhor classificado e a
mdia de notas de turma.
Listing 1.25: Melhor aluno e mdia das notas
1
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
int main ( )
{
int numero , nota , melhorNumero =0, melhorNota =0;
int somaNotas =0,numAlunos =0;
bool p r i m e i r o=true ;
double media = 0 . 0 ;
do{
cout<<" I n t r o d u z a numero : " ;
c i n >>numero ;
i f ( numero >0)
{
33
14
15
16
17
18
19
20
21
somaNotas+=nota ;
22
23
i f ( ! primeiro )
{
i f ( nota>melhorNota )
{
melhorNumero=numero ;
melhorNota=nota ;
}
}
else
{
melhorNumero=numero ;
melhorNota=nota ;
p r i m e i r o=f a l s e ;
}
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
}
while ( numero ! = 0 ) ;
i f ( numAlunos >0)
{
media=(double ) somaNotas /numAlunos ;
cout<<"Numero do melhor a l u n o : "<<melhorNumero<<e n d l ;
cout<<" Nota do melhor a l u n o : "<<melhorNota<<e n d l ;
cout<<" Media das n o t a s : "<<media<<e n d l ;
}
else
cout<<"Nao foram i n s e r i d o s n o t a s "<<e n d l ;
39
40
41
42
43
44
45
46
47
48
49
50
return 0 ;
51
52
1.6.10
Exerccios Propostos
Nesta seco so propostos alguns problemas com vista aplicao dos diferentes
tipos de instrues anteriormente introduzidas com particular nfase na instrues
cclicas.
1.6.10.1
O resultado da diviso inteira de um nmero inteiro por outro nmero inteiro pode
sempre ser obtido utilizandose apenas o operador de subtraco. Assim, se quiser34
Algarismos de um nmero
Escreva um programa que leia a temperatura de N cidades portuguesas e que represente a temperatura de cada uma delas com uma barra de asteriscos (*), em que
cada asterisco representa um intervalo de 2 C. De acordo com os exemplos seguintes:
35
*****
********
**********
****
Escreva um programa que calcule a soma dos algarismos que compem um nmero.
Por exemplo: 7258 = 7+2+5+8 = 22
1.6.10.10
Capicua de um nmero
Elaborar um programa para converter um nmero escrito em binrio para o correspondente na base decimal. A converso fazse de acordo com o exemplo seguinte:
10110011(2) =
= 1 27 + 0 26 + 1 25 + 1 24 + 0 23 + 0 22 + 1 21 + 1 20
= 128 + 0 + 32 + 0 + 16 + 0 + 0 + 2 + 1
= 179(10)
Note que os expoentes das potncias na frmula de converso correspondem, respectivamente, posio ocupada por cada algarismo no nmero em binrio. Sendo
que o algarismo mais direita corresponde posio zero.
1.7
Funes
36
2
3
4
5
6
return r ;
8
9
10
11
12
13
14
15
16
17
int main ( )
{
int a , b , z ;
a =5;
b=3;
z = soma ( a , b ) ;
c o u t << " R e s u l t a d o : " << z ;
18
return 0 ;
19
20
int main ()
{
int z;
z = soma(5,3);
return r;
soma (ver figura 1.3). Os valores so copiados para as variveis int n1 e int n2 da
funo soma .
Na funo soma definida a varivel r do tipo int qual atribudo o resultado
da operao a mais b. Neste caso como a varivel a tem o valor 5 e a varivel b tem
o valor 3 o resultado 8. Portanto a varivel r tem o valor 8. A seguinte linha
return r;
termina a funo soma e retorna o controlo do fluxo de execuo funo main,
que recomea onde foi interrompida pela chamada funo soma. Alm disso, a
instruo return retorna o valor de r. Este valor retornado pela funo soma
atribudo varivel z;
Uma funo no tem obrigatoriamente que ter argumentos e pode no retornar
nada. Para os casos em que a funo no retorna nenhum valor o tipo da funo
void, neste caso a funo tambm designada de procedimento. A seguir (1.27)
apresentase uma funo que no tem argumentos nem retorna qualquer valor.
Listing 1.27: Exemplo de uma funo void
1
2
3
4
5
6
7
8
9
10
11
12
int main ( )
{
imprime ( ) ;
return 0 ;
}
1.7.1
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void f 1 ( int d )
{
// v a r i a v e l l o c a l
int x ;
// l e i t u r a da v a r i a v e l a
x=a +3;
// e s c r e v e r na v a r i a v e l a
a=d+x ;
}
int main ( )
{
// v a r i a v e l l o c a l
int z =5;
cout<<" Valor de a= "<<a<<e n d l ;
f1 ( z ) ;
cout<<" Valor de a= "<<a<<e n d l ;
return 0 ;
}
Stack Frame
Stack
Argumentos e
Variveis de Ambiente
Stack Frame
Instrues do programa
Cdigo
Variveis Globais
Dados
Heap
2
3
4
5
6
7
void h ( int a )
{
int x ;
cout<<" Funcao h"<<e n d l ;
}
4
40
main()
main()
stack
f()
int x
g()
int x
int a
f()
int x
main()
1 passo
2 passo
3 passo
f()
int x
h()
int x
int a
f()
int x
f()
int x
main()
main()
main()
4 passo
5 passo
6 passo
main()
7 passo
tempo
8
9
10
11
12
13
void g ( int a )
{
int x ;
cout<<" Funcao g"<<e n d l ;
}
14
15
16
17
18
19
20
21
void f ( )
{
int x ;
cout<<" Funcao f "<<e n d l ;
g(x );
h(x ) ;
}
22
23
24
25
26
27
int main ( )
{
f ();
return 0 ;
}
1.7.2
Passagem de argumentos
Na linguagem C++ os parmetros podem ser passados para uma funo por valor
ou por referncia.
1.7.2.1
2
3
4
5
6
return r ;
8
9
10
11
12
13
14
15
16
17
int main ( )
{
int a , b , z ;
a =5;
b=3;
z = soma ( a , b ) ;
c o u t << " R e s u l t a d o : " << z ;
18
return 0 ;
19
20
1.7.2.2
Existem situaes em que necessrio alterar o valor de uma varivel dentro de uma
funo que foi definida noutra funo. Para este caso a varivel tem que ser passada
por referncia. O programa da listagem 1.31 apresenta a funo divisaoInteira
que tem quatro argumentos, dois passados por valor (int dividendo e int divisor)
e dois por referncia (int &quociente e int &resto). A sintaxe da linguagem C++
obriga a que os argumentos passados por referncia so identificados por um & entre
o tipo de dados e o identificador da varivel.
Listing 1.31: Passagem por referncia
1
#include<i o s t r e a m . h>
42
13
14
15
16
int main ( )
{
int D=23 , d=5, q , r ;
17
d i v i s a o I n t e i r a (D, d , q , r ) ;
18
19
20
21
22
return 0 ;
23
24
int main()
endereo
23
5
{
de q
int D,d,q,r;
D=23;
d=5;
divisaoInteira( D , d , q , r )
}
endereo
de r
Quando se declara uma funo pode-se especificar valores para cada um dos parmetros. Para tal basta atribuir valores com o operador = na declarao da funo.
O programa da listagem 1.32 apresenta a funo divide, cujo o segundo argumento
tem um valor por omisso. Significa isto que a funo pode ser chamada de duas
formas, com um parmetro ou com dois. Com um serve para iniciar o argumento a,
sendo que o b est iniciado por omisso. Com dois inicia os dois argumentos.
43
2
3
4
5
6
7
8
9
10
11
12
13
14
1.7.3
Prottipos de funes
2
3
4
5
6
7
8
int main ( )
{
int x ;
x=d i v i d e ( 2 0 , 5 ) ;
return 0 ;
}
9
10
11
12
13
14
15
A soluo para este problema consiste em definir os prottipos das funes antes
da sua chamada. No prottipo da funo necessrio referir qual o tipo ou tipos
de dados dos argumentos (respeitando a ordem) e qual o tipo de dados de retorno
alm do identificador da funo. A forma para definir um prottipo a seguinte:
44
4
5
6
7
8
9
int main ( )
{
cout<<d i v i d e (20 ,4) < < e n d l ;
return 0 ;
}
10
11
12
13
14
15
16
Embora no seja necessrio colocar o identificador dos argumentos a sua utilizao aconselhvel. Efectivamente, em alguns casos poderseia contornar a definio de prottipos, inserindo a definio das funo antes da primeira chamada,
portanto antes da funo main. No entanto, esta prtica desaconselhada, pois
ineficaz no caso de chamadas circulares entre funes.
1.7.4
Programa principal
int main()
{
cout << areaCirculo(5);
return 0;
}
Implementao da funes
float areaCirculo(int raio)
{
return raio*raio*pi;
}
45
1.7.5
Exerccios resolvidos
Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de funes na produo de programas modulares.
1.7.5.1
O programa da listagem 1.35 apresenta uma funo que recebe um nmero inteiro
e devolve o maior algarismo contido nesse nmero.
Listing 1.35: maior(n) que devolve o maior algarismo de um nmero
1
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main ( )
{
int numero ;
cout<<" I n t r o d u z a a numero= " ;
c i n >>numero ;
22
23
24
25
return 0 ;
26
27
1.7.5.2
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
14
bool p e r f e i t o ( int n )
{
int soma=0,x ;
fo r ( x=1;x<=(n / 2 ) ; x++)
{
i f ( n%x==0)
soma+=x ;
}
i f ( soma==n )
return true ;
return f a l s e ;
}
15
16
17
18
19
20
int main ( )
{
int numero ;
cout<<" I n t r o d u z a a numero= " ;
c i n >>numero ;
21
i f ( p e r f e i t o ( numero ) )
cout<<"O numero "<<numero<<" e p e r f e i t o "<<e n d l ;
else
cout<<"O numero "<<numero<<" nao e p e r f e i t o "<<e n d l ;
22
23
24
25
26
return 0 ;
27
28
1.7.6
Exerccios propostos
Nesta seco so propostos alguns problemas relacionados com a utilizao de procedimentos e funes na escritas de programas modulares.
1.7.6.1
Escreva uma funo que, dados dois nmeros reais, retorna a mdia deles arredondada para um inteiro, e devolve os nmeros por ordem crescente. Faa um programa
que permita testar a funo anterior.
1.7.6.2
A lei de Ohm uma relao entre a corrente (I), a tenso (V) e a resistncia (R),
de acordo com o circuito elctrico representado na figura 1.9.
47
Lei de Ohm:
V
I = V /R
Funo somatrio
n
X
2i
i
i=1
Sugesto: crie uma funo para determinar cada termo i da srie.
Calcular o somatrio
1.7.6.4
Uma empresa pretende enviar cifrada uma sequncia de inteiros decimais de 4 dgitos
(DigDigDigDig). A cifra consiste em: substituir cada dgito Dig por (Dig+8)%10
(i.e., adiciona 8 e calcula o resto da diviso do resultado por 10); depois troca o
terceiro dgito com o primeiro e troca o quarto dgito com o segundo.
a) Escreva uma funo que receba um inteiro decimal de 4 dgitos e o devolva
cifrado.
b) Escreva uma funo que receba um inteiro cifrado e o decifre para o valor
original.
c) Escreva uma funo que apresente um menu com 2 opes, cifrar e decifrar
nmero, pea ao utilizador para escolher uma das opes, e retorne a opo
escolhida.
d) Faa um programa que permita testar as funes anteriores.
1.7.6.5
Nmeros primos
1.8
Vectores
1.8.1
Definio de vectores
Os vectores so conjuntos de elementos (variveis) do mesmo tipo de dados, colocados consecutivamente na memria. Podem ser acedidos individualmente ou referenciados por indexao. Isto significa que, por exemplo, para guardar vinte valores
do tipo int no necessrio declarar vinte variveis. Para tal possvel declarar
um vector com vinte posies do tipo int com um nico identificador. A seguir
apresentada a sintaxe para declarar um vector:
<tipo-de-dados> <id-do-vector> [<num-de-elem>]
na qual:
<tipo-de-dados> indica qual o tipo de dados (e.g., : int, float, char) de
cada elemento do vector;
<id-do-vector> este o identificador do vector;
<num-de-elem> entre parntesis rectos ([,]) especifica o nmero de elementos do vector. O nmero de elementos tem que ser um valor constante, isto
, no pode ser uma varivel, porque os vectores so conjuntos estticos de
memria de um determinado tamanho e o compilador tem que ser capaz de
determinar exactamente a quantidade de memria necessaria para o vector
antes de qualquer instruo ser considerada.
Por exemplo um vector para armazenar vinte nmeros inteiros (do tipo de dados
int) pode ser definido da seguinte forma:
int vec[20];
A figura 1.10 representa graficamente um vector com 20 elementos. Onde cada
rectngulo representa um elemento do vector, que neste caso so elementos do tipo
int. Os elementos esto numerados de 0 a 19, uma vez que o primeiro elemento de
um vector sempre a posio 0, independentemente do nmeros de elementos do
vector.
ndice
Valor 12
17 15
...
19
...
11
1.8.2
Quando se declara um vector possvel, como acontece com qualquer outra varivel, iniciar os seus elementos. Para tal deve-se colocar os elementos separados por
virgulas (,) dentro de chavetas ({}). Como por exemplo:
int vec[5]={1,3,2,55,67};
O nmero de elementos deve ser igual ao nmero de posies do vector. No
entanto, possvel no definir o nmero de elementos do vector, sendo o nmero
de posies definido em funo dos elementos que esto dentro das chavetas. A
49
1.8.3
#include<i o s t r e a m . h>
#define MAX 5
3
4
5
6
7
8
9
int main ( )
{
int vec [MAX] = { 2 3 , 4 5 , 3 2 , 7 8 , 9 8 } , i , soma=0;
fo r ( i =0; i <MAX; i ++)
soma+=vec [ i ] ;
cout<<" Somatorio : "<<soma<<e n d l ;
10
return 0 ;
11
12
50
1.8.4
Exerccios resolvidos
1.8.4.1
i f ( vec [ i ]%2==0)
npar++;
7
8
}
return npar ;
9
10
11
51
i f ( vec [ i ]>maximo )
maximo=vec [ i ] ;
else
i f ( vec [ i ]<minimo )
minimo=vec [ i ] ;
7
8
9
10
11
}
return ( maximominimo ) ;
12
13
14
#include<i o s t r e a m . h>
#define MAX
10
3
4
5
6
7
8
9
10
int main ( )
{
int v e c t o r [MAX] ;
11
l e i t u r a ( v e c t o r ,MAX) ;
cout<<c o n t a P a r e s ( v e c t o r ,MAX)<<e n d l ;
cout<<m a i o r D i f e r e n c a ( v e c t o r ,MAX)<<e n d l ;
12
13
14
15
return 0 ;
16
17
1.8.5
Exerccios propostos
1.8.5.1
Prova de atletismo
Faa a leitura das pontuaes que 5 juzes de uma determinada prova atriburam a
um atleta (valores compreendidos entre 0 e 9 inclusive). Determine e apresente com
formato adequado, os seguintes valores:
52
Suavizao
Em qualquer experincia existe um certo erro associado aos valores obtidos. Uma
tcnica conhecida como suavizao pode ser utilizada para reduzir o efeito desse erro
na anlise dos resultados. Escreva ento um programa que permita ler os dados para
um vector de N reais e implemente uma funo que produza uma suavizao sobre
esses dados. A suavizao consiste em substituir o valor actual de uma posio
pela mdia do valor da posio anterior, da posterior e dele prprio. Assumindo
que o identificador do vector v, ento v[i]=(v[i-1]+v[i]+v[i+1])/3, (excepto o
primeiro e o ltimo). O primeiro elemento do vector suavizado com base na mdia
entre os dois primeiros valores e o ltimo elemento suavizado com base na mdia
entre os dois ltimos.
1.9
Vectores multidimensionais
...
799
56
11
...
12
...
...
...
...
...
...
...
639
83
...
#define COLUNAS 5
#define LINHAS 3
3
4
5
6
7
8
9
10
11
12
13
14
int main ( )
{
int mat [ LINHAS ] [ COLUNAS ] ;
int n ,m;
fo r ( n=0;n<LINHAS ; n++)
for (m=0;m<COLUNAS;m++)
{
mat [ n ] [m]=( n+1)(m+1);
}
return 0 ;
}
#define COLUNAS 5
#define LINHAS 3
3
4
5
6
7
8
9
10
11
12
13
14
int main ( )
{
int mat [ LINHAS COLUNAS ] ;
int n ,m;
fo r ( n=0;n<LINHAS ; n++)
for (m=0;m<COLUNAS;m++)
{
mat [ n COLUNAS + m]=( n+1)(m+1);
}
return 0 ;
}
54
1.9.1
Exerccios resolvidos
1.9.1.1
#include<i o s t r e a m . h>
#include<s t d l i b . h>
#define MAX
50
5 #define MAX_L 4
6 #define MAX_C 4
4
7
8
9
10
11
12
13
int menu ( ) ;
void l e i t u r a ( int m a t r i z [ ] [MAX_C] ) ;
f l o a t mediaDiagonal ( int m a t r i z [ ] [MAX_C] ) ;
int s u p e r i o r M e d i a ( int m a t r i z [ ] [MAX_C] , int v e c t o r [ ] ) ;
int o c o r r e n c i a s ( int m a t r i z [ ] [MAX_C] , int m a t r i z _ o c o r r [ ] [ 2 ] ) ;
void i n c _ o c o r r ( int v a l o r , int m[ ] [ 2 ] , int n ) ;
14
15
16
17
18
19
int main ( )
{
int m a t r i z [MAX_L] [MAX_C] ;
int v e c t o r [MAX_LMAX_C] ;
int m a t r i z _ o c o r r [MAX_LMAX_C] [ 2 ] ;
55
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
break ;
case 4 :
c o u t << " O c o r r e n c i a s : " << e n d l ;
n_elem = o c o r r e n c i a s ( matriz , m a t r i z _ o c o r r ) ;
f o r ( i =0; i <n_elem ; i++ )
{
c o u t << m a t r i z _ o c o r r [ i ] [ 0 ] << " : " ;
cout<< m a t r i z _ o c o r r [ i ] [ 1 ] << " o c o r r e n c i a ( s ) " << e n d l ;
}
break ;
42
43
44
45
46
47
48
49
50
51
}
} while ( op ! = 0 ) ;
return 0 ;
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
int menu ( )
{
int op ;
char b u f f e r [MAX] ;
do{
cout<<"Menu\n" ;
cout<<"1 Ler m a t r i z \n" ;
cout<<"2 Media da d i a g o n a l p r i n c i p a l \n" ;
cout<<"3 Elementos s u p e r i o r e s a media \n" ;
cout<<"4 Numero de o c o r r e n c i a s \n" ;
cout<<"0 S a i r \n" ;
cout<<"\ n D i g i t e a opcao : " ;
c i n . g e t l i n e ( b u f f e r ,MAX) ;
op=a t o i ( b u f f e r ) ;
56
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
return n ;
110
111
112
113
114
115
116
117
118
119
120
121
return n ;
57
123
124
125
126
127
128
do
{
129
130
i f ( m[ i ] [ 0 ] == v a l o r )
{
m[ i ] [ 1 ] + + ;
i n c = true ;
}
i ++;
131
132
133
134
135
136
}
while ( ! i n c && i <n ) ;
137
138
139
i f ( ! inc )
{
m[ n ] [ 0 ] = v a l o r ;
m[ ( n ) + + ] [ 1 ] = 1 ;
}
140
141
142
143
144
145
1.9.2
Exerccios propostos
1.9.2.1
Mximo local
1.10
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main ( )
{
int v e c t o r 1
int v e c t o r 2
printvector
printvector
return 0 ;
}
[ ] = {5 ,
[ ] = {2 ,
( vector1
( vector2
10 , 15};
4 , 6 , 8 , 10};
,3);
,5);
1.11
Strings
10
11
12
13
14
15
16
17
18
19
str B o m d i' a m u n d o \0
1.11.1
Iniciao de strings
Tal como os vectores de dados numricos as strings tambm podem ser iniciadas
aquando da sua definio. A seguir apresenta-se duas formas para iniciar uma string
na declarao
char str[]={B,o,m, ,d,i,a, ,m,u,n,d,o,\0};
char str[]="Bom dia mundo";
O compilador alm de as iniciar tambm define o seu tamanho. No caso da
primeira definio necessrio colocar o caracter \0, explicitamente. No segundo
caso o compilador acrescenta o esse caracter string.
Da mesma forma que os vectores de dados numricos as strings tambm podem
ser manipuladas por indexao.
str[0]=B;
str[1]=o;
Outro mtodo para atribuir dados a uma strings atravs do objecto cin, nomeadamente do mtodo getline cujo prottipo :
cin.getline (char buffer[], int length, char delimiter = \n);
na qual
buffer este o endereo da string;
length este designa o nmero mximo de caracteres que a string pode conter;
delimiter o caracter delimitador usado para determinar o fim da cadeia
de caracteres inserida pelo utilizador, que por omisso o o caracter nova linha
(\n).
60
1.11.2
#include<i o s t r e a m . h>
#include<s t r i n g . h>
3
4
#define
SIZE
50
5
6
int main ( )
61
{
char s t r i n g 1 [ SIZE]="Bom d i a mundo ! " ;
char s t r i n g 2 [ SIZE ] ;
int n ;
8
9
10
11
12
13
i f ( strcmp ( s t r i n g 2 , s t r i n g 1 )==0)
cout<<"As s t r i n g s s ao i g u a i s "<<e n d l ;
14
15
16
n=s t r l e n ( s t r i n g 1 ) ;
cout<<"A s t r i n g 1 tem"<<n<<" c a r a c t e r e s "<<e n d l ;
17
18
19
return 0 ;
20
21
1.11.3
Dado que uma string pode conter representaes de outros tipo de dados, como
nmeros, em algumas situaes pode ser til transformar uma string num dado
numrico. Por exemplo, uma string qualquer pode conter o seguinte nmero "1977",
mas em termos de codificao esta no mais nem menos do que uma sequncia de
5 caracteres, portanto, no sendo possvel realizar operaes aritmticas. Para tal
necessrio, converter esta string num tipo de dado numrico, como por exemplo:
int, long, float. Na biblioteca cstdlib ( necessrio a incluso do ficheiro de
cabealho stdlib.h) esto definidas trs funes que permitem fazer essa converso.
As funes so:
int atoi (const char *string ); converte a string num int.
long atol (const char *string ); converte a string num long.
double atof (const char *string ); converte a string num double.
A seguir apresenta-se um exemplo da utilizao destas funes
Listing 1.47: Exemplo da utilizao de funes da biblioteca cstring
1
2
#include<i o s t r e a m . h>
#include<s t d l i b . h>
3
4
#define
SIZE
50
5
6
7
8
9
10
11
int main ( )
{
char b u f f e r [ SIZE ] ;
int i ;
long l ;
double d ;
12
13
14
15
16
17
62
18
19
20
21
22
23
24
25
26
27
return 0 ;
28
29
1.11.4
Exerccios resolvidos
1.11.4.1
3. Uma funo que receba duas strings e retorne: 1 se as strings forem iguais; e 0
se forem diferentes. O prottipo da funo dever ser int str1Igualstr2(char *s1, char *s
4. Uma funo que receba um carcter e caso seja maisculo retorne o correspondente minsculo. O prottipo da funo dever ser char mytolower(char s);
5. Uma funo que receba um carcter e caso seja minsculo retorne o correspondente maisculo. O prottipo da funo dever ser char mytoupper(char s);
6. Uma funo que elimine todos os espaos esquerda do primeiro carcter(diferente
de espao). O prottipo da funo dever ser void mylefttrim(char *s);
7. Uma funo que elimine todos os espaos direita do ltimo carcter (diferente
de espao). O prottipo da funo dever ser void myrighttrim(char *s);
8. Uma funo que elimine todos os espaos mltiplos entre as palavras ou letras.
O prottipo da funo dever ser void removemultiplespace(char *s).
63
5
6
7
8
9
10
11
12
13
14
int menu ( ) ;
int m y s t r l e n ( char s ) ;
int mystrncpy ( char s t r D e s t , char s t r S o u r c e , int comp_strDest ) ;
int s t r 1 I g u a l s t r 2 ( char s t r 1 , char s t r 2 ) ;
char mytolower ( char s ) ;
char mytoupper ( char s ) ;
void m y l e f t t r i m ( char s ) ;
void m y r i g h t t r i m ( char s ) ;
void r e m o v e m u l t i p l e s p a c e ( char s ) ;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
int main ( )
{
int op , n ;
char s t r 1 [MAX] , s t r 2 [MAX] , c ;
do{
op=menu ( ) ;
switch ( op ) {
case 1 : cout<<"\ n D i g i t e a s t r i n g : " ;
c i n . g e t l i n e ( s t r 1 ,MAX) ;
n=m y s t r l e n ( s t r 1 ) ;
cout<<"A s t r i n g tem "<<n<<" c a r a c t e r e s "<<e n d l ;
break ;
case 2 :
cout<<"\ n D i g i t e a s t r i n g : " ;
c i n . g e t l i n e ( s t r 1 ,MAX) ;
n=mystrncpy ( s t r 2 , s t r 1 , MAX) ;
cout<<" Copiou "<<n<<" c a r a c t e r e s "<<e n d l ;
cout<<s t r 2 <<e n d l ;
break ;
case 3 :
cout<<"\ n D i g i t e a s t r i n g 1 : " ;
c i n . g e t l i n e ( s t r 1 ,MAX) ;
cout<<"\ n D i g i t e a s t r i n g 2 : " ;
c i n . g e t l i n e ( s t r 2 ,MAX) ;
n=s t r 1 I g u a l s t r 2 ( s t r 2 , s t r 1 ) ;
i f ( n==1)
cout<<"As s t r i n g s s a o i g u a i s "<<e n d l ;
else
cout<<"As s t r i n g s s a o d i f e r e n t e s "<<e n d l ;
45
46
47
48
49
50
break ;
case 4 :
cout<<"\ n D i g i t e o c a r a c t e r : "<<e n d l ;
c=g e t c h a r ( ) ;
cout<<mytoupper ( c)<<e n d l ;
64
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
}
} while ( op ! = 0 ) ;
return 0 ;
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
int menu ( )
{
int op ;
char b u f f e r [MAX] ;
do{
cout<<"Menu\n" ;
cout<<"1 Determinar o comprimento de uma s t r i n g \n" ;
cout<<"2 Copiar uma s t r i n g \n" ;
cout<<"3 V e r i f i c a r s e duas s t r i n g s s a o i g u a i s \n" ;
cout<<"4 C o n v e r t e r um c a r a c t e r mi n us c ul o em m a i u s c u l o \n" ;
cout<<"5 C o n v e r t e r um c a r a c t e r m a i u s c u l o em mi nus c u l o \n" ;
cout<<"6 E l i m i n a r o s e s p a c o s a e s q u e r d a \n" ;
cout<<"7 E l i m i n a r o s e s p a c o s a d i r e i t a \n" ;
cout<<"8 Remover m u l t i p l o s e s p a c o s \n" ;
cout<<"0 S a i r \n" ;
cout<<"\ n D i g i t e a opcao : " ;
c i n . g e t l i n e ( b u f f e r ,MAX) ;
op=a t o i ( b u f f e r ) ;
} while ( op<0 | | op >8);
return op ;
}
101
65
int m y s t r l e n ( char s )
{
int i =0;
i f ( s !=NULL)
{
while ( s [ i ] ! = \0 )
i ++;
}
return i ;
}
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
void m y l e f t t r i m ( char s )
{
int i , x ;
66
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
void m y r i g h t t r i m ( char s )
{
int i ;
i=m y s t r l e n ( s ) ;
i f ( i >0)
{
while ( s [ i 1]== && i >0)
{
s[ i ]= \0 ;
}
}
}
176
177
178
179
void r e m o v e m u l t i p l e s p a c e ( char s )
{
int i , j , x ;
180
i =0;
while ( s [ i ]== ) i ++;
181
182
183
j=m y s t r l e n ( s ) 1;
while ( s [ j ]== ) j ;
184
185
186
while ( i <j )
{
i f ( s [ i ]== && s [ i +1]== )
{
f or ( x=i ; x<m y s t r l e n ( s ) ; x++)
s [ x]= s [ x + 1 ] ;
j ;
}
else
i ++;
}
187
188
189
190
191
192
193
194
195
196
197
198
67
1.11.5
Exerccios propostos
1.11.5.1
Escreva uma funo que receba duas strings e retorne o nmero de ocorrncias de
uma na outra. Por exemplo, a string "DEIDE DEDEI DEEI"tem duas ocorrncias
da string "DEI".
1.11.5.2
Escreva uma funo que recebe duas strings e verifica se uma inversa de outra.
Caso seja deve retornar 1 e 0 caso no seja. Note que uma strings vazia no tem
inversa.
1.11.5.3
Escreva uma funo que recebe uma string e retorne o nmero de palavras. Entendendose por palavra cadeias de caracteres terminadas pelo carcter espao. As palavras
tm que ter mais do que um carcter.
1.11.5.4
Escreva uma funo que receba uma string e a formate da seguinte forma:
1. As palavras comeam sempre com letras maiscula e o resto com letra minscula;
2. As palavras tm que ter mais do que um carcter;
3. As letras (caracteres isolados em letra minscula).
1.12
Ponteiros
1.12.1
Sempre que se declara uma varivel, ela armazenada num local concreto da memria, sendo que o local definido pelo sistema operativo em tempo de execuo. Uma
vez atribudo o local de armazenamento, por vezes necessrio aceder directamente
a esse local. Isto pode ser feito colocando o & antes do identificador da varivel. A
listagem 1.49 apresenta um programa que permite mostrar no ecr o endereo de
memria onde a varivel est declarada.
68
Byte
0x00000000
0x00000001
0x00000002
0x00000003
0x1FFFFFFF
#include<i o s t r e a m . h>
2
3
4
5
int main ( )
{
int i ;
cout<<&i <<e n d l ;
7
8
return 0 ;
9
10
1.12.2
Operador de referncia *
Os ponteiros so variveis para que armazenam endereos. A forma de definir variveis do tipo ponteiro a seguinte:
<tipo-de-dados> * <identificador>;
A nica diferena em relao forma de definir variveis a colocao do caracter
* entre o tipo-de-dados e o identificador.
<tipo-de-dados> um qualquer tipo de dados vlido;
<identificador> tem o mesmo significado que o identificador de uma
varivel de um qualquer tipo de dados estudado at agora.
A seguir apresentase a definio de duas variveis do tipo ponteiro.
int *pi;
char *pc;
69
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main ( )
{
int pi , i =100;
// a t r i b u i o do e n d e r e o
// da v a r i v e l i ao p o n t e i r o
p i=&i ;
// a c e d e r ao v a l o r da
// v a r i v e l i a t r a v s do p o n t e i r o
cout <<pi<<e n d l ;
// a l t e r a r o v a l o r da
// v a r i v e l i a t r a v s do p o n t e i r o
p i =200;
// a c e d e r ao v a l o r da
// v a r i v e l i a t r a v s do p o n t e i r o
cout <<pi<<e n d l ;
18
return 0 ;
19
20
Endereo
Contedo
num
0x0FF10101
15
pnum
0x0FFAACC4
0x0FF10101
num
*pnum
15
0x0FF10101
&num
pnum
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main ( )
{
int p1=NULL, p2=NULL;
int v1 =100 , v2 =200;
// os p o n t e i r o s apontam t o d o s para a mesma v a r i v e l
p1=p2=&v1 ;
// a l t e r a r o v a l o r v a r i v e l v1 a t r a v s dos p o n t e i r o s
p1+=100;
p2+=100;
cout<<v1<<e n d l ;
// a l t e r a r o p o n t e i r o p2 que p a s s a
// a p o n t a r para a v a r i a v e l v2
p2=&v2 ;
cout <<p2<<e n d l ;
// a t r i b u i v a r i v e l v2 o v a l o r do
// a p o n t a d o r por p1 ( o v a l o r da v a r i v l v1 )
v2=p1 ;
cout<<v2<<e n d l ;
// a l t e r a o v a l o r v a r i v e l v1
// ( o p o n t e i r o p1 aponta para a v a r i v a e l v1 )
v1+=50;
cout <<p1<<e n d l ;
25
return 0 ;
26
27
1.12.3
Ponteiros e vectores
#include<i o s t r e a m . h>
2
3
4
5
6
7
8
9
10
11
int main ( )
{
int p=NULL;
int vec [ 1 0 ] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ;
p=vec ;
fo r ( int i =0; i <10; i ++)
cout<<p [ i ]<< e n d l ;
return 0 ;
}
1.12.4
A linguagem C++ permite a utilizao de ponteiros para ponteiros no qual o ltimo aponta para uma varivel. Para tal basta acrescentar um asterisco por cada
referncia. Por exemplo:
Listing 1.53: Exemplo da utilizao de ponteiros
1
#include<i o s t r e a m . h>
2
3
4
5
int main ( )
{
int pp=NULL, p=NULL, a =10;
6
7
p=&a ;
72
8
9
cout<<" e n d e r e c o de a : "<<&a<<e n d l ;
cout<<" e n d e r e c o de p : "<<&p<<e n d l ;
cout<<" e n d e r e c o de pp : "<<&pp<<e n d l ;
10
11
12
13
cout<<"O v a l o r da v a r i a v e l a : "<<a<<e n d l ;
cout<<"O v a l o r da v a r i a v e l p : "<<p<<e n d l ;
cout<<"O v a l o r da v a r i a v e l pp : "<<pp<<e n d l ;
14
15
16
17
cout<<"O v a l o r da v a r i a v e l a : "<<a<<e n d l ;
cout<<"O v a l o r apontado por p : "<<p<<e n d l ;
cout<<"O v a l o r apontado p e l o apontado por pp : "<<pp<<e n d l ;
18
19
20
21
return 0 ;
22
23
10
0x0012FF74
&a
p
*pp
0x0012FF78
&p
pp
1.12.5
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
i n c r e m e n t o (&a ,TPCHAR) ;
i n c r e m e n t o (&b , TPINT ) ;
i n c r e m e n t o (&c ,TPFLOAT) ;
21
22
23
24
c o u t << a << " , " << b << " , " << c<<e n d l ;
25
26
return 0 ;
27
28
1.13
1.13.1
3
4
5
6
7
struct f i l m e s _ t {
char t i t u l o [ 5 0 ] ;
int ano ;
};
8
9
10
11
12
13
int main ( )
{
char b u f f e r [ 5 0 ] ;
filmes_t afilme ;
filmes_t pfilme ;
14
// a t r i b u i r ao p o n t e i r o o e n d e r e o da v a r i a v e l a f i l m e
pfilme = & afilme ;
15
16
17
18
19
20
21
22
23
24
25
26
// l e r os dados armazenados na
// v a r i a v e l a t r a v e s do p o n t e i r o
c o u t << p f i l m e >t i t u l o ;
c o u t << " ( " << p f i l m e >ano << " ) \ n" ;
27
28
29
30
31
return 0 ;
32
33
O operador > exclusivamente utilizado para aceder aos elementos das estruturas atravs de ponteiros. No entanto, tambm possvel a utilizao do operador .
para aceder aos elementos de um ponteiro para uma estrutura. A seguir apresentase
diferentes formas de aceder aos elementos de uma estrutura atravs de um ponteiro.
filmes_t afilme;
filmes_t * pfilme;
pfilme=&afilme;
A instruo seguinte permite aceder ao elemento titulo da estrutura apontado
pelo ponteiro pfilme.
76
3
4
5
6
7
struct data_t
{
int dia , mes , ano ;
};
8
9
10
11
12
13
struct f i l m e s _ t
{
char t i t u l o [ 5 0 ] ;
data_t d a t a _ e s t r e i a ;
};
14
15
16
17
18
int main ( )
{
char b u f f e r [ 5 0 ] ;
filmes_t afilme ;
19
c o u t << " D i g i t e o t i t u l o :
cin . getline ( afilme . titulo
c o u t << " D i g i t e a data de
cin . getline ( buffer , 5 0 ) ;
afilme . data_estreia . dia =
cin . getline ( buffer , 5 0 ) ;
a f i l m e . d a t a _ e s t r e i a . mes =
cin . getline ( buffer , 5 0 ) ;
a f i l m e . d a t a _ e s t r e i a . ano =
20
21
22
23
24
25
26
27
28
";
,50);
e s t r e i a ( d i a /mes/ ano ) : " ;
atoi ( buffer );
atoi ( buffer );
atoi ( buffer );
29
c o u t << a f i l m e . t i t u l o ;
c o u t << " ( " << a f i l m e . d a t a _ e s t r e i a . dia<<" : "
c o u t <<a f i l m e . d a t a _ e s t r e i a . mes<<" : " ;
cout<<a f i l m e . d a t a _ e s t r e i a . ano<<" ) \ n" ;
30
31
32
33
34
return 0 ;
35
36
Da mesma forma que possvel definir vectores de tipos de dados primitivos, tambm possvel definir vectores, tanto unidimensionais como multidimensionais, de
estruturas. Assim como, os elementos de uma estrutura tambm pode ser vectores.
O programa da listagem 1.57 mostra como definir estruturas nas quais alguns dos
seus elementos so tambm estruturas e vectores de estruturas. O objectivo deste
exemplo mostrar a forma de aceder/utilizar os elementos de uma estrutura deste
tipo.
77
#define STR_LEN
50
#define NUM_DISC 30
5 #define NUM_ALUNOS
100
3
4
6
7
8
9
10
struct data_t
{
int dia , mes , ano ;
};
11
12
13
14
15
16
struct d i s c i p l i n a _ t
{
char d i s c i p l i n a [STR_LEN]
int c l a s s i f i c a c a o ;
};
17
18
19
20
21
22
23
24
struct aluno_t
{
char nome [STR_LEN ] ;
char morada [STR_LEN 2 ] ;
data_t data_nasc ;
d i s c i p l i n a _ t d i s c i p l i n a s [NUM_DISC ] ;
};
25
26
void l i s t a r A l u n o s ( aluno_t a l [ ] ) ;
27
28
29
30
int main ( )
{
aluno_t a l u n o s [NUM_ALUNOS] ;
31
listarAlunos ( alunos ) ;
32
33
return 0 ;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void l i s t a r A l u n o s ( aluno_t a l [ ] )
{
fo r ( int i =0; i <NUM_ALUNOS; i ++)
{
cout<<"Nome : "<<a l [ i ] . nome<<e n d l ;
cout<<"Morada : "<<a l [ i ] . morada<<e n d l ;
cout<<"Data de n as c i m ent o : "<<a l [ i ] . data_nasc . dia<<" : " ;
cout<<<<a l [ i ] . data_nasc . mes<<" : " ;
cout<<<<a l [ i ] . data_nasc . ano<<e n d l ;
f or ( int j =0; j <NUM_DISC; j ++)
{
cout<<"\ t D i s c i p l i n a : "<<a l [ i ] . d i s c i p l i n a s [ j ] . d i s c i p l i n a <<e n d l ;
cout<<"\ t D i s c i p l i n a : "<<a l [ i ] . d i s c i p l i n a s [ j ] . c l a s s i f i c a c a o <<e n d l ;
}
78
51
52
1.13.2
char CARACTER;
int INTEIRO;
float REAL;
char STRING [50];
A partir destas definies possvel usar os novos tipos da mesma forma que se
podem todos os outros. No extracto de cdigo seguinte so definidoas variveis com
base nos tipos anteriores.
CARACTER a, b,c=A;
INTEIRO x=5;
REAL f=4.9;
STRING str="Bom dia mundo!!";
1.13.3
Uma unio5 permite fazer a definio de um tipo de dados de forma disjunta, isto
significa que em termos prticos uma varivel deste tipo pode ser de qualquer dos
subtipos utilizados na definio. A sintaxe de uma unio muito semelhante com
a definio de uma estrutura:
union <identificador-da-unio>
{
<tipo-de-dados> <identificador 1>;
<tipo-de-dados> <identificador 2>;
...
<tipo-de-dados> <identificador N>;
}<identificador-da-variavel>;
na qual
<identificador-da-unio> a designao do novo tipo de dados;
5
do anglo-saxnico union.
79
byte
byte
byte
byte
c
i
f
1.13.4
Os enumeradores servem para criar tipos de dados definidos custa de uma lista
ordenada de valores possveis. A forma de definir um enumerador a seguinte:
enum <id-do-enumerador>
{
<valor 1>,
<valor 2>,
...
<valor N>
}<id-da-variavel>;
Por exemplo, a instruo seguinte define um novo tipo de dados chamado cor_t,
para armazenar as cores.
enum cor_t{preto, branco, azul,vermelho, verde, amarelo};
Nos elementos do enumerador cor_t no existe nenhuma referncia a qualquer
tipo de dados. Portanto, os enumeradores permitem definir novos tipos de dados
81
2
3
#define PI
3.1415
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
82
41
43
44
45
46
42
}
int main ( )
{
figura_t f i g ;
47
f i g . t a g=RECTANGULO;
f i g . dimen so es . r e c t a n g u l o . comprimento = 3 . 0 ;
f i g . dimen so es . r e c t a n g u l o . l a r g u r a = 2 . 0 ;
48
49
50
51
52
53
return 0 ;
54
55
compostos
Tipos de
dados
simples
enumerados
enum
nmericos
char
int
float
double
lgicos
bool
ponteiros
void
1.13.5
Exerccios resolvidos
1.13.5.1
Ponto e recta
Sabendo que um ponto constitudo por trs coordenadas e uma recta pode ser
definida por dois pontos. Desenvolva um programa que implemente as seguintes
estruturas e funes.
1. Defina as estruturas ponto e recta;
2. Desenvolva uma funo que permita definir um ponto. A funo dever ter o
seguinte prottipo: void inserirPonto(Ponto &p);
3. Desenvolva uma funo que mostre o valor das coordenadas de um ponto. A
funo dever ter o seguinte prottipo: void imprimirPonto(Ponto p);
83
3
4
5
6
7
8
9
10
11
12
13
14
struct Ponto
{
double x ;
double y ;
double z ;
};
struct Recta
{
Ponto p1 ;
Ponto p2 ;
};
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int main ( )
{
Ponto p ;
Recta r ;
inserirPonto (p ) ;
imprimirPonto ( p ) ;
a l t e r a r P o n t o (&p ) ;
imprimirPonto ( p ) ;
inserirRecta ( r );
imprimirRecta ( r ) ;
cout<<" comprimento da r e c t a : "<<comprimentoRecta ( r)<<e n d l ;
return 0 ;
}
36
37
38
84
39
40
41
42
43
44
45
46
47
48
49
50
51
52
void a l t e r a r P o n t o ( Ponto p )
{
cout<<" Novas c o o r d e n a d a s ( x , y , z ) do ponto="<<e n d l ;
c i n >>p>x>>p>y>>p>z ;
}
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
1.13.5.2
1.13.6
Exerccios propostos
1.13.6.1
<i o s t r e a m >
<iomanip>
<c t y p e . h>
<time . h>
5
6
using namespace s t d ;
#define
9 #define
10 #define
11 #define
12 #define
13 #define
8
NOME_TAM
40
NUM_TURMA_TAM 4
NUM_ALUNOS 20
NUM_MINI_TESTES 4
NUM_TURMAS 10
IGNORE
10
14
15
16
17
struct FREQ
{
// p o s i c a o 0 para o 1 MT, p o s i c a o 1 para o 2MT . . .
87
18
19
20
};
21
22
23
24
25
26
27
28
29
struct ALUNO
{
long numero ;
char nome [NOME_TAM] ;
FREQ f r e q u e n c i a ;
int exame ;
int f a l t a s ;
};
30
31
32
33
34
35
36
37
38
struct TURMA
{
char numero [NUM_TURMA_TAM] ;
char p r o f e s s o r [NOME_TAM] ;
int num_alunos ;
ALUNO a l u n o s [NUM_ALUNOS] ;
int aulas_dadas ;
};
39
40
41
42
43
44
int menuAlunos ( ) ;
int menuTurmas ( )
int menu ( ) ;
void manutencaoAlunos (TURMA t [ ] , int &n ) ;
void manutencaoTurma (TURMA t [ ] , int &n ) ;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void main ( )
{
TURMA turmas [NUM_TURMAS] ;
int num_turmas=0;
int opcao ;
do
{
opcao=menu ( ) ;
switch ( opcao )
{
case 1 : manutencaoTurma ( turmas , num_turmas ) ;
break ;
case 2 : manutencaoAlunos ( turmas , num_turmas ) ;
break ;
}
} while ( opcao ) ;
}
63
64
65
66
67
68
int menuAlunos ( )
{
int opcao ;
do
{
88
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
int menuTurmas ( )
{
int opcao ;
do
{
cout<<"\n\nTURMAS"<<e n d l ;
cout<<" 1 I n s e r i r Turma\n" ;
cout<<" 2 L i s t a r Turmas ( Todas ) \ n" ;
cout<<" 3 L i s t a r Turma (Uma) \ n" ;
cout<<" 4 I n s e r i r Aulas Dadas\n" ;
cout<<" 0 V o l t a r \n" ;
cout<<" Opcao > " ;
c i n >>opcao ;
} while ( opcao <0 | | opcao >4);
c i n . i g n o r e (IGNORE, \n ) ;
return opcao ;
}
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
int menu ( )
{
int opcao ;
do
{
cout<<"\n\nALGORITMIA E PROGRAMACAO"<<e n d l ;
cout<<" 1 Turmas \n" ;
cout<<" 2 Alunos \n" ;
cout<<" 0 S a i r \n" ;
cout<<" Opcao > " ;
c i n >>opcao ;
} while ( opcao <0 | | opcao >2);
c i n . i g n o r e (IGNORE, \n ) ;
return opcao ;
}
116
117
118
119
89
120
121
opcao=menuAlunos ( ) ;
switch ( opcao )
{
case 1 :
break ;
case 2 :
break ;
case 3 :
break ;
case 4 :
break ;
case 5 :
break ;
}
} while ( opcao ) ;
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
1.14
Nos exemplos apresentados at esta parte, o cdigo de cada programa est escrito
num s ficheiro com a extenso ".cpp". No entanto, quando os programas so de
grandes dimenses, uma boa prtica dividilos em ficheiros de menor dimenso.
Esta, diviso traz enormes vantagens: embora a no entanto obriga a alguns cuidados. Como vantagem, pode-se referir a manuteno do programa, isto , mais
fcil analisar uma ficheiro com 100 linhas de cdigo do que com 10000. Por outro,
lado podese agrupar o cdigo que de alguma forma esteja relacionado nos mesmos
ficheiros, levando, portanto, criao de mdulos. A criao de mdulos permite a
reutilizao desses mdulos noutros programas. Como desvantagem, podese referir
90
1.14.1
Diviso em mdulos
vectores.cpp
#include<iostream.h>
#includevectores.h
#define MAX
50
void lerVector(int v[],int n);
int maiorItemVecint v[],int n);
...
vectores.h
matrizes.h
#include defs.h
void lerVector(int v[],int n);
int maiorItemVec(int v[],int n);
..
#include defs.h
void lerMatriz(int v[],int n);
int maiorItemMatriz(int v[],int n);
..
appMain.cpp
#include vectores.h
#include matrizes.h
int main()
{
...
[ifndef <identificador>] verifica se o identificador no est definido com uma directiva define.
Por exemplo, a seguir define-se uma constante que contenha o nmero de bits
de um inteiro que possa ser compilado correctamente em MS-DOS no compilador
"Turbo C"no Unix.
#ifdef TURBOC
#define INT_SIZE 16
#else
#define INT_SIZE 32
#endif
Portanto, para resolver o erro do linker necessrio alterar os ficheiros de
cabealho defs.h, vectores.h e matrizes.h. A figura 1.20 apresenta uma soluo.
A desvantagem da necessidade da compilao separada dos mdulos, facilmente
supervel atravs de "makefiles"ou com a utilizao de uma Ambiente Integrado de
Desenvolvimento.
92
defs.h
#ifndef DEF_H
#define DEF_H
#define MAX
50
#define SIZE 100
struct ponto{
float x,y,z;
};
#endif
matrizes.h
vectores.h
#ifndef VECTORES_H
#define VECTORES_H
#ifndef MATRIZES_H
#define MATRIZES_H
#include defs.h
void lerVector(int v[],int n);
int maiorItemVec(int v[],int n);
..
#endif
#include defs.h
void lerMatriz(int v[],int n);
int maiorItemMatriz(int v[],int n);
..
#endif
appMain.cpp
#include vectores.h
#include matrizes.h
int main()
{
...
}
93
94
Bibliografia
[CCT, 2001] CCT. C Programming - Foundation Level, Training Manual & Exercises. Cheltenham Computer Training, Gloucester/UK, 2001.
[CPP, ]
[Kernighan e Ritchie, 1988] Brian W. Kernighan e Dennis M. Ritchie. The C Programming Language, Second Edition. Prentice Hall, Inc., 1988.
[Mosich, 1988] D. Mosich. Advanced Turbo C Programmers Guide. Wiley, John &
Sons, 1988.
[Sampaio e Sampaio, 1998] Isabel Sampaio e Alberto Sampaio. Fundamental da
Programao em C. FCA- Editora Informtica, 1998.
[Stroustrup, 2000] Bjarne Stroustrup. The C++ Programming Language. AddisonWesley Pub Co, 3rd edition edition, February 2000.
95