Está en la página 1de 42

Aula 05

Ponteiros
Strings
Listas
PONTEIROS
Introduo

Quando uma varivel declarada, um espao de


memria RAM alocado e reservado para essa varivel;
Esse espao de memria tem um endereo, que permite
que a aplicao encontre a varivel quando precisar dela;
O programador, no entanto, no precisa saber
necessariamente os endereos das variveis da aplicao, pois
ele s se refere a elas atravs de seus identificadores;
Em alguns contextos, pode ser til salvar o endereo de
uma varivel, como veremos mais a frente.
Operadores & e *

Operador & Operador *

Dado um endereo de memria


Dada uma varivel qualquer end, *end se refere ao valor
var, &var se refere ao armazenado nesse endereo;
endereo dessa varivel; Esse operador pode ser lido
Esse operador pode ser lido como: valor no endereo
como: endereo de var; end;
& chamado operador de Nesse contexto, * chamado
referncia. operador de de-referncia.
Operadores & e *
O nome da varivel, sozinho,
#include <iostream> corresponde ao valor dela.

using namespace std; O operador de referncia &


vai indicar que se trata do
endereo da varivel, e no
int main() o valor.
{
int k = 42;
E, dado um
endereo...
cout << "O valor de k e: " << k << endl;
cout << "O endereco de k e: " << &k << endl;
cout << "O valor contido no endereco de k e: " << *(&k) << endl;

system("Pause");
return 0; O operador de de-referncia * mostra
} que o valor contido naquele
endereo que deve ser mostrado aqui.
O output
O endereo pode mudar de execuo para execuo e de mquina para
mquina. Quem decide isso o SO.
Operadores & e *
#include <iostream> Mas onde armazenar o
endereo de uma
using namespace std; varivel?

int main()
{
int k = 42;

cout << "O valor de k e: " << k << endl;


cout << "O endereco de k e: " << &k << endl;
cout << "O valor contido no endereco de k e: " << *(&k) << endl;

system("Pause");
return 0;
}
Ponteiros

Um ponteiro uma varivel que armazena o endereo de


outra varivel;
Se um ponteiro ptr armazena o endereo da varivel k,
dizemos que ptr aponta para k.
int* ptr = NULL;
Ponteiros int* indica que a varivel ptr
#include <iostream>
um ponteiro (*) que aponta
using namespace std;
para um nmero inteiro (int).

int main() NULL um valor especial, que


{ indica que o ponteiro no est
int k = 42; apontando para nada. uma
int* ptr = NULL; forma segura de se inicializar
ponteiros.
ptr = &k;

cout << "O valor de k e: " << k << endl;


cout << "O endereco de k e: " << &k << endl;
cout << "O endereco armazenado no ponteiro ptr e: " << ptr << endl;
cout << "O valor contido no endereco de k e: " << *(&k) << endl;
cout << "O valor contido no endereco armazenado no ponteiro ptr e: " << *ptr << endl;

system("Pause");
return 0;
}
Ponteiros
#include <iostream>

using namespace std;


O ponteiro ptr recebe o
int main() valor do endereo de k, ou
{ seja, passa a apontar para k.
int k = 42;
int* ptr = NULL; Por isso, &k
equivalente a ptr.
ptr = &k;

cout << "O valor de k e: " << k << endl;


cout << "O endereco de k e: " << &k << endl;
cout << "O endereco armazenado no ponteiro ptr e: " << ptr << endl;
cout << "O valor contido no endereco de k e: " << *(&k) << endl;
cout << "O valor contido no endereco armazenado no ponteiro ptr e: " << *ptr << endl;

system("Pause");
return 0; E *(&k) equivalente
} a *ptr.
O output
Perceba que, nesse segundo momento, o endereo de k mudou
Ponteiros e arrays

Quando uma array declarada, espaos de memria


consecutivos so alocados para armazenamento de seus
elementos;
Ou seja, cada elemento da array est em um espao de
memria diferente;
Com isso os elementos da array tem endereos de
memria diferentes e consecutivos;
Por isso possvel armazenar e acessar consecutivamente
valores diferentes presentes nos elementos da array;
Mas qual o valor da array por si s?
Ponteiros e arrays

