DSC/CCT/UFCG [email protected] Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Farias Carga Horária: 60 h DSC/CCT/UFCG Introdução à Programação [email protected] [email protected] Tópicos 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 Introdução Fundamentos da Repetição Repetição Controlada por Contador Estrutura de Repetição For Estrutura For : Notas e Observações Exemplos de Uso da Estrutura For Estrutura de Seleção Múltipla Switch Estrutura de Repetição Do/While Instruções Break e Continue Operadores Lógicos Confusão entre os Operadores de Igualdade (==) e de Atribuição (=) Operadores Bit-a-Bit Resumo de Programação Estruturada 2 4.1 Introdução DSC/CCT/UFCG Tópicos abordados [email protected] [email protected] Estruturas adicionais de controle de repetição For Do/while Estrutura de seleção múltipla switch Instrução break Usada para sair imediata e rapidamente de certas estruturas de controle Instrução continue Usada para saltar o restante do corpo de uma estrutura de repetição, procedendo com a próxima iteração do laço 3 4.2 Fundamentos Repetição I DSC/CCT/UFCG da Laço [email protected] [email protected] Grupo de instruções que o computador executa repetidamente enquanto alguma condição permanece verdadeira Repetição controlada por contador Repetição definida Conhecimento do número de vezes de execução do laço Uso de variável de controle Contagem do número de repetições 4 DSC/CCT/UFCG 4.2 Fundamentos Repetição II da [email protected] [email protected] Repetição controlada por sentinela Repetição indefinida Uso Falta de conhecimento prévio do número de repetições Valor da sentinela Término dos dados 5 DSC/CCT/UFCG 4.3 Fundamentos da Repetição Controlada por Contador I Exigências da repetição controlada por [email protected] [email protected] contador Nome de uma variável de controle (ou contador de laço) Valor inicial da variável de controle Condição de teste do valor final da variável de controle (i.e. se o laço deve continuar) Incremento (ou decremento) para a alteração da variável de controle a execução do laço (iteração) 6 DSC/CCT/UFCG 4.3 Fundamentos da Repetição Controlada por Contador II Exemplo [email protected] [email protected] int contador = 1; // inicialização while (contador <= 10) { // condição de repetição printf( "%d\n", contador ); ++contador; // incremento } Declaração int contador = 1; Fornecimento do nome contador para a variável Declaração de um tipo (inteiro) para a variável Reserva de espaço para armazenamento da variável na memória Definição do valor inicial da variável como 1 7 DSC/CCT/UFCG 4.4 Estrutura for I de Repetição Formato geral dos laços for for (inicialização; teste_de_continuação_do_laço; incremento) instrução [email protected] [email protected] Exemplo for (contador = 1; contador <= 10; contador++) printf("%d\n", contador); Impressão dos inteiros de 1 a 10 Sem ponto-e-vírgula (;) após a última expressão 8 DSC/CCT/UFCG 4.4 Estrutura de Repetição for II Possibilidade de eventual substituição de [email protected] [email protected] laços for por laços while inicialização; while (teste_de_continuação_do_laço){ instrução; incremento; (ou decremento;) } Inicialização e incremento Possibilidade de uso de listas separadas por vírgulas Exemplo for (i = 0, j = 0; j + i <= 10; j++, i++) printf("%d\n", j + i); Separação por vírgula (,) 9 DSC/CCT/UFCG 4.5 Estrutura for : Notas e Observações I Expressões Aritméticas [email protected] [email protected] Possibilidade de inclusão de expressões aritméticas à inicialização, condição de continuação do laço e ao incremento/decremento Se x igual a 2 e y igual a 10 for (j = x; j <= 4 * x * y; j += y / x é equivalente a for (j = 2; j <= 80; j += 5 10 4.5 Estrutura for : Notas e Observações II DSC/CCT/UFCG [email protected] [email protected] Notas sobre a estrutura for Incremento pode ser negativo (decremento) Se a condição de continuação do laço é inicialmente falsa O corpo da estrutura for não é realizada A execução prossegue com a próxima instrução após a estrutura for Variável de Controle Freqüentemente (mas não necessariamente) impressa ou usada dentro do corpo 11 4.5 Estrutura for : Notas e Observações III [email protected] [email protected] DSC/CCT/UFCG 01 02 03 04 05 06 07 08 09 10 11 12 13 15 /* total com for */ #include <stdio.h> int main() { int total = 0, numero; for (numero = 2; numero <= 100; numero += 2) total += numero; printf( “A total eh %d\n", total ); return 0; } A total eh 2550 12 DSC/CCT/UFCG 4.7 Estrutura de Múltipla switch I Seleção Switch [email protected] [email protected] Uso em contextos de testes separados para cada um dos valores passíveis de serem assumidos por uma variável ou expressão Decisões múltiplas Formato Série de rótulos case e um rótulo opcional default switch (valor) { case '1': ações case '2': ações default: ações } break; Abandono da estrutura 13 DSC/CCT/UFCG 4.7 Estrutura de Seleção Múltipla switch II Fluxograma da estrutura switch V break ações do case a case a F [email protected] [email protected] break ações do case b V case b F break ações do case z V case z F ações default 14 [email protected] [email protected] DSC/CCT/UFCG 4.7 Estrutura de Seleção Múltipla switch III 01 Contagem de conceitos */ 02 #include <stdio.h> 03 04 int main() 05 { 06 int conceito; 07 int contaA = 0, contaB = 0, contaC = 0, 08 contaD = 0, contaF = 0; 09 10 printf("Entre com os conceitos.\n" ); 11 printf("Entre com o caractere EOF para o final das entradas.\n"); 12 while ((conceito = getchar()) != EOF) { 13 switch (conceito) { /* switch aninhado em um while */ 14 case 'A': case 'a': /* conceito foi A maiúsculo ou minúsculo */ 15 ++contaA; /* incremento do contador de A */ 16 break; 17 case 'B': case 'b': /* conceito foi B maiúsculo ou minúsculo */ 18 ++contaB; /* incremento do contador de B */ 19 break; 20 case 'C': case 'c': /* conceito foi C maiúsculo ou minúsculo */ 21 ++contaC; /* incremento do contador de C */ 22 break; 23 case 'D': case 'd': /* conceito foi D maiúsculo ou minúsculo */ 24 ++contaD; /* incremento do contador de D */ 25 break; 15 [email protected] [email protected] DSC/CCT/UFCG 4.7 Estrutura de Seleção Múltipla switch IV 26 case ‘F': case ‘f': /* conceito foi B maiúsculo ou minúsculo */ 27 ++contaF; /* incremento do contador de B */ 28 break; 29 default: /* demais conceitos */ 30 printf( “Fornecido um conceito incorreto." ); 31 printf( " Entre com um novo conceito.\n" ); 32 break; 33 } 34 printf( "\nTotais para cada letra de conceito sao:\n" ); 35 printf( "A: %d\n", contaA ); 36 printf( "B: %d\n", contaB ); 37 printf( "C: %d\n", contaC ); 38 printf( "D: %d\n", contaD ); 39 printf( "F: %d\n", contaF); 40 return 0; 41 } 16 DSC/CCT/UFCG 4.7 Estrutura de Seleção Múltipla switch V [email protected] [email protected] Resultado Entre com os conceitos. Entre com o caractere EOF para o final das entradas. A B C C A D F C E Fornecido um conceito incorreto. Entre com um novo conceito. D A B Totais para cada letra de conceito sao: A: 3 B: 2 C: 3 D: 2 F: 1 17 DSC/CCT/UFCG 4.8 Estrutura de Repetição do/while I A estrutura de repetição do/while [email protected] [email protected] Similar à estrutura do while Teste da condição para repetição Após a execução do corpo do laço Realização das ações Pelo menos uma vez Formato do { instrução; } while (condição); 18 DSC/CCT/UFCG 4.8 Estrutura de Repetição do/while II Exemplo [email protected] [email protected] int contador = 1; do { printf("%d ", contador); } while (++contador <= 10); Resultado Impressão dos inteiros de 1 a 10 19 DSC/CCT/UFCG 4.8 Estrutura de Repetição do/while III Fluxograma do/while da estrutura de repetição [email protected] [email protected] ações V condição F 20 [email protected] [email protected] DSC/CCT/UFCG 01 02 03 04 05 06 07 08 09 10 14 4.8 Estrutura Repetição IV de do/while /* Uso da estrutura de repetição do/while */ #include <stdio.h> int main() { int contador = 1; do { printf( "%d ", contador ); } while (++contador <= 10); return 0; } 1 2 3 4 5 6 7 8 9 10 21 DSC/CCT/UFCG 4.9 Instruções break e continue I Break [email protected] [email protected] Saída imediata de uma estrutura while, for, do/while ou switch Continuação da execução do programa a partir da primeira instrução após a estrutura Usos comuns da instrução break Saída prematura de um laço Desconsideração switch do restante de uma estrutura 22 DSC/CCT/UFCG 4.9 Instruções break e continue II Continue Desconsideração das instruções restantes do corpo de uma estrutura while, for ou do/while [email protected] [email protected] Prosseguimento com a próxima iteração do laço while e do/while Avaliação do teste de continuação do laço imediatamente após a execução da instrução continue For Execução das expressões de incremento, após o que ocorre a avaliação do teste de continuação do laço 23 [email protected] [email protected] DSC/CCT/UFCG 01 02 03 04 05 06 07 08 09 10 11 12 13 14 4.9 Instruções break e continue III /*Uso da instrução continue em uma estrutura for */ #include <stdio.h> int main() { int x; for (x = 1; x <= 10; x++) { if (x == 5) continue; /* ignora o código restante em um laço somente se x=5*/ printf("%d ", x); } printf("\nContinue eh usado para saltar a impressao do 5\n" ); return 0; } 12 3 4 5 6 7 8 9 10 Continue eh usado para saltar a impressao do 5 24 4.10 Operadores Lógicos I DSC/CCT/UFCG && (E lógico) Retorna verdadeiro se ambas as condições são verdadeiras [email protected] [email protected] || (OU lógico) Retorna verdadeiro pelo condições são verdadeiras menos uma das ! (NÃO lógico, negação lógica) Inverte a verdade/falsidade de sua condição Operador unário, tem um único operando 25 DSC/CCT/UFCG 4.10 Operadores Lógicos II [email protected] [email protected] Uso típico como condições em laços Expressão Resultado verdadeiro && falso verdadeiro || falso !falso falso verdadeiro verdadeiro 26 DSC/CCT/UFCG 4.10 Operadores Lógicos III Exercício 1 – Uso de operadores lógicos [email protected] [email protected] Dado o programa em C a seguir Analise o código e descreva o funcionamento do programa em um diagrama de fluxo Observe que o programa não discrimina a primeira interação do usuário com as possíveis interações seguintes, exibindo sempre a mensagem: Continuar (1 = SIM, 0 = NAO)? Introduza novas linhas de código de modo a contornar este problema. 27 [email protected] [email protected] DSC/CCT/UFCG 4.10 Operadores Lógicos IV #include <stdio.h> #include <conio.h> main(){ int resp,i,n; float total; clrscr(); do { printf("\nContinuar (1 = SIM, 0 = NAO)? "); scanf("%d", &resp); if((resp==0)||(resp==1)){ if (resp) { printf("Digite o valor de n: "); scanf("%d", &n); total = 0.0; for(i = n; i > 0; i--) total += 1/((float) i * (float) i); printf("total = %f\n", total);} else printf("Programa finalizado!");} else break;} while (resp); getch(); return 0; } 28 4.11 Confusão entre os Operadores de Igualdade (==) e Atribuição (=) I DSC/CCT/UFCG [email protected] [email protected] Erro perigoso!!! Comumente não causa erro de sintaxe Qualquer expressão que produz um valor pode ser usado em estruturas de controle Valores diferentes de zero são verdadeiros, valores zero são falsos Exemplo de uso do operador de igualdade (==) if (codigo_de_pagamento == 4) printf(“Você obteve um bônus!\n"); de codigo_de_pagamento, se ele é um 4 então é premiado com um bônus Verificação 29 4.11 Confusão entre os Operadores de Igualdade (==) e Atribuição (=) II DSC/CCT/UFCG Exemplo de substituição de == por = if (codigo_de_pagamento = 4) printf(“Voce obteve um bonus!\n"); Atribuição do valor 4 a codigo_de_pagamento [email protected] [email protected] 4 é diferente de zero; Assim, a expressão é verdadeira e sempre haverá a premiação com o bônus, não importando qual era o valor de codigo_de_pagamento Erro de lógica, não erro de sintaxe 30 4.11 DSC/CCT/UFCG Confusão entre os Operadores de Igualdade (==) e Atribuição (=) III [email protected] [email protected] lvalues (valores esquerdos) Expressões que podem esquerdo de uma equação Seus valores podem ser alterados, assim como os nomes de variáveis aparecer no lado x = 4; 31 4.11 DSC/CCT/UFCG Confusão entre os Operadores de Igualdade (==) e Atribuição (=) IV [email protected] [email protected] rvalues (valores direitos) Expressões que só podem aparecer no lado direito de uma equação Constantes, tais como números Não se pode escrever 4 = x; Deve-se escrever x = 4; lvalues podem ser usados como rvalues, mas não o contrário y = x; 32 4.12 Operadores Bit-a-Bit I DSC/CCT/UFCG Sistema Binário Sistema de numeração de base 2 Disponibilidade de apenas 2 dígitos 0 e 1 [email protected] [email protected] Exemplo 1011 = 1.23 + 0.22 + 1.21 + 1.20 = 11 Bit Dígito Binário Representação eletrônica a partir de chaves (ligada/ desligada) Byte Agrupamento de 8 bits 33 4.12 Operadores Bit-a-Bit II DSC/CCT/UFCG Exercício 2 – Conversão de decimal para binário ou vice-versa [email protected] [email protected] Escrever um programa em C que receba do usuário um número inteiro positivo, representável em até 2 Bytes, e o converta do sistema decimal para binário ou vice-versa Deverá ser permitida ao usuário a escolha da base de referência para a conversão – 10 ou 2 O programa deverá verificar, uma vez selecionada a base, se o número digitado pode ser convertido O programa deverá incluir mensagens de erro elucidativas, a fim de instruir o usuário no processo de entrada dos dados 34 DSC/CCT/UFCG 4.12 Operadores Bit-a-Bit III Operadores Bit-a-Bit Operações em nível de números como padrões de bits [email protected] [email protected] Para cada bit, x e y AND, OR, XOR e NOT OR x|y XOR x^y x NOT ~y x y AND x&y 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 Operador UNÁRIO 35 4.12 Operadores Bit-a-Bit IV DSC/CCT/UFCG [email protected] [email protected] Exemplos x 0 0 1 0 0 1 0 1 37 y 1 1 1 1 0 1 1 0 246 x&y 0 0 1 0 0 1 0 0 36 x|y 1 1 1 1 0 1 1 1 247 x^y 1 1 0 1 0 0 1 1 211 ~x 1 1 0 1 1 0 1 0 218 36 DSC/CCT/UFCG 4.12 Operadores Bit-a-Bit IV Operações Lógicas versus Bit-a-Bit [email protected] [email protected] Operações Lógicas 37 && 246 1 37 || 246 1 ! 37 0 Operações Bit-a-Bit 37 & 246 37 | 246 ~ 37 36 247 218 37 4.12 Operadores Bit-a-Bit V DSC/CCT/UFCG [email protected] [email protected] Mascaramento e Configuração x b7 b6 b5 b4 b3 b2 b1 b0 28 0 0 0 1 1 1 0 0 x&28 0 0 0 b4 b3 b2 0 0 227 1 1 1 0 0 1 1 x|227 1 1 1 b4 b3 b2 1 1 0 Máscaras Bits configurados 38 4.12 Operadores Bit-a-Bit VI DSC/CCT/UFCG Exemplo 1 - Redução de 256 níveis de cinza para 16 com máscara AND Nce 0 1 00000000 00000001 00000000 00000000 0 0 15 16 00001111 00010000 00000000 00010000 0 16 ⇣ ⇣ ⇣ ⇣ 31 32 00011111 00100000 00010000 00100000 16 32 47 48 00101111 00110000 00100000 00110000 32 48 ⇣ [email protected] [email protected] Ncs Máscara ⇣ ⇣ ⇣ ⇣ ⇣ ⇣ 11110000 ⇣ ⇣ ⇣ ⇣ ⇣ 39 DSC/CCT/UFCG 4.12 Operadores Bit-a-Bit VI Exemplo 1 – Resultado do mascaramento de bits sobre uma imagem digital [email protected] [email protected] 256 Imagem original 16 Imagem quantizada para 4 bits 40 4.12 Operadores Bit-a-Bit VII DSC/CCT/UFCG Operador << Movimentação de padrões de bits para a esquerda [email protected] [email protected] Deslocamento de 1 bit para a esquerda ⇒ Multiplicação do valor codificado por 2 Exemplo x 0 0 0 0 x<<1 0 0 0 x<<2 0 0 x<<3 0 x<<4 1 1 1 1 1 1 1 1 1 1 1 1 1 x<<5 0 1 1 1 1 1 1 1 1 1 1 15 0 30 0 0 60 0 0 0 120 0 0 0 0 240 0 0 0 0 224 Impossibilidade de representação com 1 Byte 41 4.12 Operadores Bit-a-Bit VIII DSC/CCT/UFCG Operador >> Movimentação de padrões de bits para a direita Deslocamento de 1 bit para a direita ⇒ Divisão do valor codificado por 2 Exemplo 1 1 x x<<1 0 1 [email protected] [email protected] x<<2 0 0 1 1 1 x<<3 0 0 0 1 1 1 1 x<<4 0 0 0 0 1 1 1 1 1 x<<5 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 254 1 1 1 1 1 127 63 31 15 7 42 4.13 DSC/CCT/UFCG [email protected] [email protected] de Programação Estruturada Resumo Programação Estruturada I Maior facilidade de compreensão, teste, depuração e alteração de programas Regras para programação estruturada Regras desenvolvidas programação pela comunidade de Uso exclusivo de estruturas de controle com única entrada/única saída 43 4.13 DSC/CCT/UFCG Resumo Programação Estruturada II de Regras 1. Ponto de Partida Fluxograma mais simples [email protected] [email protected] 2. Substituição de qualquer retângulo (ação) por dois retângulos (ações) em seqüência 3. Substituição de qualquer retângulo (ação) por qualquer estrutura de controle (seqüência, if, if/else, switch, while, do/while ou for) 4. Aplicação das regras 2 e 3 em qualquer ordem e múltiplas vezes 44 4.13 DSC/CCT/UFCG Resumo de Programação Estruturada III [email protected] [email protected] Regra 1 Início a partir do fluxograma mais simples Regra 2 Regra 2 Regra 2 Substituição de qualquer retângulo por dois retângulos em seqüência Regra 2 45 4.13 DSC/CCT/UFCG Resumo Programação Estruturada IV de Regra 3 Substituição de qualquer retângulo por uma estrutura de controle [email protected] [email protected] Regra 3 Regra 3 Regra 3 46 4.13 DSC/CCT/UFCG Resumo Programação Estruturada V de Formas de controle de programas Seqüência compilador Seleção Repetição [email protected] [email protected] Manipulação pelo if, if/else ou switch while, do/while ou for Possibilidade automática de combinação Apenas de duas maneiras Aninhamento (Regra 3) Empilhamento (Regra 2) 47 4.13 DSC/CCT/UFCG Resumo Programação Estruturada VI de [email protected] [email protected] Formas de controle de programas Qualquer seleção Possibilidade de reescrita como uma instrução if Qualquer repetição Possibilidade de reescrita como uma instrução while 48 DSC/CCT/UFCG José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE CIÊNCIAS E TECNOLOGIA [email protected] DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO