Você está na página 1de 43

PCS3111

Laboratrio de Programao
Orientada a Objetos para
Engenharia Eltrica

Aula 2: Ponteiros, Testes e Depurao

Escola Politcnica da Universidade de So Paulo


Agenda
1. Arquitetura de von Neumann
2. Ponteiros
Ponteiros e arranjos
Passagem de parmetro em C++
3. Testes e depurao
4. Qualidade de cdigo

PCS / EP / USP 2017 PCS 3111 Aula 2 2


Arquitetura de von Neumann

PCS / EP / USP 2017 PCS 3111 Aula 2 3


Computador
Arquitetura de von Neumann
Unidade Lgica-Aritmtica (ULA)

Unidade de Controle (UC) CPU

Entrada: Teclado, mouse...

Sada: Monitor, impressora ...


Memria E/S

PCS / EP / USP 2017 PCS 3111 Aula 2 4


Arquitetura de von Neumann
A memria uma sequncia de bytes
1 byte = 8 bits
Bytes so numerados sequencialmente
Dados e instrues (programa) ficam na memria
0x000000
... CPU

0x000080
0x000084
Dados
0x000088
...
0x000200
Instrues 0x000204 E/S
...
PCS / EP / USP 2017 PCS 3111 Aula 2
Memria 5
Arquitetura de von Neumann
Exemplo: antes da execuo
0x000000
... CPU

0x000080
0x000084 5 i
Dados
0x000088 17 k
...
0x000200 i=i+k
Instrues 0x000204 E/S
...
Memria

PCS / EP / USP 2017 PCS 3111 Aula 2 6


Arquitetura de von Neumann
Exemplo: depois da execuo
0x000000
... CPU

0x000080
0x000084 22 i
Dados
0x000088 17 k
...
0x000200 i=i+k
Instrues 0x000204 E/S
...
Memria

PCS / EP / USP 2017 PCS 3111 Aula 2 7


Ponteiros

PCS / EP / USP 2017 PCS 3111 Aula 2 8


Ponteiros
Varivel especial que referencia um endereo
da memria
Tambm chamado de apontador
int i = 100; 0x000000
...
i 100 0x000084
0x000088
p 0x000084 0x00008C
...

p um ponteiro que aponta para o valor de i

PCS / EP / USP 2017 PCS 3111 Aula 2 9


Ponteiros
Declarao <Tipo> *p;

O ponteiro especfico para um tipo de varivel


12 int *p1;
13 double *p2;

Operador &
Obtm o endereo de uma varivel
6 int i = 100; 12 int *p1; EX01 Sada
7 double j = 5.5; 13 double *p2;
8 14 0x6afef4
9 cout << &i << endl; 15 p1 = &i; 0x6afee8
10 cout << &j << endl; 16 p2 = &j; 0x6afef4
17 0x6afee8
p1 aponta para i 18 cout << p1 << endl;
19 cout << p2 << endl;

PCS / EP / USP 2017 PCS 3111 Aula 2 10


Ponteiros
Operador * (desreferenciao)
Permite obter o valor apontado pelo ponteiro
6 int i = 5; EX02 Sada
7 int *p = &i;
8 5
9 cout << i << endl; 5
10 cout << *p << endl;

possvel us-lo para alterar o valor


12 *p = 10; Sada
13 cout << *p << endl;
14 cout << i << endl; 10
10

PCS / EP / USP 2017 PCS 3111 Aula 2 11


Usando um ponteiro
O valor inicial de um ponteiro indefinido
6 int *p1; // endereo indefinido EX03
7
8 cout << *p1 << endl; // Ops Problema!

NULL
Representa que o ponteiro aponta para nenhum valor
10 int *p2; // endereo indefinido EX03
11 p2 = NULL; // nenhum valor
12
13 if (p2 == NULL) { possvel testar
14 cout << "Null" << endl;
15 }

NULL est definido em vrias bibliotecas


Em iostream, por exemplo
PCS / EP / USP 2017 PCS 3111 Aula 2 12
Usando um ponteiro
Na verdade, o ponteiro tambm est na memria
6 int i = 5; EX02 0x000000
7 int *p = &i;
...
i 5 0x000084
0x000088
p 0x000084 0x00008C
...

Ento qual o valor de:


&i p *p &p *&i

PCS / EP / USP 2017 PCS 3111 Aula 2 13


