Programação de Computadores I - 2019/2
CEFET-MG Funções
Slides adaptados da Profª. Cristina Duarte Murta
Introdução às funções
Exemplo de programa:
Escrever um programa que imprima o seguinte:
*************************
Números entre 1 e 5
*************************
1 2 3 4 5
*************************
20 asteriscos
Introdução às funções
//demonstra a necessidade de definição de funções
#include<stdio.h>
int main() {
int i;
for (i=1; i<=20; i++) putchar('*');
putchar('\n');
puts("Números entre 1 e 5");
for (i=1; i<=20; i++) putchar('*');
putchar('\n');
for (i=1; i<=5; i++) printf("%d\n",i);
for (i=1; i<=20; i++) putchar('*');
putchar('\n');
}
Introdução às funções
//demonstra a necessidade de definição de funções
#include<stdio.h>
int main() {
int i;
for (i=1; i<=20; i++) putchar('*');
putchar('\n');
puts("Números entre 1 e 5");
for (i=1; i<=20; i++) putchar('*');
putchar('\n');
for (i=1; i<=5; i++) printf("%d\n",i);
for (i=1; i<=20; i++) putchar('*');
putchar('\n');
}
código repetido
O ideal seria não precisar repetir o código
e ainda assim obter o mesmo
efeito!
Solução: funções
Funções
pequeno trecho de código que faz uma única tarefa
recebe um nome específico (identificador)
maneira conveniente de encapsular uma computação
funções bem projetadas podem ser usadas sem preocuparmos com sua implementação
precisamos saber O QUE a função faz, não COMO ela faz
muitas linguagens oferecem o conceito de função
outros nomes para funções: procedimentos, subrotinas
Tipos de funções
funções pré-definidas pela linguagem
funções da biblioteca
definidas nos arquivos da biblioteca da linguagem
funções definidas pelo programador
escritas pelo programador nos programas...
Todo programa em C deve possuir uma função chamada main.
Funções
Objetivos da definição de funções
reduzir a complexidade de um programa
elaborar a solução em partes pequenas e bem definidas
uma tarefa complexa é dividida em funções
evitar a repetição de código ao longo do programa
diminui o tamanho do código
menos erros, menor custo, menor tempo de programação
reutilizar código
código já testado, sem erros => custo menor de programação e maior confiabilidade
essencial!
Características de uma função - parte I
uma função deve realizar uma única tarefa bem definida
toda função tem um nome único
serve para que a função seja invocada (chamada)
uma função pode ser chamada a partir de outras funções
por exemplo, a partir de main ( )
uma função deve ser programada de forma a fazer exatamente
o que se espera dela, sem efeitos colaterais
●
Características de uma função – parte II
o código da função deve ser independente do programa e deve ser tão genérico quanto possível
para que possa ser utilizado em outros programas
uma função pode receber parâmetros de execução para se adaptar a situações distintas e ser genérica
uma função pode retornar um valor como resultado de seu trabalho
comando return
Sintaxe das funções em C
Especificador_de_tipo nome_da_função ( lista de parâmetros ) { corpo da função
}
Especificador_de_tipo - especifica o tipo de valor que o comando return da função devolve, podendo ser qualquer tipo válido
nome_da_função - é um identificador escolhido pelo programador que não se deve repetir; segue as mesmas regras para definição de identificadores
lista de parâmetros - é uma lista de nomes e tipos de variáveis separadas por vírgulas, que recebem os valores dos argumentos quando a função é chamada
Corpo da função
Corpo da função: segue o cabeçalho da função e é escrito entre chaves { }
é constituído por instruções em C de acordo com a sintaxe da linguagem
em C não se pode definir funções dentro de funções
portanto, todas as funções estão no mesmo nível
Como é a execução de uma função:
sempre que uma função é invocada pelo programa, os comandos do corpo da função são executados, um a um, sequencialmente, até terminar o corpo da função ou até ser encontrada uma instrução return
Comando return: finaliza imediatamente a função
Funções: voltando ao exemplo inicial
Resolução do programa anterior recorrendo às funções
#include<stdio.h>
void linha() {
int i;
for (i=1; i<=20; i++) putchar('*');
putchar('\n');
}
int main(){
int i;
linha();
puts("Números entre 1 e 5");
linha();
for (i=1; i<=5; i++) printf("%d\n",i);
linha();
}
definição da função linha()
chamadas da
função
linha ()
Execução de uma função: como funciona
o código de uma função só é executado quando a função é chamada no programa
quando a função é chamada, a execução do programa "salta" para o início da função
as instruções da função são executadas uma a uma, sequencialmente
quando a execução da função termina, a execução do programa continua no comando seguinte à chamada da função
ao chamar a função, o programa pode enviar argumentos
a função receberá estes valores em seus parâmetros
Funções – tipo de retorno e parâmetros
tipo de retorno:
boa prática de programação: especificar SEMPRE o tipo de retorno
uma função pode não ter parâmetros
neste caso a lista de parâmetros é vazia
todos os parâmetros da função devem incluir o tipo e o nome da
variável
Passagem de parâmetros à função
//programa que define função abs
#include <stdio.h>
int abs (int x) { //x é o número a ser analisado return ( (x < 0 ) ? x : x );
}
int main ( ) { int num;
printf ("Digite um valor:\n");
scanf ("%d", &num );
printf ("Valor absoluto de %d é %d\n",num,abs(num));
}
Programa para imprimir o valor absoluto de um número
Chamada da função abs()
Parâmetros e argumentos
comunicação de uma função com o programa ou com outra função:
feita através de argumentos e parâmetros
a função define os parâmetros que pode receber
número e tipo
quem chama a função passa os argumentos
um argumento para cada parâmetro definido
e do mesmo tipo!
passagem de parâmetros é por valor:
o valor do argumento é copiado para o parâmetro
o parâmetro comporta-se como uma variável local
Parâmetros e argumentos
Exemplo
float exemplo (int i, char ch, float valor, double pi);
int main( ) { int a;
char continua;
float valor;
double pi;
float result;
...
result = exemplo (a, continua, valor, pi);
...
}
variáveis locais à função main ()
parâmetros:
variáveis locais à função exemplo ()
argumentos passados de main() para exemplo()
Comando return
permite a atribuição de uma expressão a uma função
força o retorno imediato ao ponto de chamada da função
Ex:
float potencia (float base, int expoente) { int i;
float resultado = 1;
if (expoente == 0) return 1;
for (i = 1; i <= expoente; i++) resultado *= base
return resultado;
}
Funções que não retornam valores
o tipo de retorno é void
também conhecidas como procedimentos
#include <stdio.h>
void desenha();
int main() { desenha();
printf ("1a. funcao\n");
desenha();
}
void desenha() { int i;
for (i = 0; i <= 10; i++) printf ("*");
printf("\n");
}
***********
1a. funcao
***********
saída
Variáveis globais e locais
variáveis locais
são definidas dentro de uma função
são conhecidas apenas dentro do bloco da função
portanto, só podem ser usadas dentro do próprio bloco
são criadas quando são declaradas
são destruídas no final da execução da função: variáveis automáticas
variáveis globais
são variáveis criadas (definidas) fora de qualquer função
são conhecidas em todo o arquivo, a partir do ponto de definição
evite ao máximo o uso de variáveis globais!!
são complexas de administrar pois podem ser acessadas por qualquer função!
Escopo de variáveis
ESCOPO: região do programa onde a variável é válida void desenha ( ){
int i, j; // variáveis locais a desenha . . .
}
void calcula ( ) {
int i, j; //variáveis locais a calcula . . .
}
int main ( ) {
int a; //variável local a main desenha();
a = i; // erro de compilação . . .
}
i,j em desenha() são variáveis diferentes de
i,j em calcula()
Exercício: calcular a série
S(x, n) = x/1! + x
2/2! + x
3/3! + ... + x
n/ n!
#include <stdio.h>
float serie (float x, int n);
float potencia (float base, int expoente);
int fat (int n);
int main(){
float x;
int termos;
printf("Numero de termos: ");
scanf("%d", &termos);
printf("valor de X: ");
scanf("%f", &x);
printf("O valor da série = %f\n ", serie(x, termos));
}
Continuação ...
float serie (float x, int n){
int i;
float resultado = 0;
for (i = 1; i <= n; i++)
resultado += (potencia(x,i)/fat(i));
return resultado;
}
float potencia (float base, int expoente){
int i;
float resultado = 1;
if (expoente == 0) return 1;
for (i = 1; i <= expoente; i++) resultado *= base;
return resultado;
}
int fat (int n){
int i, resultado = 1;
for ( i = 1; i <= n; i ++) resultado *= i;
return resultado;
}
Importante:
observem que a impressão dos resultados está apenas
em main () !
Não há NENHUM printf() nem
scanf() nas funções, apenas
cálculos...
Protótipos de função e organização do programa
protótipo de uma função
corresponde a seu cabeçalho seguido de ;
declara a função ao compilador, seus parâmetros e tipo de retorno
organização do programa
boa prática de programação
declarar todas as funções após os #include e #define
e antes do main ( )