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

INF1007: Programao 2

0 Reviso / Funes Recursivas

08/03/10

(c) Casanova e Gattass

Tpicos Principais
Variveis e Constantes
Operadores e Expresses
Entrada e Sada
Tomada de Deciso
Construes com Laos
Definio de Funes
Pilha de Execuo
Funes Recursivas
Varives Globais X Variveis Estticas
08/03/10

(c) Casanova e Gattass

Variveis e Constantes
Tipos bsicos na linguagem C:
Tipo

Tamanho

Menor valor

Maior valor

char

1 byte

-128

+127

unsigned char

1 byte

+255

short int (short)

2 bytes

-32.768

+32.767

+65.535

unsigned short int 2 bytes


int (*)

4 bytes

-2.147.483.648

+2.147.483.647

long int (long)

4 bytes

-2.147.483.648

+2.147.483.647

unsigned long int

4 bytes

+4.294.967.295

float

4 bytes

-1038

+1038

double

8 bytes

-10308

+10308

(*) depende da mquina, sendo 4 bytes para arquiteturas de 32 bits


08/03/10

(c) Casanova e Gattass

Variveis e Constantes
Valor Constante:
armazenado na memria
possui um tipo, indicado pela sintaxe da constante
123
12.45
1245e-2
12.45F

08/03/10

/* constante
/* constante
/* constante
/* constante

inteira
real do
real do
real do

do tipo int */
tipo double */
tipo double */
tipo float */

(c) Casanova e Gattass

Variveis e Constantes
Varivel:
espao de memria para armazenar um dado
no uma varivel no sentido matemtico
possui um tipo e um nome
nome: identifica o espao de memria
tipo:

08/03/10

determina a natureza do dado

(c) Casanova e Gattass

Variveis e Constantes
Declarao de varivel:
variveis devem ser explicitamente declaradas
variveis podem ser declaradas em conjunto
int a;
int b;
float c;

/* declara uma varivel do tipo int */


/* declara uma varivel do tipo int */
/* declara uma varivel do tipo float */

int d, e;

/* declara duas variveis do tipo int */

08/03/10

(c) Casanova e Gattass

Variveis e Constantes
Declarao de varivel:
variveis s armazenam valores do mesmo tipo
com que foram declaradas
int a;
a = 4.3;

08/03/10

/* declara uma varivel do tipo int */


/* a armazenar o valor 4 */

(c) Casanova e Gattass

Variveis e Constantes
Varivel com valor indefinido:
uma varivel pode receber um valor quando definida
(inicializada), ou atravs de um operador de atribuio
int a = 5, b = 10;

/* declara e inicializa duas variveis do tipo int */

float c = 5.3; /* declara e inicializa uma varivel do tipo float */

08/03/10

(c) Casanova e Gattass

Variveis e Constantes
Varivel com valor indefinido:
uma varivel deve ter um valor definido quando utilizada
int a, b, c; /* declara e inicializa duas variveis do tipo int */
a = 2;
c = a + b;
/* ERRO: b contm lixo */

08/03/10

(c) Casanova e Gattass

Operadores e Expresses
Operadores:
aritmticos: + , - , * , / , %
atribuio: = , += , -= , *= , /= , %=
incremento e decremento: ++ , - relacionais e lgicos: < , <= , == , >= , > , !=
outros

08/03/10

(c) Casanova e Gattass

10

Operadores e Expresses
Operadores aritmticos ( + , - , * , / , % ):
operaes so feitas na preciso dos operandos
o operando com tipo de menor expressividade convertido para
o tipo do operando com tipo de maior expressividade
diviso entre inteiros trunca a parte fracionria
int a
double b, c;
a = 3.5;
/* a recebe
b = a / 2.0;
/* b recebe o valor
c = 1/3 + b; /* 1/3 retorna 0 pois
/* c recebe o valor

08/03/10

o valor 3 */
1.5 */
a operao ser sobre inteiros */
de b */

(c) Casanova e Gattass

11

Operadores e Expresses
Operadores aritmticos (cont.):
o operador mdulo, %, aplica-se a inteiros
precedncia dos operadores: * , / , - , +
x % 2

