Sei sulla pagina 1di 43

Na última aula

ü  Operadores aritméticos (/, *, +, -, %)


lembrar que divisão é sensível ao contexto

ü  Funções aritméticas (pow, cos, etc). Necessidade


do uso da biblioteca <math.h>
float raiz;
raiz=sqrt(3.4);

ü  Precedência de operadores


ü  Modeladores (casts)

1 INF 01202 – Marcelo Walter – Aula 04


Modeladores - casts
  Sintaxe: (tipo) expressão
ü  Altera o tipo retornado por operações parciais de uma
expressão.
ü  Funcionamento:
...
float num_real; // variável real
int x=1,y=2,z=1; // valores inteiros – inicializados na declaração
/*expressão com operadores inteiros,todos resultados
parciais em inteiro: */
num_real= x/2+ y/2 + z/2;

int int int


int int
int
int
int int

float
0 + 1 + 0 ↔ 1.0

2 INF 01202 – Marcelo Walter – Aula 04


Exercícios

Faça um algoritmo que:


–  leia um valor inteiro;
–  calcule o menor número de notas necessárias para completar este
valor. Lembre que as notas correntes no real são 100,50,20,10,5, 2 e
1 (incluindo aqui também a moeda).
ü  Obs: não vamos analisar ainda o caso da parte fracionária.

3 INF 01202 – Marcelo Walter – Aula 04


Análise e Definição do Problema

Especificação do Problema: Enunciado

Dado a parte inteira de um valor em reais,


calcular e mostrar o mínimo de notas
equivalentes a este valor.

Objetivo: calcular notas equivalentes a


valor
Entradas: valor inteiro
Saída: notas e quantidades
correspondentes ao valor

4 INF 01202 – Marcelo Walter – Aula 04


Tela da Execução

5 INF 01202 – Marcelo Walter – Aula 04


Algoritmo

algoritmo calculanotas;
/* calcula o nro mínimo de notas equivalentes a valor
entradas: valor (inteiro)
saídas: n100, n50, n20, n10, n5, n2 e n1 ( notas ) */
1. início
2. ler valor
3. v = valor //copia para outra variável, para preservar valor lido
4. n100 = v / 100 //divisão inteira: se for menor, n100 fica 0
5. v = v % 100 //recebe resto da div inteira por 100
6. n50 = v / 50 //se for menor, n50 fica 0
7. v = v % 50 //recebe resto da div inteira por 50
8. n20 = v / 20 //se for menor, n20 fica 0
9. v = v % 20 //recebe resto da div inteira por 20
10. n10 = v / 10 //se for menor, n10 fica 0
11. v = v % 10 //recebe resto da div inteira por 10
12. n5 = v / 5 //se for menor, n5 fica 0
13. v = v % 5 //recebe resto da div inteira por 5
14. n2 = v / 2 //se for menor, n2 fica 0
15. n1 = v % 2 //recebe resto da div inteira por 2: já está pronto
16. ...... //informa notas calculadas...
17. fim

6 INF 01202 – Marcelo Walter – Aula 04


Resolução do problema
//Converte valor para notas de dinheiro
#include <stdio.h>
int main( )
{
int valor, v; //valores inteiros lido e usado nos cálculos
int n100, n50,n20,n10,n5,n2,n1;
printf(“Informe valor inteiro:“);
scanf("%d", &valor);
v = valor; // copia, para preservar valor lido
n100 = v/100; // Resultado da divisao inteira por 100
v = v%100; // Resto da divisao inteira por 100
n50 = v/50;
v = v%50;
n20 = v/20;
v = v%20;
n10 = v/10;
v = v%10;
n5 = v/5;
v = v % 5;
n2 = v/2; // Resultado da divisao inteira por 2
n1 = v%2; // Resto da divisao inteira por 2
7 INF 01202 – Marcelo Walter – Aula 04
Resolução do problema
// ... continuação
//quebra 2 linhas e insere caracteres ,00 depois do valor:
printf("\n\nValor lido: R$%d,00\n",valor); // insere vírgula zero zero
printf("notas de 100: %d\n",n100);
printf("notas de 50: %d\n",n50);
printf("notas de 20: %d\n",n20);
printf("notas de 10: %d\n",n10);
printf("notas de 5: %d\n",n5);
printf("notas de 2: %d\n",n2);
printf("notas de 1: %d\n",n1);

return 0;
}

