Tipos de Dados, Declaração e tipos de variáveis, Operadores e expressão aritmética e lógica
INF01202
Prof. Lucas Mello Schnorr
1 / 34
O que veremos hoje
I Tipos de dados na declaração de variáveis
I Expressões aritméticas e lógicas
Tipos de dados
Tipos de dados
•
Determina o conteúdo e tamanho de área de memória reservada para o dado.
•
No C, os tipos básicos de dados são:
Tipo Tamanho* Valores Válidos char 1 byte Caracteres do Código
ASCII int 2 ou 4
bytes -2 e31 a 2 e32 float 4 bytes -2 e63 a 2 e64 doubl
e
8 bytes ...
* Varia de acordo com a arquitetura da máquina e o sistema operacional
Cortesia: Prof. Mara Abel
Melhor jeito de se saber o tamanho é com o comando sizeof
3 / 34
Vejamos um exemplo com sizeof
/* Programa que fornece o tamanho do tipo */
#include <stdio.h>
int main ()
{ printf ("char = %d\n", sizeof(char));
printf ("int = %d\n", sizeof(int));
printf ("long int = %d\n", sizeof(long int));
printf ("float = %d\n", sizeof(float));
printf ("double = %d\n", sizeof(double));
return 0;
}
A implementação destes tipos:
I inteiros, do menor ao maior valor inteiro que cabe no tamanho I ponto-utuante (float, double), veja a norma IEEE 754, em pt-br
https://pt.wikipedia.org/wiki/IEEE_754
I Tabela ASCII para o tipo char
Tabela ASCII
5 / 34
Presença do tipo na declaração de variáveis
Declaração de variáveis
Sintaxe:
<tipo> <nome_da_variavel>;
14
declaração das variáveis / conteúdos usadas no programa;
nomes: letra inicial + letras, dígitos ou _ (até 32) – minúsculas!
tipos principais:
int /inteiro
float /decimal, precisão simples double /decimal, precisão dupla char / 1 único caractere
exemplos:
int n;
int quantidade_valores;
float x, y, somavalores;
char sexo;
Cortesia: Prof. Mara Abel
Inicialização de variáveis na declaração
Declaração de Variável Inicializada
20
//testando inicializacao de constante
#include <stdio.h>
#define LIMITE 30 // LIMITE não pode ser alterado no programa int main ( )
{
int v = 3; // v é variável - pode ter o valor alterado ...
v = 7;
...
}
Ex: <tipo> <nome variável> = <valor>
int v = 3;
int v ;
//mais adiante no programa v = 3;
Idêntico a
Cortesia: Prof. Mara Abel 7 / 34
Vejamos um exemplo
/* Programa para realizar testes de inicializacao de variaveis na declaracao */
#include <stdio.h>
int main () { int v = 3;
printf ("O valor da variavel v eh %d.\n", v);
return 0;
}
gcc exemplo-inicializacao-variaveis.c -o exemplo-inicializacao-variaveis ./exemplo-inicializacao-variaveis
Caso não seja inicializada, a variável tem qual valor?
Tipos no scanf
Entrada formatada de dados:
função scanf
Exemplos:
int i, j;
float x;
char c;
scanf("
%d", &i);
scanf("
%d %f", &j, &x);
scanf("
%c", &c);
15
%d 1 número inteiro in base 10
%i mesmo que %d, mas detecta que base é, hexadecimal ou decimal
%f 1 número float
%lf 1 número double
%c 1 caractere char scanf ("formatos", &var1, &var2,...);
Sintaxe:
Espaço em branco : importante para limpar
o buffer de entrada
%d assume base 10 while %i auto detects the base.
Cortesia: Prof. Mara Abel
9 / 34
Tipos no printf
Saída formatada de dados: função printf
Exemplos:
int i, j;
float x;
char c;
printf(“Resultados: i=%d \n j=%d \ n“,i,j);
printf("%d", i);
printf("%d, %f", j, x);
printf("%c", c);
\ Função
\b BackSpace
\n New Line (mudança de Linha)
\t Tabulação Horizontal
\v Tabulação Vertical
\\ imprime o próprio caractere \
\' imprime o caractere '
\" imprime o caractere "
\? imprime o caractere ?
%c char
%d inteiro
%i inteiro
%f float ou double com notação comum
%e float ou double com notação científica
%g dependendo do conteúdo, usa %f ou
%e printf ("formatos", var1, var2,...);
Sintaxe:
Cortesia: Prof. Mara Abel
Contantes do pré-processador
Sintaxe:
#define < identificador em maiúsculas> <valor inicial>
Constantes
• Valores ou locais identificados onde os dados armazenados nunca se alteram durante a execução de um programa.
• Identificador será substituído em tempo de compilação pelo valor indicado;
• São declaradas e instanciadas na linha seguinte à declaração das bibliotecas (após as definições #include)
• Entre identificador e valor nada além de espaços deve ser colocado
• Identificadores de constantes devem utilizar apenas letras maiúsculas!
Cortesia: Prof. Mara Abel 11 / 34
Vejamos exemplos de constantes
19 //testando
#include <stdio.h>
#define QUANTIDADE 30 int main ( )
{ int x ;
x = x + QUANTIDADE ; ...
}
Ex:
QUANTIDADE = 7;
scanf(“%d”,& QUANTIDADE )
printf(“%d”, QUANTIDADE );
indice = QUANTIDADE ;
Constantes
#define PI 3.1416 // valor do pi, real #define INT5 5 // valor 5, inteiro
Cortesia: Prof. Mara Abel
O comando de atribuição =
Comando (operador) de atribuição
•
Atribui o valor da direita à variável da esquerda
•
O valor pode ser uma constante, uma variável ou uma expressão
•
Exemplos
x = 4; // significa que a variável X recebe conteúdo 4
y = x + 2;
y = y + 4;
valor = 2.5; //casa decimal indicada pelo ponto sexo = 'F’; /*atribuição de 1 único caractere para uma
variável char é entre apóstrofos*/
17
Sintaxe:
identificador = expressão;
Cortesia: Prof. Mara Abel
Do lado direito da atribuição, temos uma expressão.
13 / 34
Expressões aritméticas
Expressões Aritmé?cas
• Operando: corresponde a um valor constante, de uma variável, resultante de uma função aritmé?ca ou de outra expressão.
• Operador: aritmé?co.
Sintaxe:
operando operador operando
18 INF01202 - Marcelo Walter - Aula 03
Cortesia: Prof. Marcelo Walter
Operadores aritméticos sem utilizar bibliotecas externas
Operadores Aritméticos
(sem biblioteca)Resto da divisão inteira de x por y (requer operandos inteiros) x % y
%
Divide x por y (se operandos inteiros, executa divisão inteira, senão float) x / y
/
Multiplica x e y
*
Subtrai y de x x – y
-
Soma x e y x + y
+
Comentário Exemplo
Operador
x * y
21 INF01202 - Prof. Edison- Aula 03
Cortesia: Prof. Edison Pignaton de Freitas
Todos estes operadores fazem parte da linguagem C.
15 / 34
Exemplo do uso de operadores aritméticos
/* Programa para ilustrar funcionamento dos operadores aritmeticos */
#include <stdio.h>
int main ()
{ int val_1, val_2;
int divisao, resto;
val_1 = 13;
val_2 = 5;
divisao = val_1 / val_2;
resto = val_1 % val_2;
printf("Divisao inteira = %d Resto = %d\n", divisao, resto);
return 0;
}
gcc exemplo-operadores-aritmeticos.c -o exemplo-operadores-aritmeticos ./exemplo-operadores-aritmeticos
Divisão inteira = 2 Resto = 3
O resto da divisão inteira é útil sim
Resto da Divisão Inteira
• O resto da divisão inteira é útil em várias situações
• Vamos supor o cálculo do número de botes salva- vidas necessários num transatlântico
• Vamos supor 950 passageiros e tripulantes. Quantos botes de 23 lugares são necessários? E botes com 25 lugares?
INF01202 - Prof. Edison- Aula 03 23
Se o resto da divisão não der zero, significa que precisamos mais um bote que irá ser parcialmente utilizado
Cortesia: Prof. Edison Pignaton de Freitas 17 / 34
Vejamos
Com botes de 23 lugares
int passageiros = 950;
int lugares_no_bote = 23;
printf("%d %d\n",
passageiros / lugares_no_bote, passageiros % lugares_no_bote);
41 7
Com botes de 25 lugares
int passageiros = 950;
int lugares_no_bote = 25;
printf("%d %d\n",
passageiros / lugares_no_bote, passageiros % lugares_no_bote);
38 0
Funções matemáticas mais complexas com math.h
Slide 6 INF 01202
Algumas Funções Matemáticas
(#include <math.h>)Tangente de x tan(x)
tan
Raiz quadrada de x sqrt(x)
sqrt
Seno de x sin(x)
sin
Calcula x elevado à potência y pow(x,y)
pow
Logaritmo decimal de x log10(x)
log10
Logaritmo natural de x log(x)
log
Arredonda o número real para baixo: floor(3.2) é 3 floor(x)
floor
Valor absoluto de x fabs(x)
fabs
e elevado à potencia x exp(x)
exp
Cosseno de x (x em radianos) cos(x)
cos
Arredonda o número real para cima: ceil(3.2) é 4 ceil(x)
ceil
Comentário Exemplo
Função
Cortesia: Prof. Claudio Jung
19 / 34
Exemplo de operações matemáticas
/* Programa para ilustrar funcionamento de algumas operacoes aritmeticas mais complexas. */
#include <stdio.h>
#include <math.h>
int main(void) { float val_1;
printf("Entre com valor float: ");
scanf("%f", &val_1);
printf("Valor fornecido como entrada: [%f]\n", val_1);
printf("Resultado do ceil : [%f]\n", ceil(val_1));
printf("Resultado do floor : [%f]\n", floor(val_1));
printf("Resultado do round : [%f]\n", round(val_1));
return 0;
}
gcc exemplo-com-biblioteca-math.c -o exemplo-com-biblioteca-math -lm ./exemplo-com-biblioteca-math
Outras saídas possíveis do exemplo
Execução
INF01202 - Prof. Edison- Aula 03 26
Cortesia: Prof. Edison Pignaton de Freitas 21 / 34
Precedência e associatividade de operadores em C
Precedência de operadores em C
ordem operador
1o funções
2o * / %
3o + -
val_final = val1 * val2 + 5;
val_final = val1 * (val2 + 5);
Podemos usar parêntesis para modificar a precedência
Cortesia: Prof. Marcelo Walter
Qual é a associatividade de operadores?
Exemplo ilustrativo: a + b + c
Equivalência entre álgebra e C
Slide 11 INF 01202
Equivalência de expressões aritméticas em C
Expressão
algébrica Expressão em C Interpretação a+ b + c + d
4 (a+b+c+d) / 4 Necessidade de parênteses, para que a soma dos 4 valores ocorra antes da divisão. Se não usados, d será dividido (/) por 4 antes de somado com a e b.
b
4ad b / (4 * a * d) Tome cuidado para não esquecer os parêntesis no denominador. Um erro comum é fazer b / 4 * a * d.
(a + b) 2 ( a + b ) * ( a + b ) pow(a+b,2)ou
Não existe operador potência: multiplica 2 vezes ou usa função pow (biblioteca
<math.h>).
1 + c
a – b (1 + c) / (a – b) Observar a necessidade dos parênteses.
4r 3 4 * 3.1416 * (r*r*r) 4*3.1416 * ou
pow(r,3)
é um caractere grego, sem significado para C++ padrão.
Cortesia: Prof. Claudio Jung 23 / 34
Relação entre tipos e expressoes aritméticas
Vejams um exemplo representativo
/* Exemplo para ilustrar um problema com expressoes aritmeticas */
#include<stdio.h>
int main() { float num_real;
int x=1, y=2, z=1;
num_real = x/2 + y/2 + z/2;
printf("Resultado: [%f]\n", num_real);
return 0;
}
Qual é o resultado?
gcc exemplo-tipos-expressoes-aritmeticas.c -o exemplo-tipos-expressoes-aritmeticas ./exemplo-tipos-expressoes-aritmeticas
Resultado: [1.000000]
Relação entre tipos e expressoes aritméticas
Vejams um exemplo representativo
/* Exemplo para ilustrar um problema com expressoes aritmeticas */
#include<stdio.h>
int main() { float num_real;
int x=1, y=2, z=1;
num_real = x/2 + y/2 + z/2;
printf("Resultado: [%f]\n", num_real);
return 0;
}
Qual é o resultado?
gcc exemplo-tipos-expressoes-aritmeticas.c -o exemplo-tipos-expressoes-aritmeticas ./exemplo-tipos-expressoes-aritmeticas
Resultado: [1.000000]
24 / 34
Constatação: resultados parciais são do tipo inteiro
Modeladores - casts
• Altera o ?po 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;
Sintaxe: (tipo) expressão
int int int
int int
int
int int int
float 0 + 1 + 0 ↔ 1.0
26 INF01202 - Marcelo Walter - Aula 03
Cortesia: Prof. Marcelo Walter
Modeladores (casts) para explicitamente trocar o tipo
/* Exemplo para ilustrar um problema com expressoes aritmeticas */
#include <stdio.h>
int main()
{ float num_real_0, num_real_1, num_real_2, num_real_3; // variaveis reais int x=1, y=2, z=1; // valores inteiros inicializados na declaracao
num_real_0 = x/2 + y/2 + z/2;
num_real_1 = (float)x/2 + y/2 + z/2;
num_real_2 = (float)x/2 + (float)y/2 + z/2;
num_real_3 = (float)x/2 + (float)y/2 + (float)z/2;
printf("Resultados -> "
"C0: [%f] "
"C1: [%f] "
"C2: [%f] "
"C3: [%f]\n", num_real_0, num_real_1, num_real_2, num_real_3);
return 0;
}
gcc exemplo-tipos-expressoes-aritmeticas-cast.c -o exemplo-tipos-expressoes-aritmeticas-cast ./exemplo-tipos-expressoes-aritmeticas-cast
Resultados -> C0: [1.000000] C1: [1.500000] C2: [1.500000] C3: [2.000000]
26 / 34
Modeladores (casts) para explicitamente trocar o tipo
/* Exemplo para ilustrar um problema com expressoes aritmeticas */
#include <stdio.h>
int main()
{ float num_real_0, num_real_1, num_real_2, num_real_3; // variaveis reais int x=1, y=2, z=1; // valores inteiros inicializados na declaracao
num_real_0 = x/2 + y/2 + z/2;
num_real_1 = (float)x/2 + y/2 + z/2;
num_real_2 = (float)x/2 + (float)y/2 + z/2;
num_real_3 = (float)x/2 + (float)y/2 + (float)z/2;
printf("Resultados -> "
"C0: [%f] "
"C1: [%f] "
"C2: [%f] "
"C3: [%f]\n", num_real_0, num_real_1, num_real_2, num_real_3);
return 0;
}
gcc exemplo-tipos-expressoes-aritmeticas-cast.c -o exemplo-tipos-expressoes-aritmeticas-cast ./exemplo-tipos-expressoes-aritmeticas-cast
Resultados -> C0: [1.000000] C1: [1.500000] C2: [1.500000] C3: [2.000000]
Operadores de Atribuição (atalhos)
Slide 10 INF 01202
Operadores de Atribuição (atalhos)
Operado
r Exempl
o Comentário
= x = y Atribui o valor de y a x
++ x++ x = x + 1
-- x-- x = x – 1
+= x += y x = x + y -= x -= y x = x – y
*= x *= y x = x * y /= x /= y x = x / y
%= x %= y x = x % y
Cortesia: Prof. Claudio Jung 27 / 34
Exercício
Slide 16 INF 01202
Exercícios
2) 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. Podemos implementar o mesmo algorimo para ele tratando-o como um inteiro.
Cortesia: Prof. Claudio Jung
Análise e Denição do Problema
Slide 17 INF 01202
Dada uma quantia (inteira) em reais, calcular e mostrar o número de cédulas de cada nota
(R$ 100, 50, 20, 10, 5 , 2 ou 1)
que totalizem este valor, gerando o menor número possível de notas no total
Especificação do Problema: Enunciado
Objetivo: determinar tipos de notas e suas quantidades
Entradas: valor inteiro
Saída: quantidade de cada nota que totalize o valor inicial
Análise e Definição do Problema
Cortesia: Prof. Claudio Jung 29 / 34
Algoritmo
Slide 18 INF 01202
Algoritmo
algoritmo calculanotas;
/* calcula o nro mínimo de notas cujo valor total seja igual a um valor dado
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 div 100 // quociente da divisao inteira entre v e 100 5. v = v mod 100 // resto da divisao inteira entre v e 100 6. n50 = v div 50
7. v = v mod 50 8. n20 = v div 20 9. v = v mod 20 10. n10 = v div 10 11. v = v mod 10 12. n5 = v div 5 13. v = v mod 5 14. n2 = v div 2
15. n1 = v mod 2 // recebe resto da div inteira por 2: já está pronto 16. ... //informa notas calculadas...
Cortesia: Prof. Claudio Jung
Programa (página 1)
Slide 19 INF 01202
Resolução do problema
/* Calcula quantidade de cada cédula (ou moeda) tal que a soma dos valores totalize um valor inteiro dado.
Entrada: valor inteiro
Saida: quandidade de cedulas/moedas de 100, 50, 20, 10, 5, 2 e 1 reais */
#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 DIVISÃO INTEIRA POR 100 v = v%100; // RESTO DA DIVISÃO 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 DIVISÃO INTEIRA POR 2 n1 = v%2; // RESTO DA DIVISÃO INTEIRA POR 2
Cortesia: Prof. Claudio Jung 31 / 34
Programa (página 2)
Slide 20 INF 01202
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;
}
Cortesia: Prof. Claudio Jung
Testes
/* Calcula quantidade de cada cédula (ou moeda) tal que a soma dos valores totalize um valor inteiro dado.
Entrada: valor inteiro
Saida: quandidade de cedulas/moedas de 100, 50, 20, 10, 5, 2 e 1 reais */
#include <stdio.h>
intmain( )
{intvalor, v;//valores inteiros lido e usado nos cálculos intn100, 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 DIVISÃO INTEIRA POR 100 v=v%100; // RESTO DA DIVISÃO 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 DIVISÃO INTEIRA POR 2 n1=v%2; // RESTO DA DIVISÃO INTEIRA POR 2
//quebra 2 linhas e insere caracteres ,00 depois do valor:
printf("\n\nValor lido: R$%d,00\n",valor);// insere vírgula 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);
return0;
}
33 / 34
Exercício para casa
Slide 22 INF 01202
Exercício para a próxima aula!
3) Faça um algoritmo que:
leia um valor real, com casas decimais;
tranforme este valor real em dois valores inteiros correspondentes, respectivamente, à parte inteira e à parte decimal (centavos) do valor lido (se o valor lido for 123,98, parte_inteira deve receber 123 e parte_decimal deve receber 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.
implemente em C um programa que corresponda ao
Cortesia: Prof. Claudio Jung