Você está na página 1de 68

INF1007: Programao 2

0 Reviso

06/08/2015

(c) Dept. de Informtica - PUC-Rio

Tpicos Principais
Variveis e Constantes
Operadores e Expresses

Entrada e Sada
Tomada de Deciso
Construo com laos
Definio de funes
Pilha de Execuo

06/08/2015

(c) Dept. de Informtica - PUC-Rio

Variveis e Constantes
Tipos bsicos na linguagem C:

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

Variveis e Constantes
Valor Constante:
armazenado na memria

possui um tipo, indicado pela sintaxe da constante


123
12.45
1245e-2
12.45F

06/08/2015

/* constante inteira do tipo int */


/* constante real do tipo double */
/* constante real do tipo double */
/* constante real do tipo float */

(c) Dept. de Informtica - PUC-Rio

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:

06/08/2015

determina a natureza do dado

(c) Dept. de Informtica - PUC-Rio

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 */

06/08/2015

(c) Dept. de Informtica - PUC-Rio

Variveis e Constantes
Declarao de varivel:
variveis s armazenam valores do mesmo tipo
com que foram declaradas

int a;

/* declara uma varivel do tipo int */

a = 4.3;

a armazena o valor 4! porque?

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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.3f; /* declara e inicializa uma varivel do tipo float */

int a;
int b;
float c;
a=5;
b=10;
c=5.3f;
06/08/2015

C tem muitas maneiras de fazer a mesma coisa


(c) Dept. de Informtica - PUC-Rio

Variveis e Constantes
Varivel com valor indefinido:
uma varivel deve ter um valor definido quando utilizada
int a, b, c;
a = 2;
c = a + b;

06/08/2015

/* declara 3 variveis do tipo int */


/* ERRO: o que tem em b? Lixo. */

(c) Dept. de Informtica - PUC-Rio

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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 o valor 3 */
b = a / 2.0;
/* b recebe o valor 1.5 */
c = 1/3 + b; /* 1/3 retorna 0 pois a operao ser sobre inteiros */
/* c recebe o valor de b */

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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

06/08/2015

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

(c) Dept. de Informtica - PUC-Rio

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 equivalente a var = var op (expr)


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

06/08/2015

equivalente a
equivalente a

(c) Dept. de Informtica - PUC-Rio

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
incrementa n de uma unidade, depois de ser usado
incrementa n de uma unidade, antes de ser usado

n++
++n

n
x
x
a
b

=
=
=
=
=

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

06/08/2015

/* 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) Dept. de Informtica - PUC-Rio

14

Operadores e Expresses

Operadores Relacionais

<

<=

==

>=

>

!=

o resultado ser 0 (FALSE) ou 1 (TRUE)


no h valores booleanos em C
int a, b;
int c = 23;
int d = c + 4;
a= c < 20;
b= d > c;

a=0 e b=1

06/08/2015

(c) Dept. de Informtica - PUC-Rio

15

Operadores e Expresses

Operadores lgicos

&& ||

int a, b, f;
int c = 23;
int d = c + 4;
a = (c < 20) || (d > c);

(c < 20) e (d > c) so avaliadas

b = (c < 20) && (d > c);

apenas(c < 20) avaliada

a=1 e b=0

a avaliao da esquerda para a direita


a avaliao pra quando o resultado pode ser conhecido
06/08/2015

(c) Dept. de Informtica - PUC-Rio

16

Operadores e Expresses
converso de tipo:
converso de tipo automtica na avaliao de uma expresso

converso de tipo pode ser requisita explicitamente

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

06/08/2015

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


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

(c) Dept. de Informtica - PUC-Rio

17

Entrada e Sada: printf


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 Real = %g", 33, 5.3);
com sada:
Inteiro = 33 Real = 5.3

06/08/2015

(c) Dept. de Informtica - PUC-Rio

18

Entrada e Sada: formato do printf


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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

19

Entrada e Sada: ajuste de impresso


Especificao de tamanho de campo:

%4d

3 3
4

%7.2f

5 .

3 0
2

06/08/2015

(c) Dept. de Informtica - PUC-Rio

20

Entrada e Sada: exemplo


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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

21

Entrada e Sada: 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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

22

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

23

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 (:)

06/08/2015

(c) Dept. de Informtica - PUC-Rio

24

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 }
06/08/2015

(c) Dept. de Informtica - PUC-Rio

25

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;
}

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;

06/08/2015

(c) Dept. de Informtica - PUC-Rio

27

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

ou

06/08/2015

comando;

(c) Dept. de Informtica - PUC-Rio

28

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

29

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, um
06/08/2015

else est associado


ltimo- if
que no tiver seu prprio else.
(c) Dept. deao
Informtica
PUC-Rio
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;
}

06/08/2015

(c) Dept. de Informtica - PUC-Rio

31

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

32

/* 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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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

06/08/2015

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

(c) Dept. de Informtica - PUC-Rio

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
if ( a > b )
maximo = a;
else
maximo = b;
06/08/2015

(c) Dept. de Informtica - PUC-Rio

39

Construes com laos


Exemplo:
fatorial de um nmero inteiro no negativo:

n
!

(
n

1
)

(
n

2
)...
3

1
onde
:
0
!

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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
}

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;

*/

}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

46

Construes com laos


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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

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;
}

06/08/2015

(c) Dept. de Informtica - PUC-Rio

49

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;
}

06/08/2015

(c) Dept. de Informtica - PUC-Rio

50

/* 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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

51

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

06/08/2015

( lista de parmetros... )

(c) Dept. de Informtica - PUC-Rio

52

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


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

(c) Dept. de Informtica - PUC-Rio

53

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

void fat(int n)

/* obs: no existe ; na declarao */

{
}

06/08/2015

(c) Dept. de Informtica - PUC-Rio

54

/* 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
printf("Fatorial = %d\n", r);
inteiro:
return 0;
0 : execuo OK
}
0 : execuo OK
/* funo para calcular o valor do fatorial */
declarao da funo:
int fat (int n)
indica o tipo da sada e
{ int i;
o tipo e nome das
int f = 1;
entradas
for (i = 1; i <= n; i++)
f *= i;
return f;
retorna o valor da funo
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

55

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

56

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

c
b
a

06/08/2015

'x
'
4
3
.5
7

ri
v
e
lcn
oe
n
d
e
re

o1
1
2c
o
m
v
a
lo
rig
u
a
la'x
'
1
1
2 -va
1
0
8 -va
ri
v
e
lbn
oe
n
d
e
re

o1
0
8c
o
m
v
a
lo
rig
u
a
la4
3
.5
1
0
4 -va
ri
v
e
lan
oe
n
d
e
re

o1
0
4c
o
m
v
a
lo
rig
u
a
la7

(c) Dept. de Informtica - PUC-Rio

57

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
n--;
fat
}
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
06/08/2015
(c) Dept. de Informtica - PUC-Rio
valor de n no programa principal ainda ser 5

58

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

59

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

60

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

61

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

62

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

63

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;
}
06/08/2015

(c) Dept. de Informtica - PUC-Rio

64

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

1
1
1
11

4
*
(
1

...)
3
5
7
9
11
Ou seja:

1
)

4*
2*i
1
n

i
0

A funo deve obedecer ao prottipo:


float pi(int n);
06/08/2015

(c) Dept. de Informtica - PUC-Rio

65

#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;
}

06/08/2015

(c) Dept. de Informtica - PUC-Rio

66

#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;

06/08/2015

(c) Dept. de Informtica - PUC-Rio

67

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

06/08/2015

(c) Dept. de Informtica - PUC-Rio

68

Você também pode gostar