A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

1 Módulo 3 Programação Estruturada. 2 Índice do módulo Noções Introdutórias Noções Introdutórias Subprogramas Subprogramas Tipos de subprogramas Tipos.

Apresentações semelhantes


Apresentação em tema: "1 Módulo 3 Programação Estruturada. 2 Índice do módulo Noções Introdutórias Noções Introdutórias Subprogramas Subprogramas Tipos de subprogramas Tipos."— Transcrição da apresentação:

1 1 Módulo 3 Programação Estruturada

2 2 Índice do módulo Noções Introdutórias Noções Introdutórias Subprogramas Subprogramas Tipos de subprogramas Tipos de subprogramas Procedimentos Procedimentos Funções Funções Variáveis Variáveis Locais Locais Globais Globais Recursividade Recursividade Bibliotecas Bibliotecas

3 3 Noções Introdutórias Como referido no módulo 1, uma das técnicas de resolução de problemas é a DECOMPOSIÇÃO. Como referido no módulo 1, uma das técnicas de resolução de problemas é a DECOMPOSIÇÃO. E uma das vantagens da linguagem C é o facto de permitir uma programação MODULAR. E uma das vantagens da linguagem C é o facto de permitir uma programação MODULAR. A programação modular permite-nos aplicar o conceito de decomposição. A programação modular permite-nos aplicar o conceito de decomposição.

4 4 Noções Introdutórias Desde o primeiro programa em C que utilizamos funções: Desde o primeiro programa em C que utilizamos funções: main() main() printf(….) printf(….) scanf(….) scanf(….) system(…) system(…) abs(….) abs(….) …. …. Reparem nos aspectos comuns… Reparem nos aspectos comuns…

5 5 Procedimentos e Funções De acordo com o conceito da programação estruturada, a escrita de algoritmos (e programas) deve ser baseada no desenho modular dos mesmos.

6 6 Procedimentos e Funções Imaginem o seguinte problema: Imaginem o seguinte problema: Escreva um programa que coloque no ecrã o seguinte (mas utilizando estruturas de repetição): Escreva um programa que coloque no ecrã o seguinte (mas utilizando estruturas de repetição):******************** Números entre 1 e 5 ********************12345********************

7 7 Procedimentos e Funções #includemain(){ int i, numero; int i, numero; for(i=0;i<20;i++) /* 1ª linha de asteriscos */ for(i=0;i<20;i++) /* 1ª linha de asteriscos */ printf("*"); printf("*"); printf("\nNumeros entre 1 e 5\n"); printf("\nNumeros entre 1 e 5\n"); for(i=0;i<20;i++) /* 2ª linha de asteriscos */ for(i=0;i<20;i++) /* 2ª linha de asteriscos */ printf("*"); printf("*"); for(i=1;i<=5;i++) /* números de 1 a 5 */ for(i=1;i<=5;i++) /* números de 1 a 5 */ printf("\n%d\n",i); printf("\n%d\n",i); for(i=0;i<20;i++) /* asteriscos finais */ for(i=0;i<20;i++) /* asteriscos finais */ printf("*"); printf("*");}

8 8 Procedimentos e Funções No programa anterior repetimos a escrita de 20 asteriscos 3 vezes No programa anterior repetimos a escrita de 20 asteriscos 3 vezesfor(i=0;i<20;i++)printf("*"); Como evitar a repetição do mesmo código várias vezes? Como evitar a repetição do mesmo código várias vezes?

9 9 Procedimentos e Funções Aqui entram os conceitos de Procedimentos e Funções Aqui entram os conceitos de Procedimentos e Funções Embora ainda sem saber como escrever uma função, já as temos utilizado ao longo dos nossos programas: Embora ainda sem saber como escrever uma função, já as temos utilizado ao longo dos nossos programas: Exemplo: main(), printf(…), scanf(…), … Exemplo: main(), printf(…), scanf(…), … De seguida podemos ver uma simplificação do programa anterior, através do uso de funções (procedimentos). De seguida podemos ver uma simplificação do programa anterior, através do uso de funções (procedimentos). Nota: mais adiante veremos qual a diferença entre procedimentos e funções.

