Sei sulla pagina 1di 114

Anhanguera 2015.

Programao Estruturada II
Curso Completo
Apresentao

TUTORIA
INSTRUES:
- MONTAR UM DOCUMENTO COM OS SEGUINTES CONCEITOS:
Variveis / Operadores /Desvios Condicionais /Lao (loops)
Vetores /Anlise de erros /Breakpoints /Watch /Depurao
(Debug) / Arquivos / Ponteiros / Recursividade

Somente conceitos
Referencial Terico (Quem disse?)

ENTREGAR NO DIA DA PROVA

Programao Estruturada II
Reviso

REVISO

Programao Estruturada II
Reviso

Reviso
Estrutura de um programa C++:
Bibliotecas de funes

#include <iostream>

using namespace std; Identificador da funo

int main()
Funo principal do programa
{
cout << "Ol Mundo !!!";
}

Programao Estruturada II
Reviso

Reviso
Variveis:
#include <iostream>

using namespace std;


Tipo da varivel
int main()
{
const float numero_pi = 3.14; Nome da varivel
char genero = 'M';
int idade = 31;
float nota_final = 8.5;
double salario = 1200.12;

cout << "Variveis:" << genero << "," << idade << "," << nota_final
<< "," << salario << "," << numero_pi << endl;

double nota1, nota2;


Ler uma varivel a partir
cout << "Digite as notas:" << endl; do teclado
cin >> nota1 >> nota2;
cout << "Notas: " << nota1 << "-" << nota2;
}

Programao Estruturada II
Reviso

Reviso
Operadores:
#include <iostream> #include <iostream>

using namespace std; using namespace std;

int main() int main()


{ {
int x = 10 + 5;// soma int correr = 20;// incremento pr-fixado
int y = 4 - 20;// subtrao ++correr;
int j = 34 * 160;// multiplicao
int i = 6 / 2;// diviso int andar = 30;// decremento pr-fixado
int p = 150 % 2;// resto da diviso --andar;

int acelerar = 100;// incremento ps-fixado int a = 1;


acelerar++; int b = 2;
int c = 3;
int desacelerar = 100;// decremento ps-fixado int d = 4;
desacelerar--; int e = 5;
}
a += 1;// atribuio soma
b -= 1;// atribuio subtrao
c *= 1;// atribuio multiplicao
d /= 1;// atribuio diviso
e %= 1;// atribuio resto da diviso
}
Reviso

Reviso
Desvios Condicionais:
#include <iostream> #include <iostream>

using namespace std; using namespace std;

int main() int main()


Condio
{ {
int idade; int opcao;
cout << "Digite sua idade:"; cout << "Informe uma opo (1,2,3):";
cin >> idade; cin >> opcao;

if (idade >= 21) switch (opcao)


{ {
cout << "Maior de idade"; case 1:
} cout << "Opo 1 Selecionada";
else break;
{ case 2:
cout << "Menor de idade"; cout << "Opo 2 Selecionada";
} break;
} case 3:
cout << "Opo 3 Selecionada";
break;
default:
Condies cout << "Nenhuma Opo Selecionada";
break;
}
}
Reviso

Reviso
Lao (Loops): #include <iostream>
Condio inicial, final
using namespace std; do loop e contador
int main()
{
for (int i=0;i<=10;i++)
{
cout << i << "\n";
}

Condio do loop, passa pelo int j = 0;


menos uma vez na rotina while (j <=10)
{
cout << j << "\n";
j++; Condio do loop. Pode
} no entrar na rotina
int k = 0;
do
{
cout << k << "\n";
k++;
}
while (k <= 10);
}
Reviso

Reviso
Vetores:
#include <iostream> Criando um vetor com 10 posies
#include <string.h>

using namespace std;

