Buscar

Aula Computacao

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 185 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 185 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 185 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Computação
Pedro Henrique González
Centro Federal de Educação Tecnológica Celso Suckow da Fonseca - Unidade Maracanã
Pedro Henrique González (CEFET/RJ) Computação 1 / 185
Planejamento
1 Organização do Curso
Objetivos
Ementa
Bibliografia
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 2 / 185
Planejamento
1 Organização do Curso
Objetivos
Ementa
Bibliografia
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 3 / 185
Objetivos
Capacitar o aluno a desenvolver programas computacionais utilizando uma linguagem de
programação de alto nível (C,C++) na solução de problemas práticos.
Pedro Henrique González (CEFET/RJ) Computação 4 / 185
Planejamento
1 Organização do Curso
Objetivos
Ementa
Bibliografia
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 5 / 185
Ementa
1 Conceitos básicos de solução de problemas.
2 Construção de algoritmos.
3 Estruturas de controle em algoritmos.
4 Variável Composta Homogênea.
5 Sub-rotinas.
6 Variável Composta Heterogênea.
Pedro Henrique González (CEFET/RJ) Computação 6 / 185
Planejamento
1 Organização do Curso
Objetivos
Ementa
Bibliografia
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 7 / 185
Bibliografia
Bibliografia:
1 ASCENCIO, A. F. G. e CAMPOS, E. A V., Fundamentos da Programação de
Computadores - algoritmos, Pascal, C/C++ e Java. São Paulo: Pearson Education –
Prentice Hall.
2 PSCHILDT, H., C Completo e Total. São Paulo: Pearson Education – Makron Books.
Bibliografia Complementar:
1 SZWARCFITER, J. L.; MARKENZON, L. Estrutura de dados e seus algoritmos. Rio de
Janeiro: LTC, 2010.
2 CORMEN, T. H.; MATOS, J. P. Algoritmos: teoria e prática. Rio de Janeiro: Campus,
2002. 916p.
3 DEITEL, P.; DEITEL, H. C++ How to program. Pearson Education – Prentice Hall,
2014. 1028p.
4 MEYERS, S. Effective C++. Addison-Wesley, 2013. 297p.
Pedro Henrique González (CEFET/RJ) Computação 8 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
Maquina Digital
Comunicação com o Computador
Ciclo de Desenvolvimento
Conceitos básicos de solução de
problemas
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 9 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
Maquina Digital
Comunicação com o Computador
Ciclo de Desenvolvimento
Conceitos básicos de solução de
problemas
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 10 / 185
Modelo de um Computador
Pedro Henrique González (CEFET/RJ) Computação 11 / 185
CPU - Unidade Central de Processamento
Principal componente de um computador digital.
Localiza e executa as instruções de um programa.
Capaz de executar operações simples com grande rapidez.
Pedro Henrique González (CEFET/RJ) Computação 12 / 185
Memória
Memória volátil usada para armazenar dados e programas.
Conteúdo modificável pelas instruções dos programas.
Permite acesso aleatório.
Pedro Henrique González (CEFET/RJ) Computação 13 / 185
Disco Rígido (HD)
Um dos dispositivos não-voláteis mais usados para o armazenamento de grandes volumes
de dados.
Utiliza superfícies magnetizáveis para armazenar as informações
Permite acesso randômico aos dados armazenados.
Pedro Henrique González (CEFET/RJ) Computação 14 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
Maquina Digital
Comunicação com o Computador
Ciclo de Desenvolvimento
Conceitos básicos de solução de
problemas
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 15 / 185
Como um computador se comunica ?
Toda comunicação com o computador → Linguagem de Máquina
Definição
Um programa em código de máquina consiste de uma sequência de números que significam uma
sequência de instruções a serem executadas.
Pedro Henrique González (CEFET/RJ) Computação 16 / 185
Linguagens de Alto Nível
Programar em linguagem de máquina é uma tarefa entediante e propensa a erros.
A partir de meados dos anos 50 várias linguagens de alto nível foram criadas.
Tais linguagens possuem nível de abstração relativamente elevados.
Elas são mais próximas das linguagens utilizadas pelos seres humanos.
Pedro Henrique González (CEFET/RJ) Computação 17 / 185
Exemplo de Linguagens de Alto Nível
ASP
C/C++
Fortran
Pascal/Object Pascal
Java
Python
Ruby
Pedro Henrique González (CEFET/RJ) Computação 18 / 185
Exemplo de um código em C
int main(void)
{
int a = 3, b = 7, c;
c=a+b;
if(c%2==0)
printf("o␣resultado␣e␣par\n");
else
printf("o␣resultado␣e␣impar\n");
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 19 / 185
Compilação
Programas escritos em linguagens de alto nível não são executados diretamente pelo
processador.
Antes de executá-lo é preciso traduzir os comandos de alto-nível para instruções de
máquina.
Esta tarefa (compilação) é realizada por um programa chamado de compilador.
Pedro Henrique González (CEFET/RJ) Computação 20 / 185
Estágios de Compilação
Pedro Henrique González (CEFET/RJ) Computação 21 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
Maquina Digital
Comunicação com o Computador
Ciclo de Desenvolvimento
Conceitos básicos de solução de
problemas
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 22 / 185
Ciclo de Desenvolvimento
Pedro Henrique González (CEFET/RJ) Computação 23 / 185
Ciclo de Desenvolvimento
Escolha da linguagem de programação depende da aplicação que será desenvolvida.
Nesta disciplina, a escolha da linguagem C/C++ está relacionada a:
eficiência;
facilidade de uso;
base para muitas outras linguagens;
sua utilização em larga escala na atualidade.
Pedro Henrique González (CEFET/RJ) Computação 24 / 185
Ciclo de Desenvolvimento
Um programa escrito em C/C++ deve respeitar a sintaxe da linguagem.
Um computador não é capaz de executar uma sequência de instruções escritas em
C/C++ ou em qualquer outra linguagem de alto nível;
Para executar um programa em C/C++, antes é necessário converter o programa em
C/C++ para um programa em linguagem de máquina:
processo chamado de COMPILAÇÃO;
Pedro Henrique González (CEFET/RJ) Computação 25 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
Maquina Digital
Comunicação com o Computador
Ciclo de Desenvolvimento
Conceitos básicos de solução de
problemas
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 26 / 185
Como descrever um problema ?
Andando pelo campus do CEFET-RJ e após quase tropeçar em gatos e levarum susto
com o vôo de um pombo, alguém lhe pergunta:
Como faço para ir ao centro da cidade ?
o que você responde ?
Pedro Henrique González (CEFET/RJ) Computação 27 / 185
Como descrever um problema ?
Na pergunta anterior é fácil observar que faltam detalhes para a resposta ser mais correta
ou eficiente:
meio de transporte
envolve tempo e dinheiro
endereço específico
quando
envolve trajeto devido a engarrafamento
número de pessoas
Quanto mais conhecermos as reais necessidades de quem perguntou, melhor seremos
capazes de responder a pergunta eficientemente.
Pedro Henrique González (CEFET/RJ) Computação 28 / 185
Processo para resolução de um problema
Objetivo: encontrar uma sequência de passos que permitam que o problema possa ser
resolvido de maneira automática e repetitiva.
Detalhamento do problema.
Perfeita compreensão do problema.
Definir quais são os dados de entrada.
Definir o que é uma solução:
clara
não ambígua
sequencial
Definir o formato da saída.
Linguagem utilizada na solução deve ser compreendida pelo executor da solução.
Atores envolvidos:
criador da solução (programador)
executor da solução (computador)
usuário da solução (aluno do curso, no nosso caso)
Pedro Henrique González (CEFET/RJ) Computação 29 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
Variáveis
Estruturas de Entrada e Saída de Dados
Operadores Aritméticos
Exercicios de Fixação
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 30 / 185
O que é algoritmo ?
Definição (Matemática)
Sequência finita de regras, raciocínios ou operações que, aplicada a um número finito de dados,
permite solucionar classes semelhantes de problemas.
Definição (Informática)
Conjunto das regras e procedimentos lógicos perfeitamente definidos que levam à solução de um
problema em um número finito de etapas.
Pedro Henrique González (CEFET/RJ) Computação 31 / 185
Elementos Básicos de um Algoritmo
São elas:
Variáveis;
Estruturas de Entrada e Saída de Dados;
Operadores Aritméticos;
Pedro Henrique González (CEFET/RJ) Computação 32 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
Variáveis
Estruturas de Entrada e Saída de Dados
Operadores Aritméticos
Exercicios de Fixação
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 33 / 185
Variáveis
Observação 1: As variáveis podem ter nomes diversos, desde símbolos comuns na matemática,
como é o caso das variáveis x, y, z e etc, até nomes como var, endereco, cpf, etc.
Observação 2: Perceba também que os valores que as variáveis podem armazenar não se
limitam apenas a valores numéricos inteiros. Elas podem armazenar, por exemplo, um conjunto
de caracteres, como é o caso da variável b, e valores fracionários, como é o caso das variáveis y,
d e var.
Pedro Henrique González (CEFET/RJ) Computação 34 / 185
Variáveis - Tipos
1 Inteiro
2 Inteiro (Sem sinal)
3 Real
4 Real (Sem sinal)
5 Booleano (Verdadeiro ou Falso)
6 Caractere
Pedro Henrique González (CEFET/RJ) Computação 35 / 185
Variáveis - Tipos - C/C++
Sequência Bytes ocupados Faixa (ou intervalo)
short int
2 -32.768 a 32.767
signed int
signed short int
wchat_t
signed wchar_t
unsigned short int 2 0 a 65.535unsigned wchar_t
int
4 -2.147.483.648 até 2.147.483.647long int
signed long int
unsigned int 4 0 a 4.294.967.295unsigned long int
char 1 -128 a 127signed char
unsigned char 1 0 a 255
bool 1 true ou false
float 4 1,2e-38 a 3,4e+38
double 8 2,2e-308 a 1,8e+308long float
Pedro Henrique González (CEFET/RJ) Computação 36 / 185
Variáveis - Tipos - C/C++
Um exemplo de como criar e atribuir um valor a constantes variáveis:
int main (){
int a;
a = 10;
double b = 5.4;
double c = 12.0;
bool aula_ta_boa = true;
char nome = ’P’;
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 37 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
Variáveis
Estruturas de Entrada e Saída de Dados
Operadores Aritméticos
Exercicios de Fixação
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 38 / 185
Estruturas de Entrada e Saída de Dados
Os mecanismos que as linguagens de programação oferecem para interação com o usuário estão
presentes em suas bibliotecas de entrada e saída.
Pedro Henrique González (CEFET/RJ) Computação 39 / 185
Estruturas de Entrada e Saída de Dados
Em C, as funções responsáveis pelas operações básicas de entrada e saída se encontram na
biblioteca stdio, que é utilizada por meio da diretiva:
#include <stdio.h>
Pedro Henrique González (CEFET/RJ) Computação 40 / 185
Estruturas de Entrada e Saída de Dados
Mais especificamente, utilizamos as funções scanf(.) para entrar um dado e o printf(.) para
imprimir o dado na tela, conforme o exemplo a seguir:
#include <stdio.h>
int main (){
int idade;
float altura;
printf("Informe␣sua␣idade:␣");
scanf("%d", &idade)
printf("Informe␣sua␣altura:␣");
scanf("%f", &altura );
printf("\n%d␣anos␣e␣%.2f␣de␣altura.", idade , altura );
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 41 / 185
Estruturas de Entrada e Saída de Dados
Já em C++, as funções responsáveis pelas operações básicas de entrada e saída se encontram
na biblioteca iostream, que é utilizada por meio das diretivas:
#include <iostream >
using namespace std;
Pedro Henrique González (CEFET/RJ) Computação 42 / 185
Estruturas de Entrada e Saída de Dados
Mais específicamente, utilzamos os operadores cin para entrar um dado e o cout para imprimir o
dado na tela.
#include <iostream >
using namespace std;
int main() {
int idade;
float altura;
cout <<"Informe␣sua␣idade:␣"<<endl;
cin >>idade;
cout <<"Informe␣sua␣altura:␣"<<endl;
cin >>altura;
cout <<idade <<"anos␣e␣"<<altura <<"␣de␣altura."<<endl;
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 43 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
Variáveis
Estruturas de Entrada e Saída de Dados
Operadores Aritméticos
Exercicios de Fixação
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 44 / 185
Operadores Aritméticos
Operador Operação
+ Adição
− Subtração
∗ Multiplicação
/ Divisão
% Resto da Divisão
Pedro Henrique González (CEFET/RJ) Computação 45 / 185
O que aprendemos até agora ? - Nosso primeiro algoritmo!
#include <iostream >
using namespace std;
int main ()
{
int a, b;
int result;
a = 5;
b = 2;
a = a + 1;
result = a - b;
cout << result;
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 46 / 185
Mas e agora ?
Como convertemos o código em linguagem de alto nível para que a máquina entenda ?
Primeiramente abrimos o terminal e vamos até o diretório onde se encontrar o código que
escrevemos.
Definição (Se usarmos apenas ferramentas do C:)
gcc nome-do-seu-arquivo.c -o nome-do-programa
Definição (Se usarmos apenas ferramentas do C++:)
g++ nome-do-seu-arquivo.cpp -o nome-do-programa
Pedro Henrique González (CEFET/RJ) Computação 47 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
Variáveis
Estruturas de Entrada e Saída de Dados
Operadores Aritméticos
Exercicios de Fixação
4 Introdução a Funções
5 Estruturas de Controle
6 VariávelComposta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 48 / 185
Exercicios de Fixação
1 Escreva um programa em C++ que imprima na tela:
"Hello Sun", usando a biblioteca iostream
"Hello Moon", usando a biblioteca stdio
2 Escreva um programa em C/C++ que calcule a média entre 2 números e imprima este
resultado na tela.
3 Escreva um programa em C/C++ que calcule a média entre 5 números e imprima este
resultado na tela.
4 Escreva um programa em C/C++ que calcule a média entre 10 números e imprima este
resultado na tela.
5 Modifique os programas 2,3 e 4, para que os números sejam atribuídos pelo usuário
durante a execução do programa.
6 Escreva um programa em C/C++ que dado um gasto e duas pessoas com salários
diferentes, o programa imprima na tela a divisão proporcional do gasto de cada uma das
duas pessoas.
Pedro Henrique González (CEFET/RJ) Computação 49 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
Parâmetros
O Comando return
O Tipo void
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 50 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
Parâmetros
O Comando return
O Tipo void
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 51 / 185
Funções
Funções são as estruturas que permitem ao usuário separar seus programas em blocos.
Se não tivéssemos funções, os programas teriam que ser curtos e de pequena complexidade.
Para fazermos programas grandes e complexos, temos de construí-los bloco a bloco.
Pedro Henrique González (CEFET/RJ) Computação 52 / 185
Comentários Gerais
Uma função é um bloco de construção muito útil. No C++ as funções são flexíveis, mas a
flexibilidade dá poder e exige cuidado.
Se houver uma rotina que deve ser o mais veloz possível, seria bom implementá-la sem
nenhuma (ou com o mínimo de) chamadas a funções, porque uma chamada a uma função
consome tempo e memória.
Funções devem ser implementadas da maneira mais geral possível. Isto as torna mais fáceis
de serem reutilizadas e entendidas. Evite, sempre que possível, funções que usem variáveis
globais.
Pedro Henrique González (CEFET/RJ) Computação 53 / 185
Forma Geral De Uma Função
Uma função no C++ tem a seguinte forma geral:
tipo_de_retorno nome_da_função (declaração_de_parâmetros)
{
corpo_da_função
}
O tipo_de_retorno é o tipo de variável que a função vai retornar. O default é o tipo int,
ou seja, uma função para qual não declaramos o tipo de retorno é considerada como retornando
um inteiro.
O corpo da função é a sua alma. É nele que as entradas são processadas, saídas são
geradas ou outras operações são feitas.
Pedro Henrique González (CEFET/RJ) Computação 54 / 185
Declaração De Parâmetros
A declaração de parâmetros é uma lista com a seguinte forma geral:
tipo nome1, tipo nome2, . . . , tipo nomeN
Repare que o tipo deve ser especificado para cada uma das N variáveis de entrada.
É na declaração de parâmetros que informamos ao compilador quais serão as entradas da
função.
Pedro Henrique González (CEFET/RJ) Computação 55 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
Parâmetros
O Comando return
O Tipo void
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 56 / 185
O Comando return
O comando return tem a seguinte forma geral:
return (valor_de_retorno); ou return;
Digamos que uma função está sendo executada. Quando se chega a uma declaração return
a função é encerrada imediatamente e, se o valor de retorno é informado, a função retorna este
valor.
Pedro Henrique González (CEFET/RJ) Computação 57 / 185
O Comando return
É importante lembrar que o valor de retorno fornecido tem que ser compatível com o tipo
de retorno declarado para a função.
Uma função pode ter mais de uma declaração return. Isto se torna claro quando pensamos
que a função é terminada quando o programa chega à primeira declaração return.
Pedro Henrique González (CEFET/RJ) Computação 58 / 185
Retorno Da Função
É importante notar que, como as funções retornam valores, podemos aproveitá-los para
fazer atribuições, ou mesmo para que estes valores participem de expressões. Mas não podemos
fazer:
func(a,b) = x; /* Errado! */
No segundo exemplo, vemos o uso de mais de um return em uma função.
Fato importante: se uma função retorna um valor, você não precisa aproveitar este valor.
Se você não fizer nada com o valor de retorno de uma função, ele será descartado. Por exemplo,
a função printf() retorna um inteiro que nós nunca usamos para nada. Ele é descartado.
Pedro Henrique González (CEFET/RJ) Computação 59 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
Parâmetros
O Comando return
O Tipo void
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 60 / 185
O Tipo void
Agora vamos ver o único tipo da linguagem C++ que não detalhamos ainda: o void.
Em inglês, void quer dizer vazio e é isto mesmo que o void é. Ele nos permite fazer funções
que não retornam nada e funções que não têm parâmetros.
Podemos agora escrever o protótipo de uma função que não retorna nada:
void nome_da_função (declaração_de_parâmetros);
Pedro Henrique González (CEFET/RJ) Computação 61 / 185
Parâmetros E Retornos De Uma Função
Numa função, como a acima, não temos valor de retorno na declaração return. Aliás, neste
caso, o comando return não é necessário na função.
Podemos, também, fazer funções que não têm parâmetros:
tipo_de_retorno nome_da_função (void);
ou, ainda, que não tem parâmetros e não retornam nada:
void nome_da_função (void);
Pedro Henrique González (CEFET/RJ) Computação 62 / 185
Retorno Da Função main
Se quisermos que a função retorne algo, devemos usar a declaração return. Se não
quisermos, basta declarar a função como tendo tipo_de_retorno void.
Devemos lembrar agora que a função main() é uma função e como tal devemos tratá-la. O
compilador acha que a função main() deve retornar um inteiro. Isto pode ser interessante se
quisermos que o sistema operacional receba um valor de retorno da função main().
Se assim o quisermos, devemos nos lembrar da seguinte convenção: se o programa retornar
zero, significa que ele terminou normalmente, e, se o programa retornar um valor diferente de
zero, significa que o programa teve um término anormal. Se não estivermos interessados neste
tipo de informação, basta declarar a função main() como retornando void.
Pedro Henrique González (CEFET/RJ) Computação 63 / 185
Retorno Da Função main
As duas funções main() abaixo são válidas:
main (void) void main (void)
{ {
. . . . . .
return ); }
}
A primeira forma é válida porque, como já vimos, as funções em C++ têm, por padrão,
retorno inteiro. Alguns compiladores reclamarão da segunda forma de main(), dizendo que
main() sempre deve retornar um inteiro. Se isto acontecer com o compilador que você está
utilizando, basta fazer main() retornar um inteiro.
Pedro Henrique González (CEFET/RJ) Computação 64 / 185
Comentários Gerais
Como já sabemos um bocado a respeito de funções, quando aprendermos outras funções
das bibliotecas do C++, vamos ver, em primeiro lugar, o seu protótipo.
Quem entendeu tudo que foi ensinado nesta parte sobre funções pode retirar inúmeras
informações de um protótipo (tipode retorno, nome da função, tipo dos argumentos, passagem
por valor ou passagem por referência).
Pedro Henrique González (CEFET/RJ) Computação 65 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
Estruturas de Desvio Condicional
Estruturas de Desvio Incondicional
Estruturas de Repetição Simples
Estruturas de Repetição Condicional
Desvios Incondicionais
Exercícios de Fixação
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 66 / 185
Estruturas de Controle
As LPs geralmente possuem as seguintes estruturas de controle de fluxo:
1 Estruturas de desvio de fluxo: desvia o fluxo e quebra a estrutura sequencial. Pode ser
condicional ou incondicional. Em C/C++ temos:
Estruturas de desvio condicional: if e switch.
Estruturas de desvio incondicional: goto
2 Estruturas de repetição simples: repete um ou mais comandos em laços ou loops um
número fixo de vezes. Em C/C++, temos a diretiva for.
3 Estruturas de repetição condicional: semelhante à repetição simples, mas um número
indefinido de vezes, associada a uma condição. Em C/C++ temos while e do while;
4 Desvios Incondicionais: servem para pular alguma parte do código. Em C/C++ temos
break e continue.
Pedro Henrique González (CEFET/RJ) Computação 67 / 185
Estruturas de Controle
5 Mecanismos de modularização:
Divisão de um programa em funções e procedimentos(ou métodos);
O fluxo é desviado de uma função para outra.
6 Tratamento de exceções:
Quando um erro ocorre, desvia o fluxo para o código de tratamento do
erro (exceção);
Ambos serão discutidos em maior profundidade posteriormente!
Pedro Henrique González (CEFET/RJ) Computação 68 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
Estruturas de Desvio Condicional
Estruturas de Desvio Incondicional
Estruturas de Repetição Simples
Estruturas de Repetição Condicional
Desvios Incondicionais
Exercícios de Fixação
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 69 / 185
Estruturas de Desvio de Fluxo - Condicionais
Veremos agora as estruturas de desvio de fluxo condicionais.
if..elseif..else
switch
Pedro Henrique González (CEFET/RJ) Computação 70 / 185
Estruturas de Desvio de Fluxo - Condicionais
Existem 3 maneiras classicas de se usar if:
if(<condicao >) {
[diretiva1 ];
}
if(<condicao >) {
[diretiva1 ];
}else{
[diretiva2 ];
}
if(<condicao1 >) {
[diretiva1 ];
}else if(<condicao2 >){
[diretiva2 ];
.
.
.
}else if(<condicaoN >){
[diretivaN ];
}else{
[diretivaN +1];
}
Pedro Henrique González (CEFET/RJ) Computação 71 / 185
Estruturas de Desvio de Fluxo - Condicionais
Podemos criar também condições mistas usando os operadores &&(e) e ||(ou):
if (<condicao1 > && <condicao2 > ) {
[diretiva1 ];
} else if ( <condicao3 > || <condicao4 > ) {
[diretiva2 ];
} else {
[diretiva3 ];
}
Pedro Henrique González (CEFET/RJ) Computação 72 / 185
Estruturas de Desvio de Fluxo - Condicionais
Os operadores de comparação disponíveis em C++ são:
> Maior que 5 > 4 verdadeiro
< Menor que 4 < 5 verdadeiro
>= Maior que ou igual 4 >= 4 verdadeiro
<= Menor que ou igual 6 <= 4 falso
== Igual a 5 == 5 verdadeiro
!= Diferente de 4 != 4 falso
Pedro Henrique González (CEFET/RJ) Computação 73 / 185
Estruturas de Desvio de Fluxo - Condicionais
#include <iostream >
using namespace std;
int main()
{
int idade;
cout <<"Entre␣a␣sua␣idade:␣";
cin >> idade;
if ( idade < 18 ) {
cout <<"voce␣e␣muito␣nova(o)!"<<endl;
}
else if ( idade == 18 ) {
cout <<"Ja␣e␣maior␣de␣idade!"<<endl;
}
else if ( idade > 18 && idade < 23 ) { {
cout <<"Tomara␣que␣nao␣pegue␣greve␣na␣faculdade"<<endl;
}else{
cout <<"Agora␣que␣acabou␣a␣faculdade ,␣arrume␣um␣emprego"<<endl;
}
}
Pedro Henrique González (CEFET/RJ) Computação 74 / 185
Estruturas de Desvio de Fluxo - Condicionais
Ao usar o switch, temos:
case
default
Pedro Henrique González (CEFET/RJ) Computação 75 / 185
Estruturas de Desvio de Fluxo - Condicionais
switch ([ e x p r e s s o ordinal ou string ]) {
case <condicao1 > :
[diretiva1 ];
break;
case <condicao2 > :
[diretiva2 ];
break;
.
.
.
case <condicaoN > :
[diretivaN ];
break;
default :
[diretivaN +1];
}
Pedro Henrique González (CEFET/RJ) Computação 76 / 185
Estruturas de Desvio de Fluxo - Condicionais
#include <iostream >
using namespace std;
int main (){
char grade;
cout <<"Digite␣sua␣nota:␣";
cin >>grade;
cout <<endl;
switch(grade) {
case ’A’ :
cout << "Excelente!" << endl;
break;
case ’B’ :
case ’C’ :
cout << "Muito␣Bom" << endl;
break;
case ’D’ :
cout << "Voce␣Passou" << endl;
break;
case ’F’ :
cout << "Tente␣novamente" << endl;
break;
default :
cout << "Nota␣invalida" << endl;
}
cout << "Sua␣nota␣e␣" << grade << endl;
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 77 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
Estruturas de Desvio Condicional
Estruturas de Desvio Incondicional
Estruturas de Repetição Simples
Estruturas de Repetição Condicional
Desvios Incondicionais
Exercícios de Fixação
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 78 / 185
Estruturas de Desvio de Fluxo - Incondicionais
Para usarmos a estrutura de controle goto precisamos definir a priori marcações no código de
modo a fazer com que o compilador as identifique
Pedro Henrique González (CEFET/RJ) Computação 79 / 185
Estruturas de Desvio de Fluxo - Incondicionais
#include <iostream >
using namespace std;
int main () {
int a;
cout <<"Digite␣um␣valor␣entre␣0␣e␣100:␣";
cin >>a;
cout <<endl;
if(a <50){
goto FIM;
}else{
goto PRINT;
}
PRINT:cout << "O␣valor␣a:␣" << a << endl;
FIM:return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 80 / 185
Estruturas de Desvio de Fluxo - Incondicionais
#include <iostream >
using namespace std;
int main () {
int a;
cout <<"Digite␣um␣valor␣entre␣0␣e␣100:␣";
cin >>a;
cout <<endl;
if(a <50){
goto FIM;
}
cout << "O␣valor␣a:␣" << a << endl;
FIM:return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 81 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
Estruturas de Desvio Condicional
Estruturas de Desvio Incondicional
Estruturas de Repetição Simples
Estruturas de Repetição Condicional
Desvios Incondicionais
Exercícios de Fixação
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 82 / 185
Estruturas de Repetição Simples
Veremos agora a estrutura de repetição simples for
Pedro Henrique González (CEFET/RJ) Computação 83 / 185
Estruturas de Repetição Simples
Repetição de um trecho de código;
Número fixo de repetições (sabemos de antemão quantas vezes o trecho será repetido);
for([ inicio ]; [condicao ]; [inc/dec ]){
[diretiva]
}
[inc/dec]: diretiva executada após cada iteração do laço (geralmente usada para incrementar ou
decrementar o contador);
Pedro Henrique González (CEFET/RJ) Computação 84 / 185
Estruturas de Repetição Simples
#include <iostream >
using namespace std;
int main()
{
for (int n=10; n>0; n--) {
cout << n << ",␣";
}
cout << endl;
cout << "Feliz␣Ano␣Novo!"<<endl;
for (int n=0; n<10; n++) {
cout << n+1 << ",␣";
}
cout << endl;
cout << "Eu␣sei␣contar␣ate␣10!"<<endl;return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 85 / 185
Estruturas de Repetição Simples
Podemos efetuar múltiplas diretivas na inicialização e no incremento, se necessário, separando
com vírgulas:
#include <iostream >
using namespace std;
int main ()
{
for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
cout <<"i=␣"<<i<<"␣j=␣"<<j<<endl;
}
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 86 / 185
Estruturas de Repetição Simples
Claro que também podemos ter condicionais grandes (usando operadores lógicos):
#include <iostream >
using namespace std;
int main ()
{
bool achou = false;
for(int i = 0; (i < 5) && (! achou); i++) {
/* ... */
}
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 87 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
Estruturas de Desvio Condicional
Estruturas de Desvio Incondicional
Estruturas de Repetição Simples
Estruturas de Repetição Condicional
Desvios Incondicionais
Exercícios de Fixação
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 88 / 185
Estruturas de repetição condicional
Veremos agora as estruturas de repetição condicional, que como o nome diz, tem por objetivo a
repetição de um trecho de código;
No caso de repetição condicional o número de repetições é indeterminado, depende de uma
condição (expressão lógica);
As PPs C/C++ dispõe das diretivas:
while
do while
Pedro Henrique González (CEFET/RJ) Computação 89 / 185
Estruturas de repetição condicional
As estruturas do while e do do while são:
while ([ condicao ]){
[diretiva ];
}
do{
[diretiva ];
}while([ condicao ])
Pedro Henrique González (CEFET/RJ) Computação 90 / 185
Estruturas de repetição condicional
Observações:
while avalia a condição antes da diretiva, podendo nunca executá-la;
do while só avalia depois, certamente executando a diretiva ao menos uma vez;
O programador deve garantir que a condição se torna falsa em algum momento na
diretiva, do contrário poderá gerar um loop infinito.
Pedro Henrique González (CEFET/RJ) Computação 91 / 185
Estruturas de repetição condicional
As estruturas do while e do do while são:
i = 0, j = 10;
while(i <= j){
cout <<i<<"␣"<<j<<endl;
i++;
j--;
}
// Executara ao menos 1 vez!
i = 0, j = 10;
do{
cout <<i<<"␣"<<j<<endl;
i++;
j--;
}
while(i <= j);
// Podemos fazer um for equivalente!
for (i = 0, j = 10; i <= j; i++, j--) {
cout <<i<<"␣"<<j<<endl;
}
Pedro Henrique González (CEFET/RJ) Computação 92 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
Estruturas de Desvio Condicional
Estruturas de Desvio Incondicional
Estruturas de Repetição Simples
Estruturas de Repetição Condicional
Desvios Incondicionais
Exercícios de Fixação
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 93 / 185
Desvios incondicionais
C/C++ possui dois casos de desvios incondicionais: break e continue;
Estes podem ser usados dentro de laços ou dentro da estrutura switch (como já vimos):
break sai da estrutura (laço ou switch);
continue vai para a próxima iteração (somente em laços).
Pedro Henrique González (CEFET/RJ) Computação 94 / 185
Desvios incondicionais
Exemplos do uso de break e continue podem ser vistos a seguir:
int ano = 2017;
while(ano < 2020){
saldo = (saldo + salario) * (1+ juros );
if(saldo >= saldoLimite) break;
ano ++;
}
for (i = 0; i < 100; i++){
if(i%9 == 0){ continue; }
cout <<i<<endl;
}
Pedro Henrique González (CEFET/RJ) Computação 95 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
Estruturas de Desvio Condicional
Estruturas de Desvio Incondicional
Estruturas de Repetição Simples
Estruturas de Repetição Condicional
Desvios Incondicionais
Exercícios de Fixação
6 Variável Composta Homogênea
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 96 / 185
Exercícios de Fixação
A partir deste momentos vocês já possuem o conteúdo necessário para fazer as listas 1 à 5! As
lista se encontram na página da disciplina no moodle
Pedro Henrique González (CEFET/RJ) Computação 97 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
Vetor
Vetor Multidimensional
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 98 / 185
Motivação
Faça um programa que leia as notas dos alunos de uma turma de 5 alunos, determine e mostre
a média aritmética das notas, e o número de alunos com notas inferiores à média.
Pedro Henrique González (CEFET/RJ) Computação 99 / 185
Motivação
#include <iostream >
using namespace std;
int main()
{
double nota;
double soma = 0.0;
for(int i=0; i < 5; i++)
{
cout <<"Entre␣com␣a␣nota␣"<<i+1<<endl;
cin >>nota;
soma = soma + nota;
}
double media = soma /5;
cout <<" M d i a :␣"<<media <<endl;
//e agora ... como acessar as notas j digitadas ?
return 0;
}Pedro Henrique González (CEFET/RJ) Computação 100 / 185
Motivação
1 Este programa utiliza uma única variável para armazenar a nota digitada pelo usuário.
2 Toda vez que o usuário digita uma nova nota, o valor anteriormente digitado é perdido.
3 Após ler todas as notas e calcula a média, não é mais possível comparar cada nota com a
média.
4 Solução? Usar uma variável diferente para armazenar cada nota.
Pedro Henrique González (CEFET/RJ) Computação 101 / 185
Motivação
#include <iostream >
using namespace std;
int main()
{
double n1, n2, n3 , n4 , n5;
cout <<"Entre␣a␣nota␣1:"<<endl;
cin >>n1;
cout <<"Entre␣a␣nota␣2:"<<endl;
cin >>n2;
cout <<"Entre␣a␣nota␣3:"<<endl;
cin >>n3;
cout <<"Entre␣a␣nota␣4:"<<endl;
cin >>n4;
cout <<"Entre␣a␣nota␣5:"<<endl;
cin >>n5;
double media = (n1+n2+n3+n4+n5) / 5;
cout <<"A␣media:␣"<<media <<endl;
int cont = 0;
if(n1 <media) cont ++;
if(n2 <media) cont ++;
if(n3 <media) cont ++;
if(n4 <media) cont ++;
if(n5 <media) cont ++;
cout <<"Abaixo␣da␣media:␣"<<cont <<endl;
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 102 / 185
Motivação
1 O problema foi resolvido.
2 Porém o fato de usarmos uma variável diferente para cada nota impossibilita o uso de
comando de repetição.
3 Assim foi necessário escrever cin 5 vezes, e if 5 vezes.
Pedro Henrique González (CEFET/RJ) Computação 103 / 185
Motivação
1 Estenda o problema para trabalhar com uma turma de 100 alunos.
1 É possível, porém esta será uma tarefa enfadonha e sujeita a erros, pois
serão necessários:
1 100 variáveis distintas, cada uma com um nome diferente
2 100 comandos cin
3 100 comandos if
2 Pergunta: Existe outra maneira de trabalhar com as 100 variáveis sem usar 100 nomes
diferentes?
3 Resposta: Sim, utilizando vetor.
Pedro Henrique González (CEFET/RJ) Computação 104 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
Vetor
Declaração de uma variável vetor
Acessando elementos de um vetor
Uso de constantes com vetores
Inicialização de vetores
Vetor Multidimensional
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 105 / 185
Vetor
Vetor é uma variável composta homogênea unidimensional.
Um vetor é formado por uma sequência de variáveis, todas do mesmo tipo de dadosDizemos que cada variável componente é um elemento do vetor.
As variáveis que compõem um vetor são todas identificadas por um mesmo nome.
Estas variáveis são alocadas sequencialmente na memória
Pedro Henrique González (CEFET/RJ) Computação 106 / 185
Declaração de uma variável vetor
tipo identificador [tamanho ];
Primeiro, o tipo de dado dos componentes do vetor: int, float, double, char, ... .
Segundo, o identificador da variável vetor: usando as mesmas convenções de um
identificador comum.
Por fim, o tamanho do vetor (isto é, a quantidade de elementos que formam o vetor)
escrito entre colchetes: [5], [10], [3], ...
Pedro Henrique González (CEFET/RJ) Computação 107 / 185
Exemplos
int vet [6]; // um vetor de 6 inteiros
double notas [100]; // um vetor de 100 doubles
char texto [256]; // um vetor de 256 caracteres
double medias [2*n]; // um vetor de 2*n doubles
Pedro Henrique González (CEFET/RJ) Computação 108 / 185
Declaração de uma variável vetor
Todo vetor ocupa espaços lineares na memória dividido em várias variáveis componentes,
de acordo com o tamanho declarado
Ao declararmos
int vet [4];
é alocado na memória um espaço linear para 4 variáveis inteiras, representadas da seguinte
forma:
Assim, vet é uma variável vetor formada por 4 espaços de memória.
Pedro Henrique González (CEFET/RJ) Computação 109 / 185
Acessando elementos de um vetor
Os componentes de um vetor são numerados sequencialmente começando com zero.
Para identificar cada componente usamos o nome do vetor juntamente com o número que
indica a posição do componente na sequência.
a posição de um componente é chamada de índice
Exemplo:
int Notas [10];
Pedro Henrique González (CEFET/RJ) Computação 110 / 185
Acessando elementos de um vetor
Sintaxe: vetor[índice]
Primeiramente escreve-se o vetor;
Depois escreve-se o índice (uma expressão inteira) entre colchetes
Pedro Henrique González (CEFET/RJ) Computação 111 / 185
Acessando elementos de um vetor
Exemplo:
double Notas [10];
Notas [1] = 9.35;
cin >>Notas [1];
Notas[1] refere-se ao componente na posição 1 do vetor Notas, ou seja, o segundo elemento do
vetor.
Pedro Henrique González (CEFET/RJ) Computação 112 / 185
Acessando elementos de um vetor
Uma vez que as variáveis que compõem o vetor têm o mesmo nome, o que distingue cada
uma delas é o seu índice, que referencia sua localização dentro da estrutura.
Pedro Henrique González (CEFET/RJ) Computação 113 / 185
Acessando elementos de um vetor
A primeira posição de um vetor tem índice 0.
A última posição de um vetor tem índice tamanho - 1.
IMPORTANTE: O sistema de execução não verifica se o índice usado para acessar um
componente do vetor é válido.
É responsabilidade do programador garantir que o índice usado para acessar um
elemento de um vetor é válido.
Pedro Henrique González (CEFET/RJ) Computação 114 / 185
Acessando elementos de um vetor
Não esqueça:
Para acessar uma posição específica de um vetor basta indicar a posição desejada entre
colchetes.
A posição é chamada de índice.
A faixa de índices válidos inicia em 0 e termina com o tamanho -1.
Pedro Henrique González (CEFET/RJ) Computação 115 / 185
Acessando elementos de um vetor
Exemplo:
Declarar um vetor de tamanho 4 e atribuir o valor 540 na posição 1 e o valor 8456 na
posição 3.
int vetor [4];
vetor [1] = 540;
vetor [3] = 8456;
Pedro Henrique González (CEFET/RJ) Computação 116 / 185
Acessando elementos de um vetor
O limite do vetor é sempre o seu tamanho menos 1.
No exemplo anterior o vetor é de tamanho 4, a posição máxima é 3, pois 4–1=3.
Se um valor for atribuído fora dos limites do vetor ocorrerá um erro muito grave, pois o
valor estará sendo armazenado em um espaço da memória que não pertence ao vetor.
Ainda no exemplo anterior, não se deve fazer:
vetor [4] = 200;
Pedro Henrique González (CEFET/RJ) Computação 117 / 185
Acessando elementos de um vetor
Exemplo: Inserir 5 notas em um vetor, depois disso visualizar as notas inseridas.
#include <iostream >
using namespace std;
int main (){
double notas [5];
for(int j = 0; j<5; j++)
{
cout <<"Insira␣a␣nota␣"<<j+1<<endl;
cin >>notas[j];
}
for(int j = 0; j<5; j++)
{
cout <<notas[j]<<"␣";
}
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 118 / 185
Acessando elementos de um vetor
Exemplo: Faça um programa que leia as notas dos alunos de uma turma de 5 alunos, de-
termine e mostre a média aritmética das notas, e o número de alunos com notas inferiores à média.
#include <iostream >
using namespace std;
int main (){
double notas [5];
double soma = 0;
for(int j = 0; j<5; j++)
{
cout <<"Insira␣a␣nota␣"<<j+1<<endl;
cin >>notas[j];
soma+=notas[j];
}
double media = soma /5;
int cont = 0;
cout <<"A␣media␣e␣"<<media <<endl;
for(int j = 0; j<5; j++)
{
if(notas[j]<media){
cont ++;
}
}
cout <<"abaixo␣da␣media:␣"<<cont <<endl;
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 119 / 185
Uso de constantes com vetores
Geralmente é melhor usar um nome representando um valor constante do que usar a
própria constante em um programa.
Para tanto define-se a constante no início do programa, e no restante do programa usa-se
o nome definido.
Se for necessário redefinir o valor da constante no texto do programa, o local a ser
alterado é somente na declaração da constante.
Além disso, o uso de um nome pode ser uma dica do significado da constante.
Pedro Henrique González (CEFET/RJ) Computação 120 / 185
Uso de constantes com vetores
Geralmente é melhor definir e usar uma constante para representar o tamanho de um
vetor do que escrever o valor do tamanho explicitamente em todos os locais que
precisamos do tamanho.
Pedro Henrique González (CEFET/RJ) Computação 121 / 185
Uso de constantes com vetores
Uma constante pode ser definida como uma macro do pré-processador usando a diretiva
define.
No início da compilação, o pré-processador substitui todas as ocorrências no nome da
macro pela definição dada.
Este procedimento é apenas manipulação do texto do programa.
Não é feita nenhuma checagem de tipo com o nome da macro.
#include <iostream >
using namespace std;
#define TAMANHO 5
int main (){
double VetReais[TAMANHO ];
for(int i = 0; i<TAMANHO; i++)
{
VetReais[i] = TAMANHO + i;
}
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 122 / 185
Uso de constantes com vetores
Uma constante pode ser definida no nível de linguagem através do especificador const
colocado em uma declaração de variável, antes do nome do tipo.
A variável assim definida é similar às outras variáveis, exceto pelo fato de que o seu valor
não pode ser alterado. Portanto não é possível fazer uma atribuição a ela.
#include <iostream >
using namespace std;
int main (){
const int TAMANHO = 5;
double VetReais[TAMANHO], VetCopia[TAMANHO ];
for(int i = 0; i<TAMANHO; i++)
{
VetCopia[i] = VetReais[i];
}
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 123 / 185
Uso de constantes com vetores
Exemplo:
Construa um algoritmo que leia 300 números inteiros e imprima esses números na ordem
inversa de entrada.
Pedro Henrique González (CEFET/RJ) Computação 124 / 185
Uso de constantes com vetores
#include <iostream >
using namespace std;
int main (){
const int QUANTIDADE = 300;
double Vet[QUANTIDADE]
for(int i = 0; i<QUANTIDADE; i++)
{
cout <<"Digite␣o"<< i <<"o␣ n m e r o "<<endl;
cin >>Vet[i];
}
for(int i = (QUANTIDADE -1); i>-1; i--)
{
cout <<Vet[i]<<endl;
}
return 0;
}
Pedro Henrique González (CEFET/RJ) Computação 125 / 185
Inicialização de vetores
Quando declaramos um vetor, os seus elementos não são inicializados.
Neste caso os seus elementos são desconhecidos (lixode memória) e só deverão ser
utilizados após atribuição.
Porém é possível fazer a inicialização de um vetor com os valores iniciais desejados.
Para isso os valores iniciais são colocados entre chaves { }.
Exemplo:
int v[5] = {16 ,36,3 ,8 ,26};
Pedro Henrique González (CEFET/RJ) Computação 126 / 185
Inicialização de vetores
A quantidade de valores entre chaves não deve ser maior que o tamanho do vetor.
A fim de facilitar a inicialização, o C++ permite omitir o número de elementos
(tamanho): [].
Neste caso, o compilador assume que o tamanho do vetor é igual ao número de valores
especificados na inicialização (entre chaves)
int v[] = {16,36,3,8,26};
Pedro Henrique González (CEFET/RJ) Computação 127 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
Vetor
Vetor Multidimensional
Declaração de uma variável matriz
Acessando elementos de uma
matriz
Inicialização de matrizes
Dimensões Superiores
7 Ponteiros
Pedro Henrique González (CEFET/RJ) Computação 128 / 185
Vetor Multidimensional
Vetor Multidimensional é uma variável composta homogênea multidimensional.
Um vetor Multidimensional é formado por uma sequência de variáveis, todas do mesmo
tipo de dados
Dizemos que cada variável componente é um elemento do vetor multidimensional.
As variáveis que compõem um vetor multidimensional são todas identificadas por um
mesmo nome.
Estas variáveis são alocadas sequencialmente na memória
Quando falamos em um vetor multidimensional de dimensão 2, estamos falando de uma
matriz.
Pedro Henrique González (CEFET/RJ) Computação 129 / 185
Declaração de uma variável matriz
tipo identificador [linha][ coluna ];
Primeiro, o tipo de dado dos componentes do vetor: int, float, double, char, ... .
Segundo, o identificador da variável vetor: usando as mesmas convenções de um
identificador comum.
Por fim, o numlinhas e numcolunas da matriz (isto é, a quantidade de linhas e colunas
da matriz) escrito entre colchetes: [5][4], [10][1], [3][4], ...
Pedro Henrique González (CEFET/RJ) Computação 130 / 185
Acessando elementos de uma matriz
Os componentes de uma matriz são numerados sequencialmente começando com zero.
Para identificar cada componente usamos o nome da matriz juntamente com o número
que indica a posição do componente na linha e com o número que indica a posição do
componente na coluna.
Exemplo:
// Acessando a nota do aluno 10 na materia 1;
Notas [9][0]
Pedro Henrique González (CEFET/RJ) Computação 131 / 185
Acessando elementos de uma matriz
Sintaxe: matrix[linha][coluna]
Primeiramente escreve-se a matrix;
Depois escreve-se os índices (uma expressão inteira) entre os colchetes
Pedro Henrique González (CEFET/RJ) Computação 132 / 185
Acessando elementos de uma matriz
Exemplo:
double Notas [10][10];
Notas [9][0] = 7.25;
cin >>Notas [9][0];
Pedro Henrique González (CEFET/RJ) Computação 133 / 185
Inicialização de vetores
Quando declaramos uma matriz, os seus elementos não são inicializados.
Neste caso os seus elementos são desconhecidos (lixo de memória) e só deverão ser
utilizados após atribuição.
Porém é possível fazer a inicialização de uma matriz com os valores iniciais desejados.
Para isso cada linha é representada entre { } e depois todas as linhas iniciais são
colocadas entre chaves { }.
Exemplo:
int matrix [3][3] = {{1,2,3},{4,5,6},{7,8,9}};
Pedro Henrique González (CEFET/RJ) Computação 134 / 185
Inicialização de vetores
A quantidade de valores entre chaves não deve ser maior que o tamanho da matriz.
A fim de facilitar a inicialização, o C++ permite omitir o número de linhas (linha).
Neste caso, o compilador assume que o tamanho do vetor é igual ao número de linhas
especificados na inicialização (entre chaves).
No entanto, o número de colunas é necessário definir logo de inicio.
int matrix [][3] = {{1,2,3},{4,5,6},{7,8,9}};
Pedro Henrique González (CEFET/RJ) Computação 135 / 185
Dimensões Superiores
Podemos trabalhar com dimensões superiores a 2.
Esse vetores multidimensionais seguem regras que podem ser extrapoladas das regras
vistas para 1 e 2 dimensões.
Pedro Henrique González (CEFET/RJ) Computação 136 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Operações Com Ponteiros
Ponteiros E Vetores
Ponteiros Como Vetores
Alocação Dinâmica
Alocação Dinâmica De Vetores E
Matrizes
Exercícios de Fixação
Pedro Henrique González (CEFET/RJ) Computação 137 / 185
Ponteiros
Os ints guardam inteiros. Os floats guardam números de ponto flutuante. Os chars
guardam caracteres. Ponteiros guardam endereços de memória.
Quando você anota o endereço de um colega, você está criando um ponteiro. O ponteiro é
o seu pedaço de papel. Ele tem anotado um endereço.
Qual é o sentido disto? Simples. Quando você anota o endereço de um colega, depois você
vai usar este endereço para achá-lo. O C++ funciona assim. Voce anota o endereço de algo
numa variável ponteiro para depois usar.
Da mesma maneira, uma agenda, onde são guardados endereços de vários amigos, pode ser
vista como sendo uma matriz de ponteiros no C++.
Pedro Henrique González (CEFET/RJ) Computação 138 / 185
Tipos De Ponteiros
Um ponteiro também tem tipo.
Quando você anota um endereço de um amigo, você o trata diferente de quando você
anota o endereço de uma firma.
Apesar de o endereço dos dois locais ter o mesmo formato (rua, número, bairro, cidade,
etc.), eles indicam locais cujos conteúdos são diferentes.
Então os dois endereços são ponteiros de tipos diferentes.
Pedro Henrique González (CEFET/RJ) Computação 139 / 185
Declarando E Utilizando Ponteiros
No C++, quando declaramos ponteiros informamos ao compilador para que tipo de variável
vamos apontá-lo.
Um ponteiro int aponta para um inteiro, isto é, guarda o endereço de um inteiro.
Para declarar um ponteiro temos a seguinte forma geral:
tipo_do_ponteiro ∗nome_da_variável;
É o asterisco (∗) que faz o compilador saber que aquela variável não vai guardar um valor,
mas sim um endereço para aquele tipo especificado.
Pedro Henrique González (CEFET/RJ) Computação 140 / 185
Exemplos
Vamos ver exemplos de declarações de ponteiros:
int ∗pt;
char ∗temp, ∗pt2;
O primeiro exemplo declara um ponteiro para um inteiro. O segundo declara dois ponteiros
para caracteres.
Eles ainda não foram inicializados, o que significa que eles apontam para um lugar
indefinido. Este lugar pode estar, por exemplo, na porção da memória reservada ao sistema
operacional do computador.
Usar o ponteiro nestas circunstânicias pode levar a um travamento do micro, ou a algo pior.
O ponteiro deve ser inicializado (apontado para algum lugar conhecido) antes de ser usado! Isto
é de suma importância!
Pedro Henrique González (CEFET/RJ) Computação 141 / 185
O Operador &
Para atribuir um valor a um ponteiro recém-criado, poderíamos igualá-lo a um valor de
memória. Mas, como saber a posição na memória de uma variável do nosso programa?
Seria muito difícil saber o endereço de cada variável que usamos, mesmo porque estes
endereços são determinados pelo compilador na hora da compilação e realocados na execução.
Podemos então deixar que o compilador faça este trabalho por nós. Para saber o endereço
de uma variável, basta usar o operador &.
Pedro Henrique González (CEFET/RJ) Computação 142 / 185
Exemplos
Veja o exemplo:
int count = 10;
int ∗pt;
pt = &count;
Criamos um inteiro count com o valor 10 e um apontador para um inteiro pt. A expressão
&count nos dá o endereço de count, o qualarmazenamos em pt. Simples, não é? Repare que
não alteramos o valor de count, que continua valendo 10.
Pedro Henrique González (CEFET/RJ) Computação 143 / 185
Usando Um Ponteiro
Como colocamos um endereço em pt, o ponteiro está agora “liberado” para ser usado.
Podemos, por exemplo, alterar o valor de count usando pt. Para tanto vamos usar o
operador “inverso” do operador &, que é o operador ∗.
No exemplo acima, uma vez que fizemos pt = &count, a expressão ∗pt é equivalente ao
próprio count. Isto significa que, se quisermos mudar o valor de count para 12, basta fazer ∗pt
= 12.
Pedro Henrique González (CEFET/RJ) Computação 144 / 185
Ponteiro Ou Multiplicação?
Uma observação importante: apesar do símbolo ser o mesmo, o operador ∗ (multiplicação)
não é o mesmo operador que o ∗ (referência de ponteiros).
Para começar, o primeiro operador é binário e o segundo é unário pré-fixado.
Pedro Henrique González (CEFET/RJ) Computação 145 / 185
Algorithm 1 Exemplo 1: Um programa com ponteiros
1: #include <iostream>
2: using namespace std;
3: int main () {
4: int num, valor;
5: int ∗p;
6: num = 55;
7: p = &num; /* Pega o endereco de num */
8: valor = ∗p; /* Valor e igualado a num de uma maneira indireta */
9: cout«valor«endl;
10: cout«“Endereco para onde o ponteiro aponta: «p«endl;
11: cout«“Valor da variavel apontada: ”«∗p«endl;
12: return 0;
13: }
Pedro Henrique González (CEFET/RJ) Computação 146 / 185
Algorithm 2 Exemplo 2: Um programa com ponteiros
1: #include <iostream>
2: using namespace std;
3: int main () {
4: int num, ∗p;
5: num = 55;
6: p = &num; /* Pega o endereco de num */
7: cout«“Valor inicial: ”«num«endl;
8: ∗p = 100; /* Muda o valor de num de uma maneira indireta */
9: cout«“Valor final: ”«num«endl;
10: return 0;
11: }
Pedro Henrique González (CEFET/RJ) Computação 147 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Operações Com Ponteiros
Ponteiros E Vetores
Ponteiros Como Vetores
Alocação Dinâmica
Alocação Dinâmica De Vetores E
Matrizes
Exercícios de Fixação
Pedro Henrique González (CEFET/RJ) Computação 148 / 185
Operações Aritméticas Com Ponteiros
Podemos fazer algumas operações aritméticas com ponteiros.
A primeira, e mais simples, é igualar dois ponteiros. Se temos dois ponteiros p1 e p2,
podemos igualá-los fazendo p1 = p2. Repare que estamos fazendo com que p1 aponte para o
mesmo lugar que p2.
Se quisermos que a variável apontada por p1 tenha o mesmo conteúdo da variável apontada
por p2, devemos fazer ∗p1 = ∗p2.
Basicamente, depois que se aprende a usar os dois operadores (& e ∗), fica fácil entender
operações com ponteiros.
Pedro Henrique González (CEFET/RJ) Computação 149 / 185
Incremento E Decremento De Ponteiros
As próximas operações, também muito usadas, são o incremento e o decremento de
ponteiros.
Quando incrementamos um ponteiro, ele passa a apontar para o próximo valor do mesmo
tipo para o qual o ponteiro aponta. Isto é, se temos um ponteiro para um inteiro e o
incrementamos, ele passa a apontar para o próximo inteiro.
Esta é mais uma razão pela qual o compilador precisa saber o tipo de um ponteiro: se você
incrementa um ponteiro char∗, ele anda 1 byte na memória, e se você incrementa um ponteiro
double∗, ele anda 8 bytes na memória. O decremento funciona de forma semelhante.
Pedro Henrique González (CEFET/RJ) Computação 150 / 185
Incremento E Decremento De Ponteiros
Supondo que p seja um ponteiro, as operações de incremento e decremento são escritas
como:
p++;
p−−;
Mais uma vez, é bom ressaltar que estamos falando de operações com ponteiros, e não de
operações com o conteúdo das variáveis para as quais eles apontam.
Para incrementar o conteúdo da variável apontada pelo ponteiro p, fazemos:
(∗p)++;
(∗p)−−;
Pedro Henrique González (CEFET/RJ) Computação 151 / 185
Soma E Subtração De Inteiros Com Ponteiros
Outras operações aritméticas úteis são a soma e a subtração de inteiros com ponteiros.
Vamos supor que você queira incrementar um ponteiro de 15 posições. Basta fazer:
p = p + 15; ou p += 15.
E se você quiser usar o conteúdo do ponteiro 15 posições adiante:
∗(p+15);
A subtração funciona da mesma maneira.
Pedro Henrique González (CEFET/RJ) Computação 152 / 185
Comparação Entre Dois Ponteiros
Uma outra operação, às vezes útil, é a comparação entre dois ponteiros.
Que informação recebemos quando comparamos dois ponteiros? Bem, em primeiro lugar,
podemos saber se dois ponteiros são iguais ou diferentes (== e !=).
No caso de operações do tipo >, <, >= e <=, estamos comparando qual ponteiro aponta
para uma posição mais alta na memória.
A comparação entre dois ponteiros se escreve como a comparação entre outras duas
variáveis quaisquer.
Pedro Henrique González (CEFET/RJ) Computação 153 / 185
Operações Que Você Não Pode Efetuar Num Ponteiro
Há, entretanto, operações que você não pode efetuar num ponteiro.
Você não pode dividir ou multiplicar ponteiros, adicionar dois ponteiros, adicionar ou
subtrair floats ou doubles de ponteiros.
Pedro Henrique González (CEFET/RJ) Computação 154 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Operações Com Ponteiros
Ponteiros E Vetores
Ponteiros Como Vetores
Alocação Dinâmica
Alocação Dinâmica De Vetores E
Matrizes
Exercícios de Fixação
Pedro Henrique González (CEFET/RJ) Computação 155 / 185
Vetores Como Ponteiros
Vamos dar agora uma ideia de como o C++ trata vetores.
Quando você declara uma matriz da seguinte forma:
tipo_da_variável nome_da_variável [tam1][tam2]. . . [tamN];
o compilador C calcula o tamanho, em bytes, necessário para armazenar esta matriz. Este
tamanho é:
tam1 × tam2 × tam3 × . . .× tamN × tamanho_do_tipo_da_variável
Pedro Henrique González (CEFET/RJ) Computação 156 / 185
Vetores Como Ponteiros
O compilador então aloca este número de bytes em um espaço livre de memória.
O nome da variável que você declarou é, na verdade, um ponteiro para o tipo da variável da
matriz.
Este conceito é fundamental! Após alocado na memória o espaço para a matriz, o nome
da variável (que é um ponteiro) aponta para o primeiro elemento da matriz.
Pedro Henrique González (CEFET/RJ) Computação 157 / 185
Notação Para Vetores
Mas então surge a pergunta: como é que podemos usar a seguinte notação?
nome_da_variável[índice]
Isto pode ser facilmente explicado desde que você entenda que a notação acima é
absolutamente equivalente a se fazer:
∗(nome_da_variável + índice)
Pedro Henrique González (CEFET/RJ) Computação 158 / 185
Como Funciona Um Vetor
Agora podemos entender como é que funciona um vetor. Vamos ver o que podemos tirar de
informação deste fato.
Fica claro, por exemplo, porque no C++ a indexação começa com zero. É porque, ao
pegarmos o valor do primeiro elemento de um vetor, queremos, de fato, ∗nome_da_variável, e
então devemos ter um índice igual a zero.
Então sabemos que:
∗nome_da_variável é equivalente a nome_da_variável[0]
Pedro Henrique González (CEFET/RJ) Computação 159 / 185
Como Funciona Um Vetor
Outra coisa: apesar de, na maioria dos casos, não fazer muito sentido, poderíamos ter
índices negativos. Estaríamos pegando posições de memória antes do vetor.
Isto explica também porque o C não verifica a validade dos índices: ele não sabe o tamanho
do vetor! Ele apenas aloca a memória, ajusta o ponteiro do nome do vetor para o início do
mesmo e, quando você usa os índices, encontra os elementos requisitados.
Pedro Henrique González (CEFET/RJ) Computação 160/ 185
Usos De Ponteiros
Vamos ver agora um dos usos mais importantes dos ponteiros: a varredura sequencial de
uma matriz.
Quando temos que varrer todos os elementos de uma matriz de uma forma sequencial,
podemos usar um ponteiro, o qual vamos incrementando.
Qual a vantagem em fazermos isto?
Pedro Henrique González (CEFET/RJ) Computação 161 / 185
Algorithm 3 Exemplo de um programa com matrizes
1: #include <iostream>
2: using namespace std;
3: int main () {
4: float matrx [50][50];
5: int i, j;
6: for (i = 0; i < 50; i++){
7: for (j = 0; j < 50; j++){
8: matrx[i][j] = 0.0;
9: }
10: }
11: return 0;
12: }
Pedro Henrique González (CEFET/RJ) Computação 162 / 185
Programa Anterior Usando Ponteiros
Algorithm 4 Exemplo de um programa com matrizes e ponteiros
1: #include <iostream>
2: using namespace std;
3: int main () {
4: float matrx [50][50];
5: float ∗p;
6: int count;
7: p = matrx[0];
8: for (count = 0; count < 2500; count++) {
9: ∗p = 0.0;
10: p++;
11: }
12: return 0;
13: }
Pedro Henrique González (CEFET/RJ) Computação 163 / 185
Entendendo O Programa
No primeiro programa, cada vez que se faz matrx[i][j], o programa tem que calcular o
deslocamento para dar ao ponteiro. Ou seja, o programa tem que calcular 2500 deslocamentos!
No segundo programa, o único cálculo que deve ser feito é o de um incremento de ponteiro.
Fazer 2500 incrementos em um ponteiro é muito mais rápido que calcular 2500 deslocamentos
completos.
Pedro Henrique González (CEFET/RJ) Computação 164 / 185
Nome Do Vetor E Ponteiros
Há uma diferença entre o nome de um vetor e um ponteiro que deve ser frisada: um
ponteiro é uma variável, mas o nome de um vetor não é uma variável.
Isto significa, que não se consegue alterar o endereço que é apontado pelo “nome do vetor”.
Pedro Henrique González (CEFET/RJ) Computação 165 / 185
Exemplos
Seja:
int vetor[10];
int ∗ponteiro, i;
ponteiro = &i;
As operações a seguir são inválidas:
vetor = vetor + 2; /* ERRADO: vetor nao é variável */
vetor++; /* ERRADO: vetor nao é variável */
vetor = ponteiro; /* ERRADO: vetor nao é variável */
Pedro Henrique González (CEFET/RJ) Computação 166 / 185
Exemplos
As operações abaixo são válidas:
ponteiro = vetor; /* CERTO: ponteiro e’ variavel */
ponteiro = vetor + 2; /* CERTO: ponteiro e’ variavel */
Pedro Henrique González (CEFET/RJ) Computação 167 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Operações Com Ponteiros
Ponteiros E Vetores
Ponteiros Como Vetores
Alocação Dinâmica
Alocação Dinâmica De Vetores E
Matrizes
Exercícios de Fixação
Pedro Henrique González (CEFET/RJ) Computação 168 / 185
Ponteiros Como Vetores
Sabemos agora que, na verdade, o nome de um vetor é um ponteiro constante.
Sabemos também que podemos indexar o nome de um vetor.
Como consequência podemos também indexar um ponteiro qualquer.
Pedro Henrique González (CEFET/RJ) Computação 169 / 185
Algorithm 5 Ponteiros como vetores
1: #include <iostream>
2: using namespace std;
3: int main () {
4: int matrx [10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
5: int ∗p;
6: p = matrx;
7: cout«“O terceiro elemento do vetor e: ”«p[2]«endl;
8: return 0;
9: }
Podemos ver que p[2] equivale a ∗(p+2).
Pedro Henrique González (CEFET/RJ) Computação 170 / 185
Endereços De Elementos De Vetores
Vamos, agora, apenas ressaltar que a notação
&nome_da_variável[índice]
é válida e retorna o endereço do ponto do vetor indexado por índice.
Isto seria equivalente a nome_da_variável + índice.
É interessante notar que, como consequência, o ponteiro nome_da_variável tem o
endereço &nome_da_variável[0], que indica o lugar na memória em que o valor do primeiro
elemento do vetor está guardado.
Pedro Henrique González (CEFET/RJ) Computação 171 / 185
Vetores De Ponteiros
Podemos construir vetores de ponteiros como vetores de qualquer outro tipo. Uma
declaração de um vetor de ponteiros inteiros poderia ser:
int ∗pmatrx[10];
No caso acima, pmatrx é um vetor que armazena 10 ponteiros para inteiros.
Pedro Henrique González (CEFET/RJ) Computação 172 / 185
Ponteiros Para Ponteiros
Um ponteiro para um ponteiro é como se você anotasse o endereço de um papel que tem o
endereço da casa do seu amigo.
Podemos declarar um ponteiro para um ponteiro com a seguinte notação:
tipo_da_variável ∗∗nome_da_variável;
Algumas considerações: ∗∗nome_da_variável é o conteúdo final da variável apontada;
∗nome_da_variável é o conteúdo do ponteiro intermediário.
Pedro Henrique González (CEFET/RJ) Computação 173 / 185
Ponteiros Para Ponteiros
No C++, podemos declarar ponteiros para ponteiros para ponteiros, ou então, ponteiros
para ponteiros para ponteiros para ponteiros (UFA!) e assim por diante.
Para fazer isto, basta aumentar o número de asteriscos na declaração. A lógica é a mesma.
Para acessar o valor desejado apontado por um ponteiro para ponteiro, o operador asterisco
deve ser aplicado duas vezes.
Pedro Henrique González (CEFET/RJ) Computação 174 / 185
Algorithm 6 Ponteiros para ponteiros
1: #include <iostream>
2: using namespace std;
3: int main () {
4: float fpi = 3.1415, ∗pf, ∗∗ppf;
5: pf = &fpi; /* pf armazena o endereco de fpi */
6: ppf = &pf; /* ppf armazena o endereco de pf */
7: cout«∗∗ppf«endl; /* Imprime o valor de fpi */
8: cout«∗pf«endl; /* Tambem imprime o valor de fpi */
9: return 0;
10: }
Pedro Henrique González (CEFET/RJ) Computação 175 / 185
Cuidados A Serem Tomados Ao Se Usar Ponteiros
O principal cuidado ao se usar um ponteiro deve ser: saiba sempre para onde o ponteiro
está apontando. E nunca use um ponteiro que não foi inicializado!
Algorithm 7 Como não usar um ponteiro
1: #include <iostream>
2: using namespace std;
3: int main () {
4: int x, ∗p;
5: x = 13;
6: ∗p = x;
7: return 0;
8: }
Pedro Henrique González (CEFET/RJ) Computação 176 / 185
Entendendo O Programa
Este programa compilará e rodará. O que acontecerá? Ninguém sabe.
O ponteiro p pode estar apontando para qualquer lugar. Você estará gravando o número 13
em um lugar desconhecido.
Com um número apenas, você provavelmente não vai ver nenhum defeito. Agora, se você
começar a gravar números em posições aleatórias no seu computador, não vai demorar muito
para travar o micro (se não acontecer coisa pior).
Pedro Henrique González (CEFET/RJ) Computação 177 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Operações Com Ponteiros
Ponteiros E Vetores
Ponteiros Como Vetores
Alocação Dinâmica
Alocação Dinâmica De Vetores E
Matrizes
Exercícios de Fixação
Pedro Henrique González (CEFET/RJ) Computação 178 / 185
Alocação Dinâmica De Memória
A alocação dinâmica permite ao programador alocar memória para variáveis quando o
programa está sendo executado. Assim, poderemos definir, por exemplo, um vetor ou uma
matriz cujo tamanho descobriremos em tempo de execução.
O C++ utiliza 4 comandos para o sistema de alocação dinâmica:
new, new[]
delete, delete[]
Pedro Henrique González (CEFET/RJ) Computação 179 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Operações Com Ponteiros
Ponteiros E Vetores
Ponteiros Como Vetores
Alocação Dinâmica
Alocação Dinâmica De Vetores E
Matrizes
Exercícios de Fixação
Pedro Henrique González (CEFET/RJ) Computação 180 / 185
Alocação Dinâmica De Vetores
A alocaçãodinâmica de vetores utiliza os conceitos aprendidos sobre ponteiros.
Algorithm 8 Alocação Dinâmica De Vetores
1: #include <iostream>
2: using namespace std;
3: int main () {
4: int n;
5: cin»n;
6: int * vetor = new int [n];
7: delete[ ] vetor;
8: return 0;
9: }
Pedro Henrique González (CEFET/RJ) Computação 181 / 185
Alocação Dinâmica De Matrizes
A alocação dinâmica de memória para matrizes é realizada da mesma forma que para
vetores.
A única diferença é que teremos um ponteiro apontando para outro ponteiro que aponta
para o valor final, ou seja é um ponteiro para ponteiro, o que é denominado indireção múltipla.
A indireção múltipla pode ser levada a qualquer dimensão desejada, mas raramente é
necessário mais de um ponteiro para um ponteiro.
Pedro Henrique González (CEFET/RJ) Computação 182 / 185
Algorithm 9 Alocação Dinâmica De Matrizes
1: #include <iostream>
2: using namespace std;
3: int main () {
4: int m,n;
5: cin»m»n;
6: int ** matrix = new * int [m];
7: for (int i = 0; i < m; i++) matrix[i] = new int [n];
8: for (int i = 0; i < m; i++) delete[ ] matrix[i];
9: delete[ ] matrix;
10: return 0;
11: }
Pedro Henrique González (CEFET/RJ) Computação 183 / 185
Planejamento
1 Organização do Curso
2 Conceitos Básicos de Computação
3 Construção de Algoritmos
4 Introdução a Funções
5 Estruturas de Controle
6 Variável Composta Homogênea
7 Ponteiros
Operações Com Ponteiros
Ponteiros E Vetores
Ponteiros Como Vetores
Alocação Dinâmica
Alocação Dinâmica De Vetores E
Matrizes
Exercícios de Fixação
Pedro Henrique González (CEFET/RJ) Computação 184 / 185
Exercícios de Fixação
A partir deste momentos vocês já possuem o conteúdo necessário para fazer as listas 6 à 8! As
lista se encontram na página da disciplina no moodle
Pedro Henrique González (CEFET/RJ) Computação 185 / 185
	Organização do Curso
	Objetivos
	Ementa
	Bibliografia
	Conceitos Básicos de Computação
	Maquina Digital
	Comunicação com o Computador
	Ciclo de Desenvolvimento
	Conceitos básicos de solução de problemas
	Construção de Algoritmos
	Variáveis
	Estruturas de Entrada e Saída de Dados
	Operadores Aritméticos
	Exercicios de Fixação
	Introdução a Funções
	Parâmetros
	O Comando return
	O Tipo void
	Estruturas de Controle
	Estruturas de Desvio Condicional
	Estruturas de Desvio Incondicional
	Estruturas de Repetição Simples
	Estruturas de Repetição Condicional
	Desvios Incondicionais
	Exercícios de Fixação
	Variável Composta Homogênea
	Vetor
	Vetor Multidimensional
	Ponteiros 
	Operações Com Ponteiros 
	Ponteiros E Vetores
	Ponteiros Como Vetores
	Alocação Dinâmica
	Alocação Dinâmica De Vetores E Matrizes
	Exercícios de Fixação

Outros materiais