10 10 #include#include asteriscos() asteriscos() /* função responsável pela escrita de 20 asteriscos */{ int i; int i; for(i=0;i<20;i++) for(i=0;i<20;i++) printf("*"); printf("*");}main(){ int i; int i; asteriscos(); asteriscos(); /* invocação da função asteriscos */ printf("\nNumeros entre 1 e 5\n"); printf("\nNumeros entre 1 e 5\n"); asteriscos(); asteriscos(); /* invocação da função asteriscos */ for(i=1;i<=5;i++) for(i=1;i<=5;i++) printf("\n%d\n",i); printf("\n%d\n",i); asteriscos(); asteriscos(); /* invocação da função asteriscos */ system("pause"); system("pause");}

11 11 Procedimentos e Funções Um programa em C possui sempre a função main(), independentemente das restantes funções que possua. Um programa em C possui sempre a função main(), independentemente das restantes funções que possua. Um programa em C começa sempre a ser executado na função main(), mesmo que esta não esteja em primeiro lugar. Um programa em C começa sempre a ser executado na função main(), mesmo que esta não esteja em primeiro lugar. O facto de termos várias funções num programa, não quer dizer que elas sejam executadas. Só serão executadas se forem invocadas (chamadas) pela função main() ou por outra função invocada pela função main(). O facto de termos várias funções num programa, não quer dizer que elas sejam executadas. Só serão executadas se forem invocadas (chamadas) pela função main() ou por outra função invocada pela função main(). A invocação é feita escrevendo o nome da função com os respectivos (). Exemplo: asteriscos(); A invocação é feita escrevendo o nome da função com os respectivos (). Exemplo: asteriscos();

12 12 Procedimentos e Funções Como funciona uma função: Como funciona uma função: O código da função só é executado quando esta é invocada; O código da função só é executado quando esta é invocada; Quando uma função é invocada o programa que a invoca é suspenso temporariamente. Em seguida são executadas as instruções da função. Quando a função terminar, o controlo de execução do programa volta ao local em que a função foi invocada. Quando uma função é invocada o programa que a invoca é suspenso temporariamente. Em seguida são executadas as instruções da função. Quando a função terminar, o controlo de execução do programa volta ao local em que a função foi invocada. Pode receber parâmetros; Pode receber parâmetros; Pode devolver um resultado. Pode devolver um resultado.

13 13 Procedimentos e Funções Sintaxe em C: Sintaxe em C:nomeDaFuncao(){ }

14 14 Procedimentos e Funções Sintaxe algorítmica: Função nomeDaFuncao() inicio fimFunção

15 15 Procedimentos e Funções Vantagens do uso de funções: Vantagens do uso de funções: Permite o reaproveitamento de código já escrito (por si ou por outros programadores); Permite o reaproveitamento de código já escrito (por si ou por outros programadores); Evita que um trecho (pedaço) de código que seja repetido várias vezes dentro de um mesmo programa; Evita que um trecho (pedaço) de código que seja repetido várias vezes dentro de um mesmo programa; Permite a alteração de um trecho de código de uma forma mais rápida. Com o uso de uma função é preciso alterar apenas dentro da função que se deseja; Permite a alteração de um trecho de código de uma forma mais rápida. Com o uso de uma função é preciso alterar apenas dentro da função que se deseja; Permite que os blocos do programa não fiquem grandes demais e, por consequência, mais difíceis de entender ; Permite que os blocos do programa não fiquem grandes demais e, por consequência, mais difíceis de entender ; Facilita a leitura do código fonte; Facilita a leitura do código fonte; Permite separar o programa em partes (blocos) que possam ser logicamente compreendidos de forma isolada. Permite separar o programa em partes (blocos) que possam ser logicamente compreendidos de forma isolada.

