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

DCC205 - Programação Estruturada

Aula 03 - Expressões aritméticas -


Comandos de entrada e saída

Prof. Msc. Acauan C. Ribeiro


Roteiro

● Revisão
● Expressões aritméticas
● Conversão de tipos
● Exercícios
● Saída de dados
● Entrada de dados

2
Na aula passada
Expressões

Já vimos que constantes e variáveis são expressões.


Uma expressão também pode ser um conjunto de
operações aritméticas, lógicas ou relacionais utilizados
para fazer “cálculos” sobre os valores das variáveis.

Exemplo
a+b
Calcula a soma de a e b

3
Expressões Aritméticas
Os operadores aritméticos são: +,-,*,/
<expressao> + <expressao>: Soma
Ex: a = a + b;
<expressao> - <expressao>: Diferença
Ex: a = a - b;
<expressao> * <expressao>: Produto
Ex: a = a * b;
<expressao> / <expressao>: Divisão
Ex: a = a / b;
<expressao> % <expressao>: Resto da divisão inteira
Ex: a = a % b;
- <expressao>: Inverte o sinal
Ex: a = -b;
4
Criando expressões
● Operadores aritméticas (e todos os demais) juntam
várias expressões.
● Podemos formar expressões complexas
combinando vários operadores
Exemplo: a = -b + 2 + c - (9 + d * 8)

Ordem de avaliação
● Qual o valor da expressão 5 + 10 % 3?
● E da expressão 5 * 10 % 3?

5
Precedência
Precedência define a ordem em que os operadores serão
calculados quando o programa for executado.

Regras de precedência
Em C, os operadores são calculados na seguinte ordem:
1. *, % e /, na ordem em que aparecerem na expressão
2. + e -, na ordem em que aparecerem na expressão

Exemplo: 8 + 10 * 6 vale 68.

6
Alterando a precedência

Parenteses
Para alterar a precedência devemos usar parênteses:
(<expressao>) é uma expressão com o valor da
expressão interna
Exemplo: 5 + 10 % 3 retorna 6, mas (5 + 10) % 3 retorna 0

Regra de paridade:
● número de parênteses ( que abrem deve ser igual
ao número de parênteses ) que fecham expressões

Dica: Devemos usar parênteses sempre que não é claro


qual é a ordem de avaliação de uma expressão.
7
Incremento(++) e Decremento(−−)

Operadores de incremento
Algumas operações muito comuns tem atalhos em C:
● Incremento de variável: somam uma unidade a uma
variável
Exemplo: c++
● Decremento de variável: diminuem uma unidade de
uma variável
Exemplo: c−−

Atenção: Dependendo da posição do operador de


incremento, a expressão retorna um valor antes ou depois
de alterar a variável.
8
Incremento(++) e Decremento(−−)

Para incrementar uma variável antes de retornar o seu valor


colocamos o operador à esquerda:

9
Incremento(++) e Decremento(−−)

Para incrementar uma variável antes de retornar o seu valor


colocamos o operador à esquerda:

Imprime 11

10
Incremento(++) e Decremento(−−)

Para primeiro retornar o valor da variável e depois


incrementar uma variável colocamos o operador à direita:

11
Incremento(++) e Decremento(−−)

Para primeiro retornar o valor da variável e depois


incrementar uma variável colocamos o operador à direita:

Imprime 10

12
Incremento(++) e Decremento(−−)

Em uma expressão, os operadores de incremento e


decremento são sempre calculados antes dos demais
operadores (têm maior precedência)

13
Incremento(++) e Decremento(−−)

Em uma expressão, os operadores de incremento e


decremento são sempre calculados antes dos demais
operadores (têm maior precedência)

Imprime 121
Atenção: Devemos evitar utilizar expressões confusas
como essas.
14
Atribuições simplificadas

Atalhos
Podemos simplificar algumas expressões comuns em C:
● Uma expressão da forma
a = a + b;
● podem ser escritas de maneira equivalente como
a += b;

15
Atribuições simplificadas

16
Conversão de tipos
Expressões não tem somente um valor, mas também tem um tipo
associado.
Se ambos os operandos de uma operação aritmética binária são do
mesmo tipo, o resultado terá o mesmo tipo. Por exemplo:

