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
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,
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);
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
Procedimentos e Funções
Solução:
void troca(int* A, int* B) {
int aux;
Procedimentos e Funções
Solução:
void SomaEmA(int* A, int B) {
Procedimentos e Funções
Solução:
void SomaProduto(int A, int B, int* soma, int*
prod) {
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
Procedimentos e Funções
Solução:
void ImprimeVetor(int V[100], int N) {
int i;
for (i = 0; i < N; 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
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
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
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; }
Procedimentos e Funções
Problema :
E se os vetores do exercício anterior estivessem
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.
Procedimentos e Funções
Busca Binária :
X = 3; esq = 0; dir = N – 1; meio = (esq + dir)/2;
1 2 7 15 23 56 57 58 70 72 78
esq meio dir
1 2 7 15 23 56 57 58 70 72 78
esq meio dir
1 2 7 15 23 56 57 58 70 72 78
esq meio dir
1 2 7 15 23 56 57 58 70 72 78
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;
Procedimentos e Funções
Problema :
Não há como garantir que o usuário sempre digitará um vetor ordenado. E agora? Como devemos fazer
Procedimentos e Funções
Exercício :
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
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :
3 20 78 15 56 23 2 1 19 28 6
3 20 78 15 56 23 2 6 19 28
1
N = 11; M = 0;
N = 10; M = 1;
3 20 78 15 56 23 28 6 19
58 2
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 :
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.
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :
2 15 1 3 6 23 57
2
2 15 1 3 6 23 57
2 15
M = 0; i = 0;
M = 1; i = 1;
2 15
2 15 1 3 6 23 57
2 15 1
M = 2; i = 2;
2 1 15
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :
2 15 1 3 6 23 57
1 2 15 3
M = 3; i = 3;
1 2 3 15
1 2 3 15
2 15 1 3 6 23 57
1 2 3 15 6
M = 4; i = 4;
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 :
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
Procedimentos e Funções
Ordenação por Troca (Bubble Sort) :
57 30 8 15 56 23 2
30 57 8 15 56 23 2
i = 0;
i = 1;
30 8 57 15 56 23 2
i = 2;
30 8 15 56 23 2 57 i = 0;
30 8 15 57 56 23 2
i = 3;
30 8 15 56 57 23 2
i = 4;
30 8 15 56 23 57 2
i = 5;
30 8 15 56 23 2 57
i = 6;
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] ); }