16 16 Procedimentos e Funções Características de uma função: Características de uma função: Cada função tem de ter um nome único, que é usado para a sua invocação; Cada função tem de ter um nome único, que é usado para a sua invocação; Uma função pode ser invocada (chamada) a partir de outras funções; Uma função pode ser invocada (chamada) a partir de outras funções; Uma função (como o seu nome deve indicar) deve realizar uma única tarefa bem definida; Uma função (como o seu nome deve indicar) deve realizar uma única tarefa bem definida; Uma função deve comportar-se como uma caixa negra, ou seja, não interessa como o faz, o que interessa é o resultado final; Uma função deve comportar-se como uma caixa negra, ou seja, não interessa como o faz, o que interessa é o resultado final; Uma função pode receber parâmetros; Uma função pode receber parâmetros; Uma função pode retornar para a função que a invocou, um valor como resultado do seu trabalho. Uma função pode retornar para a função que a invocou, um valor como resultado do seu trabalho.

17 17 Procedimentos e Funções Nome de uma função: Nome de uma função: Segue as mesmas regras dos nomes das variáveis; Segue as mesmas regras dos nomes das variáveis; Tem de ser único no programa ( não pode ser igual ao nome de outra função ou variável); Tem de ser único no programa ( não pode ser igual ao nome de outra função ou variável); Deve ser de fácil leitura a através dele devemos conseguir perceber o que a função faz. Deve ser de fácil leitura a através dele devemos conseguir perceber o que a função faz.

18 18 Funções – Parâmetros e Argumentos +++++************************+++++ Com a aplicação de funções, elabore um programa capaz de mostrar o output (mensagens) anteriores. Com a aplicação de funções, elabore um programa capaz de mostrar o output (mensagens) anteriores. Use também estruturas de repetição. Use também estruturas de repetição.

19 19 … void cinco_mais() { int i; int i; for(i=0;i<5;i++) for(i=0;i<5;i++) { printf("+"); printf("+"); }} void sete_asteriscos() { int i; int i; for(i=0;i<7;i++) for(i=0;i<7;i++) { printf("*"); printf("*"); }} void dez_asteriscos() { int i; int i; for(i=0;i<10;i++) for(i=0;i<10;i++) { printf("*"); printf("*"); }} main(){ cinco_mais(); cinco_mais(); puts("\n"); puts("\n"); sete_asteriscos(); sete_asteriscos(); puts("\n"); puts("\n"); dez_asteriscos(); dez_asteriscos(); puts("\n"); puts("\n"); sete_asteriscos(); sete_asteriscos(); puts("\n"); puts("\n"); cinco_mais(); cinco_mais(); puts("\n\n\n"); puts("\n\n\n"); system("pause"); system("pause");} Esta seria até agora a melhor forma de resolução problema. No entanto é possível simplificar a resolução

20 20 Funções – Parâmetros e Argumentos Como podemos verificar no programa anterior, temos funções com código muito semelhante. Como podemos verificar no programa anterior, temos funções com código muito semelhante. Ex: sete_asteriscos(), dez_asteriscos() Ex: sete_asteriscos(), dez_asteriscos() Estas funções apenas diferem no número de asteriscos que são impressos. Estas funções apenas diferem no número de asteriscos que são impressos. Vejamos então o que podemos fazer para simplificar o programa anterior… Vejamos então o que podemos fazer para simplificar o programa anterior…

21 21 #include#include void cinco_mais() { int i; int i; for(i=0;i<5;i++) for(i=0;i<5;i++) { printf("+"); printf("+"); }} void asteriscos(int nr_asteriscos) { int i; int i; for(i=0;i

22 22 Funções – Parâmetros e Argumentos Como podemos ver no código anterior, podemos enviar informação para as funções. Como podemos ver no código anterior, podemos enviar informação para as funções.main(){… asteriscos(10); …} void asteriscos(int nr_asteriscos) {…} PARÂMETROS ARGUMENTOS

23 23 Funções – Parâmetros e Argumentos Características dos parâmetros e argumentos Características dos parâmetros e argumentos Os argumentos e parâmetros podem ser de qualquer tipo (int, float, char, …). Os argumentos e parâmetros podem ser de qualquer tipo (int, float, char, …). Os parâmetros de uma função são separados por vírgula, e é obrigatória a indicação do tipo de cada parâmetro. Os parâmetros de uma função são separados por vírgula, e é obrigatória a indicação do tipo de cada parâmetro. Ex. void funcaoX(int par1, char par2, float par3) Ex. void funcaoX(int par1, char par2, float par3) Ex. void funcaoX(int par1, par2, par3) ERRADO Ex. void funcaoX(int par1, par2, par3) ERRADO O nr. de argumentos enviados tem de ser igual ao nr. de parâmetros que vão receber os valores O nr. de argumentos enviados tem de ser igual ao nr. de parâmetros que vão receber os valores

