Responsável
Prof. Seiji Isotani ([email protected])
Aula 6
Conceitos de Função e modularização
Departamento de Sistemas de Computação Universidade de São Paulo
Introdução a Ciência de Computação I
Conceitos de função e
modularização
Você já percebeu que:
• À medida que aumenta o tamanho de um programa fica mais difícil de gerenciar
• As vezes existem muitas repetições no
código e que trechos do programa podem ser reutilizados em diferentes lugares
• É possível testar partes do programa em separado
• As vezes conseguimos resolver parte do
problemas, mas não ele todo
Exemplo
Dado três inteiros crie um algoritmo para retornar o
menor deles
USE APENAS (SE-ENTAO)
Resposta
LEIA n1, n2, n3
SE (n1 <= n2) ENTAO
SE (n1 <= n3) ENTAO IMPRIME n1
SENAO
IMPRIME n3 SENAO // n1 > n2
SE (n2 <= n3) ENTAO IMPRIME n2
SENAO
IMPRIME n3
Resposta
LEIA n1, n2, n3
SE (n1 <= n2) ENTAO
SE (n1 <= n3) ENTAO IMPRIME n1
SENAO
IMPRIME n3 SENAO // n1 > n2
SE (n2 <= n3) ENTAO IMPRIME n2
SENAO
IMPRIME n3
Resposta
LEIA n1, n2, n3
SE n1 <= n2 ENTAO
imprimeMenor(n1, n3) SENAO
imprimeMenor(n2, n3) FUNCAO imprimeMenor(x, y)
SE x <= y ENTAO IMPRIME x SENAO
IMPRIME y
Resposta
LEIA n1, n2, n3, menor SE n1 <= n2 ENTAO
menor ← imprimeMenor(n1, n3) IMPRIME menor
SENAO
menor ← imprimeMenor(n2, n3) IMPRIME menor
FUNCAO imprimeMenor(x, y) SE x <= y ENTAO
DEVOLVE x SENAO
DEVOLVE y
Exemplo:
• Para modularizar o código utiliza-se o conceito de função (ou procedimento)
• Uma função é um conjunto de
instruções com entradas e saídas bem definidas
– Nome – Entradas
– Instruções que executam a tarefa
– Instruções que devolvem o resultado
(saídas)
Definição
/********* Comentário **********
- O que a função faz?
- Quais as entradas - Quais as saídas
*******************************/
FUNCAO nomeDaFuncao(parâmetro1, parâmetro2, ...) DECLARE variável1, variáveln
instrução1 instruçãon ...
Devolve variáveln;
Variáveis locais Acessíveis somente
dentro da função
Valor de retorno corpo
argumentos
Vantagens das funções
• Modularização
– Permite dividir de forma lógica partes do código
– Facilita a reutilização
– ajuda a lidar com a complexidade – facilita a divisão de trabalho
• Encapsulamento
– Esconde o que não precisa ser
apresentado
Pontos importantes: variáveis
Declare x x ← 1
teste()
IMPRIME x
FUNCAO teste() Declare x
x ← 2;
DEVOLVE x
Pontos importantes: variáveis
Declare x x ← 1
x ← teste() IMPRIME x
FUNCAO teste() Declare x
x ← 2
PARA i ← 0 ate 1 FACA x ← x + i
DEVOLVE x
Pontos importantes: variáveis
Declare x x ← 1
teste(x)
IMPRIME x
FUNCAO teste(x) x ← x+1
DEVOLVE x
Exercício
Crie um programa que consegue
adivinhar um número no raio de 1 a 15 em no máximo 4 tentativas
(assuma que o jogador diga se o número é maior ou menor a cada tentativa
incorreta).
USE APENAS (SE-ENTAO)
DECLARE X, R X = 8
IMPRIME “é x?”
LE R
SE R = “correcto” FIM
SE R = “maior” ENTAO x ← x + 4 SENAO x ← x - 4 IMPRIME “é x?”
LE R
SE R = “correto” FIM
SE R = “maior” ENTAO x ← x + 2 SENAO x ← x - 2 IMPRIME “é x?”
LE R
SE R = “correcto” FIM
SE R = “maior” ENTAO x ← x + 1 SENAO x ← x - 1 IMPRIME “EU sei que é x !!!!”
Crie uma função
chamada chuteCerteiro para diminuir a
repetição de código
DECLARE x x ← 8
x ← chuteCerteiro(x, 4) x ← chuteCerteiro(x, 2) x ← chuteCerteiro(x, 1)
IMPRIME “EU sei que é x !!!!”
FUNCAO chuteCerteiro(x, y) DECLARE R
IMPRIME “é x?”
LE R
SE R = “correcto” IMPRIME “ACERTEIIIII ☺” FIM SE R = “maior” ENTAO
DEVOLVE x + y SENAO
DEVOLVE x - y
Programa Principal
DECLARE x
x ← chuteCerteiro(8, 4) x ← chuteCerteiro(x, 2) x ← chuteCerteiro(x, 1)
IMPRIME “EU sei que é x !!!!”
Declaração da Função
FUNCAO chuteCerteiro(x, y) DECLARE R
IMPRIME “é x?”
LE R
SE R = “correto” FIM SE R = “maior” ENTAO
Devolve x + y SENAO
Devolve x – y
Exercício 1
• Escreve um algoritmo que calcula a soma de 4 números:
n 1 e1 + n 2 e2 + n 1 e3 + n 2 e4
• Depois verificar se a soma resultante é par ou impar.
Dica: escreva uma função chamada
POTENCIA que recebe dois números, a base
“b” e o expoente “e” e calcula o valor da
potência b e
Programando funções em C
Exemplo: Criar funções para ler, nome, idade e exigir esses dados na tela
20
Modularização de Programas
21
Modularização de Programas
Quebrando programas na Linguagem C - Sub-rotinas / Módulos:
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
int Idade;
main( ) {
printf("Digite seu nome: ");
scanf("%s", Nome);
printf("Digite sua idade: ");
scanf("%d", &Idade);
printf("\n");
printf("Nome: %s\n", Nome);
printf("Idade: %d\n", Idade);
printf("\n");
system("PAUSE");
return 0;
}
22
Modularização de Programas
Quebrando programas na Linguagem C - Sub-rotinas / Módulos:
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
int Idade;
main( ) {
printf("Digite seu nome: ");
scanf("%s", Nome);
printf("Digite sua idade: ");
scanf("%d", &Idade);
printf("\n");
printf("Nome: %s\n", Nome);
printf("Idade: %d\n", Idade);
printf("\n");
system("PAUSE");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
int Idade;
le_nome ( )
{ printf("Digite seu nome: ");
scanf("%s", Nome);
}
le_idade( )
{ printf("Digite sua idade:
");
scanf("%d", &Idade);
}
exibe_dados ( ) { printf("\n");
printf("Nome: %s\n", Nome);
printf("Idade: %d\n", Idade);
printf("\n");
}
23
Modularização de Programas
Quebrando programas na Linguagem C - Sub-rotinas / Módulos:
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
int Idade;
main( ) {
printf("Digite seu nome: ");
scanf("%s", Nome);
printf("Digite sua idade: ");
scanf("%d", &Idade);
printf("\n");
printf("Nome: %s\n", Nome);
printf("Idade: %d\n", Idade);
printf("\n");
system("PAUSE");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
int Idade;
le_nome ( ) { ... } le_idade( ) { ... }
exibe_dados ( ) { ... }
main( ) {
le_nome();
le_idade();
exibe_dados();
system("PAUSE");
return 0;
}
24
Modularização de Programas
Programas na Linguagem C - Sub-rotinas / Módulos e Variáveis:
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
int Idade;
le_nome ( )
{ printf("Digite seu nome: ");
scanf("%s", Nome);
}
le_idade( )
{ printf("Digite sua idade: ");
scanf("%d", &Idade);
}
exibe_dados ( ) { printf("\n");
printf("Nome: %s\n", Nome);
printf("Idade: %d\n", Idade);
printf("\n");
}
main( ) {
le_nome();
le_idade();
exibe_dados();
}
25
Modularização de Programas
Sub-Rotinas e Variáveis
• Programas podem ter variáveis gerais, as denominadas variáveis globais que podem ser usadas por qualquer
sub-rotina. Todos módulos tem acesso as variáveis globais.
• Variáveis globais são declarada FORA dos blocos, ou seja, fora das sub-rotinas.
• Programas podem ter variáveis proprietárias de um bloco, as denominadas variáveis locais que podem ser usadas
apenas dentro da sub-rotina (bloco) onde foram criadas.
Variáveis locais são acessadas somente dentro do seu bloco.
26
Modularização de Programas
Programas na Linguagem C - Sub-rotinas / Módulos e Variáveis:
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
le_nome ( )
{ printf("Digite seu nome: ");
scanf("%s", Nome);
}
le_idade( ) {
int idade;
printf("Digite sua idade: ");
scanf("%d", &idade);
}
exibe_dados ( ) { printf("\n");
printf("Nome: %s\n", Nome);
printf("Idade: %d\n", Idade);
printf("\n");
}
Variável
Global main( )
{
le_nome();
le_idade();
exibe_dados();
}
27
Modularização de Programas
Programas na Linguagem C - Sub-rotinas / Módulos e Variáveis:
#include <stdio.h>
#include <stdlib.h>
char Nome[30];
le_nome ( )
{ printf("Digite seu nome: ");
scanf("%s", Nome);
}
le_idade( ) {
int idade;
printf("Digite sua idade: ");
scanf("%d", &idade);
}
exibe_dados ( ) { printf("\n");
printf("Nome: %s\n", Nome);
printf("Idade: %d\n", Idade);
printf("\n");
}
Variável Global
Variável Local de Le_Idade()
Cuidado: Idade agora é local
main( ) {
le_nome();
le_idade();
exibe_dados();
}
28
Modularização de Programas
Funções e Procedimentos da Linguagem C - Sub-rotinas:
Você já usa sub-rotinas !
Sub-Rotinas da Biblioteca Padão do “C” (Libc). Exemplos:
printf (“Hello!\n”); => Executa uma sub-rotina de impressão na tela scanf (“%d”,valor); => Executa uma sub-rotina de entrada de dados strcpy (Nome,”Fulano”); => Copia uma string para uma variável
num = atoi (“1234”); => Converte uma string em valor inteiro
preco = atof (“56.78”); => Converte uma string em valor float/double x = sqrt (nro); => Extrai a raiz quadrada de um número
x = sin (angulo); => Calcula o seno dado um determinado ângulo
sorteio = rand ( ) % 10; => Gera um número pseudo-aleatório de 0 a 9
getchar ( ); => Espera que seja pressionada uma tecla
29
Modularização de Programas
Sub-rotinas( ) e seus Blocos {} :
main ( ) => Main é um bloco que recebeu o nome especial “main”
{
printf(“1”); => Printf é uma sub-rotina executada pelo main getchar ( ); => Getchar é uma sub-rotina executada pelo main
printf(“2”); => Sub-rotinas podem ser usadas (chamadas) diversa vezes!
getchar ( );
}
getchar ( ) => Getchar é um bloco que recebeu um nome
{ ... } Sub-Rotina: Getchar / Sem Parâmetros
strcpy (Dest, Org) => Strcpy é um bloco que recebeu um nome
{ ... } Sub-Rotina: Strcpy / Com Parâmetros
30
Modularização de Programas
Programas Seqüenciais e Programas Modulares:
double calcula_media (N1, N2, N3) double N1, N2, N3;
{
return ( ( N1 + N2 + N3 ) / 3.0 );
}
main ( )
{ double Nota1, Nota2, Nota3; double Media;
scanf (“%lf”,&Nota1); scanf (“%lf”,&Nota2); scanf (“%lf”,&Nota3);
Media = calcula_media (Nota1, Nota2, Nota3);
prinf (“ Media = %lf \n”, Media);
scanf (“%lf”,&Nota1); scanf (“%lf”,&Nota2); scanf (“%lf”,&Nota3);
Media = calcula_media (Nota1, Nota2, Nota3);
prinf (“ Media = %lf \n”, Media);
}
31
Modularização de Programas
Programas Seqüenciais e Programas Modulares:
double calcula_media (N1, N2, N3) double N1, N2, N3;
{
return ( ( N1 + N2 + N3 ) / 3.0 );
}
faz_media ( ) {
double Nota1, Nota2, Nota3;
double Media;
scanf (“%lf”,&Nota1);
scanf (“%lf”,&Nota2);
scanf (“%lf”,&Nota3);
Media = calcula_media (Nota1, Nota2, Nota3);
prinf (“ Media = %lf \n”, Media);
}
32
Modularização de Programas
Programas Seqüenciais e Programas Modulares:
double calcula_media (N1, N2, N3) double N1, N2, N3;
{
return ( ( N1 + N2 + N3 ) / 3.0 );
}
faz_media ( ) {
double Nota1, Nota2, Nota3;
double Media;
scanf (“%lf”,&Nota1);
scanf (“%lf”,&Nota2);
scanf (“%lf”,&Nota3);
Media = calcula_media (Nota1, Nota2, Nota3);
prinf (“ Media = %lf \n”, Media);
}
main ( ) {
int cont, total=10;