8 INF 01202 – Marcelo Walter – Aula 04


Exercício para próxima aula

ü  John Doe gosta de correr todos os dias. Ele mede o


numero de passos que ele dá no primeiro minuto da
corrida e o numero de passos que ele dá no último
minuto da corrida. John faz então um média dos
passos para os 2 casos e diz que este é o numero
médio de passos para toda a corrida.
ü  Escreva um programa em C que lê o número de
passos do primeiro minuto, o número de passos do
último minuto e o número de horas e minutos total
que John correu. Calcule e apresente a distância
em km que John percorreu neste tempo. Considere
que cada passo de John mede 70cm.

9 INF 01202 – Marcelo Walter – Aula 04


Exemplo de execução

ü  Entre com o nro de passo do primeiro minuto: 10


ü  Entre com o nro de passo do ultimo minuto: 10
ü  Entre com o nro de horas e minutos de corrida: 1 0
ü  Distancia total percorrida 0.42km

10 INF 01202 – Marcelo Walter – Aula 04


NOVO ASSUNTO:
Operadores lógicos ou booleanos

ü  Expressar em programas decisões lógicas


ü  Analogia com situações do dia-a-dia
ü  Exemplo:
Vou à praia se tiver sol E
e tiver dinheiro
Vou visitar meu pai se for dia dos pais ou
OU
final de semana
ü  Hoje tem sol. Vou à praia? NÃO
ü  Hoje é sábado. Visito meu pai? SIM

11 INF 01202 – Marcelo Walter – Aula 04


NOVO ASSUNTO:
Operadores lógicos ou booleanos
Operador Tipo Significado && V F || V F

&& binário E
“e” V V F V V V

|| binário
OU
“ou” F F F F V F

! unário negação
! V F

F V

Em C, o valor das expressões lógicas são:


•  falso, se valor for 0;
•  verdadeiro, se valor for 1 ou outro que não zero.

12 INF 01202 – Marcelo Walter – Aula 04


Novo Assunto:
Operadores Relacionais

Operador Exemplo Comentário

== x == y O conteúdo de x é igual ao de y

!= x != y O conteúdo de x é diferente do de y

<= x <= y O conteúdo de x é menor ou igual ao de y

>= x >= y O conteúdo de x é maior ou igual ao de y

< x < y O conteúdo de x é menor que o de y

> x > y O conteúdo de x é maior que o de y

13 INF 01202 – Marcelo Walter – Aula 04


Operadores Relacionais

A é maior que 10?


(a > 10)
X é negativo?
(x < 0)
y é diferente de 10?
(y != 10)
nota é igual a 5?
(nota == 5)

Cuidado, aqui usamos dois sinais de igualdade consecutivos

14 INF 01202 – Marcelo Walter – Aula 04


A expressão lógica em C
Sintaxe:
  operando operador booleano operando
  ou
operando operador relacional operando

Ø  Retorna um valor lógico:


–  falso: zero
–  verdadeiro: 1 (ou qualquer valor diferente de zero)
Ø  Operandos podem ser expressões aritméticos ou lógicas,
incluindo operadores aritméticos, relacionais e lógicos.
Ø  Exemplos:
(a > b ) || ( c < d )
valor > 10
!(a + c < b)
  (a == b)
  (a==b) && ( a>=c)
  (a != b)
  !((a >= b) || ( a+c))

15 INF 01202 – Marcelo Walter – Aula 04


Expressões lógicas ou relacionais

a) codigo entre 1 e 100 (valores limites considerados):


(codigo > 0 && codigo < 101)