24 24 Funções – Parâmetros e Argumentos Características dos parâmetros e argumentos (cont.) Características dos parâmetros e argumentos (cont.) Um parâmetro não é mais do que uma variável local à função a que pertence. Um parâmetro é automaticamente inicializado com o valor enviado pelo programa invocador. Um parâmetro não é mais do que uma variável local à função a que pertence. Um parâmetro é automaticamente inicializado com o valor enviado pelo programa invocador. A passagem de argumentos para a função deve ser realizada colocando-os dentro de parêntesis, separados por vírgulas. A passagem de argumentos para a função deve ser realizada colocando-os dentro de parêntesis, separados por vírgulas. Ex. funcaoX(1, a, media, 1.2); Ex. funcaoX(1, a, media, 1.2); Os argumentos enviados podem ser valores (1, a) ou variáveis (valor1, letra, …). Os argumentos enviados podem ser valores (1, a) ou variáveis (valor1, letra, …).

25 25 Funções – Parâmetros e Argumentos Características dos parâmetros e argumentos (cont.) Características dos parâmetros e argumentos (cont.) O número de argumentos enviados para uma função deve ser igual ao número de parâmetros existentes no cabeçalho da função. Os tipos de dados têm também de ser iguais. O número de argumentos enviados para uma função deve ser igual ao número de parâmetros existentes no cabeçalho da função. Os tipos de dados têm também de ser iguais. Ex. Ex.main(){ funcaoX(A, 123, 23.44); } funcaoX(char letra, int valor1, float numero)

26 26 Funções – Parâmetros e Argumentos Voltando ao exercício inicial: Voltando ao exercício inicial:+++++************************+++++ Acham que se podia simplificar ainda mais??? Acham que se podia simplificar ainda mais???

27 27#include#include void imprime_caracteres(int nr_asteriscos, char caracter_a_imprimir) { int i; int i; for(i=0;i

28 28 Funções – Instrução return Esta instrução permite terminar a execução de uma função e voltar à função que a invocou. Esta instrução permite terminar a execução de uma função e voltar à função que a invocou. A execução da instrução return na função main() faz com que o programa termine. A execução da instrução return na função main() faz com que o programa termine. main(){ imprime(); imprime(); printf(ola); printf(ola);} void imprime() { printf(impressão); printf(impressão); return; return;}#includemain(){printf(ola);return;printf(xau);}

29 29 Funções – Instrução return Mas além de terminar a função que está a ser executada pode também devolver (retornar) valores para o local onde foi invocada. Mas além de terminar a função que está a ser executada pode também devolver (retornar) valores para o local onde foi invocada. E esta é a característica mais importante do return E esta é a característica mais importante do return Se até agora consegue enviar valores para as funções invocadas (com argumentos e parâmetros), agora também já consegue devolver valores das funções invocadas para as funções invocadores. Se até agora consegue enviar valores para as funções invocadas (com argumentos e parâmetros), agora também já consegue devolver valores das funções invocadas para as funções invocadores.

30 30 Funções – Instrução return return return Termina a função que está a ser executada Termina a função que está a ser executada Permite devolver um único valor (resultado) à função invocadora. Este valor poderá ser armazenado numa variável ou aproveitado por uma instrução. Permite devolver um único valor (resultado) à função invocadora. Este valor poderá ser armazenado numa variável ou aproveitado por uma instrução. Sintaxe da instrução return Sintaxe da instrução return return valor_de_retorno; ou return;

31 31 #include#include int funcao_soma(int valorA, int valorB) { int total; int total; total=valorA+valorB; total=valorA+valorB; return total; return total;}main(){ int valor1, valor2, soma; int valor1, valor2, soma; printf("\nIntroduza o valor 1: "); printf("\nIntroduza o valor 1: "); scanf("%d",&valor1); scanf("%d",&valor1); printf("\nIntroduza o valor 2: "); printf("\nIntroduza o valor 2: "); scanf("%d",&valor2); scanf("%d",&valor2); soma=funcao_soma(valor1, valor2); soma=funcao_soma(valor1, valor2); printf("\n\nSoma = %d \n", soma); printf("\n\nSoma = %d \n", soma); system("pause"); system("pause");}

