programação científica c++ - ncdd.com.br+/slide8.pdf · slide 8 nielsen castelo damasceno....

21
Programação científica C++ Slide 8 NIELSEN CASTELO DAMASCENO

Upload: hoangdan

Post on 13-Feb-2019

225 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Programação científica C++

Slide 8

NIELSEN CASTELO DAMASCENO

Page 2: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Matrizes como argumento de funções

• O nome de uma matriz (sem os colchetes) representa o endereço onde a matriz está armazenada.

Ao passar o nome de uma matriz para uma função não se cria uma cópia da matriz, a passagem é feita por referência.

• Na lista de parâmetros, pode-se declarar uma matriz unidimensional da seguinte forma:

tipo nome [ ]

Page 3: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Matrizes como argumento de funções

A função strlen() calcula e retorna o comprimento de uma string passada como parâmetro.

int strlen(char S[]){int N;

for (N=0; S[N] != '\0'; N++);

return N;}

int main(){char ch[50] = "Bom dia!”;

cout << strlen(ch) << endl;return 0;

}

Note que não se usa o operador & na declaração da matriz na lista de parâmetros

Page 4: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Matrizes como argumento de funçõesObservação: Deve-se fornecer também o tamanho da matriz (quando o tipo for diferente de char) para que a função trabalhe corretamente.

#include <iostream>using namespace std;

void imprimir(int v[], int tam) {for (int n=0; n<tam; n++)

cout << v[n] << " ";cout << "\n";

}int main (){

int vetor1[3] = {5, 10, 15};int vetor2[5] = {2, 4, 6, 8, 10};imprimir(vetor1, 3);imprimir(vetor2, 5);return 0;

}

Page 5: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

#include <iostream>using namespace std;

float calcula_media(float [], int);

int main (){int tam;float media, notas[200];

cout << "Qual o tamanho da turma? "; cin >> tam;

cout << "Entre com as notas dos alunos: ";for(int i = 0; i < tam; i++)

cin >> notas[i];

media = calcula_media(notas, tam);cout << "A media eh: " << media << endl;

return 0;}

float calcula_media(float notas[], int tamanho){float media = 0;for(int i = 0; i < tamanho; i++)

media += notas[i];media = media/tamanho;return media;

}

Page 6: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Vetores locais a funções

• Como fazer uma função que recebe dois vetores de tamanho 10 como parâmetros e calcula o vetor soma?

O espaço para guardar o resultado é alocado pela função chamadora. Assim, a função soma() recebe três vetores: dois com dados de entrada

(A e B) e um para armazenar o resultado (C)

void soma(int A[], int B[], int C[]){for(int i=0; i<10; i++)

C[i] = A[i]+B[i];}

Page 7: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Passando matrizes de duas dimensões

• Não importa quantas dimensões tem uma matriz, a passagem do endereço é feita de forma idêntica ao caso unidimensional

• Entretanto, a declaração da matriz na definição da função e no protótipo é feita da seguinte forma:

tipo nome [ ][número de colunas]

void funcao (int m[][4])

Page 8: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Passando matrizes de duas dimensões

• O tamanho da segunda dimensão deve sempre ser informado para que a função possa determinar o endereço dos elementos da matriz.

• Ao tentarmos acessar o elemento A[2][3], a função determinante() sabe que o seu endereço é A+2*4+3

int determinante(int A[][4]);

Observação: Como não há verificação de limites, é importante fornecer a primeira dimensão da matriz para que a função não acesse posições inválidas.

Page 9: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Exercício 1

Escreva uma função de protótipo:

void mid(char origem[], char dest[], int inicio, int n);

que copie os n caracteres a partir da posição início da string origem na string dest.

Page 10: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Exercício 2(a) Faça uma função MAX que recebe como entrada um inteiro n, uma matrizinteira Anxn e devolve três inteiros: k, Lin e Col. O inteiro k é o maior elementode A e é igual a A[Lin,Col].Exemplo:

Se o elemento máximo ocorrer mais de uma vez, indique em Lin e Colqualquer uma das possíveis posições.

