Operações e Expressões - Técnico LisboaP_C... · João Sousa – Miguel Pedro Silva...

40
Operações e Expressões

Transcript of Operações e Expressões - Técnico LisboaP_C... · João Sousa – Miguel Pedro Silva...

Operações e Expressões

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.