Operações e Expressões
Objectivos
‰Exemplos detalhados de tipos numéricos
‰Trabalhar com expressões do tipo lógico (bool)
‰Processamento de caracteres
‰Estudar o operador de atribuição
‰Utilizar operadores de incremento e decremento
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
2
Expressões
¾ Definição: qualquer sequência de objectos e operações
que são combinados para produzir um valor são
chamados de expressão.
™Exemplo:
double exemplo = (2.0 + 3.0) / CONSTANTE
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
3
Expressões numéricas
‰O C++ fornece quatro operadores aritméticos:
ƒ
ƒ
ƒ
ƒ
+ para a adição
- para a subtracção
* para a multiplicação
/ para a divisão
‰Cada um destes quatro operadores pode ser aplicados a
operandos reais (double) ou inteiros (int).
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
4
Divisão
‰A divisão é diferente para operandos do tipo int e do
tipo double
ƒ Considere-se os resultados das seguintes operações:
3/4 → 0
3.0/4.0 → 0.75
3.0/4 → 0.75
3/4.0 → 0.75
‰Se ambos os operadores são inteiros:
ƒ A divisão inteira é efectuada
ƒ Caso contrário, é efectuada a divisão real
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
5
Divisão inteira e divisão real
‰
“3 a dividir por 4 quanto é?”
“0 (zero) com resto 3”
‰A expressão 3 / 4 retorna o quociente.
ƒ Esta é uma divisão inteira
‰A expressão 3 % 4 retorna o resto da divisão
inteira.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
6
Conversão de tipos
‰Combinação de um inteiro com um real na
mesma expressão:
ƒ 2 + 3.0 Æ 5.0
‰O C++ converte automaticamente valores mais
estreitos (que ocupam menos espaço em
memória) em valores mais largos
ƒ Um inteiro é convertido num real
ƒ O resultado da expressão é um real
‰Esta conversão é chamada de “promoção”
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
7
Precedências
‰Considerando a expressão:
2 + 3 * 4
(2 + 3) * 4→ 20
ou 2 + (3 * 4) → 14 ?
‰A precedência de operadores dita a ordem de
avaliação.
‰ * tem precedência mais alta que +
‰ * é aplicado primeiro
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
8
Precedência de operadores
()
+(unário), -(unário), !
*, /, %
+, <, <=, >, >=
==, !=
&&
||
MAIS ALTA
MAIS BAIXA
Ver apêndice C do livro para a lista completa…
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
9
Associatividade
‰Considerando a expressão
ou
8 - 4 - 2
(8 - 4) - 2 → 2
8 - (4 - 2) → 6 ?
‰A precedência não indica a ordem de avaliação
‰Associatividade ou ordem de avaliação:
ƒ Subtracção é avaliada da esquerda para a direita (associativa
à esquerda).
‰A maioria dos operadores em C++ são avaliados da
esquerda para a direita.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
10
Funções numéricas
‰A biblioteca <cmath> contém uma grande variedade
de funções matemáticas, incluindo:
sin(x)
asin(x)
cos(x)
acos(x)
tan(x)
atan(x)
sqrt(x)
log10(x)
log(x)
pow(x, y)
floor(x)
ceil(x)
abs(x)
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
11
Utilização de funções de <cmath>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double base, expoente;
cout << “\nInsira a base e o expoente: “;
cin >> base >> expoente;
double resultado = pow(base, expoente);
cout << base << “ elevada a “
<< expoente << “ e’ “ << result <<
endl;
}
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
12
Conversão de tipos
‰É possível explicitar a conversão de um tipo noutro
‰Sintaxe a ser utilizada:
tipo (expressao) ou (tipo) expressao
‰Conversão pode causar perda de dados
double x = 3.456;
cout << (int) x;
3
Qual é a saída?
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
13
Expressões lógicas
‰O tipo bool em C++ tem dois valores possíveis
ƒ false e true
‰Os operadores relacionais produzem expressões
lógicas
João Sousa – Miguel Pedro Silva
Operador relacional
<
Operação
Menor
>
Maior
==
Igual
!=
Diferente
<=
Menor ou igual
>=
Maior ou igual
Computação e Programação 2007 / 2008
14
Operadores relacionais
‰Operadores utilizados para comparações
ƒ Cada operação tem dois operandos
ƒ Produz um valor lógico (bool), que é true ou false:
x == y
x != y
x < y
x >= y
x > y
x <= y
¾ Aviso:
ƒ Não confundir = (atribuição)
ƒ Com == (igualdade).
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
15
Expressões lógicas compostas
‰Operadores lógicos
Operador
lógico
!
Expressão
lógica
!p
Não (Negação)
!p é falso se p é verdadeiro; !p é
verdadeiro se p é falso.
&&
p && q
E (Conjunção)
p && q é verdadeiro se p e q são ambos
verdadeiros; é falso caso contrário.
||
p || q
Ou (Disjunção)
p || q é falso se p e q são ambos falsos; é
verdadeiro caso contrário.
João Sousa – Miguel Pedro Silva
Nome do
operador
Descrição
Computação e Programação 2007 / 2008
16
Expressões lógicas compostas
‰Expressões lógicas complexas utilizam os operadores
lógicos:
a && b
a || b
!a
// verdadeiro sse a e b também o são
// verdadeiro sse a ou b é verdadeiro
// verdadeiro se a e’ falso
™Exemplo:
cin >> nota;
assert (0 <= nota && nota <= 100);
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
17
Avaliação rápida
‰Considere a expressão lógica
( n != 0 ) && ( x < 1.0 / n )
ƒ Se n == 0, a expressão da direita leva a um erro de
execução do programa.
‰O C++ avalia a expressão da esquerda para a direita
ƒ Se n == 0, a expressão da esquerda retorna false
ƒ Como temos uma intersecção &&, toda a expressão é
retornada como false
ƒ Assim, o C++ não avalia a expressão da direita.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
18
Pré-condições
¾ Definição: Quando um programa assume pressupostos
sobre os seus valores de entrada
™Examplo: que são positivos
‰As pré-condições são expressões lógicas
ƒ Devem ser verdadeiras para o programa funcionar
correctamente.
‰Para verificar pré-condições, o C++ fornece a
instrução assert()…
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
19
Testes com assert
#include <iostream>
Requirido para utilizar
#include <cassert>
a instrução assert
using namespace std;
int main()
{
cout << “\nIntroduza a sua idade: “;
int idade;
cin >> idade;
assert(idade > 0);
// ...
assert() pára o
}
programa se idade <= 0
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
20
Expressões com caracteres
Variáveis do tipo carácter podem ser…
‰Declaradas e inicializadas
ƒ char middleInitial = 'Q';
‰Atribuído um valor
ƒ middleInitial = 'Z';
‰Utilizadas para entrada/saída (I/O)
ƒ cout << middleInitial;
ƒ cin >> middleInitial;
‰Comparadas
ƒ assert (middleInitial != 'X');
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
21
Funções com caracteres
‰Algumas das funções booleanas da biblioteca
<cctype>:
isalpha(ch)
isdigit(ch)
islower(ch)
isspace(ch)
isprint(ch)
isalnum(ch)
iscntrl(ch)
isupper(ch)
ispunct(ch)
isgraph(ch)
‰Funções de conversão (minúsculas em maiúsculas ou
vice-versa):
toupper(ch)
João Sousa – Miguel Pedro Silva
tolower(ch)
Computação e Programação 2007 / 2008
22
Atribuição
‰Sintaxe:
variavel = expressao;
ƒ A expressão é avaliada
ƒ O valor é colocado na localização em memória associada à
variável.
™Exemplo:
coordenadaX = 4.56;
codigo = 'T';
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
23
Atribuição
‰Dada uma dada sequência de três atribuições:
temp = alfa;
alfa = beta;
beta = temp;
alfa
234
alfa
234
alfa
65
alfa
65
beta
65
beta
65
beta
65
beta
234
temp
0
temp
234
temp
234
temp
234
‰Note-se que os valores anteriores das variáveis são
perdidos após as atribuições.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
24
Atribuição
‰ O operador de atribuição =
ƒ
ƒ
É associativo à direita,
Suporta expressões como:
int w, x, y, z;
w = x = y = z = 0;
‰ A atribuição = mais à direita é aplicada primeiro,
1.
2.
3.
4.
atribui o valor zero a z,
atribui o valor de z (que é zero) a y
atribui o valor de y (que é zero) a x
atribui o valor de x (que é zero) a w
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
25
Forma abreviada de atribuição
‰Algumas atribuições são muito comuns:
var = var + x;
var = var - y;
// adicionar x a var
// subtrair y de var
‰O C++ fornece shortcuts para estas atribuições:
var += x;
var -= y;
João Sousa – Miguel Pedro Silva
// adicionar x a var
// subtrair y de var
Computação e Programação 2007 / 2008
26
Generalização de formas abreviadas
‰A maioria das expressões aritméticas da forma:
var = var ∆ valor;
podem ser escritas na forma abreviada:
var ∆= valor;
™Exemplos:
double x, y;
cin >> x >> y;
x *= 2.0;
// duplica o valor de x
y /= 2.0;
// reduz para metade o valor de y
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
27
Incremento e decremento
‰Outras formas muito utilizadas de atribuição:
var = var + 1; // adiciona 1 a var
var = var - 1; // subtrai 1 a var
‰As formas abreviadas em C++ são as seguintes:
var++; // adiciona 1 a var
var--;
// subtrai 1 a var
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
28
Incremento com prefixo
‰A forma de incremento com prefixo, produz o valor
final (incrementado) como resultado:
int x, y = 0;
x = ++y;
cout << x;
// e’ mostrado 1 no ecran
‰O decremento com prefixo comporta-se de forma
semelhante.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
29
Incremento com sufixo
‰A forma de incremento com sufixo, produz o valor
original ( não incrementado) como resultado:
int x, y = 0;
x = y++;
cout << x;
// e’ mostrado 0 no ecran
// y tem agora o valor 1
‰O decremento com sufixo comporta-se de forma
semelhante.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
30
Prefixo vs. sufixo
‰Desde que o operador de incremento (or decremento)
seja utilizado numa atribuição isolada:
int y = 0, x = 0;
++x;
// x == 1
y++;
// y == 1
… é indiferente a versão que seja utilizada!
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
31
Expressões em instruções
‰Uma expressão seguida de um ponto-e-vírgula (;)
transforma-se numa instrução:
ƒ x = y + z;
ƒ 'A';
ƒ cos (z);
São todas
instruções
Esta expressão é uma atribuição
que modifica o valor de x
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
32
Problema
™Utilizar a equação de Einstein para calcular a
quantidade de energia libertada por uma dada
quantidade de massa
Para calcular a energia libertada, insira a
Comportamento:
João Sousa – Miguel Pedro Silva
quantidade de massa (não-negativa): 123
Energia libertada = 999.99 unidades
Computação e Programação 2007 / 2008
33
Objectos
Descrição
Objectos
Tipo
Espécie
Nome
Écran
ostream
variável
cout
prompt
string
constante
Quantidade de
matéria
double
variável
massa
istream
variável
cin
Quantidade de
energia
double
variável
energia
Descrições das
saída
string
constante
Teclado
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
34
Operações
Escreve uma cadeia de caracteres (prompt) no
écran
ii. Lê um número não negativo (massa) do
teclado
iii. Calcula a energia da massa
iv. Mostra o resultado (energia) e uma
mensagem (string) no écran
i.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
35
Elementos adicionais
‰ Note-se que o passo iii. Requer a equação de
Einstein e = m ⋅ c
‰ Isto implica mais algumas operações:
2
v. Exponenciação
vi. Multiplicação de reais
vii. Guardar o valor de um real
‰ E objectos adicionais:
Objectos
Descrição
Velocidade da luz
2
João Sousa – Miguel Pedro Silva
Tipo
Espécie
Nome
double
constante
VELOCIDADE_DA_LUZ
int
constante
Computação e Programação 2007 / 2008
36
Algoritmo
‰ Organização dos objectos e operações num
algoritmo:
1. Declaração da constante VELOCIDADE_DA_LUZ.
2. Objecto cout envia mensagem para o écrã, para
receber a massa a ser convertida em energia.
3. Objecto cin lê um número não negativo para
massa.
4. Calcular energia = massa × VELOCIDADE_DA_LUZ2
5. Objecto cout envia a descrição da saída e o valor de
energia para o écrã.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
37
Programa ConvMassaEnergia.cpp
/* ConvMassaEnergia.cpp calcula a energia de uma dada massa
utilizando
* A equação de conversão de massa em energia de Einstein.
*
* Input: A massa (em Kg) a ser convertida em energia
* Precondição: massa >= 0
* Output: A quantidade de energia (in kilojoules) correspondendo
* ‘a massa dada
*******************************************************************
/
#include <iostream> // cin, cout, <<, >>
#include <cassert> // assert()
#include <cmath>
// pow()
using namespace std;
int main()
{
const double VELOCIDADE_DA_LUZ = 2.997925e8;
// m/s
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
38
ConvMassaEnergia.cpp (2)
cout << “Calculo da quantidade de energia de uma dada massa,\n"
<< “Insira o valor da massa (em kilogramas): ";
double massa;
cin >> massa;
// get mass
assert(massa >= 0);
// assegura que valor nao e’ negativo
// calcula energia
double energia = massa * pow(VELOCIDADE_DA_LUZ, 2);
// mostra valor de energia calculado
cout << massa << " kilogramas de materia libertam "
<< energia << " kilojoules de energia.\n";
}
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
39
Exemplos de execução
Calculo da quantidade de energia de uma dada massa
Insira o valor da massa (em kilogramas): 1
1 kilogramas de materia libertam 8.98755e+16 kilojoules de energia.
Calculo da quantidade de energia de uma dada massa
Insira o valor da massa (em kilogramas): 2
1 kilogramas de materia libertam 1.79751e+17 kilojoules de energia.
Calculo da quantidade de energia de uma dada massa
Insira o valor da massa (em kilogramas): 125.5
1 kilogramas de materia libertam 1.12794e+19 kilojoules de energia.
João Sousa – Miguel Pedro Silva
Computação e Programação 2007 / 2008
40
Download

Acetatos - parte 4