3 + 5 é 8, e o tipo é int
3.5 + 2.25 é 5.75, e o tipo é float

O único comportamento não óbvio é a da divisão de inteiros:


30 / 5 é 6
31 / 5 é 6
Lembre-se de evitar escrever algo como 1 / 2 * x
29 / 5 é 5 significando .
3/5é0 Você sempre obterá o valor 0 porque 1 / 2 * x é (1 / 2) *
x que é 0 * x que é 0. Para obter o resultado desejado,
você poderia escrever 1.0 / 2.0 * x.

17
Conversão de tipos
Valores podem ser convertidos de um tipo para outro
implicitamente. Em expressões envolvendo operadores binários com
operandos de tipos diferentes, os valores dos operandos são
convertidos para o mesmo tipo antes da operação ser executada:
tipos mais simples são “promovidos” para tipos mais complexos.
Portanto, o resultado da avaliação de uma expressão com operandos
de tipos diferentes será o tipo do operando mais complexo.

Os tipos em C são (do mais simples para o mais complexo):


char < int < long < float < double

O sinal de < significa que o tipo da esquerda é promovido para o tipo


da direita, e o resultado será do tipo mais a direita. Por exemplo:
3.5 + 1 é 4.5
4 * 2.5 é 10.0
18
Conversão de tipos
Esta regra estende-se para expressões envolvendo múltiplos
operadores, mas você deve se lembrar que a precedência e
associatividade dos operadores pode influenciar no
resultado. Vejamos o exemplo abaixo:

int main() {
int a, b;
printf("Entre uma fracao (numerador e denominador): ")
scanf("%d %d", &a, &b);

printf("A fracao em decimal e %f\n", 1.0 * a / b);


}

19
Conversão de tipos
Em atribuições, o valor da expressão do lado direito é convertido
para o tipo da variável do lado esquerdo da atribuição. Isto pode
causar promoção ou “rebaixamento” de tipo. O “rebaixamento” pode
causar perda de precisão ou mesmo resultar em valores errados.
Em operações de atribuição, atribuir um int em um float causará a
conversão apropriada, e atribuir um float em um int causará
truncamento.

Por exemplo:
float a = 3; é equivalente a a = 3.0
int a = 3.1415; é equivalente a a = 3 (truncado)

Basicamente, se o valor da expressão do lado direito da atribuição é


de um tipo que não cabe no tamanho do tipo da variável do lado
esquerdo, resultados errados e não esperados podem ocorrer.
20
Conversão de tipos (CAST)
A linguagem C permite converter um tipo de uma
variável em outro (cast), utilizando parênteses a frente
a ter seu valor convertido. Conversão explícita.

21
Um uso da conversão de tipos
O operador de divisão / possui dois modos:
● Inteiro: se os dois argumentos forem inteiros
Exemplo: a expressão 10 / 3 vale 3.
● Ponto flutuante: se pelo menos um argumento for flutuante
Exemplo: a expressão 1.5 / 3 vale 0.5.

Irá imprimir 3.33333333.


22
Escolha de tipo
Simule o código abaixo e encontre os problemas.

23
Exercício em sala

● Indique a ordem em que são executadas as


operações.

● (pequeno desafio) Existe um problema nesse


programa. Que problema é esse? Quando ele
acontece?
24
Escrevendo na tela
● Podemos imprimir um de texto puro utilizando o
comando printf. O texto pode ser uma constante do tipo
string.

printf("Ola Pessoal!");
Saída: Ola Pessoal!

● No meio da constante string pode haver comandos


especiais. O símbolo especial \n é responsável por pular
uma linha na saída.

