Você está na página 1de 53

Aula 02

Manipulao e Caractersticas de Variveis


Biblioteca IOStream
Operadores Aritmticos e de Atribuio
MANIPULAO E
CARACTERSTICAS DE VARIVEIS
Caractersticas fundamentais de uma
varivel

Uma varivel em C++ possui as seguintes caractersticas:


Nome (ou identificador);
Tipo;
Ocupa um espao e tem um endereo na memria;
Possui um valor.
Tipo Descrio Tamanho
char nico caracter 1 byte

int Nmero inteiro 4 bytes

bool Valor lgico(true or false) 1 byte

float Nmero em notao de ponto 4 bytes


flutuante
double Nmero em notao de ponto 8 bytes
flutuante com maior preciso

Variveis primitivas e espao ocupado na


memria
Atribuio e inicializao de variveis

Podemos definir uma varivel, e depois dar uma valor a ela


com o operador = .
int x;
x = 5;
Mas podemos tambm definir E atribuir um valor inicial a
uma varivel ao mesmo tempo, processo chamado
inicilizao.
int x = 5;

Nota: Alguns compiladores atribuem o valor null (ou zero) a variveis no


inicializadas, porm altamente recomendado voc mesmo inicializar uma
varivel.
// Declarao de variveis
Declarao e Atribuio double temperatura;
bool esta_ligado;
char primeira_letra;

//Mltipla declarao
int a, b, c;
Declarao: reserva (aloca)
espao na memria; double temp1, temp2, temp3;
Atribuio: armazena valor no
espao alocado.
// Atribuio de variveis
temperatura = 32.55;
esta_ligado = false;
primeira_letra = 'A';
Inicializao // Inicializao de cpia
char segunda_letra = 'B';
float pi = 3.1415;

// Inicializao direta
int alunos(16);
Inicializao = bool ativo(false);
Declarao + Atribuio
// Mltipla inicializao
char c1('a'), c2('b'), c3('c');
double alt1 = 2.5, alt2 = 3.33, alt3 = 42;
Modificadores de tipo

Para as variveis do tipo int, double e char temos


modificadores de tipo, que podem aumentar ou diminuir
o espao que estas ocupam na memria.
Para variveis do tipo int:
Modificadores: short, long, long long, signed, unsigned.
Para variveis do tipo double:
Modificadores: long.
O modificador unsigned permite que nossa varivel inteira
armazene apenas valores positivos, mudando o range de
valores que ela pode assumir, mas sem modificar seu
tamanho.
Tamanho e Range
Tipo Tamanho Range
[bytes]

char 1 -128 a 127 ou 0 a 255

unsigned char 1 0 a 255

signed char 1 -128 a 127

int 4 -2147483648 a 2147483647

unsigned int 4 0 a 4294967295

signed int 4 -2147483648 a 2147483647

short int 2 -32768 a 32767

unsigned short int 2 0 a 65,535

signed short int 2 -32768 a 32767

long int 8 -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807

signed long int 8 -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807

unsigned long int 8 0 a 18,446,744,073,709,551,615

float 4 +/- 3.4e +/- 38 (~7 dgitos)

double 8 +/- 1.7e +/- 308 (~15 dgitos)

long double 8 +/- 1.7e +/- 308 (~15 dgitos)


Modificadores de
tipo #include <iostream>
#include <locale.h>
using namespace std;

int main() {
setlocale (LC_ALL,"Portuguese");
short int si = 100;
long int li = 100;
int i = 100;
long long int lli = 100;
Cdigo para unsigned ui = 100;
imprimir na tela double d = 3.14159;
algumas variveis long double ld = 3.14159265359;

primitivas com
cout << "O tamanho na memria da varivel short int : " << sizeof(si) <<" bytes"<< '\n'<< endl;
modificadores de cout << "O tamanho na memria da varivel int : " << sizeof(i) <<" bytes"<< '\n'<< endl;
tamanho. cout << "O tamanho na memria da varivel unsigned int : " << sizeof(ui) <<" bytes"<< '\n'<< endl;
cout << "O tamanho na memria da varivel long int : " << sizeof(li) <<" bytes"<< '\n'<< endl;
cout << "O tamanho na memria da varivel long long int : " << sizeof(lli) <<" bytes"<< '\n'<< endl;
cout << "O tamanho na memria da varivel double : " << sizeof(d) <<" bytes"<< '\n'<< endl;
cout << "O tamanho na memria da varivel long double : " << sizeof(ld) <<" bytes"<< '\n'<< endl;

return 0;
}
Execuo do cdigo do slide anterior
Criando seu prprio tipo
Voc pode definir seu prprio nome para um tipo
existente. Imagine que voc queira definir uma varivel do
seguinte tipo:
unsigned short int numero = 100;
consideravelmente tedioso escrever diversos modificadores
de tipos em uma varivel.
Assim, o C++ permite o desenvolvimento do seu prprio tipo.
Ou seja, voc pode combinar tipos (primitivos) e
modificadores especficos para utilizar no resto do seu
cdigo.
Dessa forma:
typedef unsigned short int usInt;
usInt numero = 100;
Nmero
Nmeros Mgicos mgico aqui

