Você está na página 1de 39

Subprogramas

ou
Funções

1 INF 01202 - Prof. Marcelo Walter – Aula 16


Quem…é….você??? Um programador!!

2 INF 01202 - Prof. Marcelo Walter – Aula 16


Necessidade de Estruturar

•  Sistemas de software reais são complexos e muito


grandes!
•  Necessidade de organizar o processo, senão CAOS!
•  Código espagueti!

3 INF 01202 - Prof. Marcelo Walter – Aula 16


Código Spagueti

4 INF 01202 - Prof. Marcelo Walter – Aula 16


Código Estruturado

5 INF 01202 - Prof. Marcelo Walter – Aula 16


•  Um dos problemas mais importantes na engenharia
de software tem sido como programar sistemas
complexos de software

•  Grandes projetos envolvem centenas de


programadores que trabalham em milhões de linhas
de código

6 INF 01202 - Prof. Marcelo Walter – Aula 16


Alguns exemplos

•  Windows XP: 45 milhões


de linhas de código
•  Mac OS X: 86 milhões
de linhas de código

http://en.wikipedia.org/wiki/Source_lines_of_code

7 INF 01202 - Prof. Marcelo Walter – Aula 16


Linux kernel 3.6: 15.9 milhões de linhas de código

8 INF 01202 - Prof. Marcelo Walter – Aula 16


•  Neste tipo de ambiente, é fácil perder a noção do
que o código faz em particular. Para evitar tais
problemas a computação começou a se organizar em
torno do conceito de "modularização", que significa
organizar o código com base na tarefa que ele
executa. Desta forma, o código torna-se reutilizável
e mais fácil de depurar e gerenciar.

http://www.ehow.com/info_12088921_advantages-modularization-programming.html

9 INF 01202 - Prof. Marcelo Walter – Aula 16


Vantagens da Programação Estruturada

•  Facilidade de debugar
•  Reutilização de código
•  Legibilidade
•  Confiança

10 INF 01202 - Prof. Marcelo Walter – Aula 16


Solução: Programação Estruturada

•  Desenvolvimento de algoritmos por fases ou


refinamentos sucessivos

•  Uso de um número muito limitado de estruturas de


controle

•  Decomposição do algoritmo total em módulos,


desenvolvidos e implementados usando subprogramas.

“dividir para conquistar”

11 INF 01202 - Prof. Marcelo Walter – Aula 16


Idéia Principal
funcao1

int main(){

funcao2

funcao3

……..

int main(){

……..

return 0} return 0}
Programa sem estruturação Programa estruturado

12 INF 01202 - Prof. Marcelo Walter – Aula 16


Subprograma

Implementados em C como funções


Objetivos principais:
ü  evitar repetição de sequência de comandos.
ü  dividir e estruturar um programa em partes fechadas
e logicamente coerentes.

“A arte de programar consiste na arte de


organizar e dominar a complexidade dos
sistemas”
Dijkstra, 1972

13 INF 01202 - Prof. Marcelo Walter – Aula 16


Funções ou subprogramas:

O que são?
•  Sequência de instruções ou programas auto-contidos
•  Uma função deve executar UMA tarefa específica, muito bem
identificada
•  Executados somente quando chamados por um programa em
execução
•  A execução de um programa em C corresponde a execução da
função principal main( ), que é obrigatória.
•  Após sua execução, o fluxo do programa retorna ao ponto
imediatamente após o da chamada da função (ou subprograma).

14 INF 01202 - Prof. Marcelo Walter – Aula 16


Tipos de Funções:

•  Funções pré-definidas (disponibilizadas pelos


compiladores)
•  Funções desenvolvidas pelo usuário (um
programa pode incluir diversas funções).

15 INF 01202 - Prof. Marcelo Walter – Aula 16


