56
1 Módulo 3 Módulo 3 Programação Estruturada

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

Embed Size (px)

Citation preview

Page 1: 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

1

Módulo 3Módulo 3

Programação Estruturada

Page 2: 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

2

Índice do móduloÍndice do módulo Noções IntrodutóriasNoções Introdutórias SubprogramasSubprogramas

Tipos de subprogramasTipos de subprogramas Procedimentos Procedimentos FunçõesFunções

VariáveisVariáveis Locais Locais GlobaisGlobais

RecursividadeRecursividade BibliotecasBibliotecas

Page 3: 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

3

Noções IntrodutóriasNoções Introdutórias

Como referido no módulo 1, uma das Como referido no módulo 1, uma das técnicas de resolução de problemas técnicas de resolução de problemas é a é a DECOMPOSIÇÃO.DECOMPOSIÇÃO.

E uma das vantagens da linguagem E uma das vantagens da linguagem C é o facto de permitir uma C é o facto de permitir uma programação programação MODULARMODULAR..

A programação A programação modularmodular permite-nos permite-nos aplicar o conceito de aplicar o conceito de decomposiçãodecomposição..

Page 4: 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

4

Noções IntrodutóriasNoções Introdutórias

Desde o primeiro programa em C Desde o primeiro programa em C que utilizamos funções:que utilizamos funções:

main()main() printf(….)printf(….) scanf(….)scanf(….) system(…)system(…) abs(….)abs(….) ……..

Reparem nos aspectos comuns…Reparem nos aspectos comuns…

Page 5: 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

5

Procedimentos e FunçõesProcedimentos 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.

Page 6: 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

6

Procedimentos e FunçõesProcedimentos e Funções

Imaginem o seguinte problema:Imaginem o seguinte problema: Escreva um programa que coloque no Escreva um programa que coloque no

ecrã o seguinte (mas utilizando ecrã o seguinte (mas utilizando estruturas de repetição):estruturas de repetição):

****************************************

Números entre 1 e 5Números entre 1 e 5

****************************************

11

22

33

44

55

****************************************

Page 7: 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

7

Procedimentos e FunçõesProcedimentos e Funções#include<stdio.h>#include<stdio.h>main()main(){{ int i, numero;int i, numero; for(i=0;i<20;i++) for(i=0;i<20;i++) /* 1ª linha de asteriscos *//* 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++) for(i=0;i<20;i++) /* 2ª linha de asteriscos *//* 2ª linha de asteriscos */ printf("*");printf("*");

for(i=1;i<=5;i++) for(i=1;i<=5;i++) /* números de 1 a 5 *//* números de 1 a 5 */ printf("\n%d\n",i);printf("\n%d\n",i);

for(i=0;i<20;i++) for(i=0;i<20;i++) /* asteriscos finais *//* asteriscos finais */ printf("*");printf("*");}}

Page 8: 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

8

Procedimentos e FunçõesProcedimentos e Funções

No programa anterior repetimos a No programa anterior repetimos a escrita de 20 asteriscos 3 vezesescrita de 20 asteriscos 3 vezes

for(i=0;i<20;i++) for(i=0;i<20;i++)

printf("*");printf("*");

Como evitar a repetição do mesmo Como evitar a repetição do mesmo código várias vezes?código várias vezes?

Page 9: 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

9

Procedimentos e FunçõesProcedimentos e Funções

Aqui entram os conceitos de Aqui entram os conceitos de ProcedimentosProcedimentos e e FunçõesFunções Embora ainda sem saber como escrever uma função, Embora ainda sem saber como escrever uma função,

já as temos utilizado ao longo dos nossos programas: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 De seguida podemos ver uma simplificação do programa anterior, através do uso de funções programa anterior, através do uso de funções (procedimentos).(procedimentos).

Nota:Nota: mais adiante veremos qual a diferença entre procedimentos e mais adiante veremos qual a diferença entre procedimentos e funções.funções.

Page 10: 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

10

#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<stdlib.h>

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

Page 11: 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

11

Procedimentos e FunçõesProcedimentos e Funções Um programa em C possui sempre a função Um programa em C possui sempre a função

main()main(), independentemente das restantes , independentemente das restantes funções que possua.funções que possua.