(0 < codigo < 101) // não obedece construção modelo

16 INF 01202 – Marcelo Walter – Aula 04


Precedência de operadores em C
(revista em função dos ops lógicos e relacionais)
Na expressão: (x != 10 || y > 1 && y < 10)
1.  Pela precedência dos operadores, primeiro
serão resolvidos “>” e “ <“:
y > 1 e y < 10
ordem operador 2.  O próximo operador a ser considerado,
pela precedência será “!=“
1o ! funções x != 10
3.  Restam os operadores “&&” e “||”, como
2o * / % “&&” é o de maior prioridade, será o
próximo:
3o + - y < 1 && y < 10
4.  Finalmente o “||” será resolvido.
4o < > <= >= A versão a seguir com parênteses mostra a
ordem de execução da expressão:
5o == !=
( (x != 10) || ( ( y > 1) && (y < 10) ) )
6o && RECOMENDAÇÃO: usar parênteses não só
para alterar a precedência de operadores,
7o || como também para tornar mais claras as
expressões.

17 INF 01202 – Marcelo Walter – Aula 04


Exemplo anterior com valores
x=10, y=1
Y > 1 Y < 10 x != 10 y>1 && y<10 (x != 10) || ( ( y > 1) && (y < 10) )
F V F F F

x=12, y=5

Y > 1 Y < 10 x != 10 y>1 && y<10 (x != 10) || ( ( y > 1) && (y < 10) )

V V V V V

18 INF 01202 – Marcelo Walter – Aula 04


Expressões lógicas ou relacionais

b) contador maior ou igual a máximo ou valor igual a procurado:


( contador >= maximo || valor == procurado )

c) valor igual a 1 ou 2 ou entre 5 e 7 (inclusive):


(valor == 1 || valor == 2 || (valor >=5 && valor <=7))

19 INF 01202 – Marcelo Walter – Aula 04


Seleções

Programa sequencial Programa com seleção condicional

int main()
{

Instrução1;
Instrução2;
?


Instrução n;
}

20 INF 01202 – Marcelo Walter – Aula 04


Comandos de seleção condicional
Aula de Hoje!
ü  Condicional Simples
  if (condição)
  comando;
ü  Seleção Dupla
  if (condição)
  comando;
  else
  comando;
ü  Seleção múltipla
  switch (expressão)
  {
  case valor1: comando;
  ...
  }

21 INF 01202 – Marcelo Walter – Aula 04


Comando condicional simples

C sem ; Linguagem algorítmica


if (expressão lógica) se expressão lógica
comando; comando
com ; !

verdadeira
< expressão lógica >

falsa 1 só
< comando >
comando

22 INF 01202 – Marcelo Walter – Aula 04


Comando condicional simples
Algoritmo:
1. início.
Ex1: Ler um valor inteiro e, no 2. ler valor.
caso de ser menor do que 10, 3. se valor < 10
emitir uma mensagem. 3.1 escrever mensagem
4. fim.
/* Lê valor e informa se maior que 10 */
#include <stdio.h>

int main() // programa principal


{
int val; // declaração da variável informada
printf("Valor inteiro:\n"); // mensagem impressa na tela
scanf("%d", &val); // leitura da informação digitada
if (val < 10)
printf("%d eh menor que 10\n", val); // mensagem

return 0;
} Margens mostram visualmente
a hierarquia de execução
dos comandos de um programa
23 INF 01202 – Marcelo Walter – Aula 04
Expressões lógicas ou relacionais

ü  Erro frequente:


–  utilizar = (atribuição) em expressões condicionais, em
vez do operador relacional == , onde se quer testar a
igualdade entre valores.

24 INF 01202 – Marcelo Walter – Aula 04


Comando condicional: teste de igualdade
Ex1: Ler um valor inteiro e, no caso Algoritmo:
de ser igual a 10, emitir uma 1. início.
mensagem. 2. ler valor.
3. se valor = 10 //C: ==
3.1 escrever mensagem
4. fim.
/* Lê valor e informa se valor lido é 10: erro comum */
#include <stdio.h>

