Subprogramas Prof. Carlos Lopes
Motivação Escreva um programa C capaz de calcular a combinação de n valores tomados p a p. Para realizar este cálculo, você deverá utilizar a seguinte fórmula: C n n! p = p! (n-p)! com n p
Descrição do Programa #include <stdio.h> int main(){ int i,n,p,fatn=1,fatp=1,fatnp=1,c; //leitura de n printf("digite um valor para n:"); scanf("%d",&n); //leitura de p printf("digite um valor para p:"); scanf("%d",&p); // calculo de fatorial de n for(i=2;i<=n;i++){ fatn *=i; for(i=2;i<=p;i++){ fatp *=i; for(i=2;i<=(n-p);i++){ fatnp *=i; c=fatn/(fatp*fatnp); printf("valor de c: %d\n",c); return 0;
Uma outra abordagem Suponha que tivéssemos um código fatorial já implementado (assim como temos sqrt, sin, cos etc). Como o programa seria reescrito?
Reescrevendo o Programa Algoritmo Usando o Fatorial como Função #include <stdio.h> int main(){ int n,p,c; //leitura de n printf("digite um valor para n:"); scanf("%d",&n); //leitura de p printf("digite um valor para p:"); scanf("%d",&p); c=fatorial(n)/(fatorial(p)*fatorial(n-p)); printf("valor de c: %d\n",c); return 0;
Como Criar uma Função em C? Forma Geral de Definição de uma função: <tipo do valor_retornado> <nome_função> (<lista de parâmetros>){ <declarações> <comandos>
Criando a Função Fatorial int fatorial(int n){ int i,fat=1; if (n == 0 n == 1) return 1; else for (i=2;i<=n;i++) fat *=i;
Exemplo de Programa com Função #include <stdio.h> int fatorial(int n){ int i,fat=1; if (n == 0 n == 1) return 1; else for (i=2;i<=n;i++) fat *=i; int main(){ int n,p,c; //leitura de n printf("digite um valor para n:"); scanf("%d",&n); //leitura de p printf("digite um valor para p:"); scanf("%d",&p); c=fatorial(n)/(fatorial(p)*fatorial(n-p)); printf("valor de c: %d\n",c); return 0;
Funcionamento do Programa com Função #include <stdio.h> int fatorial(int n){ int i,fat=1; if (n == 0 n == 1) return 1; else for (i=2;i<=n;i++) fat *=i; return fat; int main(){ int n,p,c; //leitura de n printf("digite um valor para n:"); scanf("%d",&n); //leitura de p printf("digite um valor para p:"); scanf("%d",&p); c=fatorial(n)/(fatorial(p)*fatorial(n-p)); printf("valor de c: %d\n",c); return 0; Depois da execução do comando return volta-se a executar a instrução da função main que sucede a a chamada da função Quando a função é chamada suas instruções são executadas.
Declaração de Funções Funções devem ser definidas ou declaradas antes de serem utilizadas, ou seja, antes da cláusula main. A declaração apenas indica a assinatura ou protótipo da função: <tipo_valor_retornado> <nome_função>(<declaração_parâmetros>);
Programa com Declaração de Função #include <stdio.h> int fatorial(int n); int main(){ int n,p,c; Declaração da função //leitura de n printf("digite um valor para n:"); scanf("%d",&n); //leitura de p printf("digite um valor para p:"); scanf("%d",&p); c=fatorial(n)/(fatorial(p)*fatorial(n-p)); printf("valor de c: %d\n",c); return 0; int fatorial(int n){ int i,fat=1; if (n == 0 n == 1) return 1; else for (i=2;i<=n;i++) fat *=i; return fat;
Subprogramação Funções são também conhecidas como subprogramas; A subprogramação é uma ferramenta que contribui com a tarefa de programar: Favorecendo a estruturação do programa; Facilitando a correção do programa; Facilitando a modificação do programa; Melhorando a legibilidade do programa; Divisão do problema a ser resolvido em partes (modularização);
Exercícios Crie um programa que some dois números. O programa deverá conter uma função que recebe como parâmetro dois inteiros e devolve um inteiro que é o resultado da soma. O programa principal deverá fazer a leitura dos dois inteiros que o usuário digitar e imprimir o resultado da soma.permita que o programa calcule a multiplicação por somas. Escrever um programa C que verifique se um número inteiro é par. O programa principal deverá fazer a leitura do número e imprimir a mensagem especificando se o número é par ou não.
Escopo de Variáveis Funções também estão sujeitas ao escopo das variáveis O escopo é o conjunto de regras que determinam o uso e a validade de variáveis nas diversas partes do programa. Variáveis Locais, variáveis Globais e Parâmetros formais.
Variáveis Locais Variáveis locais são aquelas que só têm validade dentro do bloco no qual são declaradas. Um bloco começa quando abrimos uma chave e termina quando fechamos a chave. Exemplo: variáveis declaradas dentro da função são variáveis locais.
Parâmetros Formais Parâmetros formais são declarados como sendo as entradas de uma função. O parâmetro formal é uma variável local da função. Exemplo: int fatorial(int n); n é um parâmetro formal
Variáveis Globais Variáveis globais são declaradas fora de todas as funções do programa. Elas são conhecidas e podem ser alteradas por todas as funções do programa. Quando uma função tem uma variável local com o mesmo nome de uma variável global a função dará preferência à variável local.
Passagem de Parâmetros Em C os argumentos para uma função são sempre passados por valor, ou seja, uma cópia do argumento é feita e passada para a função. Mesmo que esse valor mude dentro da função, nada acontece com o valor de fora da função.
Passagem de Parâmetros include <stdio.h> float sqr (float num); Existem duas variáveis locais num e elas são independentes int main (){ float num, sq; printf ("Entre com um numero: "); scanf ("%f", &num); sq = sqr(num); printf ("\n\n O numero original e: %f\n", num); printf ("O seu quadrado vale: %f\n", sq); return 0; float sqr (float num){ num = num*num; return num;
Passagem de Parâmetros Quando se quer que o valor da variável mude dentro da função, usa-se passagem de parâmetros por referência. Neste tipo de chamada, não se passa para a função os valores das variáveis,mas sim suas referências (endereço das variáveis na memória); Utilizando o endereço da variável, qualquer alteração que a variável sofra dentro da função será refletida fora da função.
Passagem por Referência Para passar um parâmetro por referência, usa-se o operador * na frente do nome da variável durante a declaração. Ex.: float sqr (float *num); Ao se chamar a função, é necessário utilizar agora o operador &. Ex.: sq = sqr(&num);
Diferença entre * e & * Declara um ponteiro. Ex: int *x; Devolve o conteúdo para onde o ponteiro aponta. Ex: int y = *x; & Devolve o endereço onde uma variável está guardada na memória. Ex: int *x = &y;
Diferença entre * e & (cont.) #include <stdio.h> #include <stdlib.h> int main (){ int x; int *y; int z; x = 10; y = &x; z = *y; printf("%d\n",x); printf("%d\n",y); printf("%d\n",*y); printf("%d\n",z); return 0;
include <stdio.h> float sqr (float *num); Passagem de Parâmetros: exemplo int main (){ float num, sq; printf ("Entre com um numero: "); scanf ("%f", &num); sq = sqr(&num); printf ("\n\n O numero original e: %f\n", num); printf ("O seu quadrado vale: %f\n", sq); return 0; float sqr (float *num){ *num = (*num)*(*num); return *num;
Exercícios Crie uma função que troque o valor de dois números inteiros passados por referência.
Vetores como Parâmetros Quando vamos passar um vetor (referência) como argumento de uma função, podemos declarar a função de três maneiras equivalentes. int m [5]; void imprime (int m[5]); ou void imprime (int m[]); ou void imprime (int*m);
Vetores como Parâmetros (cont.) void imprime (int *m){ int i; for (i=0; i< 5;i++) printf ("%d \n", m[i]); int main (){ int n[5] = {1,2,3,4,5; imprime(n); return 0;
Exercícios Faça uma função em C que receba um conjunto de valores e retorne o maior entre eles Faça uma função que recebe um vetor X(15) de inteiros, por parâmetro, e retorna a quantidade de valores pares em X Faça uma função que recebe, por parâmetro uma matriz A(6,6) e retorna a soma dos elementos da sua diagonal principal