Um programa em C começa sempre a ser Um programa em C começa sempre a ser executado na função main(), mesmo que esta executado na função main(), mesmo que esta não esteja em primeiro lugar.não esteja em primeiro lugar.

O facto de termos várias funções num O facto de termos várias funções num programa, não quer dizer que elas sejam programa, não quer dizer que elas sejam executadas. Só serão executadas se forem executadas. Só serão executadas se forem invocadas (“chamadas”) pela função main() ou invocadas (“chamadas”) pela função main() ou por outra função invocada pela função main().por outra função invocada pela função main(). A invocação é feita escrevendo o nome da função A invocação é feita escrevendo o nome da função

com os respectivos (). Exemplo: asteriscos();com os respectivos (). Exemplo: asteriscos();

Page 12: 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

12

Procedimentos e FunçõesProcedimentos e Funções Como funciona uma função:Como funciona uma função:

O código da função só é executado quando O código da função só é executado quando esta é invocada;esta é invocada;

Quando uma função é invocada o programa Quando uma função é invocada o programa que a invoca é “suspenso” temporariamente. que a invoca é “suspenso” temporariamente. Em seguida são executadas as instruções da Em seguida são executadas as instruções da função. Quando a função terminar, o controlo função. Quando a função terminar, o controlo de execução do programa volta ao local em de execução do programa volta ao local em que a função foi invocada.que a função foi invocada.

Pode receber parâmetros;Pode receber parâmetros; Pode devolver um resultado.Pode devolver um resultado.

Page 13: 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

13

Procedimentos e FunçõesProcedimentos e Funções

Sintaxe em C:Sintaxe em C:

nomeDaFuncao()nomeDaFuncao()

{{

< bloco de instruções ; >< bloco de instruções ; >

}}

Page 14: 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

14

Procedimentos e FunçõesProcedimentos e Funções

Sintaxe algorítmica:

Função nomeDaFuncao()inicio

< bloco de instruções >fimFunção

Page 15: 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

15

Procedimentos e FunçõesProcedimentos e Funções Vantagens do uso de funções:Vantagens do uso de funções:

Permite o reaproveitamento de código já escrito Permite o reaproveitamento de código já escrito (por si ou por outros programadores); (por si ou por outros programadores);

Evita que um trecho (pedaço) de código que seja Evita que um trecho (pedaço) de código que seja repetido várias vezes dentro de um mesmo repetido várias vezes dentro de um mesmo programa; programa;

Permite a alteração de um trecho de código de uma Permite a alteração de um trecho de código de uma forma mais rápida. Com o uso de uma função é forma mais rápida. Com o uso de uma função é preciso alterar apenas preciso alterar apenas dentrodentro da função que se da função que se deseja; deseja;

Permite que os blocos do programa não fiquem Permite que os blocos do programa não fiquem grandes demais e, por consequência, mais difíceis grandes demais e, por consequência, mais difíceis de entender ; de entender ;

Facilita a leitura do código fonte; Facilita a leitura do código fonte; Permite separar o programa em partes (blocos) que Permite separar o programa em partes (blocos) que

possam ser logicamente compreendidos de forma possam ser logicamente compreendidos de forma isolada.isolada.

Page 16: 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

16

Procedimentos e FunçõesProcedimentos 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 é Cada função tem de ter um nome único, que é usado para a sua invocação;usado para a sua invocação;

Uma função pode ser invocada (chamada) a Uma função pode ser invocada (chamada) a partir de outras funções;partir de outras funções;

Uma função (como o seu nome deve indicar) Uma função (como o seu nome deve indicar) deve realizar deve realizar uma única tarefauma única tarefa bem definida; bem definida;

Uma função deve comportar-se como uma Uma função deve comportar-se como uma caixa negra, ou seja, não interessa como o faz, caixa negra, ou seja, não interessa como o faz, o que interessa é o resultado final;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 Uma função pode retornar para a função que a

invocou, um valor como resultado do seu invocou, um valor como resultado do seu trabalho.trabalho.

Page 17: 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

17

Procedimentos e FunçõesProcedimentos e Funções

Nome de uma função:Nome de uma função: Segue as mesmas regras dos nomes das Segue as mesmas regras dos nomes das

