linguagem de programação c - alessandro...

45
ICMC USP Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade Lopes

Upload: hoangtu

Post on 17-Dec-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

ICMC USP

Linguagem de Programação C

Aula: Funções em CProf Alneu de Andrade Lopes

Page 2: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

MODULARIZAÇÃO

Um problema complexo é melhor abordado se for divididoprimeiramente em vários

subproblemassubproblemas

MODULARIZAÇÃOMODULARIZAÇÃO

Page 3: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

MODULARIZAÇÃO

Um problema complexo é melhor abordado se for divididoprimeiramente em vários

subproblemassubproblemas

MODULARIZAÇÃOMODULARIZAÇÃOMÓDULOSMÓDULOS

Page 4: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

MODULARIZAÇÃO

A implementação desses Módulos é feita através de SUBPROGRAMAS

MÓDULOSMÓDULOS

Page 5: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

MODULARIZAÇÃO

A implementação desses Módulos é feita através de SUBPROGRAMAS

subprograma1subprograma1 subprograma2subprograma2

programaprograma

......

...... ......

Page 6: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

MODULARIZAÇÃO

A implementação desses Módulos é feita através de SUBPROGRAMAS

MÓDULOSMÓDULOS

Os SUBPROGRAMAS em C são

implementados por FUNÇÕESFUNÇÕES

Page 7: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

FUNÇÕES

• As linguagens de programação têm à sua disposição várias funções pré-definidas:

• EXEMPLO (C)– pow (X,2) quadrado de X– pow (X,2) quadrado de X

– printf(“%s” ,X) imprime string X

Page 8: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

FUNÇÕES

• As linguagens de programação têm à sua disposição várias funções pré-definidas:

• EXEMPLO (C)– pow (X,2) quadrado de X– pow (X,2) quadrado de X

– printf(“%s” ,X) imprime string X

Identificador da Identificador da FUNÇÃOFUNÇÃO

Page 9: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

FUNÇÕES

• As linguagens de programação têm à sua disposição várias funções pré-definidas:

• EXEMPLO (C)– pow (X,2) quadrado de X– pow (X,2) quadrado de X

– printf(“%s” ,X) imprime string X

ParâmetrosParâmetros

Page 10: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

FUNÇÕES

• As Funções Pré Definidas podem ser usadas diretamente em expressões:

• Exemplo:

H = pow ((pow(X,2) + pow (Y,2)), 0.5);H = pow ((pow(X,2) + pow (Y,2)), 0.5);

Page 11: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

FUNÇÕES

• As Funções Pré Definidas podem ser usadas diretamente em expressões:

• Exemplo:

H = pow ((pow(X,2) + pow (Y,2)), 0.5);H = pow ((pow(X,2) + pow (Y,2)), 0.5);

ParâmetrosParâmetrosREAISREAIS

Page 12: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

FUNÇÕES

• As Funções Pré Definidas podem ser usadas diretamente em expressões:

• Exemplo:

H = pow ((pow(X,2) + pow (Y,2)), 0.5);H = pow ((pow(X,2) + pow (Y,2)), 0.5);

Estes parâmetros devem ser valores

conhecidos

ParâmetrosParâmetrosREAISREAIS

Page 13: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

FUNÇÕES

Se houver necessidade o programador pode definirsuas próprias FUNÇÕESFUNÇÕESsuas próprias FUNÇÕESFUNÇÕES

Page 14: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

# include <stdio.h>

int sqr(float x){x = x*x;return(x);return(x);

}

main(){float t=10;printf(“%f”,sqr(t));

}

Page 15: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

DEFINIÇÃO DE FUNÇÃO

funçãodeclaração do tipo da saída da função NOMENOME--DADA--

FUNÇÃO FUNÇÃO (declaração do tipo do parâmetro1parâmetro1, parâmetro1, declaração do tipo do parâmetro2

Linguagem AlgoritmicaLinguagem Algoritmica

parâmetro1, parâmetro1, declaração do tipo do parâmetro2 parâmetro2parâmetro2, ..., declaração do tipo do parâmetronparâmetroparâmetronn)

iníciodeclaração das variáveis utilizadas localmentecorpo da função

fim

Page 16: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

DEFINIÇÃO DE FUNÇÃO

Tipo do retorno NOMENOME--DADA--FUNÇÃO FUNÇÃO (tipo_p1 p1, tipo_p2 p2,..., tipo_pn pn){

Em CEm C

tipo_p2 p2,..., tipo_pn pn){

declaração de variáveis utilizadas no corpo da função;

corpo da função;

};

Page 17: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

CARACTERÍSTICAS DAS FUNÇÕES

• Retorna um único valor

• Na definição da função devem ser declarados:– o tipo de todos os parâmetros– o tipo do valor que a função retorna– o tipo do valor que a função retorna– todas as variáveis utilizadas internamente no subprograma (variáveis locais)

• Para utilizar a função no programa principal basta colocar seu nome (identificador) e os parâmetros.

