• Nenhum resultado encontrado

• O emprego deste nome como um comando corresponde a uma chamada a função para sua execução

N/A
N/A
Protected

Academic year: 2022

Share "• O emprego deste nome como um comando corresponde a uma chamada a função para sua execução"

Copied!
5
0
0

Texto

(1)

Funções em C

Linguagem de Programação Estruturada Prof. Leandro Carlos Fernandes

2º semestre 2015

Funções

• Agrupa um conjunto de comandos e associa a ele um nome (identificador).

• O emprego deste nome como um comando corresponde a uma chamada a função para sua execução

• Após sua execução, o programa retoma sua execução no ponto imediatamente após ao momento da chamada à sub-rotina

–O momento de retorno ao ponto em que a função foi invocada é chamado de retorno.

2

Parâmetros de uma Função

• Durante a chamada de uma função pode informar valores (argumentos) para o processamento da função

• Argumentos = lista de expressões

–Lista pode ser vazia

–Lista aparece entre parênteses após o nome da função

• Ex: int soma (int x, int y) { }

O Retorno da Função

• No seu retorno, uma função pode entregar resultados ao programa que a chamou

Exemplo: return (resultados);

O valor da variável local resultados é passado de volta como o valor da função

• Valores de qualquer tipo podem ser retornados Funções predicado: funções que retornam valores Procedimentos: funções que não retornam valores Exemplo: voidfunction (intx)

(2)

Elementos que compõem uma função

• Funções são definidas de acordo com a seguinte sintaxe:

tipo_de_resultadonome (lista de parâmetros) { /* corpo de função */

• Onde:}

–Tipo de resultado:

Quando a função é um procedimento, usa-se a palavra chave void

Procedimentos não retornam valor –Lista de parâmetros

Funcionam como variáveis locais com valores iniciais

Quando função não recebe parâmetros, a lista de parâmetros é substituída pela palavra void

5

Realizando uma chamada

• Quando invocamos uma função:

–Cada expressão na lista de argumentos é avaliada –O valor da expressão é convertido, se necessário,

para o tipo do parâmetro formal

–Este tipo é atribuído ao parâmetro formal correspondente no início do corpo da função –O corpo da função é executado

–Ao término, o fluxo de execução retorna imediatamente após o ponto de chamada

6

Exemplo de Função

Um programa em C que apresenta uma função capaz de calcular o máximo divisor comum entre dois números

#include <stdio.h>

intMDC (inta, intb); /* Protótipo */

voidmain() { intresultado;

resultado = MDC(12,8); /* chamada */

printf("O máximo divisor comum entre %d e

%d é &d\n", 12, 8, resultado );

}

/* definição da função */

intMDC (inta, intb) { intaux;

if(a < b) { aux = a;

a = b;

b = aux;

}while(b != 0) { aux = b;

b = a % b;

a = aux;

}returna;

}

Protótipos

• Antes de usar uma função em C, é aconselhável declará-la para que o compilador tome conhecimento de sua existência e verifique se estão corretas as chamadas

– A declaração apenas indica a assinaturada função.

• Esse tarefa é realizada especificando seu protótipo – Tem a mesma forma que a função, só que substitui o corpo

por um (;)

– Nomes das variáveis de um parâmetro são opcionais

Fornecê-los ajuda a leitura do programa

(3)

O comando RETURN

• Durante a execução do corpo de uma função:

–Se um comando returnfor executado, o controle é passado de volta para o trecho que chamou a função imediatamente

–Se um comando returnincluir uma expressão, o valor resultante da expressão é convertido, se necessário, para o tipo do valor que a função retorna; e então é retornado para o trecho que chamou a função

–Se um comando returnnão apresentar algum valor ou expressão, então nenhum valor será retornado ao trecho que chamou a função

–Se não existir um comando returndentro do corpo da função, o controle é passado de volta para o trecho que chamou a função após o corpo da função ser executado.

9

Passagem de Informações

• Exemplo:

doublemesada(doublenotas, intidade) { doubletotal;

if(idade > 10)

return(idade * 20.0);

else{

total = notas*idade*20;

returntotal;

} }

10

Passagem de Informações

• Argumentos passados por valor

–Quando chamada, a função recebe o valor da variável informada

–Quando argumento é do tipo atômico, a passagem por valor significa que a função não pode mudar seu valor

–Os argumentos deixam de existir após a execução do método

Exemplo – Passagem “Por valor”

#include <stdio.h>

intsoma(intx, inty); /* Protótipo */

voidmain() { inta, b;

printf("Informe dois valores inteiros");

printf("Primeiro valor: "); scanf("%d", &a);

printf("Segundo valor: "); scanf("%d", &b);

printf("%d+ %d= %d\n", a, b, soma(a,b) ); /* Chamada a função */

}

intsoma(intx, inty) { /* Definição da função soma */

returnx+ y;

}

(4)

Passagem de Informações

• Argumentos passados por referência

–Quando chamada, a função passa a referenciar (apontar) a variável informada

–Portanto o processo consiste em informar o endereço da variável para o que o parâmetro formal possa referenciá-lo.

–Os argumentos deixam de existir após a execução do método, porém as variáveis informadas e que foram referenciadas permanecem (pois não são dadas por este bloco de comandos).

13

Exemplo – Passagem “Por Referência”

#include <stdio.h>

#include <math.h>

inteq2Grau(floata, floatb, floatc, float *x1, float *x2);

voidmain() { floatc1, c2, c3, r1, r2;

intexisteRaizReal;

printf("Informe os coeficientes da equação ax^2 + bx + c\n");

printf("a: "); scanf("%d", &c1);

printf("b: "); scanf("%d", &c2);

printf(“c: "); scanf("%d", &c3);

existeRaizReal= eq2Grau(c1, c2, c3, &r1, &r2);

if(existeRaizReal)

printf("x’ = %fe x’’ = %f\n", r1, r2);

elseprintf("Não existem raízes reais\n");

}

/* Definição da função */

inteq2Grau(floata, floatb, floatc, float *x1, float *x2) {

floatdelta;

delta= b*b - 4*a*c;

if(delta< 0) return0;

else{

*x1= (-b + sqrt(delta) ) / 2*a;

*x2= (-b - sqrt(delta) ) / 2*a;

return1;

}}

14

Realizando uma chamada

Agora com mais detalhes, temos:

1. O valor dos argumentos é calculado pelo programa que está invocando a função 2. O sistema cria um novo espaço para todas as

variáveis locais da função (estrutura de pilha) 3. O valor de cada argumento é então copiado ou

referenciado pela variável dada como parâmetro de acordo com a ordem em que aparecem

– Realiza conversões de tipo necessárias

Realizando uma chamada

4. Os comandos do corpo da função são executados até que:

a) Se encontre um comando return

b) Não existirem mais comandos para serem executados