(b) Faça um programa que, dado um inteiro n e uma matriz quadrada deordem n, cujos elementos são todos inteiros positivos, imprime uma tabelaonde os elementos são listados em ordem decrescente, acompanhados daindicação de linha e coluna a que pertencem. Havendo repetições deelementos na matriz, a ordem é irrelevante. Utilize obrigatoriamente afunção da parte (a).

Page 11: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Funções Recursivas

Definição

Elementos

Exemplos

Exercícios em Sala

Page 12: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Funções Recursivas

Uma função recursiva é uma função que se refere a si própria. Isto é, uma função é recursiva quando dentro dela está presente uma instrução de chamada a ela própria.

Int funcaoa(int b){int x;x = b-1;if(x==0)

return 1;else

return funcaoa(x);}

Page 13: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Funções RecursivasAlocação de memória

Quando uma função é chamada, memória é alocada para todos os seus parâmetros e variáveis locais.

Toda função ativa tem memória na pilha(com a função atual no topo)

Quando uma função termina a memória é desalocada

Ex: main() chamaf(),

f() chama g()

g() chama recursivamente g()

main()

f()

g()

g()

Page 14: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Funções Recursivas

Em todas as funções recursivas existe:

Uma condição básica (ou mais) cujo resultado é imediatamente conhecido.

Por exemplo: fatorial(0) = fatorial(1) = 1

Um passo recursivo em que se tenta resolver um sub-problema do problema inicial.

Por exemplo: fatorial(n) = n * fatorial(n-1)

Page 15: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Função Fatorial Recursiva#include <iostream>Using namespace std;

int fatorial (int);

int main(){int n;cout << “Entre com um numero positivo:";cin >> n;cout <<“Fatorial de “ << n <<“ = ”<< fatorial(n);return 0;

}

int fatorial (int num){if (num == 1 || num == 0) return 1;else return num * fatorial (num-1);

}

Page 16: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Função Fatorial Recursiva

fatorial(6)

6 * fatorial(5)

6 * 5 * fatorial(4)

6 * 5 * 4 * fatorial(3)

6 * 5 * 4 * 3 * fatorial(2)

6 * 5 * 4 * 3 * 2 * fatorial(1)

6 * 5 * 4 * 3 * 2 * 1

6 * 5 * 4 * 3 * 2

6 * 5 * 4 * 6

6 * 5 * 24

6 * 120

720

Page 17: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Função Fatorial Iterativa#include <iostream>Using namespace std;

int fatorial (int);

int main(){int n;cout << “Entre com um numero positivo:";cin >> n;cout <<“Fatorial de “ << n <<“ = ”<< fatorial(n);return 0;

}

int fatorial (int num){

int fat = 1;for (int i=2; i <=num; i++) fat = fat * i;return fat;

}

Page 18: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Exemplo: série de Fibonnaci

A série de Fibonacci é dada por:

1, 1, 2, 3, 5, 8, 13, 21, ...

2 para),2fib()1fib(2 para,11 para,1

)fib(nnnnn

n

Page 19: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Exemplo: série de Fibonnaci

// calcula o n-ésimo número de Fibonacci.

int fib( int n )

{

if( n==1 || n==2 )

return 1;

else

return fib(n-1) + fib(n-2);

}

Page 20: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Funções RecursivasEm geral, a todo procedimento recursivo corresponde um outro não recursivo(iterativo).

Vantagens da recursão:

algoritmos mais concisos;

simplifica a solução de alguns problemas;

facilidade de implementação e compreensão;

algoritmos de divisão e conquista (Quicksort, etc)

Desvantagens:tendem a ser mais lentos e consumir mais memória

erros de implementação podem levar a estouro de memória.

Page 21: Programação científica C++ - ncdd.com.br+/slide8.pdf · Slide 8 NIELSEN CASTELO DAMASCENO. Matrizes como argumento de funções • O nome de uma matriz (sem os colchetes) representa

Eliminação de laçosFaça um programa para encontrar o maior elemento de um vetor semutilizar laço.

O programa deverá ter 3 funções recursivas: A primeira será utilizada para o usuário digitar todos os elementosdo vetor;A segunda apresentará na tela todos os elementos armazenadosno vetor;A terceira retornará o maior elemento do vetor armazenado.