32 32 #include#include int funcao_soma(int valorA, int valorB) { return valorA+valorB; return valorA+valorB;}main(){ int valor1, valor2; int valor1, valor2; printf("\nIntroduza o valor 1: "); printf("\nIntroduza o valor 1: "); scanf("%d",&valor1); scanf("%d",&valor1); printf("\nIntroduza o valor 2: "); printf("\nIntroduza o valor 2: "); scanf("%d",&valor2); scanf("%d",&valor2); printf("\n\nSoma = %d \n", funcao_soma(valor1, valor2)); printf("\n\nSoma = %d \n", funcao_soma(valor1, valor2)); system("pause"); system("pause");} A mesma funcionalidade do exercício anterior, mas mais simplificado…

33 33 Funções – Instrução return Notas: Notas: Uma função pode ser invocada dentro de outra função. Uma função pode ser invocada dentro de outra função. funcao_soma(5, funcao_soma(3,2)); funcao_soma(5, funcao_soma(3,2)); Uma função pode ter várias instruções return, mas apenas uma é realmente executada. Uma função pode ter várias instruções return, mas apenas uma é realmente executada.… if (a==3) return 3; else return 1; …

34 34 Funções – Instrução return Notas (cont.) Notas (cont.) O facto de uma função retornar um valor não obriga a que esse valor tenha de ser aproveitado (armazenado) pala função invocadora. O facto de uma função retornar um valor não obriga a que esse valor tenha de ser aproveitado (armazenado) pala função invocadora. ERRADO: ERRADO:..... funcao_soma(valor1, valor2)=soma; funcao_soma(valor1, valor2)=soma;

35 35 Funções – Instrução return int funcao_soma(int valorA, int valorB) { int total; int total; total=valorA+valorB; total=valorA+valorB; return total; return total;} O tipo de dados retornado tem de ser o mesmo tipo de dados definido para a função O tipo de dados retornado tem de ser o mesmo tipo de dados definido para a função Temos sempre de indicar qual o tipo de dados que a nossa função vai retornar Temos sempre de indicar qual o tipo de dados que a nossa função vai retornar float funcao_multiplica (int x, int y) ….

36 36 Funções – Instrução return Tipo de dados void Tipo de dados void Em C existe uma palavra reservada – void – que permite indicar que uma função não devolve qualquer tipo de dados. Em C existe uma palavra reservada – void – que permite indicar que uma função não devolve qualquer tipo de dados. void funcao_xpto () {}

37 37 Funções – Protótipos das funções Onde colocar as funções: Onde colocar as funções: Dentro de um mesmo ficheiro (por agora), antes ou depois da função main(). No entanto se as funções forem colocadas depois da função main, alguns compiladores geram erros ou alertas. Para evitar esses erros ou alertas usam-se os protótipos (cabeçalhos) de funções. Estes protótipos não são mais do que a primeira linha da função seguida de ponto e vírgula. Dentro de um mesmo ficheiro (por agora), antes ou depois da função main(). No entanto se as funções forem colocadas depois da função main, alguns compiladores geram erros ou alertas. Para evitar esses erros ou alertas usam-se os protótipos (cabeçalhos) de funções. Estes protótipos não são mais do que a primeira linha da função seguida de ponto e vírgula. int funcao_soma(int valorA, int valorB) ;

38 38 Funções – Protótipos das funções Os protótipos das funções devem ser colocados depois da inclusão das bibliotecas. Os protótipos das funções devem ser colocados depois da inclusão das bibliotecas. Não é necessário criar protótipo da função main(). Não é necessário criar protótipo da função main().

39 39 Procedimentos e Funções Qual a diferença entre Procedimentos e Funções? Qual a diferença entre Procedimentos e Funções? Procedimento: não devolve (retorna) qualquer valor à função que o invocou. Procedimento: não devolve (retorna) qualquer valor à função que o invocou. Não tem a instrução return Não tem a instrução return Função: devolve um valor de um determinado tipo à função invocadora. Função: devolve um valor de um determinado tipo à função invocadora. Possui a instrução return Possui a instrução return