variáveis;variáveis; Tem de ser único no programa ( não Tem de ser único no programa ( não

pode ser igual ao nome de outra função pode ser igual ao nome de outra função ou variável);ou variável);

Deve ser de fácil leitura a através dele Deve ser de fácil leitura a através dele devemos conseguir perceber o que a devemos conseguir perceber o que a função faz.função faz.

Page 18: 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

18

Funções – Parâmetros e Funções – Parâmetros e ArgumentosArgumentos

++++++++++

**************

********************

**************++++++++++

Com a aplicação de funções, elabore um programa capaz Com a aplicação de funções, elabore um programa capaz de mostrar o output (mensagens) anteriores.de mostrar o output (mensagens) anteriores.

Use também estruturas de repetição.Use também estruturas de repetição.

Page 19: 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

19

……void cinco_mais()void cinco_mais(){{ int i;int i; for(i=0;i<5;i++)for(i=0;i<5;i++) {{ printf("+");printf("+"); }}}}

void sete_asteriscos()void sete_asteriscos(){{ int i;int i; for(i=0;i<7;i++)for(i=0;i<7;i++) {{ printf("*");printf("*"); }}}}

void dez_asteriscos()void dez_asteriscos(){{ int i;int i; for(i=0;i<10;i++)for(i=0;i<10;i++) {{ printf("*");printf("*"); }}}}

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

Page 20: 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

20

Funções – Parâmetros e Funções – Parâmetros e ArgumentosArgumentos

Como podemos verificar no Como podemos verificar no programa anterior, temos funções programa anterior, temos funções com código muito semelhante.com código muito semelhante.

Ex: Ex: sete_asteriscos(), dez_asteriscos()sete_asteriscos(), dez_asteriscos() EstasEstas funções apenas diferem no número funções apenas diferem no número

de asteriscos que são impressos.de asteriscos que são impressos.

Vejamos então o que podemos fazer para Vejamos então o que podemos fazer para simplificar o programa anterior…simplificar o programa anterior…

Page 21: 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

21

#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<stdlib.h>

void cinco_mais()void cinco_mais(){{ int i;int i; for(i=0;i<5;i++)for(i=0;i<5;i++) {{ printf("+");printf("+"); }}}}

void asteriscos(void asteriscos(int nr_asteriscosint nr_asteriscos)){{ int i;int i; for(i=0;i<nr_asteriscos;i++)for(i=0;i<nr_asteriscos;i++) {{ printf("*");printf("*"); }}}}

main()main(){{ cinco_mais();cinco_mais(); puts("\n");puts("\n"); asteriscos(asteriscos(77);); puts("\n");puts("\n"); asteriscos(asteriscos(1010);); puts("\n");puts("\n"); asteriscos(asteriscos(77);); puts("\n");puts("\n"); cinco_mais();cinco_mais(); puts("\n\n\n");puts("\n\n\n"); system("pause");system("pause");}}

Page 22: 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

22

Funções – Parâmetros e Funções – Parâmetros e ArgumentosArgumentos

Como podemos ver no código anterior, podemos enviar Como podemos ver no código anterior, podemos enviar informação para as funções.informação para as funções.

main()main(){{……asteriscos(asteriscos(1010););……}}

void asteriscos(void asteriscos(int nr_asteriscosint nr_asteriscos)){{……}}

PARÂMETROS

ARGUMENTOS

Page 23: 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

23

Funções – Parâmetros e Funções – Parâmetros e ArgumentosArgumentos

Características dos Características dos parâmetrosparâmetros e e argumentosargumentos Os argumentos e parâmetros podem ser de Os argumentos e parâmetros podem ser de

qualquer tipo (int, float, char, …).qualquer tipo (int, float, char, …). Os parâmetros de uma função são separados Os parâmetros de uma função são separados

por vírgula, e é obrigatória a indicação do por vírgula, e é obrigatória a indicação do tipo de cada parâmetro.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) Ex. void funcaoX(int par1, par2, par3) ERRADOERRADO

O nr. de argumentos enviados tem de ser O nr. de argumentos enviados tem de ser igual ao nr. de parâmetros que vão receber os igual ao nr. de parâmetros que vão receber os valoresvalores