/* o resultado ser 0, se x for par;


caso contrrio, ser 1 */

a + b * c / d

equivalente a

08/03/10

(a + ((b * c) / d))

(c) Casanova e Gattass

12

Operadores e Expresses
Operadores de atribuio :
( = , += , -= , *= , /= , %= )
C trata uma atribuio como uma expresso
a ordem da direita para a esquerda

C oferece uma notao compacta para atribuies


em que a mesma varivel aparece dos dois lados

var op= expr


i += 2;
x *= y + 1;

08/03/10

equivalente a
equivalente a
equivalente a

(c) Casanova e Gattass

var = var op (expr)


i = i + 2;
x = x * (y +1);

13

Operadores e Expresses
Operadores de incremento e decremento ( ++ , -- ):
incrementa ou decrementa de uma unidade o valor de uma varivel
os operadores no se aplicam a expresses
o incremento pode ser antes ou depois da varivel ser utilizada
n++

incrementa n de uma unidade, depois de ser usado

++n

incrementa n de uma unidade, antes de ser usado

n
x
x
a
b

=
=
=
=
=

08/03/10

5;
n++;
++n;
3;
a++ * 2;

/* x recebe 5; n incrementada para 6 */


/* n incrementada para 6; x recebe 6 */
/ b termina com o valor 6 e a com o valor 4 */

(c) Casanova e Gattass

14

Operadores e Expresses
Operadores relacionais
(< , <= , == , >= , > , !=):
o resultado ser 0 ou 1 (no h valores booleanos em C)
int a, b;
int c = 23;
int d = c + 4;
c < 20
d > c

08/03/10

retorna 0
retorna 1

(c) Casanova e Gattass

15

Operadores e Expresses
Operadores lgicos ( && , || , ! )
a avaliao da esquerda para a direita
a avaliao pra quando o resultado pode ser conhecido
int a, b;
int c = 23;
int d = c + 4;
a = (c < 20) || (d > c);

/* retorna 1 */
/* as duas sub-expresses so avaliadas */
b = (c < 20) && (d > c);
/* retorna 0 */
/* apenas a primeira sub-expresso avaliada */

08/03/10

(c) Casanova e Gattass

16

Operadores e Expresses
sizeof:
retorna o nmero de bytes ocupados por um tipo

int a = sizeof(float)

08/03/10

/* armazena 4 em a */

(c) Casanova e Gattass

17

Operadores e Expresses
converso de tipo:
converso de tipo automtica na avaliao de uma expresso
converso de tipo pode ser requisita explicitamente

float f;
float f = 3;

/* valor 3 convertido automaticamente para float */


/* ou seja, passa a valer 3.0F, antes de ser atribudo a f */

int g, h;
g = (int) 3.5;
h = (int) 3.5 % 2

/* 3.5 convertido (e arredondado) para int */


/* antes de ser atribudo varivel g
*/
/* e antes de aplicar o operador mdulo % */

08/03/10

(c) Casanova e Gattass

18