int main()
{
int k[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // inicializando um vetor

for (int i=9;i>=0;i--)


{
k[i] = i; Inicializando um vetor
cout << k[i] << "\n";
}

Atribuindo um char nome1[10] = "Joo"; // uma string


char nome2[10] = "Maria";
valor na posio strcat(nome2, " das Graas"); // concatena duas strings
cout << "Nome1, Nome2: " << nome1 << "," << nome2 << "\n";
cout << "Tamanho do Nome1: " << strlen(nome1) << "\n"; // tamanho de uma string
cout << "Tamanho do Nome2: " << strlen(nome2) << "\n";
cout << "Comparando:" << strcmp(nome1, nome2) << "\n"; // compara duas strings

char usuario[100]; Ler um vetor de char


gets(usuario);// l a string do teclado pelo teclado
cout << "Usurio: " << usuario;
}
Depurao e Documentao

DEPURAO E DOCUMENTAO
Depurao e Documentao

Depurao ou Debug
O que :

uma tcnica para executar uma aplicao passo a passo, identificando possveis
erros (bug) ou para o entendimento de uma funcionalidade do programa pelo
desenvolvedor.
Depurao e Documentao

Depurao ou Debug
Mais um pouco:

- Executa o programa linha a linha


- Visualizar valores das variveis em tempo de execuo
- Breakpoints
- Analise das funes do cdigo fonte

BUGS = DEFEITOS = ERROS


Depurao e Documentao

Depurao ou Debug
Como fazer anlise de um erro:

Tendo a premissa que conhecemos o programa a ser depurado, podemos seguir os


seguintes passos:
- 1 Passo:
- Verificar o problema reportado (normalmente por um usurio)
- 2 Passo:
- Entender o problema
- 3 Passo:
- Conhecer os parmetros do usurio
- 4 Passo:
- Reproduzir o problema (isso pode ser extremamente difcil)
- 5 Passo:
- Aps conseguir reproduzir o problema, efetuar a leitura do cdigo e ver
possveis erros de codificao ou utilizar uma ferramenta de depurao
Depurao e Documentao

Depurao ou Debug
Anlise de Cdigo:

No caso do cdigo abaixo, conseguimos identificar um possvel problema em nosso


programa ?
#include <iostream> Sim temos !!!
using namespace std;
Nosso vetor de inteiros, possui 10 posies e
int main() para percorrer um vetor sempre a posio 1.
{ Ento o i <= 10 deveria ser i <= 9
int value[10];
int i = 0;

for (;i<=10;i++)
{
value[i] = i;
cout << i;
}
}
Depurao e Documentao

Depurao ou Debug
Debug no DevC++:

Muitas vezes efetuamos a anlise do cdigo, e no conseguimos identificar o


problema, pois o cdigo pode ser extenso ou de difcil compreenso. Por isso as
ferramentas modernas, possuem funcionalidades que permitem rodar o programa
linha a linha.

Caando os BUGS !!!


Depurao e Documentao

Depurao ou Debug
Breakpoints:

So marcaes efetuadas na ferramenta, que tem como finalidade interromper o


programa na linha selecionada, at que o desenvolvedor continue para a prxima
instruo. Na imagem abaixo, o programa interrompe na linha 12.

Marcao do breakpoint
Depurao e Documentao

Depurao ou Debug
Debugando:

Executando linha por linha


Depurao e Documentao

Depurao ou Debug
Watch:

No processo de depurao conseguimos visualizar os valores das variveis em


tempo de execuo. Para isso usamos o boto Add watch. Na barra lateral
podemos ver as variveis do programa sendo preenchidas

Valores das variveis em


tempo de execuo

Boto Add Watch


Depurao e Documentao
Depurao e Documentao
Depurao e Documentao

Documentao
Sempre !!!:

Documentao do cdigo serve principalmente quando outro desenvolvedor


precisa efetuar uma manuteno no programa. Podemos criar uma documentao
atravs de comentrios dentro do cdigo.

A documentao de um cdigo pode ser feita com:

// - quando for uma linha


/** **/ - quando for um bloco de texto em mais de uma linha
Depurao e Documentao

#include <iostream>

using namespace std;

/**

Autor: Thoms da Costa


Data de Criao: 01/01/2015
Bloco de comentrio
Titulo: Programa que efetua o clculo de uma progresso aritmtica

Descritivo: Progresso aritmtica um tipo de seqncia numrica que a partir


do segundo elemento cada termo (elemento) a soma do seu antecessor por uma constante.

**/
int main()
{
const int TOTAL_PA = 10; // Limite total da progresso aritmtica
int razao = 2; // Razo da progresso
int i = 0; // Indice para efetuar o loop da progresso
int resultadoPa = 0;// Resultado da posio da PA
int resultadoAntPa = 3;// Resultado anterior da posicao da PA

// Efetuado o clculo da progresso de acordo


for (;i<=TOTAL_PA;i++)
{
// Clculo da progresso ocorre indice atual mais a razo Comentrio em linha
resultadoPa = resultadoAntPa + razao;
resultadoAntPa = resultadoPa;

// Imprime valor na tela da PA


cout << resultadoPa << "\n";
}
}
Depurao e Documentao

Resumo

- Depurao o processo de identificao erros dentro de uma aplicao


- Podemos conhecer a funcionalidade de um programa
- Na depurao o programa executado linha a linha
- Bugs so defeitos no programa
- Documentao importante quando vamos efetuar a manuteno de um
programa
Estruturas, Unies e Enumerao

Tipos definidos pelo Usurio


Definio:

Quando precisamos definir novos nomes a determinados tipos de dados,


utilizamos o operador typedef. No criamos um novo tipo de varivel, somente
um apelido para um tipo existente.
#include <iostream>
#include <strings.h>

using namespace std;

typedef char valores[100];

int main()
{
valores val;
strcpy(val, "Programao Estruturada II");
cout << "Tipo do usurio:" << val;
}
Arquivos

ARQUIVOS
Arquivos

Arquivos
Bem conhecido no nosso dia-a-dia:

Todos os dias no nosso trabalho ou em casa utilizamos arquivos para armazenar


informaes tais como: imagem, texto, trabalho de faculdade, relatrios, planilhas
de gastos e etc. At esse ponto do curso, todas as informaes eram armazenadas
na memria, ou seja, quando um programa terminava no existia nenhum
processo de armazenamento de dados.

Vamos aprender a armazenar informaes em arquivos textos ou de dados !!!


Arquivos

Arquivos
Tipos de Arquivos:

Texto: armazena somente texto e caracteres. Normalmente possuem extenso txt

Binrio: arquivos que podem armazenar textos, imagens, planilhas e outros tipos
de informaes. Algumas extenses conhecidas: pdf, doc, xls, gif
Arquivos

Arquivos
Criando arquivos textos em C++:
Include da biblioteca de arquivos

#include <fstream> Varivel do arquivo

...
ofstream ofs;
ofs.open("ola_mundo.txt", ios::out);

Nome do arquivo

Formato de abertura do arquivo


#include <iostream>
#include <fstream>
#include <strings.h> Exemplo 1
using namespace std;
void gravar_arquivo(); O tipo string semelhante a um vetor de char,
ou seja, armazena um conjunto de caracteres
int main()
{
gravar_arquivo();
}
void gravar_arquivo()
{
string valor;
valor = "Ola Mundo";
ofstream ofs;
ofs.open("ola_mundo.txt", ios::out);
ofs << valor;
ofs.close();
} Grava um texto no arquivo
Arquivos

Arquivos
Lendo arquivos textos em C++:
Include da biblioteca de arquivos

Varivel do arquivo
#include <fstream>
...
ifstream ifs;
ifs.open("ola_mundo.txt", ios::in);

Nome do arquivo

Formato de abertura do arquivo


#include <iostream>
#include <fstream>
#include <strings.h>
using namespace std; Exemplo 2
void ler_arquivo();
int main()
{
ler_arquivo();
}
void ler_arquivo()
{
string valor;
ifstream ifs;
ifs.open("ola_mundo.txt", ios::in);
if (!ifs.is_open())
{
cout << "No foi possivel abrir o arquivo" << endl;
return; Efetua a leitura de uma
} linha no arquivo
getline(ifs, valor);
cout << "Contedo do Arquivo:" << valor << endl;
ifs.close();
}
Arquivos

Arquivos
Lembrete:

Sempre que um arquivo for aberto para leitura ou escrita, o mesmo deve ser
fechado, para que possa ser utilizado por outros programas e no ocupar recursos
do sistema operacional.

Utilizar o comando close() dos objetos


ofstream e ifstream !!!
Arquivos

Arquivos
Novos tipos e comandos:

string: novo tipo de varivel, semelhante a um vetor de char


getline: efetua a leitura de uma linha de um arquivo
is_open: verifica se o arquivo foi aberto ou criado corretamente no disco. Exemplo
de problemas: falta de espao em disco, diretrio no existente e etc

Programao Estruturada II
#include <iostream>
#include <fstream>
#include <strings.h>
using namespace std; Exemplo 3
void gravar_arquivo();
int main()
{
gravar_arquivo();
} Lendo valores a partir do teclado

void gravar_arquivo()
{
int valor_1;
double valor_2;
float valor_3;
char valor_4;
cin >> valor_1;
cin >> valor_2;
cin >> valor_3;
cin >> valor_4; Gravando os valores sequencialmente
ofstream ofs;
ofs.open("numeros.txt", ios::out);
ofs << valor_1 << endl;
ofs << valor_2 << endl;
ofs << valor_3 << endl;
ofs << valor_4 << endl;
ofs.close();
}
#include <iostream>
#include <fstream>
#include <strings.h>
Exemplo 4
using namespace std; void ler_arquivo()
{
void ler_arquivo(); int valor_1;
double valor_2;
int main() float valor_3;
{ char valor_4;
ler_arquivo();
} ifstream ifs;
ifs.open("numeros.txt", ios::in);

if (!ifs.is_open())
Lendo os valores sequencialmente {
cout << "No foi possivel abrir o arquivo" << endl;
return;
}

ifs >> valor_1;


ifs >> valor_2;
ifs >> valor_3;
ifs >> valor_4;

cout << "Valores do arquivo:" << valor_1 << ","


<< valor_2 << "," << valor_3 << "," << valor_4;
ifs.close();
}
Arquivos

Arquivos
Formas de abertura de um arquivo:

Quando trabalhamos com arquivos, existem vrias formas de leitura e escrita.


Podemos abrir o arquivo somente para leitura, escrita, escrita/leitura e etc. Para
escolher a forma de trabalhar com o arquivo, passamos parmetros na funo
open do ofstream ou do ifstream conforme a tabela abaixo:

Parmetro Descrio
ios::in Efetua operao de leitura de arquivo (Sempre usar no ifstream)
ios::out Efetua operao de escrita de arquivo (Sempre usar no ofstream)
ios::binary Cria um arquivo binrio
ios::app Insere valores no fim do arquivo
ios::trunc Apaga o contedo do arquivo e substitui por um novo
#include <iostream>
#include <fstream>
#include <strings.h> Exemplo 5
using namespace std;

void gravar_fim_arquivo();
Abre o arquivo para escrita e
int main() insere valores no final do arquivo
{
gravar_fim_arquivo();
}

void gravar_fim_arquivo()
{
string valor;
valor = "Nova linha no arquivo";

ofstream ofs;
ofs.open("arquivo_linhas.txt", ios::out | ios::app);
ofs << valor << endl;
ofs.close();
}
Arquivos

Arquivos
Lendo um arquivo com vrias linhas:

Normalmente um arquivo texto possui vrias linhas de caracteres. Quando


desenvolvemos um programa para ler um arquivo, no temos ideia do seu
tamanho. Para efetuarmos a leitura do arquivo at o seu fim, utilizamos o
comando getline dentro de uma instruo while.

O comando getline busca sempre o


fim de linha
#include <iostream>
#include <fstream>
#include <strings.h>
using namespace std;
Exemplo 6
void gravar_arquivo();
int main()
{ Criando um arquivo com vrias
gravar_arquivo(); linhas. No nosso caso, 3 linhas.
}
void gravar_arquivo()
{
string valor;
ofstream ofs;
ofs.open("arquivo_linhas.txt", ios::out);
valor = "O que so funes:";
ofs << valor << endl;
valor = "So rotinas que tem como objetivo, "
"executar trechos de cdigos de forma modular, "
"melhorando a organizao do programa e evitando repetio de
cdigo.";
ofs << valor << endl;
valor = "As funes so reutilizveis dentro de um programa.";
ofs << valor << endl;
ofs.close();
}
#include <iostream>
#include <fstream>
#include <strings.h>
using namespace std;
Exemplo 7
void ler_arquivo();
int main()
{
ler_arquivo();
}
void ler_arquivo()
{
string linha;
Utilizando getline para efetuar a leitura de
ifstream ifs; uma linha. Enquanto existir linha no
ifs.open("arquivo_linhas.txt", ios::in);
arquivo, a leitura ser efetuada
if (!ifs.is_open())
{
cout << "No foi possivel abrir o arquivo" << endl;
return;
}
while (getline(ifs, linha))
{
cout << linha << endl;
}
ifs.close();
}
Arquivos

Arquivos
Gravando estruturas em arquivo:

At agora vimos como gravar informaes no formato texto.

Neste ponto da matria, iremos aprender a gravar um estrutura dentro de um


arquivo. A estrutura gravado em um arquivo no formato binrio

Para isso vamos aprender uma nova forma de trabalhar com arquivo. Essa nova
forma, podemos gravar e ler informaes utilizando apenas um tipo de varivel,
sem precisar usar o ofstream e o ifstream

Vamos ver a nova forma de gravao em arquivos !!!


Arquivos

Arquivos
Escrevendo/Lendo arquivos textos e binrios em C++:
Include da biblioteca de arquivos

Varivel do arquivo
#include <fstream> Nome do arquivo
...
fstream fst;
fst.open("registros.dat",
ios::in | ios::out | ios::app | ios::binary);

Formato de abertura do arquivo


Arquivos

Arquivos
Gravando uma estrutura em um arquivo:
Comando para gravao

Cast da estrutura para char

fst.write((char *)&alu, sizeof(alu));

Tamanho da estrutura que ser gravada


#include <iostream>
#include <fstream>
#include <strings.h>
#include <limits>
Exemplo 8
using namespace std;
void gravar_arquivo_registros()
{
struct alunos alunos alu;
{
long id; cout << "Digite o nome do aluno:";
char nome[255]; gets(alu.nome);
char ra[30]; cout << "Digite o RA do aluno:";
int idade; gets(alu.ra);
};
cout << "Digite a idade do aluno:";
cin >> alu.idade;
void gravar_arquivo_registros();
fstream fst;
int main() fst.open("registros.dat",
ios::in | ios::out | ios::app | ios::binary);
{
gravar_arquivo_registros(); if (!fst.is_open())
} {
cout << "No foi possivel abrir o arquivo"
Gravando uma estrutura no << endl;
arquivo return;
}
fst.write((char *)&alu, sizeof(alu));
fst.close();
}
Arquivos

Arquivos
Lendo uma estrutura em um arquivo:
Comando para leitura

Cast da estrutura para char

fst.read((char *)&alu,sizeof(alu))

Tamanho da estrutura que ser lida


#include <iostream>
#include <fstream>
#include <strings.h>
#include <limits>
Exemplo 9
using namespace std;
void ler_arquivo_registros()
struct alunos {
{ alunos alu;
long id; fstream fst;
char nome[255]; fst.open("registros.dat",
char ra[30]; ios::in | ios::out | ios::app | ios::binary);
int idade;
}; if (!fst.is_open())
{
cout << "No foi possivel abrir o arquivo";
void ler_arquivo_registros(); return;
}
int main()
{ while (fst.read((char *)&alu,sizeof(alu)))
{
ler_arquivo_registros(); cout << "************************" << endl;
} cout << "Nome:" << alu.nome << endl;
cout << "RA:" << alu.ra << endl;
cout << "Idade:" << alu.idade << endl;
Lendo uma estrutura do }
arquivo
fst.close();
}
Arquivos

Arquivos
Resumo:

- Existem dois formatos de arquivos: texto e binrio


- Utilizamos o tipo ofstream para escrita em um arquivo
- Utilizamos o tipo ifstream para leitura em um arquivo
- Podemos gravar uma estrutura em um arquivo
- O tipo fstream utilizado para escrita e leitura de arquivos
- Devemos sempre fechar o arquivo com o close do tipo especfico do arquivo
- O tipo string semelhante a um vetor de char
- O comando getline efetua a leitura de uma linha em um arquivo texto
- O is_open tem como finalidade, indicar se o arquivo foi aberto ou criado
corretamente
- Para efetuar a leitura de um arquivo com vrias linhas utilizamos o getline
dentro de lao at o final do arquivo
Ponteiros

PONTEIROS
Ponteiros

Ponteiros
O que :

um tipo de varivel que armazena um endereo de memoria referente a uma


outra varivel. O ponteiro no armazena diretamente um valor como os outros
tipos em C++.
Ponteiros

Ponteiros
Mais detalhes:

- O entendimento de ponteiros complexo


- So utilizados quando desejamos passar vetores como parmetros da funo
- utilizado em passagem de parmetros por referncia
- Quando desejamos alocar e desalocar memria manualmente
- Em vetores do tipo char
- Criar estruturas complexas, como lista encadeadas e rvores binrias
- Atuar com desenvolvimento de aplicaes complexas
Ponteiros

Ponteiros
Operadores:

Para operao com ponteiros, utilizamos dois operadores unrios:

Operador Descrio

* Utilizado para declarar um ponteiro e para retornar o valor

& Utilizado para retornar o endereo de memria da varivel

Vamos ver como declarar uma varivel do tipo ponteiro !!!


Ponteiros

Ponteiros
Declarando uma varivel do tipo ponteiro:

Nome da varivel

int *ptr;
Tipo da varivel

Operador unrio
#include <iostream> Exemplo 1

using namespace std; Declarando um ponteiro

int main()
{
int *ptr;

cout << ptr << endl;


}
Exibe o endereo da varivel, neste caso,
nenhum endereo foi atribudo
Ponteiros

Ponteiros
Declarao e atribuio de ponteiros:

int *ptr;
int valor;

Varivel ponteiro
valor = 1500;
ptr = &valor;

Atribuindo o endereo de
memria
#include <iostream>
Exemplo 2
using namespace std;

valor ptr
int main()
{ 0x23fe44 0x23fe48
int valor;
int *ptr; 1500 0x23fe44 0x23fe44 0x23fe48

valor = 1500;
ptr = &valor;

cout << ptr << endl;


cout << *ptr << endl;
}
Ponteiros

Ponteiros
Mais detalhes:

- Ponteiro armazena o endereo de memria


- O operador & mostra o endereo da varivel
- O operador * utilizado na declarao do ponteiro
- Exibindo o valor de um ponteiro com cout mostrado o
endereo referenciado
- Utilizando o operador * seguido pelo nome da varivel
de ponteiro exibido o valor atribudo no endereo de
memria referente.

Vamos ver mais um exemplo !!!


#include <iostream>

using namespace std; Exemplo 3

int main()
valor ptr total
{
int valor; 0x23fe44 0x23fe48 0x23fe40
int *ptr;
int total;
1600 0x23fe44 0x23fe44 0x23fe48 1600 0x23fe40

valor = 1600;
ptr = &valor;
total = *ptr;

cout << *ptr << endl;


cout << total << endl;
}
Ponteiros

Ponteiros
Importante:

A atribuio de valores para ponteiros, deve ser do mesmo tipo. Quando as


variveis so de tipos diferentes, vamos ter um erro de compilao.
#include <iostream>
Exemplo 4
using namespace std;

int main()
{
// PROGRAMA COM ERRO NAO COMPILA !!!!
int *ptr_inteiro; ERRO !!!
double valor;

valor = 345.76;
ptr_inteiro = &valor;

cout << *ptr_inteiro << endl;


}
Ponteiros

Ponteiros
Converso de valores:

Para atribuir ponteiros de tipos diferentes, utilizamos um conceito chamado cast.


O cast de variveis ocorre em tipos similares. Neste processo as variveis de um
tipo so convertido em outro tipo. Muitas vezes esta converso no ocorre 100%
conforme o esperado.
Ponteiros

Ponteiros
Converso de valores:

Converso de valores

int *ptr_inteiro;
double valor;

ptr_inteiro = (int *)&valor;


Ponteiros

Ponteiros
Converso de valores:

Temos um pequeno problema quando existe a converso de ponteiros de tipos


diferentes. Vamos ver no prximo exemplo.
#include <iostream>
Exemplo 5
using namespace std;
valor ptr_inteiro
int main()
0x23fe40 0x23fe48
{
double valor;
int *ptr_inteiro; 345.76 0x23fe40 0x23fe40 0x23fe48

valor = 345.76; Valor exibido:


ptr_inteiro = (int *)&valor; -171798692

cout << *ptr_inteiro << endl;


}
Valor incorreto exibido pelo ponteiro !!!
#include <iostream>

using namespace std; Exemplo 6


Converso no funciona completamente
int main()
{
int *ptr_inteiro; So exibidos valores errados

double valor_1;
double valor_2;

valor_1 = 345.76;
ptr_inteiro = (int *)&valor_1;
valor_2 = *ptr_inteiro;

cout << valor_1 << endl;


cout << *ptr_inteiro << endl;
cout << valor_2 << endl;
}
Ponteiros

Ponteiros
Atribuio de valores:

Podemos atribuir um valor diretamente para um ponteiro. Para isso utilizamos o


operador * antes do nome da varivel do tipo ponteiro.

Varivel do tipo ponteiro

*ptr = 999;

Atribuindo um valor
#include <iostream>
Exemplo 7
using namespace std;
ptr x
int main()
0x23fe48 0x23fe44
{
int *ptr;
int x; 0x23fe44 0x23fe48 999 0x23fe44

ptr = &x;
*ptr = 999;

cout << &x << endl;


cout << ptr << endl;
cout << *ptr << endl;
}
Ponteiros

Ponteiros
Operao com ponteiros:

Em ponteiros, possumos operaes de incremento e decremento, tanto para


valores como para o endereo do ponteiro.

Operador Descrio

++ Incrementa um valor ou o endereo do ponteiro

-- Decrementa um valor ou o endereo do ponteiro

Quando o valor de um endereo de ponteiro incrementado ou decrementado, a


operao sempre ir acontecer utilizando o tamanho do tipo da varivel. Por
exemplo: se uma varivel for do tipo inteiro, o ponteiro ser incrementado e
decrementado de 4 em 4.
Ponteiros

Ponteiros
Como incrementar e decrementar um ponteiro:

No exemplo abaixo, a posio de memria ser incrementada e decrementada em


4 posies de acordo com o tamanho da varivel inteira.

Incremento de ponteiro
int *ptr;
Somente o endereo do ponteiro
atribudo na varivel ser
ptr++; incrementado ou decrementado
ptr--;
Decremento de ponteiro
Ponteiros

Ponteiros
Como incrementar e decrementar o valor de um ponteiro:

No exemplo abaixo, o valor de um ponteiro incrementado e decrementado.

Incremento do valor do
int *ptr; Decremento do valor do
ponteiro
ponteiro

(*ptr)++;
(*ptr)--;
O valor atribudo na posio de
memria do ponteiro, ser
incrementado ou decrementado
Programao Estruturada II
#include <iostream>
using namespace std;
Exemplo 8
int main()
{
int *ptr;
int x; Este programa efetua operaes com ponteiros. Vamos
analisar com mais detalhes. Para isso iremos ocultar as
ptr = &x; linhas de cout, pois no afetam o nosso cdigo
*ptr = 999;
cout << "Valor Original:" << ptr << endl;
ptr++;
cout << "Incremento:" << ptr << endl;
ptr--;
cout << "Decremento:" << ptr << endl;
(*ptr)++;
cout << "Inc. valor:" << *ptr << endl;
(*ptr)--;
cout << "Dec. valor:" << *ptr << endl;
}
#include <iostream>

using namespace std; Exemplo 8


ptr x
int main()
{ 0x23fe38 0x23fe34
int *ptr;
int x;
0x23fe34 0x23fe38 999 0x23fe34

ptr = &x;
*ptr = 999; 0x23fe38 0x23fe38 999 0x23fe34

ptr++; 0x23fe34 0x23fe38 999 0x23fe34


ptr--;
(*ptr)++; 0x23fe34 0x23fe38 1000 0x23fe34
(*ptr)--;
}
0x23fe34 0x23fe38 999 0x23fe34
#include <iostream>
using namespace std;
Exemplo 9
int main()
{
double *ptr;
double x; Mesmo processo do programa anterior utilizando outro
tipo de varivel.
ptr = &x;
*ptr = 999.98;
cout << "Valor Original:" << ptr << endl;
ptr++;
cout << "Incremento:" << ptr << endl;
ptr--;
cout << "Decremento:" << ptr << endl;
(*ptr)++;
cout << "Inc. valor:" << *ptr << endl;
(*ptr)--;
cout << "Dec. valor:" << *ptr << endl;
}
Ponteiros

Ponteiros
Comparao de Ponteiros:

Na comparao de ponteiros, utilizamos os operadores maior, menor e igual. O


resultado da comparao, indica se o endereo de ponteiro igual, se est mais ou
menos avanado que o endereo que est sendo comparado.
#include <iostream>
using namespace std;
Exemplo 10
int main()
{
int *ptr_1;
int *ptr_2; Comparao de ponteiros
int x, y;
ptr_1 = &x; Ponteiros so iguais
ptr_2 = &y;
cout << ptr_1 << endl;
cout << ptr_2 << endl;
cout << (ptr_1 > ptr_2) << endl;
cout << (ptr_1 < ptr_2) << endl;
ptr_1 = &x;
ptr_2 = &x;
cout << (ptr_1 == ptr_2) << endl;
}
Ponteiros

Ponteiros
Vetores:

Normalmente um vetor, pode ser representado diretamente por um ponteiro. No


caso de um vetor de char, podemos efetuar atribuies diretamente, sem precisar
represent-los por posies de memrias. Isto uma caracterstica da linguagem e
do compilador.
#include <iostream>
#include <strings.h>

using namespace std; Exemplo 11

int main()
{
char valores[100];
char *ptr;
Exibindo valor na posio
strcpy(valores, "Isto um teste"); do vetor
ptr = valores;

cout << valores << endl;


cout << ptr << endl;

ptr = (char *)"Isto um outro teste";


cout << ptr << endl;

cout << valores[3] << endl;


cout << *(ptr+3) << endl;
}
Programao Estruturada II
Ponteiros

Ponteiros
Operadores bit-a-bit:

So operaes que efetuamos diretamente com os bits de um tipo de dados. Para


isso, cada operador possui uma tabela verdade.

Operador Descrio
& AND
| OR
^ OR Exclusivo (XOR)
~ Negao
>> Deslocamento de bit a direita
<< Deslocamento de bit a esquerda
Ponteiros

Ponteiros
Tabela verdade dos operadores bit-a-bit:

Operador AND (&): Operador OR(|): Operador XOR(^):


p q p&q p q p|q p q p&q
0 0 0 0 0 0 0 0 0
0 1 0 0 1 1 0 1 1
1 0 0 1 0 1 1 0 1
1 1 1 1 1 1 1 1 0

O operador ~ (NOT), inverte o resultado, se for 0 se torna 1 e vice-versa. Os


operadores >> e <<, deslocam bit a esquerda e a direita.
#include <iostream>
#include <strings.h>
#include <stdlib.h>
using namespace std;
int main()
Exemplo 12
{
int *ptr_1, *ptr_2;
int valor_1, valor_2;
char valor_convertido[100]; Converte um nmero para
ptr_1 = &valor_1; uma base especfica
ptr_2 = &valor_2;
valor_1 = 316;
valor_2 = 206;
*ptr_1 = *ptr_1 << 2;
cout << *ptr_1 << endl;
*ptr_1 = *ptr_1 >> 2;
cout << *ptr_1 << endl;
itoa(*ptr_1, valor_convertido, 2);
cout << "Valor binrio:" << valor_convertido << endl;
itoa(*ptr_2, valor_convertido, 2);
cout << "Valor binrio:" << valor_convertido << endl;
itoa(*ptr_2 & *ptr_1, valor_convertido, 2);
cout << "Operador AND:" << valor_convertido << endl;
itoa(*ptr_2 | *ptr_1, valor_convertido, 2);
cout << "Operador OR:" << valor_convertido << endl;
itoa(*ptr_2 ^ *ptr_1, valor_convertido, 2);
cout << "Operador XOR:" << valor_convertido << endl;
itoa(~*ptr_2, valor_convertido, 2);
cout << "Operador NEG:" << valor_convertido << endl;
}
Ponteiros

Ponteiros
Resumo:

- Um ponteiro armazena uma posio de memria


- Esta posio de memria referente a um valor
- Atribuio de ponteiros deve acontecer se for do mesmo tipo
- Podemos efetuar operao de incremento e decremento em ponteiros
- Os operadores bit-a-bit so divididos em AND, OR, XOR, NOT
- Os operadores << e >> representam deslocamento de bit a esquerda e a direita
Ponteiros

Ponteiros
Lista Ligada Simples:

uma lista de elementos ligados em sequncia. Normalmente utilizamos


estruturas para representar lista ligadas.
Ponteiros

Lista Ligada Simples


Mais detalhes:

- So representados por estruturas


- So estruturas dentro de estruturas encadeadas
- A estrutura interna sempre um ponteiro para outra estrutura
- Sendo um ponteiro, indica o endereo da prxima estrutura
- Vamos trabalhar com insero no fim da lista encadeada
- Utilizadas para armazenar valores na memria de fcil acesso
Ponteiros

Lista Ligada Simples


Como funciona:

Um elemento de uma lista, possui o endereo do prximo. O ltimo elemento da


lista tem o valor NULL
Endereo de memria para o prximo elemento

1 2 3

Elementos da lista ligada simples


Ponteiros

Lista Ligada Simples


Exemplo:

struct alunos Prximo elemento da lista

{
char nome[100];
int idade;
alunos *proximo;
} *lista_alunos;
Ponteiros

Lista Ligada Simples


Alocando memria:

Para o nosso exemplo vamos efetuar alocao dinmica de memria utilizando a


palavra reservada new.

alunos *novo_aluno = new alunos;

Efetuando alocao de memria


...
alunos *novo_aluno = new alunos;

cout << "Digite o nome do aluno:" << endl; Exemplo 13


gets(novo_aluno->nome);

cout << "Digite a idade do aluno:" << endl;


cin >> novo_aluno->idade;

novo_aluno->proximo = NULL;

if (lista_alunos == NULL)
lista_alunos = novo_aluno;
else
{ Adicionando no final da lista
alunos *p;
p = lista_alunos;

while (p->proximo != NULL)


p = p->proximo;

p->proximo = novo_aluno;
}
...
...
alunos *p;
p = lista_alunos;
Exemplo 13
if (p->proximo == NULL)
{
cout << "------------------------------------" << endl;
cout << "Nome do Aluno:" << p->nome << endl;
cout << "Idade do Aluno:" << p->idade << endl;
cout << "------------------------------------" << endl;
}
else
{
while (p != NULL)
{
cout << "------------------------------------" << endl;
cout << "Nome do Aluno:" << p->nome << endl;
cout << "Idade do Aluno:" << p->idade << endl;
cout << "------------------------------------" << endl;
p = p->proximo;
}
}
... Percorrendo a lista ligada
Ponteiros

Lista Ligada Simples


Resumo:

Lembrando os itens do comeo desse tpico:


- So representados por estruturas
- So estruturas dentro de estruturas encadeadas
- A estrutura interna sempre um ponteiro para outra estrutura
- Sendo um ponteiro, indica o endereo da prxima estrutura
- Utilizadas para armazenar valores na memria de fcil acesso
Recursividade

RECURSIVIDADE
Recursividade

Recursividade
O que :

quando uma funo, invoca a si mesma para resolver um problema em uma


instncia menor.
Recursividade

Recursividade
Mais detalhes:

- quando uma funo invoca a si mesmo


- As chamadas devem possuir um fim
- O programa pode ficar em um loop infinito
- Dependendo da sua forma de utilizao, pode ser lento
- Existe uma pilha de execuo
- Simplifica algumas lgicas de programao
- Programas recursivos so complexos
- Possuem grande semelhana com instrues de laos
- Muito cuidado: existe um limite para uma funo chamar a si prprio
- Esse limite definido por cada compilador e linguagem

Vamos ver um exemplo !!!


Recursividade

Recursividade
Exemplo de Fatorial:

No nosso exemplo vamos utilizar fatorial !!!

O que fatorial?

o produto de todos os seus antecessores, incluindo si prprio e excluindo o zero

Exemplo: 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720
FATORIAL DE 6 720 !!!
#include <iostream>

using namespace std;


Exemplo 1
int calcular_fatorial(int valor);

int main()
{
cout << "Valor do fatorial:" << calcular_fatorial(6);
}
Chamada recursiva
int calcular_fatorial(int valor)
{
if (valor == 0)
return 1;
else
{
valor = (valor * calcular_fatorial(valor - 1));
cout << valor << endl;
return valor;
} Vamos ver o programa
} passo-a-passo, analisando a
pilha de execuo
...
int calcular_fatorial(int valor)
{ Exemplo 1
if (valor == 0)
return 1;
else
{
valor = (valor * calcular_fatorial(valor - 1));
cout << valor << endl;
return valor;
} Fim da recursividade
} Pilha de execuo

calcular_fatorial(0) -> return 1;


calcular_fatorial(1) -> valor = (1 * calcular_fatorial(0));

calcular_fatorial(2) -> valor = (2 * calcular_fatorial(1));


calcular_fatorial(3) -> valor = (3 * calcular_fatorial(2));

calcular_fatorial(4) -> valor = (4 * calcular_fatorial(3));

calcular_fatorial(5) -> valor = (5 * calcular_fatorial(4));

calcular_fatorial(6) -> valor = (6 * calcular_fatorial(5));


...
int calcular_fatorial(int valor)
{ Exemplo 1
if (valor == 0)
return 1;
else
{
valor = (valor * calcular_fatorial(valor - 1));
cout << valor << endl;
return valor;
}
}

calcular_fatorial(0) -> return 1;


calcular_fatorial(1) -> valor = (1 * 1);

calcular_fatorial(2) -> valor = (2 * 1 * 1);


calcular_fatorial(3) -> valor = (3 * 2 * 1 * 1);

calcular_fatorial(4) -> valor = (4 * 3 * 2 * 1 * 1);

calcular_fatorial(5) -> valor = (5 * 4 * 3 * 2 * 1 * 1);

calcular_fatorial(6) -> valor = (6 * 5 * 4 * 3 * 2 * 1 * 1);


Prof. Thoms da Costa Programao Estruturada II
Recursividade

Recursividade
Exemplo de Potenciao:

No prximo exemplo, vamos ver como criar um programa de potenciao.

O que potenciao?

o produto de um nmero por ele mesmo, em uma quantidade de vezes definida.

Exemplo: 5 = 5 * 5 * 5 = 125
POTNCIA DE 5 125 !!!
#include <iostream>

using namespace std;


Exemplo 2
int potencia(int base, int expoente);

int main()
{
int base = 5;
int expoente = 3;
cout << "Potencia:" << potencia(base, expoente);
}

int potencia(int base, int expoente)


{ Chamada recursiva
if (expoente == 0)
return 1;
else
{
int valor = base * potencia(base, expoente - 1);
cout << valor << endl;
return valor;
}

}
Recursividade

Recursividade
Resumo:

Vamos relembrar os itens do comeo da aula:

- quando uma funo invoca a si mesmo


- As chamadas devem possuir um fim
- O programa pode ficar em um loop infinito
- Dependendo da sua forma de utilizao, pode ser lento
- Existe uma pilha de execuo
- Simplifica algumas lgicas de programao
- Programas recursivos so complexos
- Possuem grande semelhana com instrues de laos
- Muito cuidado: existe um limite para uma funo chamar a si prprio
Recursividade

Semestre concludo !!! Parabns a todos !!!

THANKS FOR STUDYING


Anhanguera 2015.1

Programao Estruturada II
Melhores Prticas

MELHORES PRTICAS
Melhores Prticas

Indentao do Cdigo-Fonte
O que :

uma forma de deixar mais legvel o cdigo-fonte de um programa, usando


tabulaes e espaos entre desvios condicionais, laos, variveis e outros
comandos.

Vamos ver um exemplo !!!

Prof. Thoms da Costa Programao Estruturada II


Melhores Prticas

Indentao do Cdigo-Fonte
#include <iostream>

using namespace std; Cdigo bem tabulado e com


espaamentos, possvel saber
int main()
aonde comea e termina o desvio
{
int idade;
condicional
cout << "Digite sua idade:";
cin >> idade;

if (idade >= 21)


{
cout << "Maior de idade";
}
else
{
cout << "Menor de idade";
}
}

Prof. Thoms da Costa Programao Estruturada II


Melhores Prticas

Indentao do Cdigo-Fonte
#include <iostream>

using namespace std; Cdigo RUIM !!! Mal tabulado e sem


int main() espaamentos. Difcil de entender
{ aonde comea e termina cada
int idade; instruo
cout << "Digite sua idade:";
cin >> idade;
if(idade >= 21)
{cout << "Maior de idade";
}
else
{
cout << "Menor de idade";
}
}
Melhores Prticas

Indentao do Cdigo-Fonte
No se esqueam:

Fazer a indentao dos cdigos-fontes nas aulas de lab, nos exerccios, trabalhos e
avaliaes
Dicas e Truques

DICAS E TRUQUES
Dicas e Truques

Recomendaes
Ateno:
- Preste bastante ateno ao digitar um cdigo fonte. Qualquer erro significa que o
programa pode no compilar ou uma funcionalidade pode parar de executar
- Cuidado ao digitar nomes de funes: uma letra errada ao chamar uma funo significa
erro de compilao
- Todos os comandos aprendidos em C++ so em letras minsculas. Comandos digitado
em letra maiscula, significa erro de compilao
- Atribuir corretamente os tipos de variveis para no acontecer erros de converso. Por
exemplo: inteiro recebe um inteiro, um ponto flutuante recebe um valor numrico
separado por ponto(.)
- As aberturas de chaves definem um escopo. Uma abertura de chave errada, pode gerar
um resultado inesperado ou um erro de compilao
- Instrues terminam com ponto e vrgula. Colocando este operador, significa que a
instruo deve ser concluda. Cuidado ao colocar em if, for e while, para evitar
instrues sem contedo
Dicas e Truques

Dicas e Truques
No se esqueam:

Sigam as dicas, para desenvolver programas com o menor nmero de problemas e


erros de compilao.
Ferramentas e Sites

FERRAMENTAS E SITES
Ferramentas e Sites

Ferramentas e Sites
Vamos l:

Iremos conhecer novas ferramentas para o desenvolvimento em C/C++ e alguns


sites para aprimorar o conhecimento em programao de softwares.

Vamos conhecer as ferramentas e


sites !!!
Ferramentas e Sites

Ferramentas

CodeLite IDE
http://codelite.org/

Code::Blocks
http://www.codeblocks.org/

Visual Studio Community 2013


https://www.visualstudio.com/en-us/products/visual-
studio-community-vs.aspx

Eclipse CDT
https://eclipse.org/cdt/
Ferramentas e Sites

Sites

Microsoft Virtual Academy


http://www.microsoftvirtualacademy.com/

Codecademy
http://www.codecademy.com/pt

Veduca
http://www3.veduca.com.br/

Coursera
https://pt.coursera.org/

Udemy
https://www.udemy.com/
Ferramentas e Sites

Ferramentas e Sites
Importante:

Programao envolve muito treino, prtica, estudo, pesquisa e curiosidade. Este


material complementar pode ajud-los em todos os itens mencionados.
Obrigado !!!

Potrebbero piacerti anche