int main() // programa principal


{
int val; // declaração da variável informada
printf("Valor inteiro: "); // mensagem impressa na tela
scanf("%d", &val); // leitura da informação digitada
if (val = 10) // = é atribuição, ≠ 0 é verdadeiro!!!
printf("%d eh igual a 10\n", val); // mensagem

return 0;
}

Qual será a saída na tela para qualquer entrada?

25 INF 01202 – Marcelo Walter – Aula 04


Comando condicional: teste de igualdade
Algoritmo:
Ex1: Ler um valor e, no caso de ser 1. início.
igual a 10, emitir uma mensagem. 2. ler valor.
3. se valor = 10 //C: ==
3.1 escrever mensagem
4. fim.
/* Lê valor e informa se valor lido é 10: erro comum */
#include <stdio.h>

int main() // programa principal


{
int val; // declaração da variável informada
printf("Valor inteiro:\n"); // mensagem impressa na tela
scanf("%d", &val); // leitura da informação digitada: 53
if (val == 10) // == é comparação!!!
printf("%d eh igual a 10\n", val); // mensagem

return 0;
}

26 INF 01202 – Marcelo Walter – Aula 04


Comando condicional: teste de igualdade
Algoritmo:
Ex1: Ler um valor e, no caso de ser 1. início.
igual a 0, emitir uma mensagem. 2. ler valor.
3. se valor = 0 //C: ==
/* Lê valor e informa se valor lido é 10: erro comum 3.1
*/ escrever mensagem
#include <stdio.h> 4. fim.
int main( ) // programa principal
{
int val; // declaração da variável informada
printf("Valor inteiro:\n"); // mensagem impressa na tela
scanf("%d", &val); // leitura da informação digitada
if (val = 0) // = é atribuição, val recebe 0 e 0 é falso!!!
printf("%d eh igual a 0\n", val); // mensagem

return 0;
}

27 INF 01202 – Marcelo Walter – Aula 04


Comando condicional simples
Ex2: Processar uma venda de livros em uma livraria. Obter código do tipo de
livro vendido (A, B, C) e número de unidades, calcular e informar valor a pagar.
Preços: Tipo A: R$ 10,00
Tipo B: R$ 20,00
Tipo C: R$ 30,00
Caso tenham sido vendidos mais de 10 livros, emitir uma mensagem.

Algoritmo UmaVenda
{processa uma venda e avisa caso tenham sido vendidas mais de 10 unidades }
entradas: codigo {do tipo do livro}
nro_livros {vendidos}
saídas: aPagar
mensagem {caso tenham sido vendidas mais de 10 unidades}
1. início
2. ler codigo, nro_livros se codigo = ´A´
3. calcular preço a pagar aPagar ← nro_livros * 10;
4. informar aPagar se codigo = ´B´
5. se nro_livros > 10
5.1 informar “mais de 10 livros vendidos” aPagar ← nro_livros * 20;
6. fim se codigo = ´C’
aPagar ← nro_livros * 30;

28 INF 01202 – Marcelo Walter – Aula 04


Ex2: Processar uma venda de livros em uma livraria.
Obter código do tipo de livro vendido (A, B, C) e número de unidades.
Preços: Tipo A: R$ 10,00
Tipo B: R$ 20,00
Tipo C: R$ 30,00
Calcular e informar preço a pagar. Caso tenham sido vendidos mais de
10 livros, emitir uma mensagem.
Algoritmo UmaVenda
{processa uma venda e avisa caso tenham sido vendidas maisde 10 unidades }
entradas: codigo {do tipo do livro}
nro_livros {vendidos}
saídas: aPagar
mensagem {caso tenham sido vendidas mais de 10 unidades}
1. início
2. ler codigo, nro_livros
3. se codigo = ´A´
3.1 aPagar ← nro_livros * 10;
4. se codigo = ´B´
4.1 aPagar ← nro_livros * 20;
5 se codigo = ´C’
5.1 aPagar ← nro_livros * 30;
6. informar apagar
7. se nro_livros > 10
7.1 informar “mais de 10 livros vendidos”
8. fim
29 INF 01202 – Marcelo Walter – Aula 04
/* Processa uma venda (calcula preço total) e avisa quando mais de 10 unidades
foram vendidas */

