Operações e Expressões - Técnico LisboaP_C... · João Sousa – Miguel Pedro Silva...
Transcript of Operações e Expressões - Técnico LisboaP_C... · João Sousa – Miguel Pedro Silva...
2João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Objectivos
Exemplos detalhados de tipos numéricosTrabalhar com expressões do tipo lógico (bool)Processamento de caracteresEstudar o operador de atribuiçãoUtilizar operadores de incremento e decremento
3João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Expressões
Definição: qualquer sequência de objectos e operaçõesque são combinados para produzir um valor sãochamados de expressão.Exemplo:
double exemplo = (2.0 + 3.0) / CONSTANTE
4João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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).
5João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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.753.0/4 → 0.75 3/4.0→ 0.75
Se ambos os operadores são inteiros:A divisão inteira é efectuadaCaso contrário, é efectuada a divisão real
6João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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ãointeira.
7João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Conversão de tipos
Combinação de um inteiro com um real namesma expressão:2 + 3.0 5.0
O C++ converte automaticamente valores maisestreitos (que ocupam menos espaço emmemória) em valores mais largos
Um inteiro é convertido num realO resultado da expressão é um real
Esta conversão é chamada de “promoção”
8João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Precedências
Considerando a expressão:2 + 3 * 4
(2 + 3) * 4→ 20ou 2 + (3 * 4)→ 14 ?A precedência de operadores dita a ordem de avaliação.* tem precedência mais alta que +* é aplicado primeiro
9João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Precedência de operadores
() MAIS ALTA+(unário), -(unário), !*, /, %+, -<, <=, >, >===, !=&&
|| MAIS BAIXAVer apêndice C do livro para a lista completa…
10João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Associatividade
Considerando a expressão8 - 4 - 2
(8 - 4) - 2→ 2ou 8 - (4 - 2)→ 6 ?
A precedência não indica a ordem de avaliaçãoAssociatividade ou ordem de avaliação:
Subtracção é avaliada da esquerda para a direita (associativaà esquerda).
A maioria dos operadores em C++ são avaliados daesquerda para a direita.
11João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Funções numéricas
A biblioteca <cmath> contém uma grande variedadede 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)
12João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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;
}
13João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Conversão de tipos
É possível explicitar a conversão de um tipo noutroSintaxe a ser utilizada:tipo (expressao) ou (tipo) expressao
Conversão pode causar perda de dadosdouble x = 3.456;cout << (int) x;
Qual é a saída?3
14João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Expressões lógicas
O tipo bool em C++ tem dois valores possíveisfalse e true
Os operadores relacionais produzem expressõeslógicas
Operador relacional Operação< Menor> Maior== Igual!= Diferente<= Menor ou igual>= Maior ou igual
15João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Operadores relacionais
Operadores utilizados para comparaçõesCada operação tem dois operandosProduz um valor lógico (bool), que é true ou false:x == y x != yx < y x >= yx > y x <= y
Aviso:Não confundir = (atribuição) Com == (igualdade).
16João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Expressões lógicas compostas
Operadores lógicos
Operador lógico
Expressão lógica
Nome do operador Descrição
! !p
p && q
p || q
!p é falso se p é verdadeiro; !p éverdadeiro se p é falso.
&&
Não (Negação)
E (Conjunção) p && q é verdadeiro se p e q são ambos verdadeiros; é falso caso contrário.
|| Ou (Disjunção) p || q é falso se p e q são ambos falsos; éverdadeiro caso contrário.
17João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Expressões lógicas compostas
Expressões lógicas complexas utilizam os operadoreslógicos:a && b // verdadeiro sse a e b também o sãoa || b // verdadeiro sse a ou b é verdadeiro!a // verdadeiro se a e’ falso
Exemplo:cin >> nota;assert (0 <= nota && nota <= 100);
18João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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 direitaSe n == 0, a expressão da esquerda retorna falseComo temos uma intersecção &&, toda a expressão éretornada como falseAssim, o C++ não avalia a expressão da direita.
19João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Pré-condições
Definição: Quando um programa assume pressupostossobre os seus valores de entrada
Examplo: que são positivos
As pré-condições são expressões lógicasDevem ser verdadeiras para o programa funcionarcorrectamente.
Para verificar pré-condições, o C++ fornece a instrução assert()…
20João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Testes com assert
#include <iostream>#include <cassert>using namespace std;int main(){cout << “\nIntroduza a sua idade: “;int idade;cin >> idade;assert(idade > 0);// ...
}
Requirido para utilizara instrução assert
assert() pára o programa se idade <= 0
21João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Expressões com caracteres
Variáveis do tipo carácter podem ser…Declaradas e inicializadas
char middleInitial = 'Q';
Atribuído um valormiddleInitial = 'Z';
Utilizadas para entrada/saída (I/O)cout << middleInitial;cin >> middleInitial;
Comparadasassert (middleInitial != 'X');
22João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Funções com caracteres
Algumas das funções booleanas da biblioteca<cctype>:isalpha(ch) isalnum(ch)isdigit(ch) iscntrl(ch)islower(ch) isupper(ch)isspace(ch) ispunct(ch)isprint(ch) isgraph(ch)
Funções de conversão (minúsculas em maiúsculas ouvice-versa):toupper(ch) tolower(ch)
23João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Atribuição
Sintaxe:variavel = expressao;
A expressão é avaliadaO valor é colocado na localização em memória associada àvariável.
Exemplo:coordenadaX = 4.56;codigo = 'T';
24João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Atribuição
Dada uma dada sequência de três atribuições:temp = alfa;alfa = beta;beta = temp;
Note-se que os valores anteriores das variáveis sãoperdidos após as atribuições.
234
65
0
alfa
beta
temp
alfa
beta
temp
234
65
234
alfa
beta
temp
65
65
234
alfa
beta
temp
65
234
234
25João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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. atribui o valor zero a z, 2. atribui o valor de z (que é zero) a y3. atribui o valor de y (que é zero) a x4. atribui o valor de x (que é zero) a w
26João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Forma abreviada de atribuição
Algumas atribuições são muito comuns:var = var + x; // adicionar x a varvar = var - y; // subtrair y de var
O C++ fornece shortcuts para estas atribuições:var += x; // adicionar x a varvar -= y; // subtrair y de var
27João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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 xy /= 2.0; // reduz para metade o valor de y
28João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Incremento e decremento
Outras formas muito utilizadas de atribuição:var = var + 1; // adiciona 1 a varvar = var - 1; // subtrai 1 a var
As formas abreviadas em C++ são as seguintes:var++; // adiciona 1 a varvar--; // subtrai 1 a var
29João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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.
30João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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.
31João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Prefixo vs. sufixo
Desde que o operador de incremento (or decremento) seja utilizado numa atribuição isolada:int y = 0, x = 0;++x; // x == 1y++; // y == 1
… é indiferente a versão que seja utilizada!
32João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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 todasinstruções
Esta expressão é uma atribuiçãoque modifica o valor de x
33João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Problema
Utilizar a equação de Einstein para calcular a quantidade de energia libertada por uma dada quantidade de massa
Comportamento:
Para calcular a energia libertada, insira a
quantidade de massa (não-negativa): 123
Energia libertada = 999.99 unidades
34João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Objectos
ObjectosDescrição
Tipo Espécie NomeÉcran ostream variável cout
prompt string constanteQuantidade de matéria
double variável massa
Teclado istream variável cin
Quantidade de energia
double variável energia
Descrições dassaída
string constante
35João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Operações
i. Escreve uma cadeia de caracteres (prompt) no écran
ii. Lê um número não negativo (massa) do teclado
iii. Calcula a energia da massaiv. Mostra o resultado (energia) e uma
mensagem (string) no écran
36João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Elementos adicionais
Note-se que o passo iii. Requer a equação de EinsteinIsto implica mais algumas operações:
E objectos adicionais:
2cme ⋅=
v. Exponenciaçãovi. Multiplicação de reaisvii. Guardar o valor de um real
ObjectosDescrição Tipo Espécie Nome
Velocidade da luz double constante VELOCIDADE_DA_LUZ
2 int constante
37João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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ã.
38João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Programa ConvMassaEnergia.cpp
/* ConvMassaEnergia.cpp calcula a energia de uma dada massautilizando
* 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
39João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
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 energiadouble energia = massa * pow(VELOCIDADE_DA_LUZ, 2);
// mostra valor de energia calculadocout << massa << " kilogramas de materia libertam "
<< energia << " kilojoules de energia.\n";}
40João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008
Exemplos de execução
Calculo da quantidade de energia de uma dada massaInsira o valor da massa (em kilogramas): 11 kilogramas de materia libertam 8.98755e+16 kilojoules de energia.
Calculo da quantidade de energia de uma dada massaInsira o valor da massa (em kilogramas): 21 kilogramas de materia libertam 1.79751e+17 kilojoules de energia.
Calculo da quantidade de energia de uma dada massaInsira o valor da massa (em kilogramas): 125.51 kilogramas de materia libertam 1.12794e+19 kilojoules de energia.