1 of 31

Programação I

Funções

Capítulo 9

2 of 31

Introdução

Em geral, não gostamos de executar tarefas repetitivas.

Programamos para fazer com que o computador execute tarefa repetitivas para nós.

Podemos reaproveitar código

3 of 31

Reaproveitamento

4 of 31

Problemas do ctrl+c e ctrl+v

E se você precisar mudar o trecho copiado e colado?

5 of 31

Funções

Permite a reutilização de trechos de código

  • Facilita a manutenção
  • Diminui o código (obviamente, se ele é utilizado várias vezes)
  • Aumenta a confiança
    • Você confiaria mais em um código recém-criado ou em um que já foi utilizado em vários projetos diferentes?

… além disso tudo, a função permite principalmente:

  • Decomposição

6 of 31

Decomposição

Problema grande

  • dividir a solução em passos e resolver cada passo.

7 of 31

Mas para ilustrar, vamos construir umas casas

####

####

######

######

####

####

####

####

######

######

####

####

8 of 31

Resolvendo de forma concreta e incremental: 1 casa

1 #include <stdio.h>

2

3 int main()

4 {

5 printf("%c%c%c%c\n",'#','#','#','#');

6 printf("%c%c%c%c\n",'#','#','#','#');

7 printf("%c%c%c%c%c%c\n",'#','#','#','#','#','#');

8 printf("%c%c%c%c%c%c\n",'#','#','#','#','#','#');

9 printf("%c%c%c%c\n",'#','#','#','#');

10 printf("%c%c%c%c\n",'#','#','#','#');

11 printf("\n");

12 return 0;

13 }

9 of 31

Melhorando a manutenção

1 #include <stdio.h>

2

3 #define Q '#'

4

5 int main()

6 {

7 printf("%c%c%c%c\n",Q,Q,Q,Q);

8 printf("%c%c%c%c\n",Q,Q,Q,Q);

9 printf("%c%c%c%c%c%c\n",Q,Q,Q,Q,Q,Q);

10 printf("%c%c%c%c%c%c\n",Q,Q,Q,Q,Q,Q);

11 printf("%c%c%c%c\n",Q,Q,Q,Q);

12 printf("%c%c%c%c\n",Q,Q,Q,Q);

13 printf("\n");

14 return 0;

15 }

10 of 31

E a segunda casa?

  • Opção 1:
    • Ctrl+c e ctrl+v

  • Opção 2:
    • Vamos criar uma função casa() e chamar essa função duas vezes para fazer 2 casas.

11 of 31

Função : sintaxe

1 <tipo de retorno> <identificador>([lista de parâmetros])

2 {

3 [bloco de comandos]

4 }

12 of 31

Função: casa

13 of 31

Fazendo duas casas

primeira

segunda

14 of 31

Novos requisitos

Agora queremos fazer uma cidade.

Casas tem alturas diferentes, mas com largura fixa de 6.

15 of 31

Como fazer?

E se pudermos generalizar a função casa?

E se casa receber a altura como parâmetro?

...

casa(6);

casa(15);

casa(3);

casa(20);

...

16 of 31

Vamos por partes: anatomia da casa

altura (h)

largura

  • Altura nas duas colunas do centro: h
  • Altura nas quatro colunas das pontas: h-2

void casa (int h)

{

imprimir o caractere ‘#’ h-2 vezes

imprimir o caractere ‘#’ h-2 vezes

imprimir o caractere ‘#’ h vezes

imprimir o caractere ‘#’ h vezes

imprimir o caractere ‘#’ h-2 vezes

imprimir o caractere ‘#’ h-2 vezes

}

17 of 31

Decompondo ainda mais: Imprimir o caractere ‘#’ x vezes

Que tal outra função chamada parede ?

void casa (int h)

{

parede(h-2)

parede(h-2)

parede(h)

parede(h)

parede(h-2)

parede(h-2)

}

18 of 31

Parede

1 void parede(int altura)

2 {

3 int i;

4 for(i=0; i< altura; ++i)

5 {

6 printf("%c",Q);

7 }

8 printf("\n");

9 }

19 of 31

Juntando tudo

20 of 31

Exercícios (livro 9.6)

  • Quantas vezes a função parede é executada? Saiba que a resposta correta não é 6.
  • Modifique o código para que a diferença entre a altura do ponto mais alto para a altura das paredes laterais seja de apenas 1 caractere e não 2.
  • Modifique o código para que o caractere utilizado na casa seja o ‘*’ e não o ‘#’.
  • Modifique o código para que a largura seja de 8 caracteres. Nesse caso, continuam existindo duas paredes centrais mais altas, mas serão três paredes laterais em cada lado.
  • Modifique o código para que o usuário digite a altura da casa que deseja. Nesse caso, você só precisará modificar a função main.

21 of 31

Os parâmetros são passados por valor

void casa (int h)

{

parede(h-2)

parede(h-2)

parede(h)

parede(h)

parede(h-2)

parede(h-2)

}

...

casa(6);

casa(15);

casa(3);

casa(20);

...

22 of 31

Entendendo o fluxo e a passagem de parâmetro

#include<stdio.h>��int imprimir_varios(int quantidade)�{� while (quantidade)� {� printf("Adoro programar\n");� --quantidade;� }� printf("O valor de quantidade é: %d\n",quantidade);�}��int main()�{� int x;� scanf("%d",&x);� imprimir_varios(x);� printf("O valor de X é: %d\n",x);� return 0;�}

23 of 31

Retornando valores

Escreva uma função que recebe dois números como parâmetros e retorna o dobro do maior dos números recebidos

Huxley 694

24 of 31

Função maior de 2 (livro 9.4)

Escreva uma função que recebe dois números inteiros e retorna o maior dentre eles.

25 of 31

Função maior de 3 (livro 9.5)

Escreva uma função que recebe 3 números inteiros e retorna o maior dentre eles.

Reaproveite a função “maior de 2”

26 of 31

Função maior de 3 (livro 9.5)

27 of 31

Vamos fazer juntos: área do círculo (livro 9.6)

Faça uma função que receba o raio de um círculo e retorne a sua área.

A área do círculo é dada por: 𝜋 𝑟2.

28 of 31

Área do círculo: código

29 of 31

Huxley 32

Faça usando uma função

30 of 31

Fazendo juntos: Huxley 802

31 of 31

Agora é com vocês (livro 9.9)

  1. Modifique do “dobro do maior” para que a função retorne a metade do menor número entre eles.
  2. Faça um programa com uma função que receba dois parâmetros inteiros, soma-os e retorna a soma. O programa deve ler da entrada padrão dois números, chamar a função passando os números lidos como argumentos e depois imprimir a resposta de acordo com o valor de retorno da função.
  3. Escreva uma função que receba um número e retorna verdadeiro, caso o número seja negativo ou falso caso contrário.
  4. Escreva uma função que recebe um caractere como parâmetro e, caso seja minúsculo, converte-o para maiúsculo.
  5. Escreva uma função que recebe um número como parâmetro e retorna o fatorial desse número.