Page 18: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Resumo

• Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa

• Estrutura:

valor_retornado nome_função ( parâmetros )valor_retornado nome_função ( parâmetros )

{

declarações

comandos

}

Page 19: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Detalhes

• uma função pode retornar qualquer valor válido em C, sejam de tipos pré-definidos ( int, char, float) ou de tipos definidos pelo usuário ( struct, typedef )

• uma função que não retorna nada é definida • uma função que não retorna nada é definida colocando-se o tipo void como valor retornado (= procedure)

• Pode-se colocar void entre parênteses se a função não recebe nenhum parâmetro

Page 20: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Declaração de Funções

• Funções devem ser definidas ou declaradas antes de serem utilizadas

• A declaração apenas indica a assinatura ou protótipo da função:função:

valor_retornado nome_função(declaração_parâmetros);

• Menor função possível:

void faz_nada( void ) {}

Page 21: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

DEFINIÇÃO DE FUNÇÃO Exemplo - Função Fatorial

função

real FATFAT(declaração do tipo do parâmetro XX)

início da função//declaração das variáveis utilizadas no subprograma←P← 1

para I de 1 até X X faça P ← P * I

fim parareturn(P);

fim da função

Page 22: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

função

real FATFAT(declaração do tipo do parâmetro XX)

início da função//declaração das variáveis utilizadas no subprograma←

DEFINIÇÃO DE FUNÇÃO Exemplo - Função Fatorial

NOME DA NOME DA

tipo do valorque a função

retorna

tipo do parâmetro

P← 1para I de 1 até X X

faça P ← P * Ifim parareturn(return(P);

fim da função

PARÂMETRO FORMALquando a função

for utilizada, este parâmetro recebe um valor reallido ou atribuído no programa principal

NOME DA NOME DA FUNÇÃOFUNÇÃO

Page 23: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

função

real FATFAT(declaração do tipo do parâmetro XX)

início da função//declaração das variáveis utilizadas no subprograma←

DEFINIÇÃO DE FUNÇÃO Exemplo - Função Fatorial

P← 1para I de 1 até X X

faça P ← P * Ifim parareturn(P);return(P);

fim da função

Declarações relativas àsvariáveis do algoritmo

Page 24: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

função

real FATFAT(declaração do tipo do parâmetro XX)

início da função//declaração das variáveis utilizadas no subprogramaP← 1

DEFINIÇÃO DE FUNÇÃO Exemplo - Função Fatorial

O número para o qual é calculado P← 1

para I de 1 até X X faça P ← P * I

fim parareturn(P);return(P);

fim da função

qual é calculado o fatorial entra

como parâmetro

NÃO PRECISA SER LIDO

DENTRO DA FUNÇÃO

Page 25: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

DEFINIÇÃO DE FUNÇÃO Exemplo - Função Fatorial

função

real FATFAT(declaração do tipo do parâmetro XX)

início da função

• O resultado do cálculo do fatorial deve ser retornado início da função

declaração das variáveis utilizadas no subprogramaP← 1para I de 1 até X X

faça P ← P * Ifim parareturn(P);return(P);

fim da função

deve ser retornado para o programa que chamou a função.

Page 26: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Exercício

• Implemente a função fatorial.

Page 27: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Passagem de Parâmetrosem C os argumentos para uma função são, via de regra,

passados por valor (by value), ou seja, uma cópia do argumento é feita e passada para a função

void loop_count( int i ) {

printf( "Em loop_count, i = " );

while( i < 10 )

printf ( "%d ", i++); ==> i = 2 3 4 5 6 7 8 9

}

void main( ) {

int i = 2;

loop_count( i );

printf( "\nEm main, i = %d.\n", i ); ==> i = 2.

}

Page 28: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Passagem de Parâmetros

• como, então, mudar o valor de uma variável ?

passagem de parâmetro por referência

• enviar o endereço do argumento para a função

Page 29: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Passagem de Parâmetros

Passagem por valor Passagem por referência

func_call (arg) func_call (* arg)

Cópia de arg Endereço de arg

arg arg

def_função (arg) def_função (* arg)

Cópia de arg

enviado para

a função

Endereço de arg

enviado para

a função

arg (* arg)

Page 30: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Passagem de Parâmetros

• Passagem por referência:

void loop_count( int *i ) {

printf( "Em loop_count, i = " );

while( i < 10 )

printf ( "%d ", (*i)++); ==> i = 2 3 4 5 6 7 8 9printf ( "%d ", (*i)++); ==> i = 2 3 4 5 6 7 8 9

}

void main( ) {

int i = 2;

loop_count( &i );

printf( "\nEm main, i = %d.\n", i ); ==> i = 10.

}

Page 31: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

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:• ex:int x = 10, y = 20;

troca(&x, &y);

printf(“x=%d y=%d”, x, y) => x=20 y=10

Page 32: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Prática: função troca

void troca (int *px, int *py)

{

int temp;

px:

py:

temp=*px;

*px=*py;

*py=temp;

}

x:

y:

Page 33: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Retornando Valores

• uma função retorna um valor através do comando return

• Ex:int power (int base, int n) {

int i,p;int i,p;

p = 1;

for (i = 1; i <= n; ++i)

p *= base;

return p;

}

Page 34: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Funções

• o valor retornado por uma função é sempre copiado para o contexto de chamada (retorno by value)

x = power(2, 5); /* atribuição */

if (power(7, 2) > 12543) /* comparação */if (power(7, 2) > 12543) /* comparação */

printf(“Numero grande!”);

x = 10*power(2,3); /* expressão */

array[get_index()]; /* índice */

funcao( get_arg() ); /* argumento */

Page 35: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Ex: Concatena Strings

char *concatena( char cabeca[], char cauda[] )

{

int i, j;

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

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

cabeca[i] = '\0';

return cabeca;

}

Page 36: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Exemplo (cont.)

int main( )

{

char nome[80] = "Santos";

char sobrenome[] = " Dumont";

printf( "O nome é %s.\n",

concatena( nome, sobrenome ) );

return 0;

}

==> Santos Dumont

Page 37: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Prática: Localiza char em string

• Fazer uma função que procura um caracter em um string e retorna o seu endereço caso o encontre, senão retorna NULL (ponteiro nulo)

• Ex:char *achachar (char *str, char c) {...}

char str[] = “abcd5678”;

achachar(str, ‘c’);

==> retorna endeço do terceiro caracter do string: &str[2]

Page 38: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Achachar

char *achachar (char *str, char c) {

char *pc = str;

while (*pc != c && *pc != '\0') pc++;while (*pc != c && *pc != '\0') pc++;

return *pc ? pc : NULL;

}

Page 39: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Número de Parâmetros Variável

• C permite declarar funções com número variável de argumentos através da inserção de reticências “...”

função ( arg1, arg2, ... );

• Como determinar o número de parâmetros passados:• Como determinar o número de parâmetros passados:

– string de formato, como no comando printf:Ex: printf ( “%s %d %f\n”, s, i, f);

– pela especificação do número de parâmetros

Ex: soma (3, 10, -1, 5);

– pela inclusão de um valor de terminaçãoEx: media ( 1, 4, 6, 0, 3, -1 );

Page 40: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Acesso aos Parâmetros

• C oferece uma série de macros para acessar uma lista de argumentos:

• va_list: é um tipo pré-definido utilizado para declarar um ponteiro para os argumentos da lista

• va_start(va_list ap, ultimo_arg_def ): inicia o ponteiro ap fazendo-o apontar para o primeiro argumento da lista, ou seja, o primeiro argumento depois de ultimo_arg_def.– ultimo_arg_def é o nome do último argumento

especificado no declaração da função

Page 41: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Acesso aos Parâmetros

• type va_arg( va_list ap, type ): retorna o valor do argumento apontado por ap e faz ap apontar para o próximo argumento da lista. Type indica o tipo de argumento lido (int, float, etc.)float, etc.)

