• Nenhum resultado encontrado

Aula05 - Funções

N/A
N/A
Protected

Academic year: 2021

Share "Aula05 - Funções"

Copied!
33
0
0

Texto

(1)

www.sousavarela.co.cc

UNIVERSIDADE GREGÓRIO SEMEDO

Faculdade de Engenharia e Novas Tecnologias

Linguagem C

Funções

(2)

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.

(3)

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

(4)

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

(5)

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 5

(6)

Uma 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

(7)

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

(8)

/* 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;

(9)

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

(10)

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);

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

/* 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;

}

(19)

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

(20)

/* 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"); }

(21)

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

(22)

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

(23)

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

(24)

Bons programadores escrevem os protótipo de todas as suas funções.

Eliminando o protótipo de funções do tipo

(25)

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

(26)

/* 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");

(27)

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()

(28)

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

(29)

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

(30)

/* 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

(31)

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

(32)

/* 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)); }

(33)

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

Funções recursivas

Referências

Documentos relacionados

Uma reestruturação do trabalho que, de forma geral, tem as características anteriormente atribuídas a trabalhos femininos, trabalhos que são feitos, estritamente,

SÚMULA: RESULTADO DA PRIMEIRA ETAPA (PROVA DE PROFICIÊNCIA) PARA O PROCESSO SELETIVO DO PROGRAMA DE PÓS-GRADUAÇÃO EM LETRAS, ÁREA DE CONCENTRAÇÃO EM LINGUAGEM E

O mundo dos fatos – a que podemos também chamar de estado de coisas – é o mundo da experiência empírica, isto é, de relações contingentes, do fenômeno que pode acontecer

libras ou pedagogia com especialização e proficiência em libras 40h 3 Imediato 0821FLET03 FLET Curso de Letras - Língua e Literatura Portuguesa. Estudos literários

Apud George Coedès, Textes d’auters grecs et latins relatifs a L’Extreme Orient... A questão, porém, é que a imagem dos chineses parecia importante o suficiente para

Roque Luiz Dias dos Santos Prefeito Municipal DECRETO N° 024 /2007 DE 09 DE FEVEREIRO DE 2007.. Nomeia servidor para cargo que especifica e dá

esses pacientes têm obesidade severa e má aceitação da restrição dietética, a qual, junto com a necessidade de redução rápida de peso para alívio da dis-.. função

Este processo apresenta bons resultados, bem melhores do que os obtidos com a aplicação dos métodos convencionais (e.g., método gravitacional), tendo apenas como