Entrada e Sada
Funo printf:
possibilita a sada de valores segundo um determinado formato
printf (formato, lista de constantes/variveis/expresses...);
printf ("%d %g", 33, 5.3);
tem como resultado a impresso da linha:
33 5.3
printf ("Inteiro = %d
com sada:
Inteiro = 33
08/03/10

Real = %g", 33, 5.3);

Real = 5.3
(c) Casanova e Gattass

19

Entrada e Sada
Especificao de formato:
%c

especifica um char

%d

especifica um int

%u

especifica um unsigned int

%f

especifica um double (ou float)

%e

especifica um double (ou float) no formato cientfico

%g

especifica um double (ou float) no formato mais apropriado


(%f ou %e)

%s

especifica uma cadeia de caracteres

08/03/10

(c) Casanova e Gattass

20

Entrada e Sada
Especificao de tamanho de campo:

08/03/10

(c) Casanova e Gattass

21

Entrada e Sada
Impresso de texto:
printf("Curso de Estruturas de Dados\n");
exibe na tela a mensagem:
Curso de Estruturas de Dados

08/03/10

(c) Casanova e Gattass

22

Entrada e Sada
Funo scanf:
captura valores fornecidos via teclado
scanf (formato, lista de endereos das variveis...);
int n;
scanf ("%d", &n);
valor inteiro digitado pelo usurio armazenado na varivel n

08/03/10

(c) Casanova e Gattass

23

Entrada e Sada
Especificao de formato:
%c

especifica um char

%d

especifica um int

%u

especifica um unsigned int

%f,%e,%g

especificam um float

%lf, %le, %lg

especificam um double

%s

especifica uma cadeia de caracteres

08/03/10

(c) Casanova e Gattass

24

Entrada e Sada
Funo scanf (cont.):
caracteres diferentes dos especificadores no formato servem
para cercar a entrada
espao em branco dentro do formato faz com que sejam
"pulados" eventuais brancos da entrada
%d, %f, %e e %g automaticamente pulam os brancos que
precederem os valores numricos a serem capturados
scanf ("%d:%d", &h, &m);
valores (inteiros) fornecidos devem ser separados pelo
caractere dois pontos(:)

08/03/10

(c) Casanova e Gattass

25

Tomada de Deciso
Comando if:
comando bsico para codificar tomada de deciso
se expr for verdadeira ( 0), executa o bloco de comandos 1
se expr for falsa (= 0), executa o bloco de comandos 2
if ( expr )
{ bloco de comandos 1 }
else
{ bloco de comandos 2 }
ou
if ( expr )
{ bloco de comandos }
08/03/10

(c) Casanova e Gattass

26

Exemplo
/* nota */
#include <stdio.h>
int main (void)
{
float nota ;
printf("Digite sua nota: ");
scanf("%f", &nota);
if (nota >= 7 ){
printf(" Boa nota, parabens! \n");
}
else {
printf(" Voce precisa melhorar. \n");
}
return 0;
}

08/03/10

(c) Casanova e Gattass

27

Exemplo
/* nota */
#include <stdio.h>
int main (void)
{
float nota ;
printf("Digite sua nota: ");
scanf("%f", &nota);
if (nota >= 7 )
printf(" Boa nota, parabens! \n");
else
printf(" Voce precisa melhorar. \n");
return 0;
}

08/03/10

(c) Casanova e Gattass

28

Bloco de comandos
{
comando1;
comando2;
...
}
ou
comando;

08/03/10

(c) Casanova e Gattass

29

Tomada de Deciso
Exemplo:
funo para qualificar a temperatura:

se a temperatura for menor do que 20oC, ento est frio


se a temperatura estiver entre 20oC e 30oC, ento est
agradvel
se a temperatura for maior do que 30oC, ento est quente

08/03/10

(c) Casanova e Gattass

30

Tomada de Deciso
/* temperatura (versao 1 - incorreta) */
#include <stdio.h>
int main (void)
{
int temp;
printf("Digite a temperatura: ");
scanf("%d", &temp);
if (temp < 30)
if (temp > 20)
printf(" Temperatura agradvel \n");
else
printf(" Temperatura quente \n");
return 0;
}

Em C,
08/03/10

um else est associado


ao ltimo
if que no tiver seu prprio else.31
(c) Casanova
e Gattass

Tomada de Deciso
/* temperatura (versao 1 - incorreta) */
#include <stdio.h>
int main (void)
{
int temp;
printf("Digite a temperatura: ");
scanf("%d", &temp);
if (temp < 30)
if (temp > 20)
printf(" Temperatura agradvel \n");
else
printf(" Temperatura quente \n");
return 0;
}
08/03/10

(c) Casanova e Gattass

32

Tomada de Deciso
/* temperatura (versao 2) */
#include <stdio.h>
int main (void)
{
int temp;
printf ( "Digite a temperatura: " );
scanf ( "%d", &temp );
if ( temp < 30 ) {
if ( temp > 20 )
printf ( " Temperatura agradvel \n" );
}
else
printf ( " Temperatura quente \n" );
return 0;
}
08/03/10

(c) Casanova e Gattass

33

/* temperatura (versao 3) */
#include <stdio.h>
int main (void)
{
int temp;
printf("Digite a temperatura: ");
scanf("%d", &temp);
if (temp < 10)
printf("Temperatura muito fria \n");
else if (temp < 20)
printf(" Temperatura fria \n");
else if (temp < 30)
printf("Temperatura agradvel \n");
else
printf("Temperatura quente \n");
return 0;
}
08/03/10

(c) Casanova e Gattass

34

/* temperatura (versao 3) */
#include <stdio.h>
int main (void)
{
int temp;
printf("Digite a temperatura: ");
scanf("%d", &temp);
if (temp < 10)
printf("Temperatura muito fria \n");
else if (temp < 20)
printf(" Temperatura fria \n");
else if (temp < 30)
printf("Temperatura agradvel \n");
else
printf("Temperatura quente \n");
return 0;
}
08/03/10

(c) Casanova e Gattass

35

/* temperatura (versao 3) */
#include <stdio.h>
int main (void)
{
int temp;
printf("Digite a temperatura: ");
scanf("%d", &temp);
if (temp < 10)
printf("Temperatura muito fria \n");
else if (temp < 20)
printf(" Temperatura fria \n");
else if (temp < 30)
printf("Temperatura agradvel \n");
else
printf("Temperatura quente \n");
return 0;
}
08/03/10

(c) Casanova e Gattass

36

/* temperatura (versao 3) */
#include <stdio.h>
int main (void)
{
int temp;
printf("Digite a temperatura: ");
scanf("%d", &temp);
if (temp < 10)
printf("Temperatura muito fria \n");
else if (temp < 20)
printf(" Temperatura fria \n");
else if (temp < 30)
printf("Temperatura agradvel \n");
else
printf("Temperatura quente \n");
return 0;
}
08/03/10

(c) Casanova e Gattass

37

Tomada de Deciso
Estrutura de bloco:
declarao de variveis:
s podem ocorrer no incio do corpo da funo ou de um bloco
(esta restrio no existe no C99)

escopo de uma varivel:


uma varivel declarada dentro de um bloco vlida no bloco
aps o trmino do bloco, a varivel deixa de existir
if ( n > 0 )
{ int i;
...

08/03/10

... }
/* a varivel i no existe neste ponto do programa */

(c) Casanova e Gattass

38

Tomada de Deciso
Operador condicional:
formato geral:
se a condio for verdadeira, a expresso1 avaliada;
caso contrrio, a expresso2 avaliada
condio ? expresso1 : expresso2;

exemplo:
comando
maximo = a > b ? a : b ;

comando if equivalente

08/03/10

if ( a > b )
maximo = a;
else
maximo = b; (c) Casanova e Gattass

39

Construes com laos


Exemplo:
fatorial de um nmero inteiro no negativo:

n ! = n ( n 1) ( n 2)...3 2 1
onde : 0 ! = 1

08/03/10

(c) Casanova e Gattass

40

Construes com laos


Exemplo:
definio recursiva da funo fatorial:
fatorial(0) = 1
fatorial(n) = n x fatorial(n-1)
clculo no recursivo de fatorial(n)
comece com:
k = 1
fatorial = 1

faa enquanto k n
fatorial = fatorial * k
incremente k

08/03/10

(c) Casanova e Gattass

41

Construes com laos


Comando while:
enquanto expr for verdadeira, o bloco de comandos executado
quando expr for falsa, o comando termina
while ( expr )
{
bloco de comandos
}

08/03/10

(c) Casanova e Gattass

42

/* Fatorial */
#include <stdio.h>
int main (void)
{
int i;
int n;
long int f = 1;
printf("Digite um numero inteiro nao negativo:");
scanf("%d", &n);
/* calcula fatorial */
i = 1;
while (i <= n)
{
f = f * i;
/* equivalente a f *= i */
i = i + 1;
/*
equivalente a i++
*/
}
printf(" Fatorial = %d \n", f);
return 0;
}
08/03/10

(c) Casanova e Gattass

43

Construes com laos


Comando for:
forma compacta para exprimir laos
for (expresso_inicial; expresso_booleana; expresso_de_incremento)
{
bloco de comandos
}

equivalente a:
expresso_inicial;
while ( expresso_booleana )
{
bloco de comandos
...
expresso_de_incremento
}
08/03/10

(c) Casanova e Gattass

44

/* Fatorial (versao 2) */
#include <stdio.h>
int main (void)
{
int i;
int n;
int f = 1;
printf("Digite um numero inteiro nao negativo:");
scanf("%d", &n);
/* calcula fatorial */
for (i = 1; i <= n; i=i+1) {
f = f * i;
}
printf(" Fatorial = %d \n", f);
return 0;
}
08/03/10

(c) Casanova e Gattass

45

/* Fatorial (versao 2) */
#include <stdio.h>
int main (void)
{
int i;
int n;
int f = 1;
printf("Digite um numero inteiro nao negativo:");
scanf("%d", &n);
/* calcula fatorial */
for (i = 1; i <= n; i+1) {
/* o que acontece com este programa?
f = f * i;
}
printf(" Fatorial = %d \n", f);
return 0;

*/

}
08/03/10

(c) Casanova e Gattass

46

Construes com laos


Comando do-while:
teste de encerramento avaliado no final
do
{
bloco de comandos
} while (expr);

08/03/10

(c) Casanova e Gattass

47

/* Fatorial (versao 3) */
#include <stdio.h>
int main (void)
{
int i;
int n;
int f = 1;
/* requisita valor at um nmero no negativo ser informado */
do
{
printf("Digite um valor inteiro nao negativo:");
scanf ("%d", &n);
} while (n<0);
/* calcula fatorial */
for (i = 1; i <= n; i++)
f *= i;
printf(" Fatorial = %d\n", f);
return 0;
}
08/03/10

(c) Casanova e Gattass

48

/* Fatorial (versao 4) */
#include <stdio.h>
int main (void)
{
int i;
int n;
int f = 1;
/* O que faz este programa? */
do {
printf("Digite um valor inteiro nao negativo:");
scanf ("%d", &n);
/* calcula fatorial */
for (i = 1; i <= n; i++)
f *= i;
printf(" Fatorial = %d\n", f);
} while (n>=0);
return 0;
}

08/03/10

(c) Casanova e Gattass

49

Construes com laos


Interrupo de laos - Comando break:
termina a execuo do comando de lao
#include <stdio.h>
int main (void)
{
int i;
for (i = 0; i < 10; i++) {
if (i == 5)
break;
printf("%d ", i);
}
printf("fim\n");
return 0;
}
A sada deste programa, se executado, ser: 0
08/03/10

(c) Casanova e Gattass

fim
50

Construes com laos


Interrupo de laos - Comando continue:
termina a iterao corrente e passa para a prxima
#include <stdio.h>
int main (void)
{
int i;
for (i = 0; i < 10; i++ ) {
if (i == 5) continue;
printf("%d ", i);
}
printf("fim\n");
return 0;
}

gera a sada: 0 1 2 3 4 X5 6 7 8 9 fim


08/03/10

(c) Casanova e Gattass

51

Construes com laos


Interrupo de laos - Comando continue:
deve-se ter cuidado para criar uma iterao eterno
/* INCORRETO */
#include <stdio.h>
int main (void)
{
int i = 0;
while (i < 10) {
if (i == 5) continue;
printf("%d ", i);
i++;
}
printf("fim\n");
return 0;
}

cria iterao eterna pois i no ser mais incrementado quando chegar a 5


08/03/10

(c) Casanova e Gattass

52

Construes com laos


Comando switch:
seleciona uma entre vrios casos
(opk deve ser um inteiro ou caractere)
switch ( expr )
{
case op1: bloco de comandos 1; break;
case op2: bloco de comandos 2; break;
...
default: bloco de comandos default; break;
}

08/03/10

(c) Casanova e Gattass

53

/* calculadora de quatro operaes */


#include <stdio.h>
int main (void)
{
float num1, num2;
char op;
printf("Digite: numero op numero\n");
scanf ("%f %c %f", &num1, &op, &num2);
switch (op)
{
case '+': printf(" = %f\n", num1+num2); break;
case '-': printf(" = %f\n", num1-num2); break;
case '*': printf(" = %f\n", num1*num2); break;
case '/': printf(" = %f\n", num1/num2); break;
default: printf("Operador invalido!\n"); break;
}
return 0;
}
08/03/10

(c) Casanova e Gattass

54

Definio de Funes
Comando para definio de funo:
tipo_retornado nome_da_funo
{
corpo da funo
}

08/03/10

( lista de parmetros... )

(c) Casanova e Gattass

55

/* programa que l um nmero e imprime seu fatorial */


#include <stdio.h>
prottipo da funo:
int fat (int n);
deve ser includo antes
int main (void)
da funo ser chamada
{ int n, r;
printf(Digite um nmero nao negativo:);
chamada da funo
scanf("%d", &n);
main retorna um inteiro:
fat(n);
0 : execuo OK
return 0;
0 : execuo OK
}
declarao da funo:
/* funo para calcular o valor do fatorial */
indica o tipo da sada e
int fat (int n)
o tipo e nome das entradas
{ int i;
int f = 1;
for (i = 1; i <= n; i++)
f *= i;
printf(Fatorial = %f, f);
}
08/03/10

(c) Casanova e Gattass

56

void fat (int n); /* obs: existe ; no prottipo */

void fat(int n)

/* obs: no existe ; na declarao */

{
}

08/03/10

(c) Casanova e Gattass

57

/* programa que l um nmero e imprime seu fatorial (verso


2) */
#include <stdio.h>
prottipo da funo:
int fat (int n);
deve ser includo antes
int main (void)
da funo ser chamada
{ int n, r;
printf(Digite um nmero nao negativo:); chamada da funo
scanf("%d", &n);
r = fat(n);
main retorna um inteiro:
printf("Fatorial = %d\n", r);
0 : execuo OK
return 0;
0 : execuo OK
}
/* funo para calcular o valor do fatorial */
declarao da funo:
int fat (int n)
indica o tipo da sada e
o tipo e nome das entradas
{ int i;
int f = 1;
for (i = 1; i <= n; i++)
f *= i;
return f;
retorna o valor da funo
}

08/03/10

(c) Casanova e Gattass

58

Pilha de Execuo
Comunicao entre funes:
funes so independentes entre si
transferncia de dados entre funes:
atravs dos parmetros e do valor de retorno da funo chamada
passagem de parmetros feita por valor

variveis locais a uma funo:


definidas dentro do corpo da funo (incluindo os parmetros)
no existem fora da funo
so criadas cada vez que a funo executada
deixam de existir quando a execuo da funo terminar
08/03/10

(c) Casanova e Gattass

59

Pilha de Execuo
Comunicao entre funes (cont.):
Pergunta: Como implementar a comunicao entre funes?
Resposta: Atravs de uma pilha

c
b
a

08/03/10

'x'
43.5
7

112 - varivel c no endereo 112 com valor igual a 'x'


108 - varivel b no endereo 108 com valor igual a 43.5
104 - varivel a no endereo 104 com valor igual a 7

(c) Casanova e Gattass

60

Exemplo: Fatorial iterativo


/* programa que l um numero e imprime seu fatorial (verso 3) */
#include <stdio.h>
int fat (int n);
int main (void)
declarao das variveis n e
{ int n = 5;
r, locais funo main
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
int fat (int n)
declarao das variveis n e
{ int f = 1;
f, locais funo fat
while (n != 0) {
f *= n;
alterao no valor de n em fat
n--;
no altera o valor de n em
}
main
return f;
}

simulao da chamada fat(5):


a varivel n possui valor 0 ao final da execuo de fat, mas o valor
08/03/10
(c) Casanova e Gattass
de n no programa principal ainda ser 5

61

Exemplo: Incio do programa


/* programa que l um numero e imprime seu fatorial (verso 3) */
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
int fat (int n)
{ int f = 1;
while (n != 0) {
f *= n;
n--;
}
return f;
}
08/03/10

(c) Casanova e Gattass

62

Exemplo: Declarao de n e r na main()


/* programa que l um numero e imprime seu fatorial (verso 3) */
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
int fat (int n)
{ int f = 1;
while (n != 0) {
f *= n;
n--;
}
return f;
}
08/03/10

(c) Casanova e Gattass

63

Exemplo: Declarao de

n na fat(int n)

/* programa que l um numero e imprime seu fatorial (verso 3) */


#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
int fat (int n)
{ int f = 1;
while (n != 0) {
f *= n;
n--;
}
return f;
}
08/03/10

(c) Casanova e Gattass

64

Exemplo: Declarao de n e f na fat(int n)


/* programa que l um numero e imprime seu fatorial (verso 3) */
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
int fat (int n)
{ int f = 1;
while (n != 0) {
f *= n;
n--;
}
return f;
}
08/03/10

(c) Casanova e Gattass

65

Exemplo: no final do lao


/* programa que l um numero e imprime seu fatorial (verso 3) */
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
int fat (int n)
{ int f = 1;
while (n != 0) {
f *= n;
n--;
}
return f;
}
08/03/10

(c) Casanova e Gattass

66

Exemplo: no retorno
/* programa que l um numero e imprime seu fatorial (verso 3) */
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
int fat (int n)
{ int f = 1;
while (n != 0) {
f *= n;
n--;
}
return f;
}
08/03/10

(c) Casanova e Gattass

67

Funes Recursivas
Tipos de recurso:
direta:
uma funo A chama a ela prpria

indireta:
uma funo A chama uma funo B que, por sua vez, chama A

Comportamento:
quando uma funo chamada recursivamente,
cria-se um ambiente local para cada chamada
as variveis locais de chamadas recursivas so independentes
entre si, como se estivssemos chamando funes diferentes
08/03/10

(c) Casanova e Gattass

68

Funes Recursivas
Exemplo: definio recursiva de fatorial
1, se n = 0
n!=
n (n 1)!, se n > 0
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
if (n==0)
return 1;
else
return n*fat(n-1);
}

08/03/10

(c) Casanova e Gattass

69

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

f
fat(5) n

main n

70

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

f
fat(4) n

fat(5) n

main n

71

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

fat(0) n

fat(1) n

fat(2) n

fat(3) n

fat(4) n

fat(5) n

5
-

main n
72

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

fat(1) n

fat(2) n

fat(3) n

fat(4) n

fat(5) n

main n

5
73

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

fat(2) n

fat(3) n

fat(4) n

fat(5) n

main n

5
74

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

f
fat(3) n

fat(4) n

fat(5) n

main n
75

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

f
fat(4) n

24

fat(5) n

main n

76

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

f
fat(5) n

120

main n

77

Funes Recursivas
#include <stdio.h>
int fat (int n);
int main (void)
{ int n = 5;
int r;
r = fat ( n );
printf("Fatorial de %d = %d \n", n, r);
return 0;
}
/* Funo recursiva para clculo do fatorial */
int fat (int n)
{
int f;
if (n==0)
f=1;
else
f= n*fat(n-1);
return f;
08/03/10
(c) Casanova e Gattass
}

r
main n

120

78

Variveis Globais
Varivel global:
declarada fora do corpo das funes:
visvel por todas as funes subseqentes

no armazenada na pilha de execuo:


no deixa de existir quando a execuo de uma funo termina
existe enquanto o programa estiver sendo executado

utilizao de variveis globais:


deve ser feito com critrio
pode-se criar um alto grau de interdependncia entre as funes
dificulta o entendimento e o reuso do cdigo
08/03/10

(c) Casanova e Gattass

79

Variveis Globais
#include <stdio.h>
int s, p;

/* variveis globais */

void somaprod (int a, int b)


{
s = a + b;
p = a * b;
}
int main (void)
{
int x, y;
scanf("%d %d", &x, &y);
somaprod(x,y);
printf("Soma = %d produto = %d\n", s, p);
return 0;
}
08/03/10

(c) Casanova e Gattass

80

Variveis Estticas
Varivel esttica:
declarada no corpo de uma funo:
visvel apenas dentro da funo em que foi declarada

no armazenada na pilha de execuo:


armazenada em uma rea de memria esttica
continua existindo antes ou depois de a funo ser executada

utilizao de variveis estticas:


quando for necessrio recuperar o valor de uma varivel atribuda
na ltima vez que a funo foi executada

08/03/10

(c) Casanova e Gattass

81

Variveis Estticas
Exemplo:
void imprime ( float a )
{
static int n = 1;
printf(" %f
", a);
if ((n % 5) == 0) printf(" \n ");
n++;
}
funo para imprimir nmeros reais:
imprime um nmero por vez, separando-os por
espaos em branco e colocando, no mximo, cinco
nmeros por linha

08/03/10

(c) Casanova e Gattass

82

Variveis Estticas X Globais


variveis estticas e variveis globais:
so inicializadas com zero,
se no forem explicitamente inicializadas

variveis globais estticas:


so visveis para todas as funes subseqentes
no podem ser acessadas por funes definidas
em outros arquivos

funes estticas:
no podem ser chamadas por funes definidas
em outros arquivos
08/03/10

(c) Casanova e Gattass

83

Exerccios
Faa um programa que recebe como entrada trs graus:
G1, G2 e G3 e calcula a mdia, se o aluno estiver
aprovado, ou informa a necessidade de uma prova final,
se o aluno no tiver satisfeito o seguinte critrio:
Todas as notas maiores ou iguais a 3 E
Mdia aritmtica maior ou igual a 5

Coloque o clculo da mdia em uma funo separada

08/03/10

(c) Casanova e Gattass

84

Exerccios
#include <stdio.h>
float calculaMedia(float g1, float g2, float g3);
int main(void) {
float g1, g2, g3, media;
printf(Digite os graus G1, G2 e G3: );
scanf(%f %f %f, &g1, &g2, &g3);
media = calculaMedia(g1, g2, g3);
if (media >= 5.0 && g1 >= 3.0 && g2 >= 3.0 && g3 >= 3.0) {
printf(SF = APROVADO, MF = %f\n, media);
}
else {
printf(ALUNO EM PROVA FINAL.\n);
}
}
float calculaMedia(float g1, float g2, float g3) {
float media;
media = (g1 + g2 + g3) / 3;
return media;
}
08/03/10

(c) Casanova e Gattass

85

Exerccios
Implemente uma funo que retorne uma aproximao do valor de
PI, de acordo com a Frmula de Leibniz:

1 1 1 1 1
= 4 * (1 + +
+ ...)
3 5 7 9 11
Ou seja:
n 1

= 4*

i= 0

( 1)

2*i + 1

A funo deve obedecer ao prottipo:


float pi(int n);
08/03/10

(c) Casanova e Gattass

86

#include <stdio.h>
float pi(int n);

Exerccios

int main(void) {
int n;
float p;
printf("Digite o numero de termos: ");
scanf("%d", &n);
if (n < 1) {
printf("Erro! O numero de termos deve ser maior que zero.\n");
}
else {
p = pi(n);
printf("PI = %f\n", p);
}
return 0;
}
float pi(int n) {
float soma;
int i;
soma = 1;
for (i = 1; i < n; i++) {
if (i % 2) {
soma = soma - (1.0 / ((2 * i) + 1));
}
else {
soma = soma + (1.0 / ((2 * i) + 1));
}
}
return 4*soma;
}

08/03/10

(c) Casanova e Gattass

87

#include <stdio.h>
#include <math.h>

Exerccios

float pi(int n);


int main(void) {
int n;
float p;
printf("Digite o numero de termos: ");
scanf("%d", &n);
if (n < 1) {
printf("Erro! O numero de termos deve ser maior que zero.\n");
}
else {
p = pi(n);
printf("PI = %f\n", p);
}
return 0;
}
float pi(int n) {
float soma;
int i;
soma =
for (i
soma
}
return

1;
= 1; i < n; i++) {
= soma + (pow(-1,i) / ((2 * i) + 1));
4*soma;

08/03/10

(c) Casanova e Gattass

88

Referncias
Waldemar Celes, Renato Cerqueira, Jos Lucas Rangel,
Introduo a Estruturas de Dados, Editora Campus
(2004)

Captulo 1 Ciclo de Desenvolvimento

Captulo 2 Expresses e E/S

Captulo 3 Controle de Fluxo

Captulo 4 Funes

08/03/10

(c) Casanova e Gattass

89

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