Você está na página 1de 4

CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS – CAMPUS NEPOMUCENO

GRADUAÇÃO EM ENGENHARIA ELÉTRICA


LABORATÓRIO DE PROGRAMAÇÃO DE COMPUTADORES II
PROFA. ROSANA MASSAHUD
Exercícios teóricos e práticos sobre ponteiros e alocação de memória em C++
Objetivos: Prática com ponteiros, endereços de memória e referências e alocação dinâmica de memória
com os operadores new e delete

Valor: 30 pontos

Resumo:
O ‘stack’ é a região de memória onde ficam alocadas as variáveis locais dos programas, aquelas
variáveis que são definidas em tempo de compilação, ou seja, estáticas. De modo bem simplificado,
podemos dizer que o que sobrou de memória do sistema é o ‘heap’. É nessa região que iremos alocar
variáveis que são definidas em tempo de execução do programa, ou seja, dinâmicas. Em C++, utilizamos
os operadores new e delete para alocar e desalocar memória do heap.

new : aloca memória dinâmica (do heap)


delete: libera memória do heap
1) O que significa o operador asterisco em cada um dos seguintes casos:
a) int *p;
b) cout << *p;
c) *p = x*5;
d) cout << *(p+1);

2) Explique a diferença entre:


• p++;
• (*p)++;
• *(p++);

3) Sem executar no computador, qual é a saída deste programa?

#include <iostream>
using namespace std;

int main() {
int i=5, *p;
p = &i;
cout << p << '\t'
<< (*p+2) << '\t'
<< **&p<< '\t'
<< (3* *p) << '\t'
<< (**&p+4);
}

4) Qual o erro do trecho de programa a seguir:


{
...
float x = 333.33;
int *p = &x;
cout << *p;
...
}
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS – CAMPUS NEPOMUCENO
GRADUAÇÃO EM ENGENHARIA ELÉTRICA
LABORATÓRIO DE PROGRAMAÇÃO DE COMPUTADORES II
PROFA. ROSANA MASSAHUD
5) Faça um programa em C++ que crie um inteiro dinamicamente. Atribua o valor 10 a esse inteiro.
Imprima o inteiro. Em seguida, em uma estrutura de repetição, incremente de 2 a 2, 5 vezes. Imprima
o valor final após incrementos. Não se esqueça de liberar a memória alocada pelo inteiro no final do
programa.

6) No programa abaixo, o programador:

• Criou a referência v, que será um vetor de n posições;


• Criou e inicializou, com valor do usuário, a variável inteira n;

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main() {
int *v;
int n;
cout << "\n\tInforme o tamanho do vetor: ";
cin >> n;

/*
* continue seu programa aqui...
*/
return 0;
}

No local indicado, complete o código para o programador. Você deve:


• Alocar memória para o vetor v, dinamicamente, com n posições;
• Preencher todo o vetor com números gerados aleatoriamente. Os números aleatórios
devem ter valores entre 30 e 50. Não se esqueça de gerar uma semente aleatória (time)
para a função rand(). Para gerar números aleatórios dentro de uma faixa de valores,
utilize a seguinte fórmula: valor = min + (rand()% (max-min+1))
• Imprimir todo o vetor.
• Liberar a memória alocada pelo vetor no final do programa.

7) Refaça o programa do exercício 6, utilizando funções para preencher e imprimir o vetor. Os protótipos
das funções deverão ser:

void preenche(int *v, int n);

void imprime(const int *v, int n);

Altere a função main para chamar essas novas funções.

8) Refaça o programa do exercício 7. Agora iremos alocar memória para o vetor v utilizando uma
função. Essa nova função deverá ter o seguinte protótipo:
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS – CAMPUS NEPOMUCENO
GRADUAÇÃO EM ENGENHARIA ELÉTRICA
LABORATÓRIO DE PROGRAMAÇÃO DE COMPUTADORES II
PROFA. ROSANA MASSAHUD
int* criaVetor(int n);

/*onde n é o tamanho do vetor que será criado e retornado na função*/

9) Refaça o programa do exercício 8. Agora iremos desalocar memória do vetor v utilizando uma
função. Essa nova função deverá ter o seguinte protótipo:

void desaloca(int* v);

10) Fazer um programa que receba do usuário a quantidade N de números a ser digitada. Em seguida, o
programa deve alocar dinamicamente um vetor de N inteiros, receber N números do usuário e
armazenar no vetor, e mostrar o maior valor do vetor, o menor valor do vetor e a média dos valores.

11) Escreva uma função que recebe uma string de caracteres e uma letra e devolve um vetor de inteiros
contendo as posições (índices no vetor da string) onde a letra foi encontrada) e um inteiro contendo o
tamanho do vetor criado (total de letras iguais encontradas). Utilize o retorno de um vetor para
retornar os índices e um ponteiro para guardar o tamanho do vetor.

Poderíamos resolver esse exercício alocando o vetor de forma estática e escrevendo a função
procuraChar sem retorno (void) e simulando o retorno com uma passagem de parâmetro por
referência do vetor de posições. O protótipo poderia ser o seguinte: void procuraChar(char*
str, char c, int& qtde, int* pos)

Mas, resolva esse exercício escrevendo a função procuraChar devidamente como se pede. O protótipo
deve ser o seguinte:
int* procuraChar(char* str, int tam, char c, int& qtde)

12) Seja o seguinte trecho de programa em C++, que cria um novo tipo de dado (struct) “Livro”. Um
“Livro” para nós será uma “coisa” que tem título, nome do autor, número de páginas e ISBN.

Na função principal temos a variável a do tipo Livro, e uma referência para Livro, b.
Complete o programa alocando dinamicamente memória para b. Atribua valores para cada membro de
dados, para a e b. Imprima os dados para a e b.

#include <iostream> int main(){


using namespace std; Livro a;
Livro *b;
struct Livro{
char titulo[100]; /*complete seu programa aqui*/
char autor[100]; return 0;
int numPaginas; }
int isbn;
};

Obs.: Utilize o operador ponto (.) para acessar membros de dados de variáveis do tipo struct. E o
operador seta (->) para acessar membros de dados de ponteiros para struct.

13) Refaça o programa do exercício 12, mas agora crie uma função para capturar os valores de uma
variável do tipo Livro e uma função que imprima os dados de membros de struct Livro.
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS – CAMPUS NEPOMUCENO
GRADUAÇÃO EM ENGENHARIA ELÉTRICA
LABORATÓRIO DE PROGRAMAÇÃO DE COMPUTADORES II
PROFA. ROSANA MASSAHUD
Possíveis assinaturas das funções:
void cadastro(Livro *livro);
void imprime(const Livro *livro);

Chame as funções para cadastrar e imprimir a e b.

14) Refaça o programa do exercício 13. Agora crie dinamicamente uma lista de Livros:

Livro *biblioteca = new Livro[n];

Crie um menu de opções:

1-Inserir livro na biblioteca


2-Lista toda a coleção
0-Sair

Mantenha as funções cadastro e imprime implementadas no exercício 13.

Implemente a função listaBiblioteca, que deverá percorrer todo o vetor de Livros, imprimindo os
dados para cada Livro. O protótipo deve ser:

void listaBiblioteca(const Livro *v, int p);

Na função principal, implemente os controles necessários para chamar o menu de opções e chamar
as funções adequadamente de acordo com a opção escolhida pelo usuário.

Você também pode gostar