Usando um ponteiro
Vrios ponteiros podem apontar para o mesmo
valor
6 char c = 'a'; EX04 0x000000
7
8 char *p1 = &c; ...
9 char *p2 = &c; c a 0x000084
10 char *p3 = p1; ...
11
12 cout << *p3 << endl; p1 0x000084 0x000100
13 ...
14 *p3 = 'b'; p2 0x000084 0x000200
15
16 cout << c << endl;
p3 0x000084 0x000300
Sada
a
b
PCS / EP / USP 2017 PCS 3111 Aula 2 14
Usando um ponteiro
possvel ter ponteiros de ponteiros
6 int i = 100; EX05 0x000000
7 int *p1 = &i;
...
8
9 int **p2; i 100 0x000084
10 p2 = &p1; 0x000088
11
p1 0x000084 0x00008C
12 cout << i << endl;
13 cout << *p1 << endl; ...
14 cout << **p2 << endl; p2 0x00008C 0x120060

Sada p2 um ponteiro para


100 ponteiro de inteiros
100
100

PCS / EP / USP 2017 PCS 3111 Aula 2 15


Ponteiros e arranjos
Um arranjo um ponteiro
A varivel aponta para a primeira posio do arranjo
6 int a1[] = {1, 2, 5}; 0x000000
...
EX06 0x000084 1 0x000084
a1 2 0x000088
5 0x00008C
Um ponteiro para o arranjo pode ser usado como um
arranjo
8 int *p = a1; Sada
9
1
10 cout << p[0] << endl;
5
11 cout << p[2] << endl;

Observao: em C++ no possvel retornar arranjos.


necessrio retornar um ponteiro.
PCS / EP / USP 2017 PCS 3111 Aula 2 16
Ponteiros e arranjos
possvel ter um arranjo de ponteiros
Ponteiro um tipo
15 int *a2[10]; Arranjo para 10 ponteiros de int
16
17 int i = 0;
18 a2[0] = &i; Colocando o endereo de i na posio 0
19
20 *a2[0] = 10; Alternado o valor do inteiro em i para 10
EX06

Observao: esse arranjo um ponteiro de ponteiros!

PCS / EP / USP 2017 PCS 3111 Aula 2 17