#include <iostream>
O que ser que acontece
using namespace std; quando imprimimos na tela o
valor da prpria array?
int main()
{
int lost[3] = {4, 8, 15};

cout << "Valor da array e: " << lost << endl;


cout << "O endereco do elemento 0 e: " << &lost[0] << endl;
cout << "O endereco do elemento 1 e: " << &lost[1] << endl;
cout << "O endereco do elemento 2 e: " << &lost[2] << endl;

system("Pause");
return 0; E o endereo dos
} seus elementos?
Ponteiros e arrays

O valor de uma array


simplesmente o endereo do
primeiro elemento;
Em outras palavras, uma array
ponteiro, apontando para o
elemento zero;
Os elementos da array
encontram-se em endereos que
diferem de 4 bytes entre si;
Isso acontece pois o tipo int
ocupa 4 bytes de memria.
Aritmtica com ponteiros
#include <iostream>
Se a array aponta
para o elemento 0...
using namespace std;
O valor contido no
int main() endereo apontado
pela array o valor do
{
elemento zero.
int lost[3] = {4, 8, 15};

cout << "Valor da array e: " << lost << endl;


cout << "O valor apontado e: " << *lost << endl;
cout << "No proximo endereco encontra-se: " << *(lost + 1) << endl;
cout << "E no seguinte: " << *(lost + 2) << endl;
Quando soma-se 1 ao
system("Pause"); ponteiro, estamos nos
Ao se somar 2, refere-
return 0; referindo ao endereo de
se ao endereo duas
} memria seguinte.
posies a frente.
Em outras palavras

*(lost + N) equivalente a lost[N]


STRINGS
Strings
Strings so arrays, ou sequncias, de caracteres;
Em contraste com a linguagem C, o C++ contm o tipo string
que provido por uma biblioteca padro chamada
<string>;
Em outras palavras, uma string nada mais do que uma classe
que define capacidades e propriedades das strings;
Esta classe foi implementa na biblioteca padro que includa
no programa, a implementao foi feita de tal maneira que
podemos trabalhar com strings de forma semelhante aos
tipos primitivos;
Podemos, por exemplo, atribuir strings usando =,
comparar usando == e concatenar strings usando +;
#include <iostream>
#include <string> //[1] - Incluso da biblioteca

Primeiro programa com


#include <locale.h> //Necessrio para usar o setlocale()

strings
using namespace std;

