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