printf("Ola Pessoal!
Saída: Ola Pessoal!
Ola Pessoal
25
Escrevendo o conteúdo de uma
variável na tela
● Podemos imprimir também o conteúdo de uma variável
utilizando printf.
● Utilizamos símbolos especiais no texto para representar um
trecho deve substituído por uma variável
● Passamos uma lista de variáveis ou constantes a serem
substituídas, separadas por vírgula.

Nesse caso, %s foi substituído por uma constante do tipo string


enquanto %d foi substituído por uma variável do tipo inteiro.
26
Formatos inteiros
%d - escreve um inteiro na tela

Exemplo:
printf(“%d”, 10);
imprime 10

Exemplo:
int a = 12;
printf(“O valor é %d”, a);
imprime O valor é 12

27
Formatos inteiros
A letra d pode ser substituída pelas letras u e l, ou as
duas, quando desejamos escrever variáveis do tipo
unsigned ou long, respectivamente.

Exemplo:
printf ("%d", 4000000000);
escreve -294967296 na tela, enquanto que
printf ("%u", 4000000000);
escreve 4000000000.

28
Formatos ponto flutuante
%f - escreve um ponto flutuante na tela

Exemplo:
printf(“%f”, 10.0);
imprime 10.000000

29
Formatos ponto flutuante
%e - escreve um ponto flutuante na tela, em notação
científica

Exemplo:
printf(“%e”, 10.02545);
imprime 1.002545e+01

30
Formatos ponto flutuante
A letra f pode ser substituída pelas letras lf, para
escrever um double ao invés de um float

Exemplo
printf ("%6.2lf", 10.0);
imprime <espaço> 10.00

31
Formato caracter
%c - escreve uma letra

Exemplo
printf ("%c", ‘A’);
imprime A

Note que o printf(“%c”, 65) também imprime a letra A

32
Formato string
%s - escreve uma string

Exemplo
printf ("%s", “Meu primeiro programa”);
imprime Meu primeiro programa

33
A função scanf
● Realiza a leitura de um texto a partir do teclado.
● Parâmetros:
○ Uma string, indicando os tipos das variáveis que
serão lidas e o formato dessa leitura.
○ Uma lista de variáveis.
● Aguarda que o usuário digite um valor e atribui o
valor digitado à variável.

34
A função scanf
O programa abaixo é composto de quatro passos:
1. Cria uma variável n;
2. Escreve na tela Digite um número:
3. Lê o valor do número digitado
4. Imprime o valor do número digitado

35
A função scanf

36
Formato de leitura de variável
Os formatos de leitura são muito semelhantes aos
formatos de escrita utilizados pelo printf. A tabela a
seguir mostra alguns formatos possíveis de leitura

37
Um parêntese: Comentários
O código fonte pode conter comentários direcionados
unicamente ao programador. Estes comentários devem
estar delimitados pelos símbolos /* e */, e são ignorados
pelo compilador. Ou // (comentário de uma única linha)

Comentários são úteis para descrever o algoritmo usado e para


explicitar suposições não óbvias sobre a implementação.
38
Possibilidade de erros em um Algoritmo

Erros de Compilação : Erros de digitação e de uso da


sintaxe da linguagem.

Erros de Link-Edição : Erro no uso de bibliotecas de


subprogramas necessárias ao programa principal.

Erros de Execução : Erro na lógica do programa


(algoritmo).

39
Detalhes importantes
● Caso tenha algum erro e você o conserte-o você é
obrigado a compilar o programa novamente para
que este tenha efeito.

● Outra coisa importante, o C (como a maioria das


linguagens atuais) exige que se faça uma listagem
de todas as variáveis do programa previamente.
Ou seja, não existe uso dinâmico de variáveis e
tudo que você usa tem que ser previamente
declarado.

40
A função main()

● Todo programa deve ter uma única função main.


● A função main é o ponto de partida quando o
programa é executado.
● Arquivos auxiliares não devem conter a função
main.

41
Bibliotecas
● Programas que possuem a especificação das
funções pré-definidas da linguagem.
● As bibliotecas que serão usadas devem ser os
primeiros comandos de um programa em C.

#include <nome_da_biblioteca.h>

int main() {
<açoes>
return 0;
}

42
Bibliotecas (alguns exemplos)
● stdio.h: biblioteca de funções de entrada e saída
(leitura e escrita de dados).
● stdlib.h é um arquivo cabeçalho da biblioteca de
propósito geral padrão da linguagem de programação
C. Ela possui funções envolvendo alocação de memória,
controle de processos, conversões e outras.
● math.h: biblioteca de funções matemáticas
(potenciação, raiz quadrada, funções
trigonométricas, etc.).
● string.h: biblioteca de funções para manipulação
de conjunto de caracteres (por exemplo, palavras).

43
Exercícios 3.0 - URI (início)

44