Post on 13-Feb-2019
Programação científica C++
Slide 8
NIELSEN CASTELO DAMASCENO
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 [ ]
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
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;
}
#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;
}
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];}
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])
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.
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.
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).
Funções Recursivas
Definição
Elementos
Exemplos
Exercícios em Sala
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);}
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()
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)
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);
}
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
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;
}
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
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);
}
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.
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.