www.sousavarela.co.cc
UNIVERSIDADE GREGÓRIO SEMEDO
Faculdade de Engenharia e Novas Tecnologias
Linguagem C
Funções
Uma função é um conjunto de instruções desenhadas para cumprir uma tarefa particular
Funções dividem grandes tarefas de computação em tarefas menores
Permitem que todos os outros programadores C a utilizem em seu programas
Funções apropriadas podem ocultar detalhes de operações de parte do programa
o
Ex: printf()
Evita que o programador tenha que escrever o mesmo código repetidas vezes
O grande princípio de linguagens estruturadas é o de dividir um programa em funções.
www.sousavarela.co.cc
Você já escreveu programas que chamam funções
o
printf(), scanf(), getchar()
Outras funções podem ser escritas por nós
#include <stdio.h> #include <stdlib.h>
int main()
{
int n;
printf(“Digite um numero: "); scanf("%d", &n);
printf(“O quadrado do numero e %d.\n“, (n*n)); getchar ();
return 0;
}
Chamando uma função
Um programa pode conter uma ou mais funções, das quais uma deve ser
main()
/* Celsius.C */
/* Mostra a escrita da função celsius() */
#include <stdio.h> #include <stdlib.h>
float celsius(float); /* Protótipo ou declaração da função */ int main()
{
float c, f;
printf("Digite a temperatura em graus Fahrenheit: "); scanf("%f", &f);
c = celsius(f); /* Chamada à função */
printf("Celsius = %.2f\n", c);
printf("Pressione [ENTER] para finalizar.");
getchar(); getchar(); return 0;
}
/* celsius() */
/* Definição da função */
float celsius( float fahr) { float c; c = (fahr - 32.0) * 5.0/9.0; return c; }
Funções simples
www.sousavarela.co.cc
Um programa pode conter uma ou mais funções, das quais uma deve ser
main()
/* Celsius.C */
/* Mostra a escrita da função celsius() */
#include <stdio.h> #include <stdlib.h>
float celsius(float); /* Protótipo ou declaração da função */ int main()
{
float c, f;
printf("Digite a temperatura em graus Fahrenheit: "); scanf("%f", &f);
c = celsius(f); /* Chamada à função */
printf("Celsius = %.2f\n", c);
printf("Pressione [ENTER] para finalizar.");
getchar(); getchar(); return 0;
}
/* celsius() */
/* Definição da função */
float celsius( float fahr) { float c; c = (fahr - 32.0) * 5.0/9.0; return c; }
Funções simples
Página 5Uma função não pode ser chamada sem antes ter sido declarada A declaração de uma função é dita protótipo da função
o Instrução geralmente alocada no início do programa
o Estabelece o tipo da função e os argumentos que ele recebe
O protótipo da função permite que o compilador verifique a sintaxe de chamada à função.
float celsius(float);
Essa declaração informa que a função de nome celsius() é do tipo float e recebe como argumento um valor float
www.sousavarela.co.cc
Há duas formas de declarar funções em C
• A mais usada é denominada protótipo externo
o É escrita antes de qualquer função
o A declaração é feita uma única vez e é visível para todas as funções
do programa
• A outra forma é denominada protótipo local
o É escrita no corpo de todas as funções que a chamam, antes de sua
chamada
Protótipo externo e local
/* Celsius1.C */
/* Mostra a escrita da função celsius() */ #include <stdio.h>
#include <stdlib.h>
int main()
{
float celsius(float); /* Protótipo local */
float c, f;
printf("Digite a temperatura em graus Fahrenheit: ");
scanf("%f", &f);
c = celsius(f); /* Chamada à função */
printf("Celsius = %.2f\n", c);
printf("Pressione [ENTER] para finalizar.");
getchar(); getchar();
return 0;
}
/* celsius() */
/* Definição da função */
float celsius( float fahr)
{
float c;
c = (fahr - 32.0) * 5.0/9.0;
return c;
www.sousavarela.co.cc
O tipo de uma função é definido pelo tipo de valor que ela retorna por meio do comando return
Os tipos de funções em C são os mesmos tipos que o das variáveis, excepto quando a função não retorna valor algum
•
void
O tipo de uma função é determinado pelo valor que ela retorna via comando RETURN, e não pelo tipo de argumentos que ela recebe
O tipo de uma função
O comando return termina a execução da função e retorna o controle para a instrução seguinte do código de chamada
Se, após a palavra return, houver uma expressão, o valor desta é retornado à função que chama
• Esse valor é convertido para o tipo da função, especificado no seu protótipo
A sintaxe de uma instrução return obedece uma das três formas
o return;
o return expressão; o return(expressão);
www.sousavarela.co.cc
Podemos eliminar a variável declarada no corpo da função celsius() e
colocar a expressão de cálculo directamente
/* celsius() */
/* Definição da função */
float celsius( float fahr) {
return(fahr - 32.0) * 5.0/9.0; }
Funções do tipo void podem ter um comando return desacompanhado de expressão
• Nesse caso, o comando return serve para terminar a execução da função
• Em funções do tipo void, o comando return não é obrigatório
• Um função sem comando return termina quando encontra a chame de fechamento (})
O comando RETURN
O valor de retorno de uma função é acessado, na instrução de
chamada, pelo nome da função de parênteses, contendo ou não
argumentos
c = celsius(f);
/* Chamada à função */
Esse valor pode, então, ser atribuído a uma variável ou fazer parte de
alguma expressão
www.sousavarela.co.cc Várias instruções return podem fazer parte de uma função, porém somente
uma será executada
/* Minusculo.C */
#include <stdio.h> #include <stdlib.h>
#include <conio.h> /* para getche() */
/* minusculo() */
/* converte para minusculo se for maiusculo */
unsigned char minusculo(unsigned char ch) {
if(ch >= 'A' && ch <= 'Z') /* se maiusculo ? */
return(ch + 'a'-'A'); /* devolve convertido */
else
return(ch); /* devolve sem converter*/
} int main() { unsigned char ch ; ch=getche(); /* le um caractere */ printf("%c", minusculo(ch));
printf("\nPressione [ENTER] para finalizar."); getchar();
return 0; }
Funções com mais de um comando RETURN
Vários valores podem ser passados para uma função como argumentos Entretanto, não é permitido o retorno de mais de um valor por meio do comando return
O comando return pode retornar somente
um único valor para a função que chama
Limitação do comando RETURN
www.sousavarela.co.cc
O código C que descreve o que a função faz é denominado definição
da função
Sua forma geral é a seguinte:
tipo nome (declaração dos parâmetros) {
instruções; }
A primeira linha é o cabeçalho da definição da função
A definição de qualquer função C começa com o nome do tipo da
função, o mesmo de seu protótipo
A definição de uma função
As variáveis que receberão as informações enviadas a uma função são chamadas
parâmetros
A função deve declarar essas variáveis entre parênteses, no cabeçalho de sua definição ou antes das chaves
Os parâmetros podem ser utilizados livremente no corpo da função
/* Outra sintaxe de declaração de parâmetros */
float celsius(fahr)
float fahr; /* Declaração de parâmetros */
{
return(fahr - 32.0) * 5.0/9.0; }
Variáveis que não fazem parte dos parâmetros de uma função não
podem ser declaradas em seu cabeçalho
www.sousavarela.co.cc
No exemplo anterior, a função cria uma nova variável para receber o valor passado Sua declaração indica que o valor enviado será armazenado na variável fahr, criada quando a função inicia sua execução e destruída quando ela termina
A função copia o valor enviado por main() na variável fahr, criada por ela. Isso se chama passagem de argumento por valor
No próximo exemplo, uma função recebe um número inteiro como argumento e retorna seu valor absoluto
Passagem de argumentos por valor
/* Abs.C */
#include <stdio.h> #include <stdlib.h>
int abs(int); /* protótipo */
int main()
{
int x=10;
printf("%d\t%d\t%d\n", abs(0), abs(-3), abs(x));
printf("Pressione [ENTER] para finalizar.");
getchar();
return 0;
}
/* abs() */
/* Calcula o valor absoluto de um número*/
int abs( int n)
{
return ( n > 0 ) ? n : -n;
}
www.sousavarela.co.cc
/* moldtext.C */
/* envolve um texto por uma moldura */
#include <stdio.h> #include <stdlib.h>
void linha(int); /* protótipo */
int main() {
linha(20);
printf("\xDB UM PROGRAMA EM C \xDB\n"); linha(20);
printf("Pressione [ENTER] para finalizar."); getchar();
return 0; }
/* linha() */
/* desenha uma linha solida na tela, 20 caracteres */
void linha(int n) { int j; for(j=1; j<=n; j++) printf("\xDB"); printf("\n"); }
Funções que retornam nada: tipo VOID
/* DoisBeep.C */
/* testa a funcao doisbeep */
#include <stdio.h> #include <stdlib.h> #include <conio.h>
void doisbeep(void); /* protótipo */
int main() {
doisbeep();
printf("Digite um caractere: "); getche();
doisbeep();
printf("\nPressione [ENTER] para finalizar."); getchar();
return 0; }
/* doisbeep() */
/* toca o auto-falante duas vezes */
void doisbeep() { int k; printf("\x7"); for(k=1;k<5000;k++); printf("\x7"); }
www.sousavarela.co.cc
As funções definidas antes de serem chamadas não necessitam de protótipo
/* Celsius3.C *//* Mostra a escrita da função celsius() */
#include <stdio.h> #include <stdlib.h>
/* celsius() */
/* Definição da função */
float celsius( float fahr) { float c; c = (fahr - 32.0) * 5.0/9.0; return c; } int main() { float c, f;
printf("Digite a temperatura em graus Fahrenheit: "); scanf("%f", &f);
c = celsius(f); /* Chamada à função */
printf("Celsius = %.2f\n", c);
printf("Pressione [ENTER] para finalizar."); getchar(); getchar();
return 0; }
Eliminando o protótipo de funções
Em linguagem C, se uma função for do tipo int, char ou void, não é obrigatória a sua declaração Se você omitir a declaração da função, a linguagem C assume
por padrão que a função é do tipo int #include <stdio.h>
#include <stdlib.h> main()
{
int x=10;
printf("%d\t%d\t%d\n", abs(0), abs(-3), abs(x)); printf("Pressione [ENTER] para finalizar.");
getchar(); return 0; }
/* abs() */
/* Calcula o valor absoluto de um número*/
abs( int n) {
return ( n > 0 ) ? n : -n; }
Eliminando o protótipo de funções do tipo
INT, CHAR e VOID
www.sousavarela.co.cc
/* moldtext.C */
/* envolve um texto por uma moldura */
#include <stdio.h> #include <stdlib.h> main() { linha(20); printf("\xDB UM PROGRAMA EM C \xDB\n"); linha(20);
printf("Pressione [ENTER] para finalizar."); getchar();
return 0; }
/* linha() */
/* desenha uma linha solida na tela, n caracteres */
linha(int n) { int j; for(j=1; j<=n; j++) printf("\xDB"); printf("\n"); }
Eliminando o protótipo de funções do tipo
INT, CHAR e VOID
Bons programadores escrevem os protótipo de todas as suas funções.
Eliminando o protótipo de funções do tipo
www.sousavarela.co.cc
Uma função do tipo não inteira deve, obrigatoriamente, ser declarada
/* Esfera.C *//* calcula a area da esfera */
#include <stdio.h> #include <stdlib.h>
const float PI=3.14159;
float area(float); /* protótipo */
int main() {
float raio;
printf("Digite o raio da esfera: "); scanf("%f",&raio);
printf("A area da esfera e' %.2f\n",area(raio)); printf("Pressione [ENTER] para finalizar.");
getchar(); getchar(); return 0;
}
/* area() */
/* retorna a area da esfera */
float area(float r) /* definicao da funcao */
{
return( 4 * PI * r * r); }
Calculando a Área de uma Esfera
/* Retangulos.C */
/* Desenha cômodos de uma casa */
#include <stdio.h> #include <stdlib.h>
void retangulo( int, int);/* protótipo */
int main() { printf("Sala\n"); retangulo(22,12); printf("Cozinha\n"); retangulo(16,16); printf("Banheiro\n"); retangulo(6,8); printf("Quarto\n"); retangulo(12,12); printf("\n");
printf("Tecle [ENTER] para finalizar."); getchar();
return 0; }
/* retangulo() */
/* Desenha um retângulo na tela */
void retangulo( int largura, int altura) { int j, k; largura /=2; altura /=4; for( j=1; j<= altura; j++) { printf("\t\t");
for(k=1; k <= largura; k++) printf("\xDB"); printf("\n");
www.sousavarela.co.cc
/* Minuts.C */
/* calcula a diferenca entre dois tempos */ /* solicita hora:minutos */
#include <stdio.h> #include <stdlib.h>
int minutos(int, int); /* protótipo */
int main() {
int minsl, mins2; int hora, min;
printf("Digite a primeira hora (hora:min): ");
scanf("%d:%d",&hora,&min); /* novo uso de scanf hh:mm */ minsl=minutos(hora, min);
printf("Digite a segunda hora (hora:min): "); scanf("%d:%d",&hora,&min);
mins2=minutos(hora, min);
printf("A diferenca e' %d minutos.",mins2-minsl); printf("\nTecle [ENTER] para finalizar.");
getchar(); getchar(); return 0;
}
/* minutos() */
/* retorna hora em minutos */
int minutos(int h, int m) {
return(h*60 + m); }
Horas e minutos – um novo uso de SCANF()
Você pode escrever quantas funções quiser em um programa Em C, não é permitido definir uma função dentro de outra As funções são módulos independentes
O exemplo a seguir modifica o programa moldtext.c
• Criaremos a função espacos() que imprime um número de espaços em branco
www.sousavarela.co.cc
/* Centraliza.C */
/* Centraliza um texto com moldura */
#include <stdio.h> #include <stdlib.h>
void linha(int); /* protótipo */
void espacos(int); /* protótipo */
int main() { espacos(30); linha(20); espacos(30); printf("\xDB UM PROGRAMA EM C \xDB\n"); espacos(30); linha(20);
printf("Tecle [ENTER] para finalizar."); getchar();
return 0; }
/* linha() */
/* desenha uma linha solida na tela, 20 caracteres */
void linha(int n) { int j; for(j=1; j<=n; j++) printf("\xDB"); printf("\n"); } /* espacos() */
/* Imprime espacos em branco */
void espacos(int n) {
int i;
for(i=0; i<n ; i++) printf(" "); }
Várias funções no mesmo programa
/* Multifunc.C */
/* Calcula a soma dos quadrados de dois números */
#include <stdio.h> #include <stdlib.h>
float somasqr(float, float); /* protótipo */ float sqr(float); /* protótipo */
float soma(float, float); /* protótipo */ int main()
{
float a,b;
printf("Digite dois numeros: "); scanf("%f%f", &a, &b);
printf("A soma dos quadrados e' %f\n" , somasqr(a,b)); printf("Tecle [ENTER] para finalizar.“ );
getchar(); getchar(); return 0;
}
/* somasqr()*/
/*Calcula a soma dos quadrados de dois números */
float somasqr(float m, float n) {
return soma( sqr(m), sqr(n) ) ; }
/* sqr() */
/* Calcula o quadrado de um número */
float sqr(float z) {
return z*z; }
/* soma() */
/* Calcula a soma de dois números */
float soma(float m, float n) {
Chamando funções usadas como argumento de outras
funções
www.sousavarela.co.cc
Uma função é dita recursiva quando for definida por seus próprios
termos
•
quando dentro dela há uma instrução de chamada para si própria
Funções recursivas
/* Fatorial.C */
/* Mostra o uso de funções recursivas */
#include <stdio.h> #include <stdlib.h>
long fatorial(int); /* Protótipo */
int main() {
int n; do
{
printf("Digite um numero positivo (ou negativo para terminar): "); scanf("%d",&n);
if( n < 0 ) break; /* Termina se no. negativo */
printf("O fatorial de %d e' %d.\n",n, fatorial(n)); } while (1);
printf("Tecle [ENTER] para finalizar."); getchar(); getchar();
return 0; }
/* fatorial() */
/* Calcula o fatorial de um número. Recursiva */
long fatorial (int n) {
return( (n==0) ? (long)1 : (long)n* fatorial(n-1)); }
www.sousavarela.co.cc
O código gerado por uma função recursiva exige a utilização de mais memória, o que torna a execução mais lenta
Não é difícil criar funções recursivas
• O difícil é reconhecer as situações nas quais a recursão é apropriada
Três pontos devem ser levados em conta • Definir o problema em termos recursivos
n! = n * (n-1)!
• Encontrar a condição básica• A função fatorial(), quando chamada, verifica se n é igual a zero
• Cada vez que a função é chamada recursivamente, ela deve estar mais próxima de satisfazer a condição básica
• A cada chamada, o valor de n estará mais próximo de zero