Capítulo 2 Operadores A função scanf() A função scanf() é outra das funções de E/S implementadas em todos os compiladores e nos permite ler dados formatados da entrada padrão (teclado). Sintaxe: scanf( expressão de controle, lista de argumentos); Por enquanto, assuma que a expressão de controle pode conter apenas códigos de formatação, que indica à função que deve ser lido um valor do tipo indicado pelo código. A lista de argumentos deve consistir nos endereços das variáveis que irão armazenar os valores lidos. C possui um operador para tipos básicos chamado operador de endereço e referenciado pelo símbolo & que fornece o endereço do operando. O operador de endereço (&) A memória do seu computador é divida em bytes, e estes bytes são numerados de 0 até o limite de memória de sua máquina. Estes números são chamados de endereços. Um endereço é o nome que o computador usa para identificar a variável. Toda variável ocupa uma certa localização na memória, e seu endereço é o do primeiro byte ocupado por ela. Um inteiro ocupa 2 bytes. Se você declarou a variável n como inteira a atribuiu a ela o valor 2, quando n for referenciada devolverá 2. Entretanto, se você referenciar n precedido de & (&n) devolverá o endereço do primeiro byte onde n está armazenada. O programa seguinte imprime o endereço de n e o valor armazenado em n: int n = 2; printf( Endereco: %u, Valor: %d, n, &n); Um endereço de memória é visto como um número inteiro sem sinal, por isso usamos %u. A tabela abaixo mostra os códigos de formatação da função scanf() código Significado %c caracter simples %d inteiro decimal %e notação científica %f ponto flutuante %o inteiro octal %s cadeia de caracteres %u decimal sem sinal %x hexadecimal %l inteiro longo %lf double Vamos escrever um programa para exemplificar a utilização da função scanf(). O programa também mostra a saída formatada printf(): DCT/UFMS Prof. Marcos Alves 1
printf( Digite um caracter e veja-o em decimal, ); printf( octal e hexadecimal \n ); scanf( %c, &ch); printf( \n %c corresponde a %d em decimal, %o em octal e %x em hexadecimal.\n, ch, ch, ch, ch); As funções getche() e getch() O C oferece funções que lêem um caracter no instante em que é digitado sem esperar [enter]. Essas funções estão definidas na biblioteca conio.h. A função getche() lê o caracter do teclado e o imprime na tela imediatamente. Esta função não aceita argumentos e devolve o caracter lido para a função que a chamou. #include <conio.h> ch = getche(); printf( \n A tecla pressionada foi: %c, ch); A função getch() lê o caracter do teclado mas não imprime o caracter lido na tela. Esta função não aceita argumentos e devolve o caracter lido para a função que a chamou. #include <conio.h> ch = getch(); printf( \n A tecla pressionada foi: %c, ch); As funções getchar() e putchar() A função getchar() está definida na biblioteca stdio.h e lê um caracter do teclado só terminando a leitura quando a tecla [enter] é pressionada. A função putchar(), também definida na biblioteca stdio.h, aceita um argumento cujo valor será impresso na saída padrão (tela). ch = getchar(); putchar(ch); Um argumento de uma função pode ser outra função. Por exemplo, o programa anterior pode ser escrito como: DCT/UFMS Prof. Marcos Alves 2
putchar(getchar()); Operadores Um operador é um símbolo que diz ao compilador para realizar manipulações matemáticas e lógicas específicas. A linguagem C oferece três classes de operadores: aritméticos, relacionais e lógicos e de atribuição. Operador de atribuição Em C, o sinal de igual (=) não tem a mesma interpretação dada em matemática. Representa a atribuição da expressão à direita ao nome da variável à esquerda. Por exemplo: num = 20; Neste exemplo o valor 20 é atribuído a variável num. C aceita várias atribuições numa mesma instrução: num1 = num2 = num3 = 20; Neste exemplo o valor 20 é atribuído as variáveis num1, num2 num3. Operadores aritméticos C oferece 5 operadores aritméticos binários (operam sobre dois operandos) e um operador aritmético unário (opera sobre um operando). operador operação + adição - subtração e menos unário * multiplicação / divisão % resto da divisão inteira Operadores binários: + - / * Representam as operações aritméticas básicas de soma, subtração, divisão e multiplicação respectivamente. Estes operadores podem ser aplicados a qualquer tipo de dado interno permitido pelo C. Exemplo 1: programa que calcula a idade em dias float anos, dias; printf( Informe sua idade em anos: ); scanf( %f, &anos); dias = anos*365; printf( Sua idade em dias e : %.0f \n, dias); DCT/UFMS Prof. Marcos Alves 3
Exemplo 2: programa que converte temperatura Fahrenheit em seus correspondentes graus Celsius. int ftemp, ctemp; printf( Informe a temperatura em graus Fahrenheit: ); scanf( %d, &ftemp); ctemp = (ftemp 32)*5/9; printf( Temperatura em graus Celsius e : %d\n, ctemp); Exemplo 3: programa para adivinhar a soma de 5 números. O usuário digita um número qualquer e o computador informa o resultado da soma dos 5 números dos quais o primeiro o usuário já forneceu. O usuário digita o segundo número e o computador mostra o terceiro. O usuário digita o quarto número e o computador mostra o quinto. int num, aux; printf( Informe um número de ate 4 algarismos: ); scanf( %d, &num); aux = 19998 + num; printf( O resultado da nossa conta sera : %d\n, aux); printf( Informe o segundo número (4 algarismos): ); scanf( %d, &num); printf( O meu numero e : %d\n, 9999-num); printf( Informe o quarto número (4 algarismos): ); scanf( %d, &num); printf( O meu numero e : %d\n, 9999-num); Operador menos unário: - Este operador é utilizado somente para indicar a troca do sinal algébrico do valor. Por exemplo: num = -8; num1 = -num; Depois destas duas instruções, o conteúdo de num1 será 8. Operador módulo: % O operador módulo aceita apenas operandos inteiros. Resulta o resto da divisão do inteiro à sua esquerda pelo inteiro à sua direita. Por exemplo: num = 17%5; Depois desta instrução, o conteúdo de num será 2. Operadores de incremento (++) e decremento (--) A linguagem C permite dois operadores bastante úteis geralmente não encontrados em outras linguagens. São eles os operadores de incremento (++) e decremento (--). O operador de incremento (++) adiciona um ao seu operando, enquanto o operador de decremento (--) subtrai um do seu operando. DCT/UFMS Prof. Marcos Alves 4
Estes operandos trabalham de dois modos. O primeiro modo é chamado pré-fixado e o operador aparece antes do nome da variável. O segundo é o modo pós-fixado em que o operador aparece seguindo o nome da variável. Em ambos os casos, a variável é incrementada (++) ou decrementada (--). Porém quando ++n é usado numa instrução, n é incrementada antes de seu valor ser usado, e quando n++ estiver numa instrução, n é incrementada depois de seu valor ser usado. int n, x; n = 5; x = n++; printf( x=%d n=%d\n, x, n); Quando o programa acima for executado a saída será: x = 5 n = 6. Isto porque o valor de n é atribuído a x e depois n é incrementado de 1. int n, x; n = 5; x = ++n; printf( x=%d n=%d\n, x, n); Quando o programa acima for executado a saída será: x = 6 n = 6. Isto porque o valor de n é incrementado de 1 e depois seu valor é atribuído a x. Quando um desses operadores aparece sozinho numa instrução (como em num++;) não faz diferença o uso do modo pré-fixado ou pós-fixado. Precedência dos operadores aritméticos A tabela abaixo mostra a precedência dos operadores aritméticos; mais alta ++ -- - (unário) * / % mais baixa + - Operadores do mesmo nível de precedência são avaliados pelo compilador da esquerda para a direita. Parênteses podem ser usados para alterar a ordem de avaliação. Os parênteses forçam uma operação, ou conjunto de operações, para o nível mais alto de precedência. Operadores aritméticos de atribuição: +=, -=, *=, /=, %= Cada um destes operadores é usado com uma variável a sua esquerda e uma expressão à sua direita. A operação consiste em atribuir um novo valor à variável que dependerá do operador e da expressão à direita. Se x é uma variável, exp uma expressão e op um operador aritmético (+,-.*,/ ou %), então x op= exp; equivale a x = x op exp; Exemplos: DCT/UFMS Prof. Marcos Alves 5
i += 2; equivale a i = i+2; x *= y+1; equivale a x = x*(y+1); t /= 2.5; equivale a t = t/2.5; p %= 5; equivale a p = p%5; d -= 3; equivale a d = d-3; As expressões com estes operadores são mais compactas e normalmente produzem um código de máquina mais eficiente. int total = 0; int cont = 10; printf( Total: %d\n, total); total += cont; printf( Total: %d\n, total); total *= cont; printf( Total: %d\n, total); Operadores relacionais e lógicos Nos termos operador relacional e lógico, relacional refere-se aos relacionamentos que podem haver entre dois valores e lógico à maneira como esses relacionamentos podem ser conectados. A chave para o conceito de operadores relacionais e lógicos é a idéia de verdadeiro e falso. Em C, verdadeiro é qualquer valor diferente de zero e falso é zero. Expressões que operadores relacionais e lógicos retornarão 0 para falso e 1 para verdadeiro. Operadores relacionais: operador ação > maior que >= maior ou igual que < menor que <= menor ou igual que == igual!= diferente Os operadores relacionais são usados para determinar o relacionamento de uma quantidade com outra. Eles sempre retornam 0 ou 1, dependendo do resultado do teste. O programa seguinte ilustra o uso de cada operação e exibe o resultado de cada uma como 0 ou 1: int i, j; printf( Informe dois numeros: ); scanf( %d%d, &i, &j); printf( %d == %d eh %d\n, i, j, i==j); printf( %d!= %d eh %d\n, i, j, i!=j); printf( %d <= %d eh %d\n, i, j, i<=j); printf( %d >= %d eh %d\n, i, j, i>=j); printf( %d < %d eh %d\n, i, j, i>j); printf( %d < %d eh %d\n, i, j, i<j); DCT/UFMS Prof. Marcos Alves 6
Os operadores relacionais podem ser aplicados a qualquer dos tipos de dados básicos. No próximo capítulo você verá outras aplicações para os operadores relacionais. Operadores lógicos: operador ação && AND (E) OR (OU)! NOT (NÃO) Os operadores lógicos são usados para dar suporte às operações lógicas básicas de AND, OR e NOT, de acordo com a tabela esta verdade. A tabela usa 1 para verdadeiro e 0 para falso. p q p AND q p OR q NOT p 0 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 O próximo programa ilustra a ação dos operadores lógicos: int i, j; printf( Informe dois numeros (cada um sendo 0 ou 1): ); scanf( %d%d, &i, &j); printf( %d AND %d eh %d\n, i, j, i&&j); printf( %d OR %d eh %d\n, i, j, i j); printf( NOT %d eh %d\n, i,!i); Tanto operadores lógicos como os relacionais têm menor precedência que os operadores aritméticos. Isto significa que a expressão 10 > 1+12 é avaliada como 10 > (1+12). A tabela abaixo mostra a precedência relativa dos operadores relacionais e lógicos: mais alta! > >= < <= ==!= && mais baixa Assim como nas expressões aritméticas é possível usar parênteses para alterar a ordem natural de avaliação em uma expressão relacional e/ou lógica. DCT/UFMS Prof. Marcos Alves 7