• void va_end ( va_list ap ) : encerra o acesso à lista de parâmetros. Deve sempre ser chamada no final da função

Page 42: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Exemplo Parâmetros Variáveis

#include <stdio.h>

#include <stdlib.h>

#include <stdarg.h>

int sum( int no_args, ... ) {

va_list ap; int result = 0, i;

sum( 5, 3, 5, 18, 57, 66 ) ==> 149sum( 2, 3, 5 ) ==> 8

va_list ap; int result = 0, i;

va_start( ap, no_args );

for( i = 1; i <= no_args; i++ ) {

result += va_arg( ap, int );

}

va_end(ap);

return result;

}

Page 43: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Parâmetros para main()

• ao executar programas a partir de linha de comando, é possível passar parâmetros diretamente para a função main()

• os argumentos são fornecidos na forma de um • os argumentos são fornecidos na forma de um array de strings.

• main() é definida com dois parâmetros:main ( int argc, char *argv[] )

argc é o número de argumentos

argv é o array de argumentos

Page 44: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Parâmetros para main()

• por convenção, o primeiro argumento argv[0]é o nome do programa e o último é 0 (zero)

• ex:

echo Alô, mamãeecho Alô, mamãe

argv

0

echo\0

Alô, \0

mamãe\0

argc = 3

Page 45: Linguagem de Programação C - Alessandro Santosalessandrosantos.com.br/.../slides_e_pdfs/aula07_funcoes.pdf · Linguagem de Programação C Aula: Funções em C Prof Alneu de Andrade

Parâmetros para main()

Uma possível implementação para echo:

#include <stdio.h>

void main( int argc, char *argv[] ) {void main( int argc, char *argv[] ) {

int i;

for ( i = 1; i < argc; i++ )

printf(“%s%s”, argv[i], (i < argc-1)?“ ”:“”);

printf(“\n”);

}