programação c/c++ - ncdd.com.br+/slide5.pdf · slide 5 nielsen castelo damasceno. programação...

113
Programação C/C++ Slide 5 Nielsen Castelo Damasceno

Upload: lammien

Post on 10-Dec-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Programação C/C++

Slide 5Nielsen Castelo Damasceno

Programação estruturada

Programação estruturada

Programação estruturada

Programação estruturada

Programação estruturada

vetores

vetores

vetores

vetores

vetores

vetores

Vetores e constantes

Vetores e constantes

Vetores (Regras)

Vetores (caracteres)

Vetores (strings)

Vetores (strings)

Vetores (strings)

Funções básicas (strings)

Funções básicas (strings)

Funções

FUNÇÕES

Função main

Função Função Função

Função Função

FUNÇÕES (CMATH)

Definindo uma função

• A lista de parâmetros, também chamada de lista de argumentos, é opcional. A função pode não ter entrada (void).

tipo_da_função nome_da_função (lista de parâmetros){

corpo da função}

O comando return

Sintaxe de um comando return:

A instrução return expressão; tem os seguintes efeitos:1) avaliação da expressão2) conversão automática do resultado da expressão para

o tipo da função3) retorno do resultado4) término da execução da função e retorno do controle

para a instrução seguinte do código de chamada

• return;

• return expressão;

• return (expressão);

O comando return• No exemplo anterior, temos a definição das funções:

Função com um comando return

Função com mais de um comando return

O comando return• Funções do tipo void podem ter um

comando return sem expressão, servindo para terminar a execução da função

• Em funções do tipo void, o comando returnnão é obrigatório

• Uma função sem comando return termina quando encontra a chave de fechamento

• O valor de retorno é obtido através de uma chamada àfunção, como no exemplo:

Funções definidas pelo usuário

Declaração e definição de funções• Em geral, o nome de uma função aparece em três

lugares em um programa:1) na declaração (protótipo/assinatura)2) na definição3) na chamada

ExemploDeclaração de

funções (protótipos)

Chamadas de funções

Definição de funções

• Uma função não pode ser chamada sem antes ter sido declarada

• No exemplo, temos a declaração das funções:

Declaração de uma funçãoA declaração de uma função, dita protótipo da função, é uma instrução, geralmente colocada no início do programa, que estabelece o tipo da função e os argumentos que ela recebe.

• a função de nome le_numero() é do tipo int e não recebe argumentos

• a função de nome max() é do tipo inte recebe como argumento dois valores do tipo int

Observações1) No protótipo de uma função, o seu tipo,

o número e o tipo dos parâmetros devem corresponder àqueles do cabeçalho da definição.

2) O nome dos parâmetros podem ser omitidos na declaração.

3) Se uma função não tem parâmetros, pode-se declarar a lista de parâmetros como (void) ou simplesmente ()

Outras observações1) Se uma função é definida antes da sua

primeira chamada, esta não precisa ser declarada.

2) O comando return pode retornar somente um único valor.

3) Se uma função não tem valor de retorno, deve-se indicar o tipo de retorno como void

4) Não se pode definir funções dentro de uma outra função.

Escopo de variáveis

• As variáveis podem ser declaradas em três lugares:

1)dentro de funções variáveis locais

2)como parâmetros de funçõesparâmetros formais

3)fora de todas as funçõesvariáveis globais

O escopo de uma variável é o bloco de código onde esta variável é válida

Variáveis locaisvoid funcao1(void)

{

int x;

x = -10;

}

void funcao2(void)

{

int x, y;

x = 2;

y = 18;

}

• São visíveis apenas dentro de seu próprio bloco de código.

Um bloco de código é delimitado por { }.

• O espaço de memória usado pela variável é liberado na saída do bloco de código.

Variáveis globais• São visíveis no programa inteiro.• O espaço de memória fica

reservado durante toda a execução do programa.

Variáveis globais

São úteis quando o mesmo dado é usado em muitas funçõesOcupam espaço de memória mesmo quando desnecessáriasPodem levar a erros no programa

Variáveis globais x locais

Qual a diferença entre as funções?

int produto(int x, int y)

{

return (x * y);

}

}

int x, y;

int produto(void)

{

return (x * y);

}

Variáveis globais x locais

int produto(int x, int y)

{

return (x * y);

}

}

int x, y;

int produto(void)

{

return (x * y);

}

Qual a diferença entre as funções?

Parâmetros de uma função

• São visíveis apenas dentro da função: são criadas na entrada e destruídas na saída da função

• No momento da chamada de uma função, o número e o tipo dos parâmetros devem corresponder à declaração da função

• Os parâmetros são convertidos automaticamente para os tipos da declaração antes de serem passados à função

Variáveis locais que são inicializadas pelos valores passados na chamada da função.

Passagem de parâmetros• Em geral, pode-se passar parâmetros para

funções de duas maneiras:1) Por valor: o valor do argumento é copiado

para o parâmetro e as alterações feitas no parâmetro não tem efeito sobre a variável usada na chamada da função