#include <stdio.h>

int main() // programa principal


{
char cod;
int nro_livros;
float aPagar;

printf("Digite o codigo do produto e unidades: ");


scanf("%c%d", &cod, &nro_livros); // sem espaco entre tipos. Na leitura
colocar espacos ou enter
if (cod=='a' || cod=='A') aPagar = nro_livros * 10;
if (cod=='b' || cod=='B') aPagar = nro_livros * 20;
if (cod=='c' || cod=='C') aPagar = nro_livros * 30;

printf("O valor a pagar eh: %4.2f\n", aPagar);

if (nro_livros > 10)


printf("Foram vendidades mais de 10 unidades do tipo %c\n", cod);

return 0;
}

30 INF 01202 – Marcelo Walter – Aula 04


Comando: simples / composto

Comando simples

comando;

1 só comando
Comando composto

{
comandos, separados por ponto e vírgula
}

1 bloco (vários comandos)

31 INF 01202 – Marcelo Walter – Aula 04


Comando condicional composto
C Linguagem algorítmica
if ( expressão lógica ) se < expressão lógica >
{
comando 1; < comandoS >
...
comando n;
}

verdadeira
< expressão lógica >

< comando1 >


falsa 1 comando
< comando2 > composto

32 INF 01202 – Marcelo Walter – Aula 04


Para a próxima aula: localização de um ponto no plano

Dados um par de valores x e y, que representam


as coordenadas de um ponto no plano, determinar
a localização do ponto: se em um quadrante, em
um dos eixos ou na origem.

–  Entradas: coordenadas x e y de um ponto.


–  Processamento: testes, verificando onde o par de
valores se enquadra.
–  Saída: mensagem adequada.

33 INF 01202 – Marcelo Walter – Aula 04


Eixo dos Ys
x=0 ey≠0

Quadrante 2 Quadrante 1
x<0ey>0 x>0ey>0
Origem
x=0ey=0
Eixo dos Xs
x≠0 ey=0

Quadrante 3 Quadrante 4
x<0ey<0 x > 0 e y <0

34 INF 01202 – Marcelo Walter – Aula 04


Melhorando o exemplo anterior
das notas de dinheiro
Faça um algoritmo que:
–  leia um valor real, com casas decimais;
–  transforme este valor real em dois valores inteiros correspondentes,
respectivamente, à parte inteira e à parte real do valor lido (se o valor
lido for 123,98, parte_int deve receber 123 e part_frac, 98);
–  calcule o menor número de notas e moedas necessárias para completar
este valor. Lembre que as notas correntes no real são 100,50,20,10,5,
2 e 1 (incluindo aqui também a moeda) e as moedas 50, 25, 10, 5 e 1
centavos

35 INF 01202 – Marcelo Walter – Aula 04


Análise e Definição do Problema

Especificação do Problema: Enunciado

Dado um valor em reais,


calcular e mostrar o mínimo de notas
e moedas equivalentes a este valor.

Objetivo: calcular notas e moedas equivalentes a


valor
Entradas: valor real
Saída: número mínimo de notas e moedas
correspondentes ao valor lido (contadores: valores
inteiros)

36 INF 01202 – Marcelo Walter – Aula 04


Projeto do Algoritmo
Estratégia - obter dois números inteiros a partir de um
numero real:
•  isolar parte inteira
•  isolar parte decimal e transformar em inteira

valor
159 , 81

pint pfrac
159 81

Teremos que tomar cuidado com o cálculo da parte