40 40 Funções – Tipos de Variáveis Variáveis LOCAIS: Variáveis LOCAIS: São declaradas dentro de uma função; São declaradas dentro de uma função; São conhecidas apenas dentro da função onde estão declaradas. São conhecidas apenas dentro da função onde estão declaradas. #include main() { int var_local; var_local=2; func(); printf("%d\n",var_local); system("pause"); } func() { int var_local; var_local=127; printf("%d\n",var_local); }

41 41 Funções – Tipos de Variáveis Variáveis GLOBAIS: Variáveis GLOBAIS: São declaradas fora das funções (normalmente após a inclusão das bibliotecas) ; São declaradas fora das funções (normalmente após a inclusão das bibliotecas) ; São conhecidas em todas as funções do programa (o seu valor está sempre acessível) São conhecidas em todas as funções do programa (o seu valor está sempre acessível) #include int var_global; main() { var_global=10; func(); printf("%d\n",var_global); system("pause"); } func() { printf("%d\n",var_global); var_global=var_global+20; }

42 42 Funções – Tipos de Variáveis Resumo Resumo Tipos de variáveis: Tipos de variáveis: Locais Locais Globais Globais Use sempre que possível variáveis locais para garantir a independência das funções. Use sempre que possível variáveis locais para garantir a independência das funções. Não confundir tipos de Variáveis (locais e globais) com tipos de Dados (int, float, …) Não confundir tipos de Variáveis (locais e globais) com tipos de Dados (int, float, …)

43 43 Funções – Passagem de Parâmetros A passagem de parâmetros consiste no envio de valores para as funções invocadas. A passagem de parâmetros consiste no envio de valores para as funções invocadas. Exemplo: funcaoX(10, 20); Exemplo: funcaoX(10, 20); A passagem de parâmetros pode ser feita: A passagem de parâmetros pode ser feita: Por Valor Por Valor Por Referência Por Referência

44 44 Funções – Passagem de Parâmetros Passagem de parâmetros por valor Passagem de parâmetros por valor É enviado o valor do argumento para a função; É enviado o valor do argumento para a função; A função recebe esse valor no parâmetro definido, ou seja, a função fica com uma cópia valor original. A função recebe esse valor no parâmetro definido, ou seja, a função fica com uma cópia valor original. É aquilo que tem vindo a ser feito até agora. É aquilo que tem vindo a ser feito até agora.

45 45 Funções – Passagem de Parâmetros Passagem de parâmetros por valor Passagem de parâmetros por valor memória 001a 002b 003c 004d … #include main() { int valor, res; valor=20; res=func(valor); printf("%d",res); system("pause"); } func(int valor_recebido) { valor_recebido=valor_recebido+100; return valor_recebido; } valor valor res res valor_recebido valor_recebido

46 46 Funções – Passagem de Parâmetros Passagem de parâmetros por referência Passagem de parâmetros por referência É enviado para a função o endereço de memória do(s) argumento(s). É enviado para a função o endereço de memória do(s) argumento(s). A função recebe nos parâmetros definidos os endereços de memória dos argumentos, ou seja, a localização na memória dos valores dos argumentos. A função recebe nos parâmetros definidos os endereços de memória dos argumentos, ou seja, a localização na memória dos valores dos argumentos.

47 47 Funções – Passagem de Parâmetros Passagem de parâmetros por referência Passagem de parâmetros por referência memória 001a 002b 003c 003c 004d … #include main() { int valor; valor=20; func(&valor); printf("%d",valor); system("pause"); } func(int *endereco_recebido) { *endereco_recebido=*endereco_recebido+100; } valor valor 20 endereco_recebido endereco_recebido 001a 120

48 48 Funções – Passagem de Parâmetros Passagem de parâmetros por valor: Passagem de parâmetros por valor: São enviados valores para a função. São enviados valores para a função. São criadas cópias dos valores originais. São criadas cópias dos valores originais. Passagem de parâmetros por referência: Passagem de parâmetros por referência: São enviados endereços de memória para a função. São enviados endereços de memória para a função. Trabalhamos com os valores originais. Trabalhamos com os valores originais.