Passagem de parmetro
Como funciona a passagem de parmetros?
Qual a sada em tela?
5 void trocar(int a, int b) { EX07
6 int temp = a;
7 a = b;
8 b = temp;
9 }
...
24 int main() {
25 int a = 1;
26 int b = 2;
27
28 trocar(a, b);
29 cout << "a: " << a << " b: " << b << endl;
...

PCS / EP / USP 2017 PCS 3111 Aula 2 18


Passagem de parmetro
O C++ passa argumentos por valor
Ou seja, feita uma cpia do valor da varivel
5 void trocar(int a, int b) {
6 int temp = a;
7 a = b;
8 b = temp;
9 } 0x000000
...
24 int main() { ...
25 int a = 1; a 1 0x000084
26 int b = 2; b 2 0x000088
27
28 trocar(a, b);
...
... EX07 0x120060
0x120064
...
PCS / EP / USP 2017 PCS 3111 Aula 2 19
Passagem de parmetro
O C++ passa argumentos por valor
Ou seja, feita uma cpia do valor da varivel
5 void trocar(int a, int b) {
6 int temp = a;
7 a = b;
8 b = temp;
9 } 0x000000
...
24 int main() { ...
25 int a = 1; a 1 0x000084
26 int b = 2; b 2 0x000088
27
28 trocar(a, b);
...
... EX07 a' 1 0x120060

Cpia b' 2 0x120064


...
PCS / EP / USP 2017 PCS 3111 Aula 2 20
Passagem por referncia
C++ permite parmetros por referncia
Nesse caso a referncia ao valor passada como
parmetro
Usar o smbolo & na declarao do parmetro
11 void trocar1(int& a, int& b) {
12 int temp = a;
13 a = b;
Por referncia 0x000000
14 b = temp;
15 } ...
... a 1 0x000084
24 int main() {
b 2 0x000088
25 int a = 1;
26 int b = 2; ...
... 0x120060
33 trocar1(a, b);
0x120064
... EX07
PCS / EP / USP 2017 PCS 3111 Aula 2 ... 21
Passagem usando ponteiros
Uma outra forma usar ponteiros
17 void trocar2(int* a, int* b) {
18 int temp = *a;
19 *a = *b;
20 *b = temp; Ponteiro
21 } 0x000000
...
24 int main() { ...
25 int a = 1; a 1 0x000084
26 int b = 2; b 2 0x000088
...
38 trocar2(&a, &b);
...
... 0x120060
EX07 0x120064
Endereo de a e de b
...

PCS / EP / USP 2017 PCS 3111 Aula 2 22


Passagem usando ponteiros
Uma outra forma usar ponteiros
17 void trocar2(int* a, int* b) {
18 int temp = *a;
19 *a = *b;
20 *b = temp; Ponteiro
21 } 0x000000
...
24 int main() { ...
25 int a = 1; a 1 0x000084
26 int b = 2; b 2 0x000088
...
38 trocar2(&a, &b);
...
... a' 0x000084 0x120060
EX07 b' 0x000088 0x120064
Endereo de a e de b
...

PCS / EP / USP 2017 PCS 3111 Aula 2 23


Testes e Depurao

PCS / EP / USP 2017 PCS 3111 Aula 2 24


Testes e depurao
Definies
Teste: processo de executar um programa com o
objetivo de encontrar erros
Depurao: processo de localizar um suposto erro e
corrigi-lo

Sadas corretas em um teste no garantem que


o software no tem erros
O teste pode no ter sido bom o suficiente!

Existem abordagens de teste e de depurao


Engenharia de Software

PCS / EP / USP 2017 PCS 3111 Aula 2 25


Exemplo: total de uma compra
Se a soma dos preos dos produtos for maior
que "limite" reais, o frete no deve ser cobrado
11 double totalDaCompra (double produtos[], int quantidade,
12 double frete, double limite) {
13 double total = 0;
14 for (int i = 0; i < quantidade; i++)
15 total = total + produtos[i];
16 if (total > limite)
17 total = total + frete;
18 return total;
19 } EX08

Como fazer testes?

PCS / EP / USP 2017 PCS 3111 Aula 2 26


Exemplo: total de uma compra
Se a soma dos preos dos produtos for maior
que "limite" reais, o frete no deve ser cobrado
11 double totalDaCompra (double produtos[], int quantidade, Sada
12 double frete, double limite) {
Erro: 35.5
13 double total = 0;
14 for (int i = 0; i < quantidade; i++)
15 total = total + produtos[i];
16 if (total > limite)
17 total = total + frete;
18 return total;
19 } EX08
21 int main() {
22 double produtos[] = {5, 10, 5, 10};
23 double total = totalDaCompra (produtos, 4, 5.5, 25);
Teste
24
25 if (total != 30) cout << "Erro: " << total << endl;
PCS / EP / USP 2017 PCS 3111 Aula 2
... 27
Depurao
Breakpoint
Ponto de parada no programa para depurao

Inserir breakpoint na linha


23 usando boto direito
ou 1 clique na linha 23
PCS / EP / USP 2017 PCS 3111 Aula 2 28
Depurao
Controle da depurao
Ir para a Entrar na funo
prxima linha existente
Executar at o na linha atual
prximo breakpoint

Janelas de depurao
(a mais importante a watches,
que mostra os valores
das variveis)

PCS / EP / USP 2017 PCS 3111 Aula 2 29


Observao
Nunca compare double com == ou !=
Pontos flutuantes tem problemas de preciso
1 #include <iostream>
2 #include <cmath>
Inclua cmath para usar o abs
3 e faa using namespace std
4 using namespace std;
..
21
22 int main() {
23 double produtos[] = {5, 10, 5, 10};
24 double total = totalDaCompra (produtos, 4, 5.5, 25);
25
26 if (abs(total - 30) > 0.01) cout << "Erro: " << total << endl;
27 return 0;
28 } EX08b

Se a diferena entre o valor esperado e o


obtido for maior que um psilon, h um erro
PCS / EP / USP 2017 PCS 3111 Aula 2 30
Qualidade de Cdigo

PCS / EP / USP 2017 PCS 3111 Aula 2 31


Qualidade do cdigo
O que um bom cdigo?
Correto
Faz o que se espera
Eficiente
No desperdia recursos (memria e processador)
Elegante
Simples, limpo, bonito e sem enfeites
Testvel
Fcil de procurar erros

PCS / EP / USP 2017 PCS 3111 Aula 2 32


Qualidade do cdigo
O que esse cdigo faz?
1 #include <iostream>
2 using namespace std; Alguns problemas:
3
Nome das variveis
4 int main() {
5 int i,J,k; Indentao
6 int l[10]; Espaamento
7 cout << "Digite 10 numeros" << endl; Blocos no claros
8 for (i=0;i<10; i++)
9 cin >>l[i]; k= 0;
10 for(J =0;J < 10;J++) {
11 if (l[J]> 0) k +=l[J];}
12
13 cout << "Valor: " << k;
14 return 0;
15 } EX09

PCS / EP / USP 2017 PCS 3111 Aula 2 33


Qualidade do cdigo
Uma outra verso do mesmo cdigo
1 #include <iostream> EX10
2 using namespace std;
3
4 int main() {
5 int entrada[10];
6 cout << "Digite 10 numeros" << endl;
7
8 for (int i = 0; i < 10; i++)
9 cin >> entrada[i];
10
11 int soma = 0;
12
13 for (int i = 0; i < 10; i++) {
14 if (entrada[i] > 0)
15 soma += entrada[i];
16 }
17
18 cout << "Valor: " << soma;
19 return 0;
PCS / EP / USP 201720
PCS}3111 Aula 2 34
Nome de variveis
Use nomes representativos
Cuidado com abreviaes ou nomes longos
Dica: use CTRL + ESPAO" para autocompletar

Conveno: CamelCase
Variveis e funes
Primeira palavra com letra minscula e as demais com s a
1 letra em maiscula
Exemplo: i, peso, maiorNumero e pedidosAtrasados
Nomes de arquivos
Cada palavra com a 1 letra maiscula e as demais
minsculas
Exemplo: HelloWorld.cpp, Exemplo1.cpp, ListaLigada.cpp

PCS / EP / USP 2017 PCS 3111 Aula 2 35


Organizao geral
Declarao de varivel no incio do bloco
Bloco real (if, for, etc.) ou lgico (organizao do
cdigo)
Declare somente a varivel controladora do for
no for
Exemplo:
for (int i = 0, z; i < 10; i++) {

int z;
for (int i = 0; i < 10; i++) {

PCS / EP / USP 2017 PCS 3111 Aula 2 36


Espaamento
Use um espao para separar uma palavra da
seguinte
=, <=, while, if, for etc. so palavras
Deixe um espao depois, mas no antes, de
cada sinal de pontuao
Exemplo: int i, j;
Parnteses
Deixe um espao antes, mas no depois, de abrir um
parntese
Deixe um espao depois, mas no antes, de fechar
um parntese
Exemplo: for (int i = 0; i < 5; i++) j++;

PCS / EP / USP 2017 PCS 3111 Aula 2 37


Espaamento
Excees
x[i] e no x [i]
x++ e no x ++

"." no sinal de pontuao em C++!

PCS / EP / USP 2017 PCS 3111 Aula 2 38


Chaves (bloco)
O { deve ficar na mesma linha do comando que
define o bloco, com um espao antes
Exemplo
if (x > 5) {

if (x > 5){
if (x > 5)
{
if (x > 5)
{

O } deve ficar em uma linha separada, mas
alinhado com o comando que definiu o bloco
Exemplo


if (x > 5) {
// ...
}
PCS / EP / USP 2017 PCS 3111 Aula 2 39
Blocos
O contedo de um bloco deve ficar tabulado
(um tab, normalmente)
Deve ser possvel diferenciar o que est dentro ou
fora do bloco!
Exemplo
for (int i = 0; i < 5; i++) {
if (entrada[i] > 5) {
cout << entrada[i] << endl;
}
}

for (int i = 0; i < 5; i++) {


if (entrada[i] > 5) {
cout << entrada[i] << endl;
}}
PCS / EP / USP 2017 PCS 3111 Aula 2 40
Recomendaes
if, else e else if devem ficar alinhados
if (x == 0) {
//...


} else if (x > 0) {
//...
} else {
//...
}

As chaves podem ser omitidas se o bloco tiver


apenas uma linha
Indente ou deixe na mesma linha o comando
if (x > 5)
i++; if (x > 5) i++;

PCS / EP / USP 2017 PCS 3111 Aula 2 41


Outras recomendaes
Evite processamento desnecessrio
Evite excesso de otimizao
Cdigo ilegvel, mas eficiente!
Dificuldade de manuteno
(a menos que otimizao seja fundamental)

O fundamental ser consistente

PCS / EP / USP 2017 PCS 3111 Aula 2 42


Bibliografia
FEOFILOFF, P. Algoritmos em linguagem C.
Editora Campus, 2009. Apndices A e D.

MYERS, G. J. The Art of Software Testing.


John Wiley & Sons, 2 edio, 2004.

SAVITCH, W. C++ Absoluto. Pearson, 1st ed.


2003. Seo 10.1.

PCS / EP / USP 2017 PCS 3111 Aula 2 43

Você também pode gostar