Академический Документы
Профессиональный Документы
Культура Документы
08/03/10
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
Variveis e Constantes
Tipos bsicos na linguagem C:
Tipo
Tamanho
Menor valor
Maior valor
char
1 byte
-128
+127
unsigned char
1 byte
+255
2 bytes
-32.768
+32.767
+65.535
4 bytes
-2.147.483.648
+2.147.483.647
4 bytes
-2.147.483.648
+2.147.483.647
4 bytes
+4.294.967.295
float
4 bytes
-1038
+1038
double
8 bytes
-10308
+10308
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 */
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
Variveis e Constantes
Declarao de varivel:
variveis devem ser explicitamente declaradas
variveis podem ser declaradas em conjunto
int a;
int b;
float c;
int d, e;
08/03/10
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
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;
08/03/10
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
Operadores e Expresses
Operadores:
aritmticos: + , - , * , / , %
atribuio: = , += , -= , *= , /= , %=
incremento e decremento: ++ , - relacionais e lgicos: < , <= , == , >= , > , !=
outros
08/03/10
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 */
11
Operadores e Expresses
Operadores aritmticos (cont.):
o operador mdulo, %, aplica-se a inteiros
precedncia dos operadores: * , / , - , +
x % 2
a + b * c / d
equivalente a
08/03/10
(a + ((b * c) / d))
12
Operadores e Expresses
Operadores de atribuio :
( = , += , -= , *= , /= , %= )
C trata uma atribuio como uma expresso
a ordem da direita para a esquerda
08/03/10
equivalente a
equivalente a
equivalente a
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++
++n
n
x
x
a
b
=
=
=
=
=
08/03/10
5;
n++;
++n;
3;
a++ * 2;
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
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
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 */
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;
int g, h;
g = (int) 3.5;
h = (int) 3.5 % 2
08/03/10
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 = 5.3
(c) Casanova e Gattass
19
Entrada e Sada
Especificao de formato:
%c
especifica um char
%d
especifica um int
%u
%f
%e
%g
%s
08/03/10
20
Entrada e Sada
Especificao de tamanho de campo:
08/03/10
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
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
23
Entrada e Sada
Especificao de formato:
%c
especifica um char
%d
especifica um int
%u
%f,%e,%g
especificam um float
especificam um double
%s
08/03/10
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
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
26
Exemplo
/* nota */
#include <stdio.h>
int main (void)
{
float nota ;
printf("Digite sua nota: ");
scanf("%f", ¬a);
if (nota >= 7 ){
printf(" Boa nota, parabens! \n");
}
else {
printf(" Voce precisa melhorar. \n");
}
return 0;
}
08/03/10
27
Exemplo
/* nota */
#include <stdio.h>
int main (void)
{
float nota ;
printf("Digite sua nota: ");
scanf("%f", ¬a);
if (nota >= 7 )
printf(" Boa nota, parabens! \n");
else
printf(" Voce precisa melhorar. \n");
return 0;
}
08/03/10
28
Bloco de comandos
{
comando1;
comando2;
...
}
ou
comando;
08/03/10
29
Tomada de Deciso
Exemplo:
funo para qualificar a temperatura:
08/03/10
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
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
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
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
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
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
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
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)
08/03/10
... }
/* a varivel i no existe neste ponto do programa */
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
n ! = n ( n 1) ( n 2)...3 2 1
onde : 0 ! = 1
08/03/10
40
faa enquanto k n
fatorial = fatorial * k
incremente k
08/03/10
41
08/03/10
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
43
equivalente a:
expresso_inicial;
while ( expresso_booleana )
{
bloco de comandos
...
expresso_de_incremento
}
08/03/10
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
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
46
08/03/10
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
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
49
fim
50
51
52
08/03/10
53
54
Definio de Funes
Comando para definio de funo:
tipo_retornado nome_da_funo
{
corpo da funo
}
08/03/10
( lista de parmetros... )
55
56
void fat(int n)
{
}
08/03/10
57
08/03/10
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
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
60
61
62
63
Exemplo: Declarao de
n na fat(int n)
64
65
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
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
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
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
79
Variveis Globais
#include <stdio.h>
int s, p;
/* variveis globais */
80
Variveis Estticas
Varivel esttica:
declarada no corpo de uma funo:
visvel apenas dentro da funo em que foi declarada
08/03/10
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
82
funes estticas:
no podem ser chamadas por funes definidas
em outros arquivos
08/03/10
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
08/03/10
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
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
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
87
#include <stdio.h>
#include <math.h>
Exerccios
1;
= 1; i < n; i++) {
= soma + (pow(-1,i) / ((2 * i) + 1));
4*soma;
08/03/10
88
Referncias
Waldemar Celes, Renato Cerqueira, Jos Lucas Rangel,
Introduo a Estruturas de Dados, Editora Campus
(2004)
Captulo 4 Funes
08/03/10
89