Procedimentos e Funções Problema 1: Escreva um procedimento ou função em linguagem C que troca dois valores A e B. Problema 2: Escreva um procedimento ou função em linguagem C que retorna a soma e o produto de dois valores A e B. Procedimentos e Funções Passagem de Parâmetros: • Passagem por Valor: Quando a função é chamada o parâmetro passado por valor é copiado, ou seja, o valor da variável utilizada como parâmetro não é alterado. • Passagem por Referência: Quando a função é chamada o endereço do parâmetro passado por referência é atribuído à um ponteiro, ou seja, qualquer alteração no conteúdo apontado será refletida no conteúdo da variável utilizada como parâmetro. Procedimentos e Funções Exemplo : void FuncaoInutil(int A, int* B) { A = 1; *B = 2; } int main() { int X = 0, Y = 0; FuncaoInutil(X, &Y); printf(“%d %d”, X, Y); return 0; } Procedimentos e Funções Exercício 1: Escreva um procedimento ou função em linguagem C que troca dois valores A e B. Exercício 2: Escreva um procedimento ou função em linguagem C que recebe dois valores A e B, calcula a soma e guarda o resultado em A. Exercício 3: Escreva um procedimento ou função em linguagem C que retorna a soma e o produto de dois valores A e B. Procedimentos e Funções Solução: void troca(int* A, int* B) { int aux; aux = *A; *A = *B; *B = aux; } Procedimentos e Funções Solução: void SomaEmA(int* A, int B) { *A = *A + B; } Procedimentos e Funções Solução: void SomaProduto(int A, int B, int* soma, int* prod) { *soma = A + B; *prod = A * B; } Procedimentos e Funções Exercício : Escreva um procedimento ou função em linguagem C que recebe um vetor de números inteiros V de tamanho 100, e um inteiro N, em seguida você deve imprimir os N primeiros valores do vetor. Procedimentos e Funções Solução: void ImprimeVetor(int V[100], int N) { int i; for (i = 0; i < N; i++) printf(“%d ”, V[i]); } Procedimentos e Funções Exercício : Escreva um procedimento ou função em linguagem C que recebe um vetor de números inteiros V de tamanho 100, e um inteiro N por referência, em seguida você deve ler valores inteiros da entrada até que o usuário digite -1. Ao final todos os valores diferentes de -1 devem estar armazenados em V e o total de valores deve estar em N. Procedimentos e Funções Solução: void LeVetor(int V[100], int* N) { int aux; *N = 0; scanf(“%d”, &aux); while (aux != -1) { V[*N] = aux; (*N)++; scanf(“%d”, &aux); } } Procedimentos e Funções Exercício : Escreva uma função em linguagem C que recebe um vetor de números inteiros V de tamanho 100, um inteiro N que contém o número de posições preenchidas de V, e um número inteiro X. A sua função deve retornar 1 se V contém o valor X e zero caso contrário. Procedimentos e Funções Algoritmo : • • • • • Percorra todos os valores do Vetor Compare cada valor com o número procurado Se um dos valores for igual então retorne 1 Senão continue procurando Se chegar ao fim da busca retorne zero, porque o valor não foi encontrado. Procedimentos e Funções Busca Linear: int BuscaLinear(int V[100], int N, int X) { int i; for (i = 0; i < N; i++) { if( V[i] == X ) return 1; } return 0; } Procedimentos e Funções Problema : E se os vetores do exercício anterior estivessem sempre ordenados? Seria necessário verificar todos os elementos para determinar se X está em V? Procedimentos e Funções Algoritmo : • • • • • • • • Marque os extremos direito (dir) e esquerdo (esq) do vetor. Compare o valor procurado com o valor central (meio) Se for igual retorne saia do laço. Senão, se o valor for maior que o valor de meio, então esq recebe meio mais 1. Senão dir recebe meio menos 1. Atualize o valor do meio. Repita enquanto esq for menor que dir. Ao sair do laço se valor for igual a meio retorne 1, senão retorne 0. Procedimentos e Funções Busca Binária : X = 3; esq = 0; dir = N – 1; meio = (esq + dir)/2; esq 1 meio 2 15 meio esq 1 7 2 23 dir 56 57 58 70 72 78 dir 7 15 23 56 57 58 70 72 78 7 15 23 56 57 58 70 72 78 7 15 23 56 57 58 70 72 78 esq meio dir 1 2 esq meio dir 1 2 Procedimentos e Funções Busca Binária: esq = 0; dir = N - 1; meio = (esq + dir) / 2; while (esq < dir) { if ( X == V[meio] ) break; else if ( X > V[meio] ) esq = meio + 1; else dir = meio - 1; meio = (esq + dir) / 2; } if ( X == V[meio] ) return 1; return 0; Procedimentos e Funções Problema : Não há como garantir que o usuário sempre digitará um vetor ordenado. E agora? Como devemos fazer para que seja possível utilizar a busca binária sempre? Procedimentos e Funções Exercício : Escreva uma função em linguagem C que retorna a posição no vetor (não é o valor) do menor elemento. A função recebe como parâmetros um vetor V de 100 elementos e um inteiro N que indica o número de elementos de V. Procedimentos e Funções Solução: int MenorElemento(int V[100], int N) { int i, menor = 0; for(i = 1; i < N; i++) if(V[i] < V[maior]) menor = i; return menor; } Procedimentos e Funções Algoritmo : • • Remova o menor elemento do vetor (V) e insira na primeira posição livre do vetor auxiliar (Ordenado). Repita este processo até acabarem os elementos do vetor V. Procedimentos e Funções Ordenação por Seleção (Selection Sort) : N = 11; M = 0; 3 20 78 15 56 23 2 1 19 28 78 15 56 23 2 6 19 28 78 15 56 23 28 6 19 N = 10; M = 1; 3 20 1 N = 9; M = 2; 3 20 58 2 6 Procedimentos e Funções Ordenação por Seleção (Selection Sort) : void SelectionSort(int V[100], int N, int Ordenado[100]) { int M = 0, i; while(N > 0) { i = MenorElemento(V, N); Ordenado[M] = V[i]; V[i] = V[N - 1]; N--; M++; } } Procedimentos e Funções Problema : Como ordenar um vetor sem alterar os dados do vetor original V ? Procedimentos e Funções Algoritmo : • • • • • Percorra o vetor (V) Para cada elemento (aux) de V, insira uma cópia de aux na primeira posição livre do vetor auxiliar (Ordenado). Se o valor de aux for menor que do elemento anterior, então troque aux com o anterior. Senão saia do laço. Repita as trocas até que aux chegue na primeira posição. Procedimentos e Funções Ordenação por Inserção (Insertion Sort) : M = 0; i = 0; 2 15 1 3 6 23 57 2 15 1 3 6 23 57 2 15 1 3 6 23 57 2 M = 1; i = 1; 2 15 2 15 M = 2; i = 2; 2 15 1 2 1 15 1 2 15 Procedimentos e Funções Ordenação por Inserção (Insertion Sort) : M = 3; i = 3; 2 15 1 3 6 23 57 3 6 23 57 1 2 15 3 1 2 3 15 1 2 3 15 2 15 1 M = 4; i = 4; 1 2 3 15 6 1 2 3 6 15 1 2 3 6 15 Procedimentos e Funções Solução : void InsertionSort( int V[100], int N, int Ordenado[100]) { int M = 0, i, j, k; for (i = 0; i < N; i++) { Ordenado[M] = V[i]; k = M; for (j = M - 1; j >= 0; j--) if (Ordenado[k] < Ordenado[j] ) Troca(&Ordenado[k--], &Ordenado[j]); else break; M++; } } Procedimentos e Funções Problema : Como ordenar um vetor sem o uso de um vetor auxiliar (Ordenado) ? Procedimentos e Funções Algoritmo : • • • • • • Para cada elemento i do vetor V. Se o valor de i + 1 for menor que i Então troque i + 1 com i. Senão incremente o valor de i. Repita este processo até i chegue ao fim do vetor. Repita todo o processo até que todos os elementos do vetor tenham sido comparados. Procedimentos e Funções Ordenação por Troca (Bubble Sort) : i = 0; 57 30 8 15 56 23 2 i = 1; 30 57 8 15 56 23 2 i = 2; 30 8 57 15 56 23 2 i = 3; 30 8 15 57 56 23 2 i = 4; 30 8 15 56 57 23 2 i = 5; 30 8 15 56 23 57 2 i = 6; 30 8 15 56 23 2 57 i = 0; 30 8 15 56 23 2 57 i = 1; 8 30 15 56 23 2 57 Procedimentos e Funções Solução : void BubbleSort( int V[100], int N) { int j, i; for ( i = 0; i < N - 1; i++ ) { for ( j = 0; j < N - 1; j++ ) if ( V[j] < V[j + 1] ) Troca( &V[j], &V[j + 1] ); } }