Page 24: 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

24

Funções – Parâmetros e Funções – Parâmetros e ArgumentosArgumentos

Características dos Características dos parâmetrosparâmetros e e argumentos argumentos (cont.)(cont.) Um parâmetro não é mais do que uma variável Um parâmetro não é mais do que uma variável

local à função a que pertence. Um parâmetro é local à função a que pertence. Um parâmetro é automaticamente inicializado com o valor enviado automaticamente inicializado com o valor enviado pelo programa invocador.pelo programa invocador.

A passagem de argumentos para a função deve A passagem de argumentos para a função deve ser realizada colocando-os dentro de parêntesis, ser realizada colocando-os dentro de parêntesis, separados por vírgulas.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, Os argumentos enviados podem ser valores (1,

‘a’) ou variáveis (valor1, letra, …). ‘a’) ou variáveis (valor1, letra, …).

Page 25: 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

25

Funções – Parâmetros e Funções – Parâmetros e ArgumentosArgumentos

Características dos Características dos parâmetrosparâmetros e e argumentos argumentos (cont.)(cont.) O número de O número de argumentosargumentos enviados para uma enviados para uma

função deve ser igual ao número de parâmetros função deve ser igual ao número de parâmetros existentes no cabeçalho da função. Os tipos de existentes no cabeçalho da função. Os tipos de dados têm também de ser iguais.dados têm também de ser iguais.

Ex.Ex.main()main()

{{

funcaoX(‘A’, 123, 23.44);funcaoX(‘A’, 123, 23.44);

}}

funcaoX(char letra, int valor1, float numero)funcaoX(char letra, int valor1, float numero)

Page 26: 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

26

Funções – Parâmetros e Funções – Parâmetros e ArgumentosArgumentos

Voltando ao exercício inicial:Voltando ao exercício inicial:++++++++++

**************

********************

**************++++++++++

Acham que se podia simplificar ainda Acham que se podia simplificar ainda mais???mais???

Page 27: 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

27

#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<stdlib.h>

void imprime_caracteres(int nr_asteriscos, char void imprime_caracteres(int nr_asteriscos, char caracter_a_imprimir)caracter_a_imprimir)

{{ int i;int i; for(i=0;i<nr_asteriscos;i++)for(i=0;i<nr_asteriscos;i++) {{ printf("%c", caracter_a_imprimir);printf("%c", caracter_a_imprimir); }}}}main()main(){{ imprime_caracteres(5, '+');imprime_caracteres(5, '+'); puts("\n");puts("\n"); imprime_caracteres(7, '*');imprime_caracteres(7, '*'); puts("\n");puts("\n"); imprime_caracteres(10, '*');imprime_caracteres(10, '*'); puts("\n");puts("\n"); imprime_caracteres(7, '*');imprime_caracteres(7, '*'); puts("\n");puts("\n"); imprime_caracteres(5, '+'); puts("\n\n\n"); imprime_caracteres(5, '+'); puts("\n\n\n"); system("pause"); }system("pause"); }

Page 28: 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

28

Funções – Instrução Funções – Instrução returnreturn

Esta instrução permite terminar a Esta instrução permite terminar a execução de uma função e voltar à função execução de uma função e voltar à função que a invocou.que a invocou. A execução da instrução return na função A execução da instrução return na função

main() faz com que o programa termine.main() faz com que o programa termine.main() main()

{{

imprime();imprime();

printf(“ola”);printf(“ola”);

}}

void imprime() {void imprime() {

printf(“impressão”);printf(“impressão”);

return;return;

}}

#include<stdio.h>#include<stdio.h>

main()main()

{{printf(“ola”);printf(“ola”);

return;return;

printf(“xau”);printf(“xau”);

} }

Page 29: 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

29

Funções – Instrução Funções – Instrução returnreturn

Mas além de terminar a função que está Mas além de terminar a função que está a ser executada pode também devolver a ser executada pode também devolver (retornar) valores para o local onde foi (retornar) valores para o local onde foi invocada .invocada . E esta é a característica mais importante do E esta é a característica mais importante do

returnreturn Se até agora consegue enviar valores para as Se até agora consegue enviar valores para as

