Mathematics">
Funções em C
Funções em C
Funções em C
IPC2
1999/2000
F. Nunes Ferreira
Funções
Funções
Funções matemáticas
Funções
Funções matemáticas
Funções
Funções
Exemplo
#include <stdio.h>
int quadrado(int); /* protótipo da função */
int main(void)
{
int x;
Funções
Definição
/* definição de função */
instruções
}
Funções
Definição: Lista de parâmetros
/* definição de função */
instruções
}
Funções
Definição: Considerações gerais
u Uma função não deve ocupar mais do que uma página...
u O cabeçalho de uma função deve caber numa linha
u Uma função com uma longa lista de parâmetros deve
estar associada a muitas tarefas...
} ou return;
} sem valor de retorno
return expressão;
} com valor de retorno
#include <stdio.h>
int maximo(int, int, int);
int main(void)
{
int a, b, c;
printf("Indicar 3 inteiros: ");
scanf("%d%d%d", &a, &b, &c);
printf("O maximo de %d, %d, e %d e': %d\n", a, b, c,
maximo(a, b, c));
return 0;
}
int maximo(int x, int y, int z)
{
int max = x;
if (y > max)
max = y;
if (z > max)
max = z;
Indicar 3 inteiros: 1 9 4
return max;
} O maximo de 1, 9, e 4 e': 9
11
Funções
Protótipo da função
u Incluir o protótipo de todas as funções usadas, para
controlo dos tipos... Controlo que se verifica na
definição e na chamada das funções
Funções
Protótipo da função
u O protótipo pode escrever-se:
int maximo(int, int, int); ou também
int maximo(int primeiro, int segundo, int terceiro);
Funções
Bibliotecas standard
u Cada biblioteca standard tem um ficheiro com os
protótipos das funções e a definição de tipos e
constantes utilizados pelas funções
Ficheiros Explicação
<assert.h> apoiar o debugging
<ctype.c> manipular caracteres
<errno.h> reportar condições de erro
<float.h> limites da vírgula flutuante do sistema
<limits.h> limites inteiros do sistema
<locale.h> adaptar programas a regiões do mundo
<math.h> funções matemáticas
<setjmp.h> funções com esquemas anormais de chamada e retorno
<signal.h> assinalar várias condições que ocorram na execução
<stddef.h> definições de tipos para certos cálculos
<stdio.h> funções de entrada/saída standard
<stdlib.h> funções de conversão números/texto, alocação memória,
números aleatórios e outras funções utilitárias
<string.h> funções para cadeias de caracteres
<time.h> manipulação de tempo e datas
14
Funções
Chamadas da função
preencheValores(valLidos, comprimento);
Funções
Exemplo
Funções
Geração de números aleatórios
u Correndo os 2 últimos programas, a solução é sempre
a mesma!!!
Funções
Geração de números aleatórios
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
...
srand(time(NULL))
Funções
Exemplo
n1 = rand() % 10;
n2 = rand() % 10;
printf("Quantos sao %d vezes %d? ", n1, n2);
scanf("%d", &resposta);
Funções
Ficheiro tabuaMain.c
#include "tabua.h"
int main(void)
{
unsigned int i, erradas = 0;
for (i = 1; i <= N_PERGUNTAS; i++){
if (pergunta_resposta())
printf("Resposta certa...\n");
else{
printf("Resposta errada...\n");
++erradas;
}
}
if (erradas >= LIM_MIN)
printf("\n\nE' preciso estudar a tabuada.\n");
else
printf("\n\nParabens. Tabuada bem estudada.\n");
return 0;
}
23
Funções
Ficheiro pergTabua.c
#include "tabua.h"
int pergunta_resposta(void)
{
int resposta, n1, n2;
srand(time(NULL));
n1 = rand() % 10;
n2 = rand() % 10;
printf("Quantos sao %d vezes %d? ", n1, n2);
scanf("%d", &resposta);
Funções
Classes de armazenamento
u Classes de armazenamento:
auto, register, extern e static
Funções
Classes de armazenamento e ambientes de acção
u Classes de armazenamento:
auto, register, extern e static
Funções
Classes de armazenamento e ambientes de acção
#include <stdio.h>
void a(void);
void b(void);
void c(void);
int x = 1;
int main(void)
{
int x = 5;
printf("x local no ambiente mais exterior de main: %d\n", x);
{
int x = 7;
printf("x local no ambiente mais interior de main: %d\n", x);
}
printf("x local no ambiente mais exterior de main: %d\n", x);
a();
b();
c();
a();
b();
c();
printf("x local no ambiente mais exterior de main: %d\n", x);
return 0;
}
27
Funções
Classes de armazenamento e ambientes de acção
void a(void)
{
int x = 25;
printf("\nx local e' %d ao entrar em a\n", x);
++x;
printf("x local e' %d ao sair de a\n", x);
}
void b(void)
{
static int x = 50;
printf("\nx local e' %d ao entrar em b\n", x);
++x;
printf("x local e' %d ao sair de b\n", x);
}
void c(void)
{
printf("\nx global e' %d ao entrar em c\n", x);
x *=10;
printf("x global e' %d ao sair de c\n", x);
}
28
Funções
Classes de armazenamento e ambientes de acção
Funções
Recursividade
u Exemplo: Factorial
n! = n * (n - 1) * (n -2) * ... * 1 - por iteração
n! = n * (n -1)! - por recursividade
#include <stdio.h>
long factorial(long);
int main(void)
{
int i; 1! = 1
for (i = 1; i <= 10; i++)
printf("%2d! = %ld\n", i, factorial(i)); 2! = 2
3! = 6
return 0; 4! = 24
} 5! = 120
long factorial(long num) 6! = 720
{ 7! = 5040
if (num == 1)
return 1; 8! = 40320
else 9! = 362880
return num * factorial (num - 1); 10! = 3628800
}
30
Funções
Recursividade vs iteração
Funções
Erros mais comuns
u ...
32
Funções
Erros mais comuns
u ...
Funções
Regras de boa programação
u ...
34
Funções
Regras de boa programação
u ...
Exercícios
u Escrever a função quadrado que tem apenas um
parâmetro, lado.
Ex: quadrado(3) ***
***
***
u Escrever a função quadrado_caract com dois
parâmetros, lado e caracter
Exercícios
u Foi apresentado como exemplo o seguinte exercício:
Escrever um programa que põe questões do seguinte
tipo, em que os valores numéricos são determinados
aleatoriamente. Quantos são 3 vezes 8?
Se a resposta for correcta responde Resposta
certa..., se não, responde Resposta errada...
O diálogo integra 10 perguntas e, no final, o
estudante é aconselhado a estudar a tabuada se
tiver errado 2 ou mais perguntas.
void resposta_certa(void);
{
switch (rand() % 4){
case 0:
printf("Muito bem.\n");
break;
...
case 3:
printf("Continua assim.\n");
break;
}
}
void resposta_errada(void);
{
switch (rand() % 4){
case 0:
printf("Errou. Tenta de novo.\n");
...
39
Exercícios
u O máximo divisor comum de dois inteiros positivos é
o maior inteiro que é divisor desses positivos.
u Uma solução recursiva de uma função que calcula o
máximo divisor comum:
int mdc (int n1, int n2)
{
int resto;
if ((resto = n1 % n2) == 0)
return n2;
else
return mdc (n2, resto);
}
u Escrever um programa para testar a função mdc
u Escrever e testar a função mdc_iter, uma solução
iterativa para este problema
40
Exercícios
u n0 é um inteiro positivo à escolha e
ni / 2 se ni for par
ni+1 =
3ni + 1 se ni for ímpar
Exercícios
u Escrever o programa que se baseia na função sequencia
e gera, por exemplo, o que se segue, quando o número
inicial é 77:
77 232 116 58 29 88
44 22 11 34 17 52
26 13 40 20 10 5
16 8 4 2 1
Exercícios
u Escrever o programa que permite estabelecer o
seguinte tipo de diálogo:
Exercícios
u Um número é perfeito se a soma dos seus factores
(retirando o próprio número) é igual a esse número. 6 é
perfeito, pois 1+2+3 = 6.
u int perfeito (int numero)
é o cabeçalho de uma função que recebe um número
inteiro e devolve 1 se ele for perfeito e 0 se não for.
-Escrever a função perfeito
-Escrever um programa que sustenta diálogos do
tipo:
Gama de valores: 1 10
Os numeros perfeitos entre 1 e 10:
6
Gama de valores: 100 10000
Os numeros perfeitos entre 100 e 1000:
...
44
Exercícios
u O estacionamento num parque tem um custo fixo, até 3
horas, de 200$00. Por cada hora adicional (ou parte)
paga-se 100$00. O custo máximo, num período de 24
horas, é de 2.000$00. Não são permitidos períodos de
estacionamento superiores a 24 horas.
Escrever o programa que mantém um diálogo do tipo:
Tempo de estacionamento (> 24 horas, termina): 2.5
custo: 200$00
Tempo de estacionamento (> 24 horas, termina): 3.1
custo: 300$00
Tempo de estacionamento (> 24 horas, termina): 4.1
custo: 400$00
Tempo de estacionamento (> 24 horas, termina): 24
custo: 2000$00
45
Exercícios
u Escrever a função inverte que toma um valor
inteiro e devolve um número correspondente
ao número dado, mas com os dígitos em
posição invertida. Se o número dado for
12345, devolve 54321.
u Escrever a função inverte
u Escrever um programa que permita testar a
função inverte.
46
Exercícios
u Um jogo de sorte - Regras do jogo
Um jogador lança 2 dados.
Se a soma é 7 ou 11, o jogador ganha a soma.
Se a soma é 2, 3, ou 12, o jogador perde a soma.
Se a soma é 4, 5, 6, 8, 9, ou 10... o ponto é a soma e
a jogada continua...
... até obter uma soma que é igual ao ponto, e ganha.
... ou até obter uma soma igual a 7, e perde.
/* ganhou */
/* perdeu */
/* jogada de ponto */
}
int jogar(void)
{
/* mensagem para lançar os dados */
int jogar(void);
int jogarPonto(int saldo, int soma);
int main(void)
{
int soma, saldo = 0;
srand(time(NULL));
soma = jogar();
...
switch (soma) {
case 7: case 11: /* ganhou */
saldo += soma;
printf("%s%d%s%d\n",
"O jogador ganhou ", soma,
" pontos e o saldo e': ", saldo);
break;
case 2: case 3: case 12: /* perdeu */
saldo -= soma;
printf("%s%d%s%d\n",
"O jogador perdeu ", soma,
" pontos e o saldo e': ", saldo);
break;
default: /* jogada de ponto */
printf("%s%d%s\n",
"O ponto e' ", soma,
" e continua a jogada. ");
saldo = jogarPonto(saldo, soma);
}
soma = jogar();
}
return 0;
}
int jogar(void)
{
int d1, d2, tecla, soma_obtida;
d1 = rand() % 6 + 1;
d2 = rand() % 6 + 1;
soma_obtida = d1 + d2;
do {
d1 = rand() % 6 + 1;
d2 = rand() % 6 + 1;
soma_ponto = d1 + d2;
...
if (soma_ponto == soma) { /* ganhou */
saldo += soma;
printf("%s%d%s%d\n", "O jogador ganhou ",
soma, " pontos e o saldo e': ",
saldo);
}
else if (soma_ponto == 7) { /* perdeu */
saldo -= soma;
printf("%s%d%s%d\n", "O jogador perdeu ",
soma, " pontos e o saldo e': ",
saldo);
}
/* repete */
} while (soma_ponto != 7 && soma_ponto != soma);
return saldo;
}