2) Por referência: o endereço de uma variável copiado para o parâmetro, assim as mudanças feitas no parâmetro afetam a variável usada na chamada da função

Passagem de parâmetros por valor

o valor de n é copiado para o parâmetro x da função quadrado()

na atribuição, apenas a variável local x é modificada

a variável n, usada para chamar quadrado(), ainda tem o valor 10

Passagem de parâmetros por referência

A referencia de n é passado para o parâmetro x da função quadrado()

na atribuição, a variável referenciada por x é modificada

a variável n, usada para chamar quadrado(), teve seu valor modificado

Operador unário de referência &

Passagem de parâmetros por valor• Considere o seguinte programa:

ExercícioFaça um programa que calcula as raízes de uma equação do segundo grau , onde a, b e c são números reais fornecidos pelo usuário. Observação: use funções para calcular e imprimir o resultado.

)0( 2 cbxax

Exercício• Implemente duas funções uma que converte em

Real para dólar e outra que faz a operação inversa.

• Chame essa função através do main.• O programa deve ter uma boa interação com

usuário.• Mostre a cotação do dólar utilizado.

Problema 1• Crie uma função para encontrar o maior entre 3

inteiros. O usuário entra com os inteiros e o programa imprime os 3 inteiros e mostrando o maior elemento.

Local e global

Uso do define

Constantes

Operador (?:)

Problema 2

• Escreva um programa que calcula a soma dos quadrados de dois números fornecido pelo usuário.

• Implemente 3 funções: Calcula a soma dos quadrados de dois números, calcula o quadrado de um número e calcula a soma de dois números.

• A função main deve chamar somente a função que apresente todo o resultado.

Funções e variáveis globais

Funções e variáveis globais

Funções e variáveis globais

Passando array a função• Para passar um argumento array a uma função,

especifique o nome do array sem colocar colchetes. Por exemplo, se o array temperaturaPorHora for declarado como

Passando array a função

Exercício

• Crie um programa em que o usuário entre com o tamanho do vetor.

• A função main deve chamar outra função que preenche os valores desse vetor aleatoriamente (passando como parâmetro o vetor e seu tamanho).

• Crie uma função que imprima esse vetor (passando como parâmetro o vetor e seu tamanho).

• A função deve ser chamada pelo main.• Pesquise na Internet a função rand.

Argumento de defaults

Setprecision

Variável static

Exemplo

Exemplo

Problema 3: Passeio do cavalo• Um dos problemas mais interessantes para os

fãs do jogo de xadrez é o problema do Passeio do Cavalo, proposto originalmente pelo matemático Euler.

• A questão é esta: a peça do jogo de dez chamada ao cavalo pode se mover ao longo de um tabuleiro vazio e passar uma única vez em cada uma 64 casas?

Problema 3: Passeio do cavalo• O cavalo faz movimentos em formato de L

(percorre duas casas em uma direção e uma no sentido perpendicular às duas primeiras). Dessa forma, de uma casa no meio do tabuleiro, o cavalo pode fazer movimentos diferentes (numerados de 0 a 7).

Problema 3: Passeio do cavalo• Desenhe um tabuleiro de xadrez 8-por-8 em

uma folha de papel e tente fazer o Passeio do Cavalo a mão, Coloque um 1 no primeira casa para a qual se mover, um 2 na segunda casa, um 3 na terceira etc.

• Antes de começar os movimentos, imagine até onde você chegará, lembrando-se que um passeio completo consiste em 64 movimentos.

• Até onde você chegou? Você chegou perto do quanto havia imaginado?

Problema 3: Passeio do cavalo

Problema 3: Passeio do cavalo• Escreva um programa para mover o cavalo pelo

tabuleiro de xadrez.• Rode o programa. • Quantos movimentos o cavalo fez? • Depois de tentar escrever e rodar o programa do

Passeio do Cavalo, provavelmente você adquiriu alguns conceitos valiosos.

Problema 4: Puzzle15

Problema 4: Puzzle15

• 1.3 trilhões de estados alcançáveis• Instâncias aleatórias são resolvidas otimamente em

alguns milissegundos pelos melhores algoritmos de busca

• 24-puzzle (5 x 5): possui 10 estados.• Resolver através da busca em profundidade.

Problema 4: Puzzle8

• A estratégia deve “tentar” uma regra e, se mais tarde

descobrir que essa regra não era apropriada, “voltar

atrás” e tentar outra regra. Essa estratégia é chamada

Backtracking (Tentativa e erro).

Problema 4: Puzzle8

Ponteiros• Os ponteiros são variáveis que contêm

endereços de memória como valores. • Normalmente, uma variável faz uma

referência direta a um valor específico. • Um ponteiro, por outro lado, contém um

endereço de uma variável que contém um valor específico.

Ponteiros

contPtr é um ponteiro para int ou contPtr aponta para um objeto do tipo inteiro

Ponteiros• Os ponteiros devem ser inicializados ao serem

declarados.• Um ponteiro pode ser inicializado com 0,

NULL ou um endereço. • Um ponteiro com o valor NULL não aponta

para lugar algum. • Inicializar um ponteiro com 0 é equivalente a

inicializar um ponteiro com NULL

Operadores de Ponteiros• O & ou operador de ponteiro é um operador que

retorna o endereço de seu operando. Por exemplo, admitindo as declarações

a instrução

Operadores de Ponteiros

Operadores de Ponteiros

Operadores de Ponteiros• O operador *, chamado frequentemente

operador de referência indireta ou operador de desreferenciamento, retorna o valor do objeto ao qual seu operando (i.e., um ponteiro) aponta.

Usar * dessa maneira é chamado desreferenciar um poteiro.

Operadores de Ponteiros

Chamando funções por referência• Há duas maneiras de passar argumentos a uma

função — chamada por valor e chamada por referência.

• Usar ponteiros e o operador de referência indireta para simular chamadas por referência.

Chamando funções por referência

Chamando funções por referência

Passagem por referência• Funções que recebem argumentos por referencia

utilizam o operador & somente na definição do tipo de argumento.

• Pelo comando return só é possível retornar um valor.

• Por referência podemos retornar mais de um valor.

Passagem por referência

Passagem por referência

Exercício

• Implemente um programa que ordene 3 números de forma ascendente fornecido pelo usuário.

• Utiliza chamada por referência.• A função main deve chamar a função

ordena que apresenta os resultados.

Expressões e aritmética com ponteiro

Expressões e aritmética com ponteiro

• Quando um inteiro é adicionado ou subtraído de um ponteiro, este último não é simplesmente incrementado ou decrementado por tal inteiro, mas sim por tal inteiro vezes o tamanho do objeto ao qual o ponteiro se refere.

• O número de bytes depende do tipo de dado do objeto.

• vPtr += 2, produziria 3008 (3 000 + 2 * 4) admitindo que um inteiro está armazenado em 4 bytes de memória

Expressões e aritmética com ponteiro

• Se um ponteiro for incrementado ou decrementado de um, os operadores de incremento e decremento podem ser usados. Qualquer uma das instruções ++vPtr; vPtr++;

• As variáveis de ponteiros podem ser subtraídas entre si.

• Por exemplo, se vPtr possuir o local 3000 e v2Ptr possuir o endereço 3008, a instrução x = v2Ptr -vPtr;

• A Aritmética de ponteiros não tem significado algum se não for realizada em um array.

Ponteiros e Arrays• bPtr = &b[0];• O elemento b [ 3 ] do array pode ser referenciado

alternativamente com a expressão de ponteiro *(bPtr + 3).

• Notação ponteiro/offset• Os parênteses são necessários porque a precedência

do * é maior do que a precedência do +.• O array em si pode ser tratado como um ponteiro e

usado com a aritmética de ponteiros. Por exemplo, a expressão *(b + 3).

Ponteiros e Arrays• Os arrays podem conter ponteiros. Um uso

comum de tais estruturas de dados é para formar um array de strings.

Ponteiros e Arrays• Embora pareça que essas strings estão sendo

colocadas no array naipe, apenas os ponteiros são de fato colocados no array.

Ponteiros e Arrays

Ponteiros e Arrays

Ponteiros e Arrays

Ponteiros e Arrays

Ponteiros e Arrays

Ponteiros e Arrays

Alocando memória• typeName * pointer_name = new typeName;• int * pn = new int;

Alocando memória

Liberando memória

Operador new e delete• O operador new é utilizado para alocar um bloco

de memória.• Primeiro o operador new solicita ao SO um bloco

de memória, após alocar o bloco de memória, new retorna um ponteiro para o bloco alocado.

• Se new falhar, retorna um bad_aloc.

Operador new e delete• Para destruir o objeto e devolver a memória para o

SO utiliza-se o operador delete.• Delete destrói o objeto e devolve o bloco de

memória para o SO.• Observe que apenas o bloco de memória é

destruído. O ponteiro continua existindo, e continua apontando para o bloco de memória que agora não existe mais.

• Depois de usar delete, o ponteiro aponta para um monte de lixo e não deve mais ser utilizado.

Operador new e delete

Ponteiro para função

Problema 5

Faça um programa na linguagem C++ que imprima os 50 primeiros números inteiros pares positivos. Utilize ponteiros e funções.

Problema 6

Num frigorífico existem 90 bois. Cada boi traz preso no pescoço um cartão contendo seu número de identificação e seu peso. Fazer um programa na linguagem C++ que escreva o número e peso do boi mais gordo e do boi mais magro.

Problema 7

Suponha que no ano N a população americana seja maior que a brasileira. Sabendo-se que os Estados Unidos possuem um crescimento anual de 2% na sua população e que o Brasil tem crescimento anual de 4%, determinar o ano em que as duas populações serão iguais (em quantidade). São dados os números de habitantes dos Estados Unidos e do Brasil no ano N.