funções invocadas (com argumentos e funções invocadas (com argumentos e parâmetros), agora também já consegue parâmetros), agora também já consegue devolver valores das funções invocadas para devolver valores das funções invocadas para as funções invocadores. as funções invocadores.

Page 30: 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

30

Funções – Instrução Funções – Instrução returnreturn

returnreturn Termina a função que está a ser executadaTermina a função que está a ser executada Permite devolver Permite devolver um únicoum único valor (resultado) à valor (resultado) à

função invocadora. Este valor poderá ser função invocadora. Este valor poderá ser armazenado numa variável ou aproveitado por armazenado numa variável ou aproveitado por uma instrução.uma instrução.

Sintaxe da instrução Sintaxe da instrução returnreturn return valor_de_retorno; ou return;

Page 31: 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

31

#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<stdlib.h>int funcao_soma(int valorA, int valorB)int funcao_soma(int valorA, int valorB){{ int total;int total; total=valorA+valorB;total=valorA+valorB; return total;return total;}}

main()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");}}

Page 32: 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

32

#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<stdlib.h>int funcao_soma(int valorA, int valorB)int funcao_soma(int valorA, int valorB){{ return valorA+valorB;return valorA+valorB;}}

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

Page 33: 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

33

Funções – Instrução Funções – Instrução returnreturn

Notas:Notas: Uma função pode ser invocada dentro de outra Uma função pode ser invocada dentro de outra

função.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 Uma função pode ter várias instruções returnreturn, , mas apenas uma é realmente executada.mas apenas uma é realmente executada.

……

if (a==3)if (a==3)return 3;return 3;

elseelsereturn 1;return 1;

……

Page 34: 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

34

Funções – Instrução Funções – Instrução returnreturn

Notas (cont.)Notas (cont.) O facto de uma função retornar um valor O facto de uma função retornar um valor

não obriga a que esse valor tenha de ser não obriga a que esse valor tenha de ser aproveitado (armazenado) pala função aproveitado (armazenado) pala função invocadora.invocadora.

ERRADO:ERRADO:

.......... funcao_soma(valor1, valor2)=soma;funcao_soma(valor1, valor2)=soma;

..........

Page 35: 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

35

Funções – Instrução Funções – Instrução returnreturn

intint funcao_soma(int valorA, int valorB) 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 O tipo de dados retornado tem de ser o mesmo

tipo de dados definido para a funçãotipo de dados definido para a função Temos sempre de indicar qual o tipo de dados Temos sempre de indicar qual o tipo de dados

que a nossa função vai retornarque a nossa função vai retornarfloat funcao_multiplica (int x, int y)float funcao_multiplica (int x, int y)

……..

Page 36: 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

36

Funções – Instrução Funções – Instrução returnreturn

Tipo de dados Tipo de dados voidvoid Em C existe uma palavra reservada – Em C existe uma palavra reservada –

voidvoid – que permite indicar que uma – que permite indicar que uma função não devolve qualquer tipo de função não devolve qualquer tipo de dados.dados.

void funcao_xpto ()void funcao_xpto ()

{{

}}

Page 37: 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

37

Funções – Protótipos das Funções – Protótipos das funçõesfunções

Onde colocar as funções:Onde colocar as funções: Dentro de um mesmo ficheiro (por agora), Dentro de um mesmo ficheiro (por agora),

antes ou depois da função antes ou depois da função main(). main(). No No entanto se as funções forem colocadas entanto se as funções forem colocadas depois da função main, alguns depois da função main, alguns compiladores geram erros ou alertas. Para compiladores geram erros ou alertas. Para evitar esses erros ou alertas usam-se os evitar esses erros ou alertas usam-se os protótipos (cabeçalhos) de funções. Estes protótipos (cabeçalhos) de funções. Estes protótipos não são mais do que a primeira protótipos não são mais do que a primeira linha da função seguida de ponto e linha da função seguida de ponto e vírgula.vírgula.

int funcao_soma(int valorA, int valorB)int funcao_soma(int valorA, int valorB);;

Page 38: 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

38

Funções – Protótipos das Funções – Protótipos das funçõesfunções