int main()
[1] Incluso da biblioteca para {
uso do tipo string na rotina //Necessrio para adaptar as caractersticas de uma determinado idioma ou de uma
regio.
principal; setlocale(LC_ALL, "Portuguese");

[2] Inicializao das trs //[2] - Inicializando trs strings


strings; string primeiro_nome = "son";
string ultimo_nome = "goku";
[3] Acessar um caractere string nome = "";
especfico da string com base
//[3] - Acessando o contedo de strings
em um index (uma string sempre primeiro_nome[0] = 'S';
comea com o index 0); ultimo_nome[0] = 'G';

[4] Concatenando strings com //[4] - Concatenando Stings

operador +; nome = primeiro_nome + " " + ultimo_nome;

[5] Comparando o valor das //[5] - Comparando strings com operadores convencionais
if(nome != ""){
string, isto , o contedo //[6] - Uso de outputs da forma convencional
comparado; endl;
cout << "Seu nome " << nome << " e seu poder mais de 8000!!!" <<

[6] Output de uma string da }


//[7] - Inteiro inicializado com nmero de caractere da string "nome"
forma convencional; int tamanho = nome.length();

[7] Mtodo length() retorna a cout << "\"" << nome << "\" tem " << tamanho
<< " caracteres. (Espaos em branco tambm contam como caractere)" << endl;
quantidade de caracteres da return 0;

string
Tela de execuo
Tela de Execuo
Principais Funes
Iterador
A Standard Template Library (STL)
do C++ possui containers que
so geralmente acessados por
iteradores. Todo objeto iterador
representa uma posio no
container.
A vantagem no uso de iteradores
que ele permite que todos os
containers usem a mesma
interface para acessar elementos.
Os iteradores possuem operaes
fundamentais que definem o seu
comportamento bsico.
#include <iostream>
#include <string>

Iteradores vs operator[] using namespace std;

int main ()
{
setlocale (LC_ALL, "Portuguese");
//pede uma string para o usurio e imprime caractere por caractere
string str = "";
cout<<"Insira uma palavra: "<<endl;
String suportam o operador [], cin>>str;
mas outros containers no; cout<<"A string caractere por caractere : \n";
Por isso usamos iteradores, que for ( string::iterator it=str.begin(); it!=str.end(); ++it)
so suportados pela maioria de cout << *it<<'\n';
containers em C++;
cout<<"Ou entao : \n";
for (int idx = 0; idx < str.size(); ++idx)
cout << str[idx] << '\n';

return 0;
}
LISTAS
A Biblioteca STL
A STL (Standard Template Library) representa uma poderosa
coleo de modelos de programao. Ela prov um grupo de
containers, algoritmos, iteradores, e outras coisas.
Containers permitem voc armazenar e acessar uma
coleo de valores do mesmo tipo. verdade que arrays
permitem que voc utilize essa mesma caracterstica.
Porm,. os containers da STL oferecem maior poder e
flexibilidade do que um array
Iteradores so ponteiros que identificam elementos em
containers, eles podem ser manipulados para se mover entre
os elementos.
Eles so bastante utilizados para iterar atravs de
contineres. Alm disso, os algoritmos da STL exigem
iteradores.
Introduo
As listas so containers de sequncia que permitem operaes de insero
e remoo em qualquer lugar dentro da sequncia e iterao em
ambas as direes;
Em comparao com outros containers de sequncia padro (matriz, vetor e
deque), as listas, geralmente, funcionam melhor na insero, extrao
e movimentao de elemento;
A principal desvantagem das listas que elas no tm acesso direto aos
elementos por sua posio;
Por exemplo, para acessar o sexto elemento de uma lista, preciso iterar a partir de uma
posio conhecida (como o comeo ou o fim) para essa posio, que leva um tempo linear
na distncia entre eles.
Eles tambm consomem alguma memria extra para manter as informaes de vinculao
associadas a cada elemento (o que pode ser um fator importante para grandes listas de
elementos de pequeno porte).
Alguns Conceitos
using namespace std;

[1] Inicializa a varivel lista como uma lista de int main()


nmeros inteiros. {
[2] Adiciona um novo elemento no final do /*[1]*/ list<int> lista;
continer de lista, aps seu ltimo
/*[2]*/ lista.push_back(1);
elemento atual.
[3] Insere um novo elemento no incio da lista, /*[3]*/ lista.push_front(0);
logo antes de seu primeiro elemento atual. /*[4]*/ lista.pop_back();
[4] Remove o ltimo elemento no continer de /*[5]*/ lista.pop_front();
lista, reduzindo efetivamente o tamanho do
recipiente em um.
[5] Remove o primeiro elemento no continer return 0;
de lista, efetivamente reduzindo seu }
tamanho em um.
#include<iostream>
#include<list>

using namespace std;

int main()
{
list<char> alfabeto; //Coleo de chars
// Inserindo elementos com valor de 'a' at 'z';
for(char letra='a'; letra !='z'; ++letra)
{
alfabeto.push_back(letra);
}

//iterador que ir atuar sobre todos os elementos de lista


list<char>::iterator pos;

//output dos elementos da lista


for(pos = alfabeto.begin(); pos != alfabeto.end(); ++pos)
{
cout << *pos << ' ';
}
cout << endl;
return 0;

}
O Output do programa
Como esperado, o iterador passa por todos os elementos da lista;
Exerccio 1
Faa um programa que receba uma array do usurio e calcule a mdia dos elementos informados,
usando ponteiros.
Exerccio 2
Faa um programa que pea ao usurio para digitar uma palavra e imprima caractere por caractere
dela (no necessrio fazer o tratamento de caracteres especiais).
Exerccio 3
Faa um programa que pea ao usurio uma palavra e a imprima em ordem inversa.
Exerccio 4
Faa um programa que pea ao usurio uma frase e verifique o nmero de vezes que certa palavra
ocorre nesta frase.
Exerccio 5
Crie um programa que receba nmeros inteiros do usurio at que o nmero 0 seja inserido. Em
seguida, o programa deve imprimir na tela todos os nmeros inseridos em ordem crescente.
Exerccio 6
Desenvolva um programa que solicite strings do usurio at que o usurio pressione ENTER sem
inserir nenhuma string. O programa deve, ento, apresentar a string de maior comprimento
informada.
Exerccio 7
Faa um programa que solicite 10 nmeros inteiros do usurio, e os armazene em uma lista. O
programa deve, ento, remover o terceiro elemento da lista.
Exerccio 2
Faa um programa que pea ao usurio para digitar uma palavra e imprima caractere por caractere
dela (no necessrio fazer o tratamento de caracteres especiais).
Exerccio 3
Faa um programa que pea ao usurio uma palavra e a imprima em ordem inversa.
Exerccio 4
Faa um programa que pea ao usurio uma frase e verifique o nmero de vezes que certa palavra
ocorre nesta frase.

Obs.:Lembre-se que C++ case sensitive.


Gabarito Exerccio 1
Faa um programa que receba uma array do usurio e calcule a mdia dos
elementos informados, usando ponteiros.
#include <iostream>

using namespace std;

int main()
{
const int tam = 5;
double arr[tam], soma = 0, med = 0;

for(int cnt = 0; cnt < tam; cnt++) {


cout<< "Informe o elemento " << cnt << " da array: ";
cin >> *(arr + cnt);
}

for(int cnt = 0; cnt < tam; cnt++) {


soma = soma + *(arr + cnt);
}
med = soma/tam;

cout << "A media e: " << med << endl;

system("Pause");
return 0;
}
Gabarito Exerccio 2
Faa um programa que pea ao usurio para digitar uma palavra e imprima caractere por caractere
dela (no necessrio fazer o tratamento de caracteres especiais).

#include <iostream>
#include <string>

using namespace std;

int main ()
{
setlocale (LC_ALL, "Portuguese");
//pede uma string para o usurio e imprime caractere por caractere da string
string str = "";
cout<<"Insira uma palavra: "<<endl;
cin>>str;
cout<<"A string caractere por caractere : \n";
for ( string::iterator it=str.begin(); it!=str.end(); ++it)
cout << *it<<'\n';

return 0;
}
Gabarito Exerccio 3
Faa um programa que pea ao usurio uma palavra e a imprima em ordem inversa.

#include <iostream>
#include <string>

using namespace std;

int main ()
{
setlocale (LC_ALL, "Portuguese");
//pede uma string para o usurio e imprime ela invertida
string str = "";
cout<<"Insira uma palavra: \n";
cin>>str;
cout<<"A string invertida : \n";
//Bloco de instruo para imprimir os caracteres da string em ordem inversa
for ( string::reverse_iterator rit=str.rbegin(); rit != str.rend(); ++rit){
cout << *rit;
}
cout<<endl;

system("pause");
return 0;
}
Gabarito Exerccio 4
Faa um programa que pea ao usurio uma frase e verifique o nmero de vezes que certa palavra
ocorre nesta frase.
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main ()
{
setlocale (LC_ALL, "Portuguese");
//verifica quantas veze a palavra oi apareceu na frase digitada pelo usurio
string str = "";
string to_find ="br";
int count_founds(0);
cout<<"Insira uma frase para verificar a ocorrncia da palavra: "<<to_find<<endl;
//Funo getline para pegar toda a stream digitada (mesmo que tenha caracteres de trmino , como o espao em branco)
getline(cin,str);

//Bloco de instruo para verificar a ocorrncia da palavra 'br' na string


size_t found = str.find(to_find); //retorna o ndice onde o primeiro 'oi' foi encontrado
while(found != string::npos){
found = str.find(to_find,found +1); //tenta encontrar outro 'br', comeando da posio do primeiro 'oi' +1
count_founds++;
}

cout<<"A palavra "<<to_find <<" apareceu "<<count_founds<<" vezes.\n";

system("pause");
return 0;
}
Gabarito Exerccio 5
Crie um programa que receba nmeros inteiros do usurio at que o nmero 0 seja inserido. Em
seguida, o programa deve imprimir na tela todos os nmeros inseridos em ordem crescente.
#include <iostream>
#include <list>
#include <clocale>

using namespace std;

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

list<int> numeros;
int num;

cout << "Insira numeros!" << endl;


do{
cin >> num;
numeros.push_back(num);
}while(numeros.back() != 0);

numeros.sort();

cout << "A lista ordenada : "<< endl;


for(list<int>::iterator it = numeros.begin(); it != numeros.end(); it++){
cout << *it << endl;
}

return 0;
}
Gabarito Exerccio 6
Desenvolva um programa que solicite strings do usurio at que o usurio pressione ENTER sem
inserir nenhuma string. O programa deve, ento, apresentar a string de maior comprimento
informada.
#include <iostream>
#include <clocale>
#include <string>
#include <list>