Algumas vezes podem aparecer nmeros mgicos em nossos


cdigos
Ex.
int maxAlunos = numSalas * 30;
Em alguns casos, esses nmeros podem ser de fcil interpretao,
mas na maioria das vezes no so.
Variveis constantes

Em C++ podemos tornar uma


varivel constante,
acrescentando a keyword const double gravidade = 9.8;
const em frente ao nome do
gravidade = 9.9; // No permitido, causar erro de
tipo da varivel; compilao
Tornar uma varivel
constante impede que ela
seja alterada atravs de
uma atribuio; const int maxAlunosPorSala = 30;
Alm disso, criamos um
contexto no qual podemos int maxAlunos = numSalas * maxAlunosPorSala;
interpretar alguns
nmeros mgicos.
BIBLIOTECA IOSTREAM
Introduo

Stream a representao de entrada e sada de dados em


uma aplicao;
Esses dados podem entrar de fontes diversas:
Arquivos;
Interface grfica;
Console.
Eles tambm podem ser apresentados para o usurio em locais
diferentes, e diversos formatos;
Os operadores de insero (<<) e extrao (>>) so usados
nesse contexto.
A Biblioteca IOStream
cout: Console Output
A biblioteva iostream contem
diversos comandos de input e
output de dados no console.

cin: Console Input

cout
cin
#include <iostream>
clog
clog: Console Log
cerr

cerr: Console Error


O cout

#include <iostream>

using namespace std;

J vimos o cout int main()


{
antes; char ch = 'a';

Ele pode ser usado cout << "O char ch tem, primeiramente, o valor de :" << ch << endl;

para mostrar texto ch = 'b';


cout << "Depois o valor passa a ser: " << ch << endl;
pr-definido e
valores de variveis ch = 'B';
cout << "E, por ultimo, ele fica com o valor de: " << ch << endl;

no console. system("pause");
}
O output no console
O valor de ch muda em cada linha
#include <iostream>
#include <locale>

using namespace std;


Formatando Texto
int main () {
setlocale(LC_ALL,"Portuguese");

double a = 2.718281828459045235360287;
double b = 3005.0;
double c = 1.0e-15;

cout.precision(5); cout.precision(5);
Indica o nmero mximo de algoritmos
mostrados; cout << "Padro:\n";
fixed; cout << a << '\n' << b << '\n' << c << '\n';

Mostrar nmeros em preciso mxima.


cout << '\n';
scientific;
Utilizar notao cientfica. cout << "Fixo:\n" << fixed;
cout << a << '\n' << b << '\n' << c << '\n';

cout << '\n';

cout << "Cientfico:\n" << scientific;


cout << a << '\n' << b << '\n' << c << '\n';
return 0;
}
Formatao de Nmeros
O cin

#include <iostream>

using namespace std;

Com o cin, ento, int main()


possvel receber {
char ch = 'a';
dados do console;
cout << "O char ch tem, primeiramente, o valor de :" << ch << endl;
O cin permite que o
usurio atribua cout << "Informe o novo valor de ch: ";
cin >> ch;
valores a variveis. cout << "O character informado pelo usuario foi: " << ch << endl;

system("pause");
}
Regio de Memria
O cin
O char ch
inicializado com o
#include <iostream> caracter a char ch
a
using namespace std;

int main()
{
char ch = 'a';

cout << "O char ch tem, primeiramente, o valor de :" << ch << endl;

cout << "Informe o novo valor de ch: ";


cin >> ch;

cout << "O character informado pelo usuario foi: " << ch << endl;

system("pause");
}
Regio de Memria
O cin

#include <iostream> char ch


a
using namespace std;

