Вы находитесь на странице: 1из 32

(Na aula passada) Necessidade de Estruturar

•  Não queremos Código espagueti!

1 INF 01202 - Prof. Marcelo Walter – Aula 17


Idéia Principal
funcao1

int main(){

funcao2

funcao3

……..

int main(){

……..

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

2 INF 01202 - Prof. Marcelo Walter – Aula 17


AULA PASSADA

•  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.

3 INF 01202 - Prof. Marcelo Walter – Aula 17


AULA DE HOJE!

•  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.

4 INF 01202 - Prof. Marcelo Walter – Aula 17


funcao1
Necessidade
de
funcao2
Parâmetros

Troca de funcao3

informação
entre os
módulos int main(){

Parâmetros: ……..
permitem comunicação entre os
“mundos” (interno e externo), de
uma função, possibilitando que seja return 0}
executada no processamento de Programa estruturado
diferentes valores
5 INF 01202 - Prof. Marcelo Walter – Aula 17
Exemplo: função que calcula média aritmética de 3
números float e apresenta na tela

•  Informaremos os 3
void calcula_media(……????........)
números que irão
{ compor a média, via
parâmetros para a
função
}
•  Parâmetros
definidos dentro
dos parêntesis que
seguem o nome da
função
void calcula_media(float n1, float n2, float n3){
}
6 INF 01202 - Prof. Marcelo Walter – Aula 17
Exemplo de função void com parâmetros

void calcula_media(float n1, float n2, float n3)


{

float m;

m = (n1 + n2 + n3 ) / 3;

printf(“A media vale %3.2f\n”, m);

7 INF 01202 - Prof. Marcelo Walter – Aula 17


E como fica no main?

int main()
{
float a,b,c;

a=3.2; // poderia tb ler esses valores do usuário


b= 5.4;
c=-11.7;

calcula_media(a,b,c); Chamada da função

return 0;
}
Aqui não vai float… apenas as variáveis
Pela correspondência com o protótipo:
a->n1, b->n2, c->n3
8 INF 01202 - Prof. Marcelo Walter – Aula 17
Função void com parâmetro: outro exemplo
Problema:
•  Como melhorar a função escreve_linha (desenvolvida em aula
anterior) na impressão de linhas contendo diferentes número de
qualquer caractere?
–  n e c são recebidos pela função: parâmetros!

Fazer uma função que imprime na tela n vezes um caractere c qualquer,


digitado pelo usuário

Solução:
–  obtém caractere
–  obtém nro_vezes
–  para (i=1, enquanto i <= nro_vezes, incrementa 1 em i)
imprime caractere
–  quebra a linha

9 INF 01202 - Prof. Marcelo Walter – Aula 17


Voltando à impressão de caractere c por n vezes:

/*
Exemplo de funcao void com parametro. Impressao de um
caractere c por n vezes
Entradas: caractere a ser impresso e numero de vezes
Saidas: Impressao na tela
*/
#include<stdio.h>
#... //outros includes
void escreve_linha (char caract, int num_vezes)
{ // preenche linha com num_vezes caract
int i; // variável local
for (i=1;i<=num_vezes;i++)
printf(“%c“, caract);
printf("\n");
} 2 parâmetros de tipos
int main() diferentes: um char e um
{
...
inteiro

10 INF 01202 - Prof. Marcelo Walter – Aula 17


Exemplo de uso da função criada Preencha os
//Escrita de numeros inteiros
#include<stdio.h> retângulos com a
void escreve_linha (char caract, int num_vezes)
chamada adequada
{ // preenche linha com num_vezes caract da função
int i; // variável local
for (i=1;i<=num_vezes;i++) escreve_linha
printf(“%c“, caract);
printf("\n");
}
int main( ) Execução
{
int i;
//apresentacao do cabecalho
// imprime 20 #
printf("Numeros entre 1 e 5\n");
// imprime 5 +
printf("\n");
//escrita dos numeros
for (i=1;i<=5;i++)
{
printf("%d\n",i);
// imprime i *
}
// imprime 20 #
printf("\n");
return 0;
}
11 INF 01202 - Prof. Marcelo Walter – Aula 17
Exemplo de uso da função criada
//Escrita de numeros inteiros
#include<stdio.h>
void escreve_linha (char caract, int num_vezes)
{ // preenche linha com num_vezes caract
int i; // variável local
for (i=1;i<=num_vezes;i++)
printf(“%c“, caract);
printf("\n");
}
int main( ) Execução
{
int i;
//apresentacao do cabecalho
escreve_linha('#',20); // imprime 20 #
printf("Numeros entre 1 e 5\n");
escreve_linha('+',5); // imprime 5 +
printf("\n");
//escrita dos numeros
for (i=1;i<=5;i++)
{
printf("%d\n",i);
escreve_linha('*',i); // imprime i *
}
escreve_linha('#', 20); // imprime 20 #
printf("\n");
return 0;
}
12 INF 01202 - Prof. Marcelo Walter – Aula 17
Tipos de funções:
•  Funções void:
2.  com parâmetros:
1)  passados por valor:
ü  declaração:
void nome_da_função (lista_de_parâmetros)
{
declaração de variáveis locais
comando1;
comando2;
...
}
ü  chamada:
nome_da_função (lista_de_parâmetros);

13 INF 01202 - Prof. Marcelo Walter – Aula 17


Como definir uma função void com parâmetros?
void nome_da_função (lista_de_parâmetros) cabeçalho da função
{
comando1;
comando2;
...
}

Elemento Significado
void Palavra_chave indicando que a função não retornará
valor.
nome_da_função Nome da função.
lista de Um ou mais parâmetros, passados à função como
parâmetros argumentos, quando da sua execução. Devem ter o
tipo especificado e estar separados por vírgulas. Se
omitidos, significa que não existem.
void Palavra_chave indicando que a função não receberá
argumentos. Aqui, equivale a ( ).
{ Indica início do corpo_da_função.
} Indica fim do corpo_da_função.

14 INF 01202 - Prof. Marcelo Walter – Aula 17


Mais detalhes sobre a função e parâmetros
//Escrita de numeros inteiros
#include<stdio.h>
void escreve_linha (char caract, int num_vezes)
{ // preenche linha com num_vezes caract
int i; // variável local
for (i=1;i<=num_vezes;i++)
printf(“%c“, caract);
printf("\n");
} Parâmetros formais (valores
int main( ) a serem recebidos na execução)
{
int i;
//apresentacao do cabecalho
escreve_linha('#',20);
printf("Numeros entre 1 e 5\n");
escreve_linha('+',5);
printf("\n");
//escrita dos numeros
for (i=1;i<=5;i++)
{ Parâmetros reais ou
printf("%d\n",i); argumentos
escreve_linha('*',i); (utilizados na execução)
}
escreve_linha('#', 20);
printf("\n");
return 0;
}
15 INF 01202 - Prof. Marcelo Walter – Aula 17
Mais detalhes sobre a função e parâmetros
//Escrita de numeros inteiros
#include<stdio.h>
void escreve_linha (char caract, int num_vezes)
{ // preenche linha com num_vezes caract
int i; // variável local
for (i=1;i<=num_vezes;i++)
printf(“%c“, caract); •  Parâmetros: variáveis locais criadas
printf("\n"); quando a função é ativada e
}
int main( ) destruídas quando a função encerra.
{ •  Os parâmetros são inicializados com
int i;
//apresentacao do cabecalho os conteúdos enviados como
escreve_linha('#',20); argumento, na chamada da função.
printf("Numeros entre 1 e 5\n");
escreve_linha('+',5);
printf("\n");
//escrita dos numeros
for (i=1;i<=5;i++)
{
printf("%d\n",i);
escreve_linha('*',i);
}
escreve_linha('#', 20);
printf("\n");
return 0;
}16 INF 01202 - Prof. Marcelo Walter – Aula 17
Exercício: função void, com parâmetro
•  Completar o programa abaixo, de forma que a tela abaixo seja impressa
a partir de chamadas da função, geradas de forma iterativa:

// gera linhas contendo seqüência de letras


#include <stdio.h>

void imprime(char c, int n) // declaração da função void


{
int cont; // variável local de controle do laço
for (cont = 0; cont < n; cont++)
printf("%c",c);
printf(“\n”);
}

int main()
{
int num;
char letra='a';

?????? // chamada da função imprime


return 0;
}

17 INF 01202 - Prof. Marcelo Walter – Aula 17


Solução - incremento da letra dentro do laço

// gera linhas contendo seqüência de letras


#include <stdio.h>

void imprime(char c, int n) // declaração da função void


{
int cont; // variável local de controle do laço
for (cont = 0; cont < n; cont++)
printf("%c",c);
printf(“\n”);
}

int main()
{
int num;
char letra='a'; // inicializa conteúdo antes do for

for (num=1;num<=15;num++)
{
imprime(letra,num);
letra++;
}
return 0;
18} INF 01202 - Prof. Marcelo Walter – Aula 17
Exercício

Escreva uma função em C que receba o sexo de uma


pessoa (M ou F), a altura da pessoa (em metros), e
imprima na tela o peso ideal (em kg) de acordo com a
tabela abaixo:

sexo peso ideal


feminino altura * 62,1 – 44,7
masculino altura * 72,7 – 58

19 INF 01202 - Prof. Marcelo Walter – Aula 17


Solução
/*
Exemplo de funcao sem retorno. Calcula o peso ideal
Entradas: sexo e altura da pessoa
Saida: impressao do peso ideal
*/
#include <stdio.h>

void pesoideal(char sex, float alt) // funcao que calcula o peso ideal
{
if (sex == 'M' || sex == 'm')
printf("Peso ideal: %.2f\n", alt*72.7-58);
else
if (sex == 'F' || sex == 'f')
printf("Peso ideal: %.2f\n", alt*62.1-44.7);
else
printf("Sexo informado invalido.\n");
}

int main()
{
...
}

20 INF 01202 - Prof. Marcelo Walter – Aula 17


Exemplo de main que chama a rotina
// Exemplo de chamada da rotina
#include <stdio.h>

void pesoideal(char sex, float alt) // funcao que calcula o peso ideal
{
if (sex == 'M' || sex == 'm')
printf("Peso ideal: %.2f\n", alt*72.7-58);
else
if (sex == 'F' || sex == 'f')
printf("Peso ideal: %.2f\n", alt*62.1-44.7);
else
printf("Sexo informado invalido.\n");
}

int main()
{
char sexo;
float altura;
puts("Entre o sexo da pessoa (M ou F)");
scanf(" %c", &sexo);
puts("Entra a altura da pessoa (em metros)");
scanf("%f", &altura);
pesoideal(sexo, altura); //chamada da funcao
return 0;
21} INF 01202 - Prof. Marcelo Walter – Aula 17
Comentários sobre o programa anterior

•  Veja que a rotina pesoideal recebe como


entrada um caractere e um float

•  O peso ideal é calculado e impresso como um


tipo float

•  Entretanto, o valor do peso ideal calculado na


rotina pesoideal não é acessível no programa
main!!!

•  Questão: como passar um valor calculado


em uma função para o programa que chama
a subrotina?
22 INF 01202 - Prof. Marcelo Walter – Aula 17
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.

23 INF 01202 - Prof. Marcelo Walter – Aula 17


Exemplo de função tipada
// Exemplo de chamada da rotina
#include <stdio.h>

float pesoideal(char sex, float alt) // funcao que calcula o peso ideal
{
float peso;
if (sex == 'M' || sex == 'm') Observe: o
peso = alt*72.7-58; valor
else
if (sex == 'F' || sex == 'f') retornado pela
peso = alt*62.1-44.7; função é
return peso; armazenado na
} variável
int main()
{ pesoid, do
char sexo; mesmo tipo
float altura, pesoid; que o valor
retornado pela
puts("Entre o sexo da pessoa (M ou F)");
scanf(" %c", &sexo); função (float)
puts("Entra a altura da pessoa (em metros)");
scanf("%f", &altura);
pesoid = pesoideal(sexo, altura); //chamada da funcao
printf(“O peso ideal da pessoa eh %.2f\n”, pesoid );
return 0;
24} INF 01202 - Prof. Marcelo Walter – Aula 17
Como definir uma função tipada, com ou sem parâmetro ?

tipo_valor nome_da_função (lista_de_parâmetros


ou void
formais)
{
comando1;
...
return valor; // encerra e retorna valor
}
Elemento Significado
tipo_valor Tipo do valor a ser retornado (int, char,float).
Se omitido, será considerado como int.
nome Nome da função.
Parâmetros Um ou mais parâmetros, a serem passados à função
como argumentos, quando da sua execução. Devem
estar separados por vírgulas. Se omitido, significa
que não há.
void Palavra_chave indicando que a função não receberá
argumentos. Aqui, equivale a ( ).
{ Indica início do corpo_da_função.
} Indica fim do corpo_da_função.

25 INF 01202 - Prof. Marcelo Walter – Aula 17


Função tipada: return

•  Uma função termina sua execução quando seu último comando


for executado ou quando o comando return for encontrado

•  O comando return provoca a saída imediata da função que o


contém e retorna a execução ao código chamador

•  O comando return pode ser usado para devolver um valor.


•  PROGRAMAÇÃO ESTRUTURADA:
O return deve estar vinculado à última instrução da função.

// exemplo de função com retorno:


float teste ( int a, int b)
{
float x, res;

printf(“\nInforme valor real:”);


scanf(“%f”, &x);
res = a + b * x;
return res;
}
26 INF 01202 - Prof. Marcelo Walter – Aula 17
Como executar uma função tipada, com ou sem parâmetro ?
Incluir a chamada da função em uma expressão, atribuição ou função
de impressão do programa, com ou sem parâmetros, utilizando
diretamente o valor retornado pela função quando esta é concluída.
Ex://Função com retorno que soma reais:
#include<stdio.h>

float soma (float a, float b)


// soma os valores de a e b Declaração
{
return a + b; da função
}
int main()
{ Chamadas
float v1, v2, somadois;
printf(“valores a serem somados”); da função
scanf(“%f%f”,&v1,&v2);
somadois = soma (v1, v2); // usa na atribuição
printf(“Soma= %f\n”,somadois);
if (soma (v1, v2) > 15)
printf(“Outra vez: %f\n”, soma (v1, v2)); // direto na impressão
return 0;
}
27 INF 01202 - Prof. Marcelo Walter – Aula 17
Exemplo de função tipada, sem parâmetro:

Escreva uma função char le_s_n( ) que:


1.  imprime na tela “Deseja continuar (s ou n)?”;
2.  lê a resposta, consistindo;
3.  retorna na função a resposta correta, como maiúscula.
# include <ctype.h> // função toupper
// exemplo de função com retorno:
char le_s_n ( ) // retorna letra maiúscula s ou n
{
char s_n;
do
{
printf(“\ Deseja continuar (S ou N)?”);
scanf(“ %c”, &s_n);
s_n = toupper(s_n);
if (s_n != ‘S’ && s_n != ‘N’ )
printf(“ Resposta invalida. “);
} while (s_n != ‘S’ && s_n != ‘N’ );
return s_n;
}
28 INF 01202 - Prof. Marcelo Walter – Aula 17
Exercício

Fazer um programa completo que leia dois valores, n e p,


e calcule a combinação de n elementos, p a p.
Fórmula: n!/(p! * (n-p)!)

•  Faça duas funções tipadas, uma para o cálculo do


fatorial, e outra para o cálculo da combinação
•  Assume-se que n >= p

29 INF 01202 - Prof. Marcelo Walter – Aula 17


Exercício: solução
/*
Programa que calcula a combinacao de n elementos tomados p a p
Entradas: valores de n e p
Saida: Combinacao de n elementos tomados p a p
*/
#include<stdio.h>

int fatorial (int n); // prototipos das funcoes


int combinacoes (int n, int p); // usa a funcao fatorial (deve ser definida após ela)
char le_s_n(); // le um caracter e somente devolve se for S ou N
// definido aula passada
int main()
{
int n, p;

// leitura de valores varias vezes


do{
printf("digite n e p: ");
scanf("%d%d",&n,&p);
// chamada da funcao que calcula as combinacoes
printf(“Combinacoes de %d elementos %d a %d = %d", n,p,p,combinacoes (n,p));
}while (le_s_n() == ‘S');

return 0;
}

30 INF 01202 - Prof. Marcelo Walter – Aula 17


Exercício: solução
...
int fatorial (int n)
{
// Funcao que devolve o fatorial de n
// Caso n seja menor que zero, devolve o valor zero como sinal
int i, fat;
if (n < 0 )
fat=0;
else
{
fat = 1;
for (i=n; i>=1 ;i--)
fat = fat * i;
}
return fat;
}

int combinacoes (int n, int p){


// Função que devolve as combinações de n elementos, p a p
//fórmula: n!/(p! * (n-p)!
// Utiliza a função Fatorial
return fatorial(n) / ( fatorial(p) * fatorial(n-p) );
}

31 INF 01202 - Prof. Marcelo Walter – Aula 17


Exercício: execução do programa

O que houve?
Erro no cálculo do fatorial de 14 e 40 (número muito grande
para um tipo int)

Obs: essa implementação não é eficiente, pois gera


números intermediários muito grandes! Pensar em
alternativas
32 INF 01202 - Prof. Marcelo Walter – Aula 17

Вам также может понравиться