using namespace std;

int main(){

size_t tamanho_max(0);
list<string> strings_inseridas;
string inserida, maior;

do{
cout << "Insira uma frase: " << endl;
getline(cin,inserida);
strings_inseridas.push_back(inserida);
}while(strings_inseridas.back() != "");

list<string>::iterator it;
for(it = strings_inseridas.begin(); it != strings_inseridas.end(); it++){
if((*it).size() > tamanho_max){
tamanho_max = it->size();
maior = *it;
}
}

cout << "A maior frase inserida foi: " << maior << endl;

return 0;
}
Gabarito Exerccio 7
Faa um programa que solicite 10 nmeros inteiros do usurio, e os armazene em uma lista. O
programa deve, ento, remover o terceiro elemento da lista.

#include <iostream>
#include <list> for(it; it != it2; ++it){
#include <iterator> if(it == it3) numeros.erase(it);
}

using namespace std; cout << "Os numeros apos remocao sao: " << endl;
for(it = numeros.begin(); it != numeros.end(); ++it){
int main(){ cout << *it << endl;
}
list<int> numeros; return 0;
int num; }

cout << "Insira 10 numeros: " << endl;


for(int cnt = 0; cnt < 10; cnt++){
cin >> num;
numeros.push_back(num);
}

list<int>:: iterator it = numeros.begin();