5. O valor da expressão return, se ele existir, é avaliado e retornado como valor da função 6. A pilha criada é liberada

7. O programa que chamou continua sua execução

(5)

Prática: função troca

• Fazer uma função troca(px, py) que recebe como parâmetros 2 ponteiros para inteiros e troca o conteúdo deles

• Ex:

intx= 10, y= 20;

troca(&x, &y);

printf("x=%dy=%d", x, y) /* ==> x=20 y=10 */

17

Vetores como Argumentos de Funções

• Quando desejamos informar um vetor como

argumento para uma função, podemos fazê-lo de três maneiras equivalentes.

• Suponha o vetor:

intmatrx [50];

e que queiramos informá-lo como argumento para uma função func().

• Podemos declarar func() de três maneiras:

voidfunc (intmatrx[50]);

voidfunc (intmatrx[]);

voidfunc (int*matrx);

18

Ex: Concatena Strings

#include <stdio.h>

char *concatena(charcabeca[ ], charcauda[ ]) { inti, j;

/* procura o fim da primeira palavra */

for(i= 0; cabeca[i] != '\0'; i++) ;

/* ... e copia cada letra da segunda palavra para a primeira */

for( j= 0; (cabeca[i] = cauda[ j]) != '\0'; i++, j++) ; cabeca[i] = '\0';

returncabeca;

}

Exemplo (cont.)

intmain( ) {

charsobrenome[ ] = " Dumont";

charnome[80] = "Santos"; /* a variável tem que ter tamanho suficiente para comportar a msg */

/* Escreve na tela a frase, substituindo a máscara %s pela string "Santos Dumont“, que é retornada pela chamada da função concatena. */

printf("O nome é %s.\n", concatena(nome, sobrenome) );

return0;

}

Referências

Documentos relacionados

Nessa situação temos claramente a relação de tecnovívio apresentado por Dubatti (2012) operando, visto que nessa experiência ambos os atores tra- çam um diálogo que não se dá

Portanto, mesmo percebendo a presença da música em diferentes situações no ambiente de educação infantil, percebe-se que as atividades relacionadas ao fazer musical ainda são

We approached this by (i) identifying gene expression profiles and enrichment terms, and by searching for transcription factors in the derived regulatory pathways; and (ii)

4.5.3.1 Comparação da evolução das e iên ias da rede gerada pelo modelo Elite om uma rede aleatória, uma rede livre de es ala e uma rede de mundo pequeno

Excluindo as operações de Santos, os demais terminais da Ultracargo apresentaram EBITDA de R$ 15 milhões, redução de 30% e 40% em relação ao 4T14 e ao 3T15,

Este trabalho buscou, através de pesquisa de campo, estudar o efeito de diferentes alternativas de adubações de cobertura, quanto ao tipo de adubo e época de

O valor da reputação dos pseudônimos é igual a 0,8 devido aos fal- sos positivos do mecanismo auxiliar, que acabam por fazer com que a reputação mesmo dos usuários que enviam

Box-plot dos valores de nitrogênio orgânico, íon amônio, nitrito e nitrato obtidos para os pontos P1(cinquenta metros a montante do ponto de descarga), P2 (descarga do