Os protótipos das funções devem ser Os protótipos das funções devem ser colocados depois da inclusão das colocados depois da inclusão das bibliotecas.bibliotecas.

NãoNão é necessário criar protótipo da é necessário criar protótipo da função main().função main().

Page 39: 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

39

Procedimentos e FunçõesProcedimentos e Funções

Qual a diferença entre Procedimentos Qual a diferença entre Procedimentos e Funções?e Funções? ProcedimentoProcedimento: não devolve (retorna) : não devolve (retorna)

qualquer valor à função que o invocou.qualquer valor à função que o invocou. Não tem a instrução “return”Não tem a instrução “return”

FunçãoFunção: devolve um valor de um : devolve um valor de um determinado tipo à função invocadora.determinado tipo à função invocadora. Possui a instrução “return”Possui a instrução “return”

Page 40: 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

40

Funções – Tipos de Funções – Tipos de VariáveisVariáveis

Variáveis LOCAIS:Variáveis LOCAIS: São declaradas São declaradas

dentro de uma dentro de uma função;função;

São conhecidas São conhecidas apenas dentro da apenas dentro da função onde estão função onde estão declaradas.declaradas.

#include<stdio.h>

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

Page 41: 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

41

Funções – Tipos de Funções – Tipos de VariáveisVariáveis

Variáveis GLOBAIS:Variáveis GLOBAIS: São declaradas fora São declaradas fora

das funções das funções (normalmente após a (normalmente após a inclusão das bibliotecas)inclusão das bibliotecas);;

São conhecidas em São conhecidas em todas as funções do todas as funções do programa programa (o seu valor (o seu valor está sempre acessível)está sempre acessível)

#include<stdio.h>

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

Page 42: 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

42

Funções – Tipos de Funções – Tipos de VariáveisVariáveis

ResumoResumo Tipos de variáveis:Tipos de variáveis:

LocaisLocais GlobaisGlobais

Use sempre que possível Use sempre que possível variáveis locaisvariáveis locais para garantir a independência das para garantir a independência das funções.funções.

Não confundir tipos de Variáveis (locais e Não confundir tipos de Variáveis (locais e globais) com tipos de Dados (int, float, …)globais) com tipos de Dados (int, float, …)

Page 43: 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

43

Funções – Passagem de Funções – Passagem de ParâmetrosParâmetros

A passagem de parâmetros consiste A passagem de parâmetros consiste no envio de valores para as funções no envio de valores para as funções invocadas.invocadas. Exemplo: funcaoX(10, 20);Exemplo: funcaoX(10, 20);

A passagem de parâmetros pode ser A passagem de parâmetros pode ser feita:feita: Por ValorPor Valor Por ReferênciaPor Referência

Page 44: 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

44

Funções – Passagem de Funções – Passagem de ParâmetrosParâmetros

Passagem de parâmetros por Passagem de parâmetros por valorvalor É enviado o valor do argumento para a É enviado o valor do argumento para a

função;função; A função recebe esse valor no parâmetro A função recebe esse valor no parâmetro

definido, ou seja, a função fica com uma definido, ou seja, a função fica com uma “cópia” valor original.“cópia” valor original.

É aquilo que tem vindo a ser feito até É aquilo que tem vindo a ser feito até agora.agora.

Page 45: 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

45

Funções – Passagem de Funções – Passagem de ParâmetrosParâmetros

Passagem de parâmetros por Passagem de parâmetros por valorvalor

memóriamemória001a001a

002b002b

003c003c

004d004d

……

#include<stdio.h>#include<stdlib.h>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_recebidovalor_recebido

2020

2200

120120

120120

Page 46: 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

46

Funções – Passagem de Funções – Passagem de ParâmetrosParâmetros

Passagem de parâmetros por Passagem de parâmetros por referênciareferência É enviado para a função o É enviado para a função o endereço de endereço de

memóriamemória do(s) argumento(s). do(s) argumento(s). A função recebe nos parâmetros A função recebe nos parâmetros

definidos os endereços de memória dos definidos os endereços de memória dos argumentos, ou seja, “a localização na argumentos, ou seja, “a localização na memória” dos valores dos argumentos.memória” dos valores dos argumentos.

Page 47: 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

47

Funções – Passagem de Funções – Passagem de ParâmetrosParâmetros

