Baixe o app para aproveitar ainda mais
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 = # /* 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 = # /* 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
Compartilhar