int main()
{
char ch = 'a';

cout << "O char ch tem, primeiramente, o valor de :" << ch << endl; O programa pausa
nesse ponto,
cout << "Informe o novo valor de ch: "; esperando o input do
cin >> ch;
usurio
cout << "O character informado pelo usuario foi: " << ch << endl;

system("pause");
}
O usurio deve indicar o novo valor de ch
O usurio deve indicar o novo valor de ch
Regio de Memria
O cin

#include <iostream> char ch


M
using namespace std;

int main()
{
char ch = 'a';

cout << "O char ch tem, primeiramente, o valor de :" << ch << endl; Quando o usurio aperta
Enter, o valor de ch
cout << "Informe o novo valor de ch: "; muda, e o programa
cin >> ch;
segue em frente
cout << "O character informado pelo usuario foi: " << ch << endl;

system("pause");
}
O Output final do programa
O clog e cerr

Assim como o cout, o clog e o cerr imprimem texto e


variveis no console, por padro;
Os trs comandos, entretanto, so destinados a tipos
diferentes de mensagens:
cout: mensagens de output, de sada de resultados do programa;
clog: log, ou registro das atividades internas ao seu programa;
cerr: erros ocorridos na execuo do programa.
clog e cerr so muito teis quando mensagens de log e erro
so salvas em um arquivo;
Para imprimir no console, entretanto, o cout mais utilizado.
O clog e cerr

#include <iostream>

using namespace std;

int main()
{
clog << "Isso aqui vai ser impresso no console." << endl;
cerr << "Isso tambem." << endl;

system("pause");
}
O clog e cerr
O texto impresso no console, no destino padro
OPERADORES ARITMTICOS E DE
ATRIBUIO
Operadores
Operadores dizem a uma expresso como combinar um
ou mais operandos para produzir um novo resultado. Por
exemplo, na expresso 3 + 4, o + o operador de soma. O
operador + diz como combinar 3 e 4 para produzir um novo
valor (7).
Unrios: Tm efeito sobre um operando.
Ex.: O operador em (-5) tem efeito apenas sobre o operando (5).
Binrios: Tm efeito sobre dois operandos.
Ex.: O operador + em 3 + 4 tem efeito sobre os operandos (3) e (4).
Ternrios: Tm efeito sobre trs operandos.
Na linguagem C++ s existe um operador ternrio (?:) que ser visto
mais adiante.
Operadores Aritmticos
Operadores aritmticos unrios:
Operator Symbol Form Operation
Unary plus + +x Value of x
Unary minus - -x Negation of x

Operadores aritmtico binrios:


Operator Symbol Form Operation
Addition + x+y x plus y
Subtraction - x-y x minus y
Multiplication * x*y x multiplied by y
Division / x/y x divided by y
Modulus The remainder of x
% x%y
(Remainder) divided by y
Operador de diviso /
mais fcil pensar no operador de diviso
como tendo dois modos diferentes.
Se os dois operandos forem inteiros, ele retorna
um valor inteiro da diviso
Ex.: 7 / 4 = 1 , pois a parte fracional retirada
(truncada, no arredondada).
J se um ou ambos os operandos forem float
(ou double), a diviso de pontos flutuantes
retorna pontos flutuantes
Ex.: 7.0 / 3 = 2.333, 7 / 3.0 = 2.333, e 7.0 / 3.0 =
2.333.
Operador de mdulo(ou resto) %

O operador de mdulo s funciona com variveis do tipo


int, e este retorna o resto da diviso de um nmero inteiro por
outro.
Ex.: 7 / 4 = 3 , pois o quociente da diviso 1 e o resto 3.
Este operador muito utilizado para saber se um nmero
divisvel por outro.
Ex.: Se (x % 2) zero, por exemplo, sabemos que x par.
#include <iostream>
#include <locale>

Exemplo Operadores using namespace std;