Passagem de parâmetros por Passagem de parâmetros por referênciareferência

memóriamemória001a001a

002b002b

003c003c

004d004d

……

#include<stdio.h>#include<stdlib.h>main(){ int valor; valor=20; func(&valor); printf("%d",valor); system("pause");}func(int *endereco_recebido){ *endereco_recebido=*endereco_recebido+100;}

valor valor 2020

endereco_recebido endereco_recebido 001a001a

120

Page 48: 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

48

Funções – Passagem de Funções – Passagem de ParâmetrosParâmetros

Passagem de parâmetros por Passagem de parâmetros por valorvalor:: São enviados São enviados valoresvalores para a função. para a função. São criadas São criadas cópiascópias dos valores originais. dos valores originais.

Passagem de parâmetros por Passagem de parâmetros por referênciareferência:: São enviados São enviados endereçosendereços de memória para de memória para

a função.a função. ““Trabalhamos” com os valores Trabalhamos” com os valores originaisoriginais. .

Page 49: 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

49

Funções - RecursividadeFunções - Recursividade

RECURSIVIDADERECURSIVIDADE Consiste na capacidade de uma função se Consiste na capacidade de uma função se

chamar (invocar) a ela própria.chamar (invocar) a ela própria. Verificamos que estamos perante código Verificamos que estamos perante código

recursivo, quando dentro de uma função recursivo, quando dentro de uma função temos uma chamada a essa mesma função.temos uma chamada a essa mesma função.

Ex:Ex:funcao(int x)funcao(int x)

{{

……

funcao(b);funcao(b);

}}

Page 50: 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

50

Funções - RecursividadeFunções - Recursividade

Problema: Desenvolva uma aplicação Problema: Desenvolva uma aplicação capaz de calcular o factorial de um capaz de calcular o factorial de um número.número.

Exemplo: Exemplo: Factorial de 4 = 4*3*2*1 = 24Factorial de 4 = 4*3*2*1 = 24 Factorial de 5 = 5*4*3*2*1 = 120Factorial de 5 = 5*4*3*2*1 = 120

Page 51: 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

51

Funções - RecursividadeFunções - Recursividade#include <stdio.h>#include <stdio.h>#include<stdlib.h>#include<stdlib.h>

int factorial(int num)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 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

RECU

RSIVID

ADE

Page 52: 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

52

Funções - RecursividadeFunções - Recursividade

No entanto se analisar melhor o No entanto se analisar melhor o problema factorial verifica que:problema factorial verifica que:

Factorial de N = N * factorial de N-1Factorial de N = N * factorial de N-1 O factorial de N-1 = N-1 * factorial de O factorial de N-1 = N-1 * factorial de

(N-1)-1 (N-1)-1 ……

Até 1Até 1

Page 53: 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

53

Funções - RecursividadeFunções - Recursividade

Exemplo: factorial (fact) de 4:Exemplo: factorial (fact) de 4:

fact(4)=4*fact(3)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)=1fact(1)=11

2

6

24

A Recursividade funciona exactamente desta forma.

Vamos de seguida implementar a solução recursiva em C.

Page 54: 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

54

Funções - RecursividadeFunções - Recursividade#include <stdio.h>#include <stdio.h>#include<stdlib.h>#include<stdlib.h>int factorial(int num)int factorial(int num){{ int res;int res; if (num==1)if (num==1) {{ return 1;return 1; }} elseelse {{ res=num*factorial(num-1);res=num*factorial(num-1); return res;return res; }}}}

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

RECU

RSIVID

ADE

Page 55: 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

55

Funções - RecursividadeFunções - Recursividade Regras para a escrita de funções Regras para a escrita de funções

recursivasrecursivas1.1. A primeira instrução de uma função recursiva deve ser sempre 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 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 devem verificar para que a função pare de se invocar a si própria).própria).

2.2. Só depois de escrito o critério de paragem é que se deverá Só depois de escrito o critério de paragem é que se deverá escrever a chamada recursiva da função, sempre relativa a um escrever a chamada recursiva da função, sempre relativa a um subconjunto.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”).

Page 56: 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

56

Funções - BibliotecasFunções - Bibliotecas