Funções matemáticas pré-definidas:
Requer uso da biblioteca math (#include <math.h>)
Função Exemplo Comentário
abs abs(x) Valor absoluto
ceil ceil(x) Arredonda o número real para cima: ceil(3.2) é 4

cos cos(x) Cosseno de x (x em radianos)

exp exp(x) e elevado à potencia x

fabs fabs(x) Valor absoluto de x

floor floor(x) Arredonda o número real para baixo: floor(3.2) é 3

log log(x) Logaritmo natural de x

log10 log10(x) Logaritmo decimal de x

pow pow(x, y) Calcula x elevado à potência y

sin sin(x) Seno de x

sqrt sqrt(x) Raiz quadrada de x

tan tan(x) Tangente de x

16 INF 01202 - Prof. Marcelo Walter – Aula 16


Exemplo do uso funções pré-definidas na linguagem C:
// Calcula a área de um circulo, utilizando a função pow.
#include <stdio.h> // para uso de funções de entrada e saída
#include <math.h> // para o uso de funções aritméticas já disponíveis
#define PI 3.141618 // não existe esta constante em C

int main( )
{
float raio, area;
printf("Forneca o raio de um circulo: "); // função
scanf("%f", &raio); // função
area = PI * pow(raio, 2);
printf("Area do circulo de raio %6.2f eh %6.2f \n", raio, area);

return 0;
}

Função power com 2 parâmetros


17 INF 01202 - Prof. Marcelo Walter – Aula 16
Funções desenvolvidas pelo usuário:

Objetivos principais e vantagens de uso:


•  Estrutura lógica mais clara.
•  Facilita a solução de problemas complexos através de
uma solução em partes (dividir para conquistar);
•  Maior facilidade de depuração e teste (subprogramas
podem ser testados separadamente).
•  Disponibiliza trechos de programa que solucionam
problemas recorrentes;
•  Evita repetição de sequência de comandos (e erros
decorrentes).

18 INF 01202 - Prof. Marcelo Walter – Aula 16


Exemplo de repetição de código:
//Escrita de numeros inteiros
#include<stdio.h>

int main( ) Como evitar


{ repetição
int i;
de mesmo código?
//apresentacao do cabecalho
for (i=1;i<20;i++)
printf("*");
printf("\n");
printf("Numeros entre 1 e 5\n"); Execução
for (i=1;i<20;i++)
printf("*");
printf("\n");
//escrita dos numeros
for (i=1;i<=5;i++)
printf("%d\n",i);
for (i=1;i<20;i++)
printf("*");
printf("\n");

return 0;
} 19 INF 01202 - Prof. Marcelo Walter – Aula 16
Problemas associados a repetições de código:
ü  Repetição de trechos de código idênticos:
•  um procedimento fácil e rápido, mas que facilmente tende a
produzir erros.
•  manutenção e alteração de programas com trechos repetidos é
trabalhosa e sujeita a erros.
•  com frequência alterações de trechos iguais que se repetem não
são realizadas em todas as ocorrências do trecho ou são realizadas
de forma incompleta ou equivocada, com resultados bastante
danosos.
ü Solução:
•  funções.

20 INF 01202 - Prof. Marcelo Walter – Aula 16


Função X parâmetro:

Quando um programa executa uma função:


1.  A função pode receber dados deste programa, utilizados
localmente para executar os comandos incluídos na função:
estes dados são chamados de parâmetros ou argumentos.
2.  Uma função pode também retornar um valor para o programa, o
que chamamos de retorno de função.

21 INF 01202 - Prof. Marcelo Walter – Aula 16


Tipos de funções:

•  Funções void: não retornam valor associado à função


1.  sem parâmetros (parâmetros void)
2.  com parâmetros:
1.  passados por valor
2.  passados por referência
•  Funções tipadas ou com retorno: devolvem um único
valor associado a execução da função, usando o comando
return.
1.  sem parâmetros (parâmetros void)
2.  com parâmetros.

void é um termo que indica ausência.


Em linguagem C é um tipo de dados.

22 INF 01202 - Prof. Marcelo Walter – Aula 16


Tipos de funções:
•  Funções void:
1.  sem parâmetros:
ü  declaração:
void nome_da_função (void)
ou ( )
{
declaração de variáveis locais
comando1;
comando2;
...
}

ü  chamada:
nome_da_função ( );

23 INF 01202 - Prof. Marcelo Walter – Aula 16


Como definir uma função void sem parâmetro?
void nome_da_função (void) cabeçalho da função
ou ( )
{
declaração de variáveis locais
comando1; corpo da função
comando2; (entre chaves)
...
}

Elemento Significado
void Palavra_chave indicando que a função não retornará
valor.
nome_da_função Identificador, com nome da função.
void Palavra_chave, indicando que a função não receberá
argumentos. Aqui, equivale a ( ), sem incluir a palavra
void.
{ Indica início do corpo_da_função.
} Indica fim do corpo_da_função.

24 INF 01202 - Prof. Marcelo Walter – Aula 16


Caso 1: Exemplo de função void, sem parâmetro:
//Escrita de numeros inteiros
#include<stdio.h>
void escreve_linha ( )
void escreve_linha ( ) ou
{ // preenche linha com 19 asteriscos
int i; // variável local void escreve_linha(void)
for (i=1;i<20;i++)
printf("*");
printf("\n");
}
int main( )
{
int i; // variável local Mesma Execução
//apresentacao do cabecalho
escreve_linha( );
printf("Numeros entre 1 e 5\n");
escreve_linha( );
//escrita dos numeros
for (i=1;i<=5;i++)
printf("%d\n",i);
escreve_linha( );

return 0;
}

25 INF 01202 - Prof. Marcelo Walter – Aula 16


Caso 1: Exemplo de função void, sem parâmetro:
//Escrita de numeros inteiros
#include<stdio.h>
void escreve_ linha ( ) Declaração da função
{ // preenche linha com 19 asteriscos escreve_linha, que
int i; // variável local escreve uma linha de
for (i=1;i<20;i++) asteriscos.
printf("*");
printf("\n");
}
int main( ) IMPORTANTE: i e i são
{ variáveis independentes,
int i; // variável local sem nenhuma relação
//apresentacao do cabecalho entre elas!!
escreve_ linha( );
printf("Numeros entre 1 e 5\n");
escreve_ linha( );
//escrita dos numeros Chamadas da função
for (i=1; i<=5; i++)
escreve_linha
printf("%d\n", i);
escreve_ linha( );

return 0;
}

26 INF 01202 - Prof. Marcelo Walter – Aula 16


Funções: variáveis locais

Programa principal Subprograma X


Variáveis locais :
int a, k
...
•  uma função (inclusive
int a =4, k=9; a = 0; // local a main) tem acesso
k = 5; // local
...
somente às variáveis
...
locais
execute X
... •  não altera valor de
variáveis de outras
... funções
execute X
...
0 5
4 9 a k
a k
main

27 INF 01202 - Prof. Marcelo Walter – Aula 16


Variáveis Locais

•  São declaradas dentro de uma função.


•  Só podem ser referenciadas por comandos que estão
dentro do bloco (função) no qual elas foram declaradas –
ou seja, não são reconhecidas fora da função onde foram
declaradas (programa principal ou outra funções).
•  Existem apenas enquanto o bloco de código em que foram
declaradas está sendo executado.

28 INF 01202 - Prof. Marcelo Walter – Aula 16


Variáveis Globais

•  São declaradas antes de todas as funções

•  Qualquer parte do programa pode utilizar


estas variáveis

•  Deve-se utilizar o mínimo possível ou


evitar totalmente variáveis globais (código
espagueti)

29 INF 01202 - Prof. Marcelo Walter – Aula 16


Variáveis Locais e Globais – exemplo 1

#include <stdio.h>

int cont=5; // variável global

void funcao1( )
{
int i;
for (i=1;i < cont; i++)
printf(".");
printf("\n cont funcao 1 = %d", cont);
}

int main( )
{
printf("\n cont main = %d \n", cont);
funcao1( );
printf("\n cont main apos funcao1 = %d \n", cont);

return 0;
}

30 INF 01202 - Prof. Marcelo Walter – Aula 16


Variáveis Locais e Globais – exemplo 2

#include <stdio.h>

int cont=5; // variável global


void funcao1()
{
int i;
for (i=1;i < cont; i++) // reconhece a variável global
printf(".");
printf("\n cont funcao 1 = %d", cont);
}

int main( )
{
int cont=10; // cont local, do programa principal. Não altera a
// variavel cont global!
printf("\n cont main = %d \n", cont);
funcao1();
printf("\n cont main apos funcao1 = %d \n", cont);

return 0;
}

31 INF 01202 - Prof. Marcelo Walter – Aula 16


Variáveis Locais e Globais – exemplo 3

#include <stdio.h>

int cont=5; // variável global


void funcao1()
{
int cont=15, i; // cont local da funcao1
for (i=1;i < cont; i++)
printf(".");
printf("\n cont funcao 1 = %d", cont);
}

int main()
{
int cont=10; // cont local do programa principal

printf("\n cont main = %d \n", cont);


funcao1();
printf("\n cont main apos funcao1 = %d \n", cont);
return 0;
}

32 INF 01202 - Prof. Marcelo Walter – Aula 16


Variáveis Locais e Globais – exemplo 4
O que aconteceria?
#include <stdio.h>
Programa não compila!
// cont global foi excluída!!!
void funcao1( ) Variável cont não existe!
{
int i; // declaração cont local também foi excluída
for (i=1;i < cont; i++)
printf(".");
printf("\n cont funcao 1 = %d", cont);
}

int main( )
{
int cont=10; // cont local do programa principal – não é global

printf("\n cont main = %d \n", cont);


funcao1( );
printf("\n cont main apos funcao1 = %d \n", cont);

return 0;
}

33 INF 01202 - Prof. Marcelo Walter – Aula 16


Importante

•  Em subprogramas, utilizar somente variáveis locais.


•  Troca de dados entre módulos feita somente através de
parâmetros!
•  Identificar claramente os parâmetros de entrada (que
fornecem valores para serem processados) e os de saída
(que retornam o que foi calculado ao programa principal)
•  EVITE UTILIZAR VARIÁVEIS GLOBAIS!!!!

34 INF 01202 - Prof. Marcelo Walter – Aula 16


Declaração de funções void, com uso de protótipo

Se não estiverem declaradas antes do programa principal, incluir


pré-declaração através do recurso do protótipo.

#include <stdio.h>

void escreve_linha(void); // protótipo: com ;


Protótipo
da função int main( )
{
...
escreve_linha( );
Chamada }
da função
void escreve_linha(void) // declaração: sem ;
{ // preenche linha com 19 asteriscos
int i; // variável local
for (i=1;i<20;i++)
Declaração printf("*");
da função printf("\n");
}

35 INF 01202 - Prof. Marcelo Walter – Aula 16


Exercício 1: função void, sem parâmetro
1 ) Escreva uma função void, de nome menu_de_opcoes, que
gere a tela abaixo, sem incluir a leitura da opção informada:

No programa principal, inclua a chamada desta função e


verifique se o resultado é o desejado.

36 INF 01202 - Prof. Marcelo Walter – Aula 16


Exercício 1: função void, sem parâmetro
// Uso de funções:
#include <stdio.h>
void menu_de_opcoes (void) // função para impressão de menu
{
printf("\nOpcoes disponiveis:");
printf("\nOpcoes disponiveis:");
printf("\n------------------\n");
printf("\n------------------\n");
printf("\n 1 - soma de dois valores reais");
printf("\n 21 -- se
printf("\n soma
eh de dois do
divisor valores reais");
numero");
printf("\n 2 - se eh divisor do numero");
printf("\n 33--sequencia
sequencia de
de numeros
numeros pares
pares ");
printf("\n 4 - se numero eh perfeito\n"); ");
printf("\n
printf("\n-> 4Informe
printf("\n - se numero eh perfeito\n”);
a opcao desejada: ");
} printf("\n -> Informe a opcao desejada: ");
int main( )
{
.......
menu_de_opcoes( ); // chamada da função, SEM PARÂMETRO!
.....
return 0; // fim da execução de main( )
}

37 INF 01202 - Prof. Marcelo Walter – Aula 16


Exercício 2:

•  Faça um programa que imprime na tela 3 matrizes


de inteiros de dimensão 3x3 com números aleatórios
no intervalo [5,15].
•  A geração e impressão na tela das matrizes deverá
ser obtida com uma função void sem parâmetros

38 INF 01202 - Prof. Marcelo Walter – Aula 16


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

#define NLIN 3
#define NCOL 3

void imprime_matriz(void)
{
int l,c,n;

for(l=0;l<NLIN;l++){
for(c=0;c<NCOL;c++){
n = 5 + (rand() % (15-5+1));
printf("%d ", n); int main()
} {
printf("\n"); int i;
} srand(time(NULL)); //inicializa gerador de nros
printf("\n"); // randomicos
}
for(i=0;i<3;i++){
printf("Impressao matriz %d\n", i+1);
imprime_matriz();
}

return 0;
39 INF 01202 - Prof. Marcelo}Walter – Aula 16

Você também pode gostar