list<int>:: iterator it2 = numeros.begin(), it3 =
numeros.begin();
advance(it2,3);
advance(it3,2);
Desafio: Conceber um programa que extrai e retorna um link HTML a partir de
linhas de entrada do usurio.
Desafio: Conceber um programa que extrai e retorna um link HTML a partir de
linhas de entrada do usurio.
#include <iostream>
#include <string>
#include <locale.h> else
{
using namespace std; link = linha.substr(comIdx);
}
int main(){
setlocale(LC_ALL,"Portuguese"); if(link != "http:")
{
const string comeco = "http:"; link = string("Link: ") + link;
const string separador = " \"\t\n<>"; cout << "\nResultado:" << endl;
string linha; cout << link << endl << endl;
string link; }
string::size_type comIdx, fimIdx; if (fimIdx != string::npos)
{
comIdx = linha.find(comeco,fimIdx);
while (getline(cin,linha)) }
{ else
bool entrou = false; {
comIdx = linha.find(comeco); comIdx = string::npos;
while(comIdx != string::npos) }
{ }
entrou = true; if(!entrou){
cout << "No Foi Encontrado!" << endl;
fimIdx = linha.find_first_of(separador, }
comIdx); }
if(fimIdx != string::npos) }
{
link = linha.substr(comIdx, fimIdx-
comIdx);
}