Baixe o app para aproveitar ainda mais
Prévia do material em texto
TÉCNICAS DE PROGRAMAÇÃO 1 INTRODUÇÃO À LINGUAGEM C- VARIÁVEIS E EXPRESSÕES Prof Geiza Maria Hamazaki da Silva 2013.1 Resumo Ao desenvolver um algoritmo são utilizadas variáveis para armazenar uma informação ou para realizar operações lógicos e aritméticas. Este raciocínio é o mesmo aplicado nos programas utilizando a Linguagem C. Neste conjunto de slides será apresentado como é realizado o armazenamento de uma variável em memória, quais são os tipos os básicos de variáveis, além de sua utilização em expressões lógicas e aritméticas. Exemplo apresentado na aula de algoritmos Enunciado Soma de dois números inteiros Esboço do algoritmo Leitura dos dados Soma dos valores lidos Saída do resultado Algoritmo Soma de dois números inteiros variáveis a,b,c: inteiro; início leia(a,b); c a+b; imprima(c); fim. Leitura dos dados Algoritmo Soma de dois números inteiros variáveis a,b,c: inteiro; início leia(a,b); c a+b; imprima(c); fim. Soma dos valores lidos Algoritmo Soma de dois números inteiros variáveis a,b,c: inteiro; início leia(a,b); c a+b; imprima(c); fim. Saída do Resultado Bits, Bytes e Palavras As variáveis são utilizadas para armazenar informações em memória. Desta forma, é essencial saber como funciona a organização das unidades de memória. Bit -> menor unidade armazena 0 ou 1 Byte: sequencia de 8 bits Palavra: sequencia de bytes número de bytes da palavra varia conforme a arquitetura do computador. Em computadores de 64 bits uma palavra terá 8 bytes e em um de 32 bits uma palavra terá 4 bytes. Variáveis Tipos básicos das variáveis na Linguagem C e intervalo de valores que podem armazenar: Tipo Tamanho Menor valor Maior valor char 1 byte -128 +127 unsigned char 1 byte 0 +255 short int (short) 2 bytes -32.768 +32.767 unsigned short int 2 bytes 0 +65.535 int (*) 4 bytes -2.147.483.648 +2.147.483.647 long int (long) 4 bytes -2.147.483.648 +2.147.483.647 unsigned long int 4 bytes 0 +4.294.967.295 float 4 bytes -1038 +1038 double 8 bytes -10308 +10308 (*) depende da máquina, sendo 4 bytes para arquiteturas de 32 bits Variáveis Uma variável em qualquer linguagem de programação faz referência a um espaço de memória para armazenar um dado (valor). Deve-se reservar o espaço correspondente ao tipo do dado (char, int, float, etc..) a ser armazenado. Uma variável é definida por um tipo e um nome: nome: identifica o espaço de memória; e tipo: determina a natureza do dado, reservando o espaço de memória necessário. Declaração de Variáveis Variáveis devem ser explicitamente declaradas; Pode-se declarar um variável como vez ou em conjunto. Exemplos: int a; /* declaração de uma variável do tipo int */ int b; /* declaração de uma variável do tipo int */ float c; /* declaração de uma variável do tipo float */ int d, e; /* declaração de duas variáveis do tipo int */ Declaração de Variáveis Variáveis só armazenam valores do mesmo tipo que foram declaradas. int a; /* declara uma variável do tipo inteiro */ a = 4.3; /* a armazenará o valor 4, parte inteira do número real 4.3*/ Declaração de Variáveis Questão 1: Suponha que: a = 3 b = a / 2 c = b + 3.1 Qual é o valor de c? c = 4.6 c = 4.1 c = 4 Nenhuma das opções acima Não é possível determinar o valor de c Declaração de Variáveis Questão 1: Suponha que: a = 3 b = a / 2 c = b + 3.1 Qual é o valor de c? c = 4.6 c = 4.1 c = 4 Nenhuma das opções acima Não é possível determinar o valor de c Não é possível determinar o valor de c, visto que os tipos não foram definidos. Dependendo dos tipos das variáveis a e b a variável c poderá ter um valor diferente. Declaração de Variáveis Na Linguagem C, as variáveis podem ser inicializadas na declaração. Por exemplo: int a = 5, b = 10; /* declara e inicializa as variáveis */ float c = 5.3; Nomes de identificadores Na Linguagem C, os nomes de variáveis e vários outros itens definidos pelo usuário são chamados de identificadores. Esses identificadores podem variar de um a diversos caracteres. Regras para definição de um identificador: O primeiro caractere deve ser uma letra ou um sublinhado; Os caracteres subsequentes podem ser letras, números ou sublinhados (_); e Os identificadores não podem conter espaços. Nomes de identificadores Na linguagem C, letras minúscula e maiúscula são tratadas diferentemente A linguagem é “case sensitive” idade, Idade e IDADE Os identificadores acima são distintos. Um identificador não pode ser igual a uma palavra chave da linguagem C (ou palavra reservada, por exempo: if, while, for,..) ou ter o mesmo nome que as funções escritas pelo programador ou as que estão na biblioteca da linguagem( printf, main ,...). Nomes de identificadores Nomes de identificadores válidos podem ser, por exemplo: x J23qrsnf minhaIdade Declaração de Variáveis Bons nomes de variáveis dizem para que serve a variável a utilização de bons nomes facilita o entendimento do fluxo do seu programa Declaração de Variáveis - exemplo O que faz este código? int main(){ unsigned short x; unsigned short y; unsigned short z; x = 5; y = 10; z = x * y; return 0; } Declaração de Variáveis - exemplo O que faz este código? int main(){ unsigned short largura; unsigned short comprimento; unsigned short area; largura = 5; comprimento = 10; area = largura * comprimento; return 0; } Declaração de Variáveis - exemplo O que faz este código? int main(){ unsigned short largura; unsigned short comprimento; unsigned short area; largura = 5; comprimento = 10; area = largura * comprimento; return 0; } O propósito do programa acima é mais fácil de ser decifrado dado os nomes das variáveis. Declaração de Variáveis Boas práticas de programação: Escolher identificadores significativos ajuda a fazer um programa autodocumentado. Por exemplo, minhaIdade. Restrinja o uso de nomes de uma letra só (como por exemplo x ou i) à variáveis que são utilizadas brevemente. Evite identificadores que iniciem com sublinhados e sublinhadosduplos, pois os compiladores podem utilizar nomes assim internamente para seus próprios propósitos. Declaração de Variáveis Não importa o método adotado para dar nomes as variáveis. O importante é ser consistente! Exemplo de convenções populares: muitos programadores usam letras minúsculas meu_carro ou meuCarro Variáveis com valores indefinidos Uma variável deve ter um valor definido quando for utilizada. int a, b, c; /* declara e inicializa duas variáveis do tipo int */ a = 2; c = a + b; /* ERRO: b contém “lixo” */ Variáveis com valores indefinidos Uma variável pode receber um valor quando é definida (inicializada), ou através de um operador de atribuição. int a = 5, b = 10; /* declara e inicializa duas variáveis do tipo int */ float c = 5.3; /* declara e inicializa uma variável do tipo float */ Valores Constantes A diferença básica entre variáveis e constantes: o valor armazenado numa constante não pode ser alterado. Exemplos de constantes: 3, 4.5, ‘a’. Constantes em C podem ser de qualquer um dos tipos de dados básicos (e seus modificadores). A maneira como cada constante é representada depende do seu tipo. Constantes do tipo caractere são envolvidas por aspas simples: ‘a’, ‘B’, ‘:’, ‘+’, ‘\n’, ‘\0’, ‘\” ’, ‘\\’, ‘\’ ’ Operadores Aritméticos; Relacionais e Lógicos; Atribuição; incremento e decremento; e Outros. Operadores Aritméticos Operadores aritméticos: +: soma; - : subtração; * : multiplicação; / : divisão; % : modulo – retorna o resto da divisão. Operadores Aritméticos Operadores aritméticos ( + , - , * , / , % ): A operação é feita na precisão dos operandos a expressão 5/2 resulta no valor 2, pois a operação de divisão é feita em precisão inteira, já que os dois operandos (5 e 2) são constantes inteiras. a divisão de inteiros trunca a parte fracionária, pois o valor resultante é sempre do mesmo tipo da expressão. a expressão 5.0/2.0 resulta no valor real 2.5 pois a operação é feita na precisão real (double, no caso). Operadores Aritméticos O operando com tipo de menor expressividade é convertido para o tipo do operando de maior expressividade. No exemplo abaixo a parte fracionária é truncada. int a double b, c; a = 3.5; /* a recebe o valor 3 */ b = a / 2.0; /* b recebe o valor 1.5 */ c = 1/3 + b; /* 1/3 retorna 0 pois a operação será sobre inteiros */ /* c recebe o valor de b */ Operadores Aritméticos o operador módulo, “%”, aplica-se a inteiros . Exemplo : Deseja-se saber se o valor armazenado numa determinada variável inteira x é par ou ímpar Basta analisar o resultado da aplicação do operador %, aplicado à variável e ao valor dois x % 2 se resultado for zero, o número é par x % 2 se resultado for um, o número é ímpar precedência dos operadores: * , / , - , + a + b * c / d é equivalente a (a + ((b * c) / d)) Operadores de atribuição A forma geral do operador de atribuição é variável = expressão; onde expressão pode ser tão simples como uma única constante ou tão complexa quanto você necessite; e a parte esquerda da atribuição deve ser uma variável ou ponteiro, mas não uma função ou uma constante. Operadores de atribuição Na linguagem C, uma atribuição é uma expressão cujo valor resultante corresponde ao valor atribuído. A atribuição: a = 5; /*armazena o valor 5 na variável a*/ A ordem de avaliação é da direita para a esquerda: y = x = 5; o computador avalia x = 5, armazenando 5 em x, e em seguida armazena em y o valor produzido por x = 5, que é 5 Portanto, ambos, x e y, recebem o valor 5. Operadores de atribuição C oferece uma notação compacta para atribuições em que a mesma variável aparece dos dois lados var op= expr é equivalente a var = var op (expr) Operadores de atribuição de forma compacta: += , -= , *= , /= , %= i += 2; equivalente a i = i + 2; x *= y + 1; é equivalente a x = x * (y +1) que equivale a x= x*y +1 Operadores de atribuição Exemplos int a, b, c; a = 2; b = 3; c = 41; a += 5; b *= 3; c %= a+b; Qual o valor de a, b e c? Operadores de atribuição Exemplos int a, b, c; a = 2; b = 3; c = 41; a += 5; b *= 3; c %= a+b; Qual o valor de a, b e c? Resultado: a:7 b:9 c:9 Operadores de incremento e decremento Operadores de incremento e decremento ( ++ , -- ): incrementa ou decrementa de uma unidade o valor de uma variável os operadores não se aplicam a expressões; o incremento pode ser antes ou depois da variável ser utilizada: n++ incrementa n de uma unidade, depois de ser usado; e ++n incrementa n de uma unidade, antes de ser usado. Cuidado: Formas compactas dificulta a compreensão do código!! n = 5; x = n++; /* x recebe 5; n é incrementada para 6 */ x = ++n; /* n é incrementada para 7; x recebe 7*/ a = 3; b = a++ * 2; / b termina com o valor 6 e a com o valor 4 */ Operadores de incremento e decremento Se n armazena o valor 5,então x = n++; atribui 5 à x, mas: x = ++n; atribuiria 6 à x. Em ambos os casos, n passa a valer 6, pois seu valor foi incrementado em uma unidade Os operadores de incremento e decremento podem ser aplicados somente em variáveis Uma expressão do tipo x = (i + 1)++ é ilegal 777++ é ilegal /* constante não pode ser incrementada */ Operadores de incremento e decremento Exemplo int i, a, b, c, d, e; i = 0; a = i; b = i++ - 5; c = i; d = ++i + 5; e = i; Qual o valor de a,b,c,d,e? Operadores de incremento e decremento Exemplo int i, a, b, c, d, e; i = 0; a = i; b = i++ - 5; c = i; d = ++i + 5; e = i; Qual o valor de a,b,c,d,e? resultado: a:0 b:-5 c:1 d:7 e:2 As expressões ++a e a++ isoladas equivalem ao comando a = a+1 os efeitos do operador -- nas expressões --a e a-- e sua equivalência com o comando a = a - 1 são análogos Tabela da hierarquia dos operadores Precedência em ordem decrescente Parênteses podem ser usados para alterar a ordem de avaliação. Operadores Classe Associatividade - + ++ -- unários direita para esquerda * / % multiplicativos esquerda para direita + - aditivos esquerda para direita = += -= *= /= de atribuição direita para esquerda Exercício:Avaliação de expressões Declarações e inicializações int a = 1, b = 2, c = 3, d = 4; Expressão Expressão equivalente Valor a * b /c a * b % c + 1 ++ a * b - c -- 7 - - b * ++ d Exercício:Avaliação de expressões Declarações e inicializações int a = 1, b = 2, c = 3, d = 4; Expressão Expressão equivalente Valor a * b /c (a * b) /c a * b % c + 1 ((a * b) % c) + 1 ++ a * b - c -- ((++a)* b)-(c--) 7 - - b * ++ d 7 - ((-b)*(++d)) Exercício:Avaliação de expressões Declarações e inicializações int a = 1, b = 2, c = 3, d = 4; Expressão Expressão equivalente Valor a * b /c (a * b) /c 0 a * b % c + 1 ((a * b) % c) + 1 3 ++ a * b - c -- ((++a)* b)-(c--) 1 7 - - b * ++ d 7 - ((-b)*(++d)) 17 Exercício:Avaliação de expressões Declarações e inicializações int i = 1, j = 2, k = 3, m = 4; Expressão Expressão equivalente Valor i += j + k j *= k = m + 5 Avaliação de expressões Declarações e inicializações int i = 1, j = 2, k = 3, m = 4; Expressão Expressão equivalente Valor i += j + k i += (j+k) j *= k = m + 5 j *= (k = (m + 5)) Avaliação de expressões Declarações e inicializações int i = 1, j = 2, k = 3, m = 4; Expressão Expressão equivalente Valor i += j + k i += (j+k) 6 j *= k = m + 5 j *= (k = (m + 5)) 18 Operadores e Expressões Operadores relacionais (< , <= , == , >= , > , !=): < menor que > maior que <= menor ou igual que >= maior ou igual que == igual a != diferente de Operadores e Expressões O resultado da avaliação da expressão será 0(falso) ou 1(verdadeiro) - não há valores booleanos na Linguagem C) int a, b; int c = 23; int d = c + 4; c < 20 retorna 0 d > c retorna 1 Operadores lógicos Os operadores lógicos combinam expressões booleanas. A linguagem oferece os seguintes operadores lógicos. && operador binárioE (AND) || operador binário OU (OR) ! operador unário de NEGAÇÃO (NOT) Operadores e Expressões Operadores lógicos ( && , || , ! ) A avaliação é da esquerda para a direita; A avaliação pára quando o resultado pode ser conhecido (ver b = (c < 20) && (d > c)) É aconselhado o uso de parênteses para especificar a precedência entre os operadores lógicos e relacionais. int a, b; int c = 23; int d = c + 4; a = (c < 20) || (d > c); /* retorna 1 */ /* as duas subexpressões são avaliadas */ b = (c < 20) && (d > c); /* retorna 0 */ /* apenas a primeira subexpressão é avaliada */ Operadores lógicos Expressões conectadas por && ou || são avaliadas da esquerda para a direita, e a avaliação pára assim que a veracidade ou falsidade do resultado for conhecida. Recomenda-se o uso de parênteses em expressões que combinam operadores lógicos e relacionais. Operadores lógicos Os operadores relacionais e lógicos são normalmente utilizados para tomada de decisões No entanto, pode-se utilizá-los para atribuir valores a variáveis int a, b; int c = 23; int d = c + 4; a = (c < 20) || (d > c); /* verdadeiro */ b = (c < 20) && (d > c); /* falso * Operadores lógicos int a, b; int c = 23; int d = c + 4; a = (c < 20) || (d > c); /* verdadeiro */ b = (c < 20) && (d > c); /* falso * Na avaliação da expressão atribuída à variável b, a operação (d>c) não chega a ser avaliada, pois independente do seu resultado a expressão como um todo terá como resultado 0 (falso), uma vez que a operação (c<20) tem valor falso Operadores lógicos Operações lógicas em operações lógicas, todo operando diferente de 0 (zero) torna-se 1 a b !a a&&b a||b 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 452 || 0 = 1 || 0 = 1 36 && 2 = 1 && 1 = 1 17502 && 0 = 1 && 0 = 0 !57 = !1 = 0 Operações lógicas com números quaisquer 56 Referências W. Celes, R. Cerqueira e J.L. Rangel, Introdução a Estruturas de Dados - com técnicas de programação em C, Ed. Campus, 2004 A. Kelley, A Book on C, Benjamin Cummings, 1995 Notas de aulas do curso presencial de Técnicas de Programação1- UNIRIO - Desenvolvidos pelas professoras: Geiza Maria Hamazaki da Silva e Adriana C. F Alvim – primeiro semestre de 2011.
Compartilhar