int main(){
setlocale(LC_ALL,"Portuguese");

int a = 5, b = 2;
double c = 9.0, d = 3.1415;

int e = a % b;
O que acontece quando aplicamos
um operador a variveis de tipos cout << "a + b = " << a + b << endl;
diferentes? cout << "a + -b = " << a + -b << endl;
cout << "d - a = " << d - a << endl;
cout << "c * b = " << c * b << endl;
cout << "a / b = " << a / b << endl;
cout << "c / b = " << c / b << endl;
cout << "e = a % b = " << e << endl;

system("pause");
return 0;
}
O output do programa
Tabela de Precedncia de Operadores
Prec/Ass Operator Description Pattern
::name
:: Global scope (unary)
1 None class_name::member_name
:: Class scope (binary)
() Parentheses (expression)
() Function call function_name(parameters)
() Initialization type name(expression)
{} Uniform initialization (C++11) type name{expression}
type() Functional cast new_type(expression)
type{} Functional cast (C++11) new_type{expression}
[] Array subscript pointer[expression]
. Member access from object object.member_name
2 L->R
-> Member access from object ptr object_pointer->member_name
++ Post-increment lvalue++
Post-decrement lvalue
typeid Run-time type information typeid(type) or typeid(expression)
const_cast Cast away const const_cast<type>(expression)
dynamic_cast Run-time type-checked cast dynamic_cast<type>(expression)
reinterpret_cast Cast one type to another reinterpret_cast<type>(expression)
static_cast Compile-time type-checked cast static_cast<type>(expression)
+ Unary plus +expression
- Unary minus -expression
++ Pre-increment ++lvalue
Pre-decrement lvalue
! Logical NOT !expression
~ Bitwise NOT ~expression
(type) C-style cast (new_type)expression
3 R->L
sizeof Size in bytes sizeof(type) or sizeof(expression)
& Address of &lvalue
* Dereference *expression
new Dynamic memory allocation new type
new[] Dynamic array allocation new type[expression]
delete Dynamic memory deletion delete pointer
delete[] Dynamic array deletion delete[] pointer
* Multiplication expression * expression
5 L->R / Operadores Division expression / expression
% matemticos Modulus expression % expression

+ Addition expression + expression


6 L->R
- Subtraction expression - expression

Comparison less than


< expression < expression
Comparison less than or equals
<= Operadores expression <= expression
8 L->R Comparison greater than
> relacionais Comparison greater than or
expression > expression
>= expression >= expression
equals

== Equality expression == expression


9 L->R
!= Inequality expression != expression

13 L->R && Operadores Logical AND expression && expression


lgicos

14 L->R || Logical OR expression || expression


expression ? expression :
?: Conditional (see note below)
expression
= Assignment
lvalue = expression
*= Multiplication assignment
lvalue *= expression
/= Division assignment
lvalue /= expression
%= Modulus assignment
lvalue %= expression
+= Addition assignment
15 R->L lvalue += expression
-= Subtraction assignment
lvalue -= expression
<<= Bitwise shift left assignment
lvalue <<= expression
>>= Bitwise shift right assignment
lvalue >>= expression
&= Bitwise AND assignment
lvalue &= expression
|= Bitwise OR assignment
lvalue |= expression
^= Bitwise XOR assignment
lvalue ^= expression

Fonte: http://www.learncpp.com/cpp-tutorial/31-precedence-and-associativity/

Nota: A expresso no meio do operador condicional ?: avaliada


como se estivesse entre parntesis.
Qual o resultado das operaes?

int a(1), b(2), c(3);


double d(4.);
double result1 = a + b/d + c; // igual a 4 ou 4.5?
double result2 = (a + b)/d + c; // igual a 3 ou 3.75?
double result3 = a/b + d; // igual a 4 ou 4.5?
Qual o tipo do resultado das operaes?

int a(1), b(2), c(3);


double d(4.);
// ser double ou int?
cout << "Tamanho de a + d: " << sizeof(a + d) << endl;
cout << "Tamanho de a * d: " << sizeof(a * d) << endl;
int e = a * d;
cout << "Tamanho de e = a * d: " << sizeof(e) << endl;
cout << "Tamanho de (double)e: " << sizeof((double)e) << endl;
Exerccio 1
Faa um programa que receba um nmero e apresente a raiz quadrada desse nmero. A funo
sqrt()da biblioteca cmath pode ser til: http://www.cplusplus.com/reference/cmath/sqrt/

Exerccio 2
Desenvolva um programa que receba uma distncia em milhas e a converta para quilmetros (1 milha
= 1.60934 km).
Exerccio 3
Crie um programa que imprima a soma de duas variveis do tipo enum. O que acontece?

Exerccio 4
Ler uma temperatura dada pelo usurio em Celsius e atravs da frmula
9
= + 32
5
transforma-la em Fahrenheit. Depois apresentar a temperatura convertida para o usurio.
Gabarito Exerccio 1
#include <iostream>
#include <cmath>
#include <locale>