49 49 Funções - Recursividade RECURSIVIDADE RECURSIVIDADE Consiste na capacidade de uma função se chamar (invocar) a ela própria. Consiste na capacidade de uma função se chamar (invocar) a ela própria. Verificamos que estamos perante código recursivo, quando dentro de uma função temos uma chamada a essa mesma função. Verificamos que estamos perante código recursivo, quando dentro de uma função temos uma chamada a essa mesma função. Ex: Ex: funcao(int x) {…funcao(b);}

50 50 Funções - Recursividade Problema: Desenvolva uma aplicação capaz de calcular o factorial de um número. Problema: Desenvolva uma aplicação capaz de calcular o factorial de um número. Exemplo: Exemplo: Factorial de 4 = 4*3*2*1 = 24 Factorial de 4 = 4*3*2*1 = 24 Factorial de 5 = 5*4*3*2*1 = 120 Factorial de 5 = 5*4*3*2*1 = 120

51 51 Funções - Recursividade #include #include #include int factorial(int num) { int res=1, i; int res=1, i; for (i=num; i>=1; i--) for (i=num; i>=1; i--) { res = res * i; res = res * i; } return res; return res;} int main() { int numero; int numero; printf("\n Factorial a calcular:"); printf("\n Factorial a calcular:"); scanf("%d", &numero); scanf("%d", &numero); printf("\n Resultado: %d \n", factorial(numero)); printf("\n Resultado: %d \n", factorial(numero)); system("pause"); system("pause");} SEM RECURSIVIDADE

52 52 Funções - Recursividade No entanto se analisar melhor o problema factorial verifica que: No entanto se analisar melhor o problema factorial verifica que: Factorial de N = N * factorial de N-1 Factorial de N = N * factorial de N-1 O factorial de N-1 = N-1 * factorial de (N-1)-1 O factorial de N-1 = N-1 * factorial de (N-1)-1 … Até 1 Até 1

53 53 Funções - Recursividade Exemplo: factorial (fact) de 4: Exemplo: factorial (fact) de 4:fact(4)=4*fact(3) fact(3)=3*fact(2) fact(3)=3*fact(2) fact(2)=2*fact(1) fact(2)=2*fact(1) fact(1)=1 fact(1)= A Recursividade funciona exactamente desta forma. Vamos de seguida implementar a solução recursiva em C.

54 54 Funções - Recursividade #include #include #include int factorial(int num) { int res; int res; if (num==1) if (num==1) { return 1; return 1; } else else { res=num*factorial(num-1); res=num*factorial(num-1); return res; return res; }} int main() { int numero; int numero; printf("\n Factorial a calcular:"); printf("\n Factorial a calcular:"); scanf("%d", &numero); scanf("%d", &numero); printf("\n Resultado: %d \n", factorial(numero)); printf("\n Resultado: %d \n", factorial(numero)); system("pause"); system("pause");} COM RECURSIVIDADE

55 55 Funções - Recursividade Regras para a escrita de funções recursivas Regras para a escrita de funções recursivas 1. A primeira instrução de uma função recursiva deve ser sempre o critério de paragem (qual é a condição ou condições que se devem verificar para que a função pare de se invocar a si própria). 2. Só depois de escrito o critério de paragem é que se deverá escrever a chamada recursiva da função, sempre relativa a um subconjunto. Vantagens da Recursividade: Vantagens da Recursividade: Menor quantidade de código escrito; Menor quantidade de código escrito; Maior legibilidade (após a compreensão do conceito); Maior legibilidade (após a compreensão do conceito); Evita a escrita de estruturas de repetição. Evita a escrita de estruturas de repetição. Desvantagens da Recursividade: Desvantagens da Recursividade: Perda de performance (porque as funções ficam em standby). Perda de performance (porque as funções ficam em standby).

56 56 Funções - Bibliotecas


Carregar ppt "1 Módulo 3 Programação Estruturada. 2 Índice do módulo Noções Introdutórias Noções Introdutórias Subprogramas Subprogramas Tipos de subprogramas Tipos."

Apresentações semelhantes


Anúncios Google