fracionária, devido à representação interna dos valores
37
fracionários… INF 01202 – Marcelo Walter – Aula 04
// Converte valor real em dois valores inteiros: exemplos de soluções
#include <stdio.h>
#include <math.h> // para uso da função round

int main( )
{
float valor; // variável float
int pint, pdecimal; // parte inteira e parte decimal, convertidas para inteiro

// Extraindo números inteiros de um número decimal:


printf(" *** Conversoes de valores float ***\n ");
printf("Informe o valor a ser convertido:");
scanf("%f",&valor);

pint= (int) valor;

pdecimal=(int)((valor-pint)*100); // cast, para obter parte inteira


printf("parte inteira = %d, parte decimal = %d (aqui, sem o round!!!)\n”, pint,pdecimal);

pdecimal=(int)(round((valor-pint)*100));// função para obter parte inteira


printf("parte inteira = %d, parte decimal = %d (com o round!!!)\n", pint,pdecimal);

return 0;
}

38 INF 01202 – Marcelo Walter – Aula 04


Execução do Programa

Com e sem round, mesmo valor

Com e sem round, valores diferentes. Porque?

39 INF 01202 – Marcelo Walter – Aula 04


Explicação dos valores diferentes

ü  A representação interna em binário dos números


float pode causar erros de arredondamento
ü  A parte fracionária do exemplo anterior (0.85) não
tem representação completamente exata no
número de bits para tipo float
ü  Por isso quando convertemos este valor para
inteiro com o cast obtemos 84
ü  A função round resolve isso pois aproxima para o
próximo maior inteiro

40 INF 01202 – Marcelo Walter – Aula 04


Programa Completo
// Calcula menor número de notas e moedas correspondentes a um valor:
#include <stdio.h>
#include <math.h> // função round

int main( )
{
float valor;
int pint, pdecimal;
int n100, n50,n20,n10,n5,n2,n1; // contadores de notas
int m50,m25, m10 , m05, m01; // contadores de moedas

// Extraindo números inteiros de um número decimal:


printf(" *** Conversoes de valores ***\n");
printf("Informe o valor a ser convertido: R$");
scanf(”%f",&valor);

pint= (int) valor;


pdecimal = (int) (round((valor-pint)*100));

// segue no proximo slide

41 INF 01202 – Marcelo Walter – Aula 04


.....
n100 = pint/100; // resultado da divisão inteira por 100
pint = pint % 100; // resto da divisão inteira por 100
n50 = pint / 50;
pint = pint%50;
n20 = pint/20;
pint = pint%20;
n10 = pint/10; Esta parte igual ao exemplo anterior…
pint = pint%10;
n5 = pint/5;
pint = pint % 5;
n2 = pint/2; // resultado da divisão inteira por 2
n1 = pint%2; // resto da divisão inteira por 2

printf("\n\nValor lido: R$%.2lf\n",valor);


printf(" Notas de 100: %d\n",n100);
printf(" Notas de 50: %d\n",n50);
printf(" Notas de 20: %d\n",n20);
printf(" Notas de 10: %d\n",n10);
printf(" Notas de 5: %d\n",n5);
printf(" Notas de 2: %d\n",n2);
printf(" Notas de 1: %d\n",n1);
.......

42 INF 01202 – Marcelo Walter – Aula 04


.....
m50 = pdecimal/50; // resultado da divisão inteira por 50
pdecimal = pdecimal % 50; // resto da divisão inteira por 50
m25 = pdecimal / 25;
pdecimal = pdecimal% 25;
m10 = pdecimal/10;
pdecimal = pdecimal%10;
m05 = pdecimal/5;
m01 = pdecimal%5;
printf(" Moedas de 50: %d\n",m50);
printf(" Moedas de 25: %d\n",m25);
printf(" Moedas de 10: %d\n",m10);
printf(" Moedas de 5: %d\n",m05);
printf(" Moedas de 1: %d\n",m01);

return 0;
}

43 INF 01202 – Marcelo Walter – Aula 04

Potrebbero piacerti anche