using namespace std;

Faa um programa que receba um int main() {


nmero e apresente a raiz quadrada setlocale(LC_ALL,"Portuguese");
desse nmero. A funo sqrt()da double num, res;
biblioteca cmath pode ser til:
http://www.cplusplus.com/reference cout << "Informe um nmero: ";
/cmath/sqrt/ cin >> num;

res = sqrt(num);

cout << "Raiz de " << num << " " << res;

return 0;
}
Gabarito Exerccio 2
#include <iostream>
#include <locale>

using namespace std;

int main() {
setlocale(LC_ALL,"Portuguese");
Desenvolva um programa double dist_km, dist_miles;
que receba uma distncia
em milhas e a converta para
cout << "Informe uma distancia em milhas: ";
quilmetros
cin >> dist_miles;
(1 milha = 1.60934 km).
dist_km = 1.60934*dist_miles;

cout << dist_miles << " milhas = " << dist_km << "km" << endl;

return 0;
}
#include <iostream>
#include <locale>
using namespace std;

Gabarito Exerccio 3 int main(){


setlocale(LC_ALL,"Portuguese");

// Declarar enumeradores
enum Cor{
VERMELHO,
AZUL,
VERDE
};
enum Fruta{
Crie um programa que imprima a BANANA,
soma de duas variveis do tipo ABACATE,
LARANJA
enum. O que acontece?
};

// Criar variaveis
Cor c1 = VERMELHO;
Fruta f1 = LARANJA;

// Imprimir na tela
cout << c1 << " + " << f1 << " = " << c1 + f1 << endl;

return 0;
}
Gabarito Exerccio 4

#include <iostream>

using namespace std;

Ler uma temperatura dada pelo int main()


usurio em Celsius e atravs da {
frmula
float tempC = 0;
9
= + 32 cout << "Temperatura em Celsius: ";
5 cin >> tempC;
transforma-la em Fahrenheit. Depois float tempF = tempC*9/5 + 32;
apresentar a temperatura convertida
para o usurio. cout << "\nA temperatura em Fahrenheit: " << tempF << endl;

return 0;
}
Desafio 1:

Crie um programa que recebe o nome completo de um usurio (entrada no terminal) e informe na
tela uma mensagem de boas-vindas.
Obs1: O nome completo deve ser inserido de uma nica vez.
Obs2: O nome deve ser inserido separado por espaos. Ex: Jon Snow.
Desafio 1:
Crie um programa que recebe o nome completo de um usurio (entrada no terminal) e informe na
tela uma mensagem de boas-vindas.
Obs1: O nome completo deve ser inserido de uma nica vez.
Obs2: O nome deve ser inserido separado por espaos. Ex: Jon Snow.

#include <iostream>
#include <locale.h>

using namespace std;

int main()
{
setlocale(LC_ALL, "");
char nome[256];
cout << "Entre seu nome: ";
cin.getline(nome,256);
cout << "\nOl " << nome << ", seja bem-vindo!!!" << endl;
return 0;
}
Desafio 2:
Utilizando a tcnica de converso de tipos, crie um programa que divida dois nmeros inteiros
(int) e resulte em um nmero com ponto flutuante (float).
Desafio 2:
Utilizando a tcnica de converso de tipos, crie um programa que divida dois nmeros inteiros
(int) e resulte em um nmero com ponto flutuante (float).

// Uma forma de converso // Outra forma de converso


#include <iostream> #include <iostream>

using namespace std; using namespace std;

int main()
int main()
{
{
int num1 = 10, num2 = 3;
int num1 = 10, num2 = 3;
float div;
float div;
div = (float) num1/num2;
div = static_cast<float>(num1) / static_cast<float>(num2);
cout << div;
cout << div;
return 0;
return 0;
}
}
Curiosidade...
Aqui est mostrada a diferena entre funes que mostram o tipo de uma varivel. O primeiro caso
typeid da biblioteca typeinfo deve ser utilizado pois est presente nos compiladores atuais a partir
do C++11. J a segunda forma (typeof) uma extenso especfica do compilador GCC e ser evitada
por que pode ocasionar erros.
typeid typeof

#include <iostream> #include <iostream>


#include <typeinfo>
using namespace std;
using namespace std;
int main()
int main() {
{ int a = 1222;
int a = 1222; cout << typeof(a);
cout << typeid(a).name(); return 0;
return 0; }
}

Você também pode gostar