Baixe o app para aproveitar ainda mais
Prévia do material em texto
CETENS121- Programação de Computadores I Controle de programas em C Centro de Ciências e Tecnologia em Energia e Sustentabilidades – CETENS Bacharelado Interdisciplinar em Energia e Sustentabilidade - BES Prof. Dr. Anderson Leonardo Sanches alsanches@ufrb.edu.br Feira de Santana - BA 2015 Nesta aula, são abordados(as): Os aspectos essenciais da repetição controlada por contador; Utilização de estruturas de repetição for e do…while para executar instruções repetidamente; O estudo da seleção múltipla usando a estrutura de seleção switch. Os comandos break e continue para alterar o fluxo de controle. Operadores lógicos para formar expressões condicionais complexas nas estruturas de controle; As consequências de confundir os operadores de igualdade com os de atribuição. Feira de Santana - BA 2 / 202015 Objetivos Controle de programas em C 1. Estrutura de repetição for; 2. Estrutura de seleção múltipla switch; 3. Estrutura de repetição do while; 4. Comandos break e continue 5. Operadores lógicos; Agenda Feira De Santana - BA 2015 3 / 20 Controle de programas em C 1. Estrutura de repetição for; 2. Estrutura de seleção múltipla switch; 3. Estrutura de repetição do while; 4. Comandos break e continue 5. Operadores lógicos; Agenda Feira De Santana - BA 2015 4 / 20 A estrutura de repetição for trata de todos os detalhes da repetição controlada por contador. Sua utilização é ilustrada na reescrita do programa abaixo. Feira de Santana - BA 5 / 202015 Estrutura de repetição for Quando a estrutura for começa a ser executada, a variável de controle contador é declarada e inicializada com 1; Então, é verificada a condição de continuação do loop, contador <= 10; Como o valor inicial do contador é 1, a condição é satisfeita; assim, a instrução printf (linha 13) imprime o valor de contador, ou seja, 1; A variável de controle contador é, então, incrementada na expressão contador++, e o loop começa novamente com o teste de continuação do loop. Feira de Santana - BA 6 / 202015 Estrutura de repetição for Como a variável de controle agora é igual a 2, o valor final não é excedido, e, assim, o programa executa novamente a instrução printf; Esse processo se estende até que a variável de controle contador seja incrementada ao seu valor final, que é 11; isso faz com que o teste de continuação do loop não seja satisfeito, e a repetição termine o programa da estrutura for (nesse caso, o comando return no fim do programa); Feira de Santana - BA 7 / 202015 Estrutura de repetição for A Figura abaixo examina com mais detalhes a estrutura for da Figura anterior. Observe que a estrutura ‘for” ‘faz tudo’; ela especifica cada um dos itens necessários para uma repetição controlada por contador com uma variável de controle.; Feira de Santana - BA 8 / 202015 Estrutura de repetição for O formato geral da estrutura for é: for (expressão1; expressão2; expressão3){ instrução; } onde expressão1 inicializa a variável de controle de loop, expressão2 é a condição de continuação do loop e expressão3 incrementa a variável de controle. Na maior parte dos casos, a estrutura for pode ser representada com uma estrutura while equivalente, da seguinte forma: expressão1; while (expressão2) { instrução; expressão3; } Feira de Santana - BA 9 / 202015 Estrutura de repetição for As três expressões na estrutura for são opcionais; Pode-se omitir a expressão1 se a variável de controle for inicializada em outro lugar no programa. Se a expressão2 for omitida, C considerará que a condição é verdadeira, criando assim um loop infinito. A expressão3 pode ser omitida se o incremento for calculado pelas instruções no corpo da estrutura for ou se nenhum incremento for necessário. A expressão de incremento na estrutura for atua como uma instrução em C isolada no final do corpo de for. Feira de Santana - BA 10 / 202015 Estrutura de repetição for Portanto, as expressões: contador = contador + 1 contador += 1 ++contador contador++ são equivalentes na parte de incremento da estrutura for; Muitos programadores em C preferem a forma contador++, pois o incremento ocorre após o corpo do loop ser executado, e o formato de pós-incremento parece mais natural; Aqui, como a variável, pré-incrementada ou pós-incrementada, não aparece em uma expressão maior, as duas formas de incremento têm o mesmo efeito; Os dois sinais de ponto e vírgula na estrutura for são obrigatórios. Feira de Santana - BA 11 / 202015 Estrutura de repetição for A inicialização, a condição de continuação do loop e o incremento podem conter expressões aritméticas. Por exemplo, se x = 2 e y = 10, a estrutura for ( j = x; j <= 4 * x * y; j += y / x ) é equivalente à estrutura for ( j = 2; j <= 80; j += 5 ) O ‘incremento’ pode ser negativo (nesse caso, na realidade, ele é um decremento, e o loop conta no sentido decrescente); Se a condição de continuação do loop for inicialmente falsa, o corpo do loop não será executado. Em vez disso, a execução prosseguirá com a instrução seguinte à estrutura for. Feira de Santana - BA 12 / 202015 Estrutura de repetição for A estrutura for representada por fluxograma de modo muito semelhante à estrutura while. Por exemplo, a Figura abaixo ilustra o fluxograma da estrutura for; for ( contador = 1; contador <= 10; contador ++ )} printf( "%d", contador ); { Feira de Santana - BA 13 / 202015 Estrutura de repetição for Os dois exemplos a seguir oferecem aplicações simples para a estrutura for. A Figura abaixo realiza a soma de todos os inteiros pares de 2 a 100. Feira de Santana - BA 14 / 202015 Estrutura de repetição for Considere o seguinte problema: Uma pessoa investe R$ 1.000,00 em uma conta de poupança que rende juros de 5 por cento. Supondo que os juros sejam deixados na conta, calcule e apresente o valor existente na conta ao final de cada ano em um período de dez anos. Use a fórmula a seguir para determinar esses valores: vf = vp(1 + t)n em que: vp é o valor original investido (ou seja, o principal); t é a taxa de juros anual; n é o número de anos; vf é o valor do depósito ao final do n-ésimo ano.. Feira de Santana - BA 15 / 202015 Estrutura de repetição for Feira de Santana - BA 16 / 202015 Estrutura de repetição for Feira de Santana - BA 17 / 202015 Estrutura de repetição for A estrutura for executa o corpo do loop 10 vezes, alternando uma variável de controle de 1 a 10 em incrementos de 1; Embora C não inclua um operador de exponenciação, podemos usar a função pow da biblioteca-padrão para essa finalidade; A função pow(x, y) calcula o valor de x elevado à potência y; Ela utiliza dois argumentos do tipo double e retorna um valor double; O tipo double é um tipo de ponto flutuante, semelhante a float, mas normalmente uma variável do tipo double pode armazenar um valor muito maio e com mais precisão do que float. Feira de Santana - BA 18 / 202015 Estrutura de repetição for O cabeçalho <math.h> (linha 4) deve ser incluído sempre que uma função matemática como pow é utilizada; Na realidade, esse programa não funcionaria corretamente sem a inclusão de math.h, pois o linker não encontraria a função pow; A função pow exige dois argumentos double, porém a variável year é um inteiro; O arquivo math.h inclui informações que dizem ao compilador para converter o valor de year a uma representação double temporária antes de chamar a função. Feira de Santana - BA 19 / 202015 Estrutura de repetição for O especificador de conversão %21.2f é usado para exibir o valor da variável valor no programa; O 21 no especificador de conversãoindica a largura do campo em que o valor será impresso; Um campo com largura 21 especifica que o valor a ser exibido aparecerá em 21 posições de impressão. O 2 especifica a precisão (ou seja, o número de casas decimais). Se o número de caracteres exibido for menor que a largura do campo, então o valor será automaticamente alinhado à direita no campo. Isso é útil, principalmente, para alinhar valores de ponto flutuante com a mesma precisão (de modo que seus pontos decimais sejam alinhados verticalmente). Feira de Santana - BA 20 / 202015 Estrutura de repetição for Controle de programas em C 1. Estrutura de repetição for; 2. Estrutura de seleção múltipla switch; 3. Estrutura de repetição do while; 4. Comandos break e continue; 5. Operadores lógicos. Agenda Feira De Santana - BA 2016 22 / 55 Ocasionalmente, um algoritmo conterá uma série de decisões em que uma variável, ou expressão, será testada separadamente para cada um dos valores inteiros constantes que ela possa vir a assumir, e diferentes ações serão tomadas; Isso é chamado de seleção múltipla; C nos oferece a estrutura de seleção múltipla switch para lidar com essa tomada de decisão.; A estrutura switch consiste em uma série de rótulos case, um caso padrão (default) opcional e instruções para executar cada caso; Feira de Santana - BA 23 / 552016 Estrutura de seleção switch O exemplo posterior usa a estrutura switch para contar o número de diferentes notas, classificadas por letra, que alunos receberam em um exame. Feira de Santana - BA 24 / 552016 Estrutura de seleção switch (continuação) Feira de Santana - BA 25 / 552016 Estrutura de seleção switch (continuação) Feira de Santana - BA 26 / 552016 Estrutura de seleção switch (continuação) Feira de Santana - BA 27 / 552016 Estrutura de seleção switch (continuação) Feira de Santana - BA 28 / 552016 Estrutura de seleção switch (continuação) No programa, o usuário digita as notas em letra para uma turma; No cabeçalho do while (linha 19), while ( ( nota = getchar() ) != EOF ) A função getchar (de <stdio.h>) lê um caractere do teclado e armazena esse caractere na variável inteira nota; Os caracteres normalmente são armazenados em variáveis do tipo char; Porém, um recurso importante da linguagem em C é que os caracteres podem ser armazenados em qualquer tipo de dado inteiro, pois eles normalmente são representados como inteiros de um byte no computador. Feira de Santana - BA 29 / 552016 Estrutura de seleção switch (continuação) No programa, o valor da atribuição nota = getchar() é comparado com o valor de EOF (acrônimo para ‘end of file’ — fim de arquivo). Usamos EOF (que normalmente tem o valor -1) como um valor de sentinela; O usuário digita uma combinação de toque de tecla dependente do sistema para indicar o ‘fim de arquivo’ — ou seja, ‘Não tenho mais dados para informar’. EOF é uma constante inteira simbólica (posteriormente, veremos como as constantes simbólicas são definidas); Se o valor atribuído à nota for igual ao EOF, o programa é encerrado; Nesse programa, escolhemos representar caracteres como interfaces, pois EOF um valor inteiro (normalmente, também, -1). Feira de Santana - BA 30 / 552016 Estrutura de seleção switch (continuação) Nos sistemas Linux/UNIX/Mac OS X, o identificador EOF é inserido digitando-se <Ctrl> d em uma linha isolada. Essa notação <Ctrl> d significa que se deve pressionar a tecla Enter e depois, simultaneamente, as teclas Ctrl e d. Em outros sistemas, como no Microsoft Windows, o indicador de EOF pode ser inserido digitando-se <Ctrl> z Você também pode ter de pressionar Enter no Windows. Feira de Santana - BA 31 / 552016 Estrutura de seleção switch (continuação) Quando a tecla Enter é pressionada, os caracteres são lidos um por vez pela função getchar; Se o caractere inserido não for igual a EOF, a estrutura switch (linha 22) será executada.; A palavra-chave switch é seguida pelo nome de variável nota entre parênteses; Isso é chamado de expressão de controle; O valor dessa expressão é comparado a cada um dos rótulos case; Suponha que o usuário tenha digitado a letra C como nota; C é automaticamente comparado a cada case no switch. Feira de Santana - BA 32 / 552016 Estrutura de seleção switch (continuação) Se houver uma correspondência (case 'C':), as instruções para esse case serão executadas; No caso da letra C, cCount é incrementado em 1 (linha 36), e a estrutura switch termina imediatamente com o comando break; O comando break faz com que o controle do programa continue com a primeira instrução após a estrutura switch; O comando break é usado porque, de outra forma, os cases em uma estrutura switch seriam executados juntos; Se o break não for usado em nenhum ponto da estrutura switch, então, toda vez que houver uma correspondência na estrutura, as instruções para todos os cases restantes serão executadas. Feira de Santana - BA 33 / 552016 Estrutura de seleção switch (continuação) Se não houver correspondência, o caso default será executado, e uma mensagem de erro será exibida. Cada case pode ter uma ou mais ações; A instrução switch diferente de todas as outras estruturas de controle no sentido de que as chaves não são exigidas em torno de várias ações em um case de um switch; A estrutura de seleção múltipla switch geral (usando um break em cada case) é representada na forma de um fluxograma na Figura 4.8; O fluxograma deixa claro que cada comando break no final de um case faz com que o controle saia imediatamente da estrutura switch. Feira de Santana - BA 34 / 552016 Estrutura de seleção switch (continuação) Feira de Santana - BA 35 / 552016 Estrutura de seleção switch (continuação) Na estrutura switch da Figura anterior, as linhas case '\n': /* ignora caracteres de nova linha, */ case '\t': /* tabulações, */ case ' ': /* e espaços na entrada */ break; /* fim do switch */ fazem com que o programa omita caracteres de nova linha, tabulação e espaço. Feira de Santana - BA 36 / 552016 Estrutura de seleção switch (continuação) Para que o programa leia os caracteres, eles precisam ser enviados ao computador por meio da tecla Enter; Isso gera um caractere de nova linha na entrada, após o caractere que queremos processar; Normalmente, esse caractere de nova linha precisa ser especialmente processado para que o programa funcione de modo correto; Ao incluir esses casos em nossa estrutura switch, evitamos que a mensagem de erro no caso default seja exibida toda vez que um caractere de nova linha, tabulação ou espaço forem encontrados na entrada. Feira de Santana - BA 37 / 552016 Estrutura de seleção switch (continuação) Controle de programas em C 1. Estrutura de repetição for; 2. Estrutura de seleção múltipla switch; 3. Estrutura de repetição do while; 4. Comandos break e continue; 5. Operadores lógicos. Agenda Feira De Santana - BA 2016 38 / 55 A estrutura de repetição do…while é semelhante à estrutura while; Na instrução while a condição da continuação de loop é testada no início do loop, antes que seu corpo seja executado; A estrutura do…while testa a condição da continuação do loop depois que o corpo do loop é executado. Portanto, o corpo do loop será executado pelo menos uma vez. Quando uma do…while é encerrada, a execução continua com a instrução após a cláusula while. Feira de Santana - BA 39 / 552016 Estrutura de repetição do...while A Figura abaixo usa uma estrutura do…while para imprimir os números de 1 a 10. Feira de Santana - BA 40 / 552016 Estrutura de repetição do...while (continuação) A Figura abaixo ilustra o fluxograma da estrutura do…while o qual deixa claro que a condição de continuação do loop não é executada antes que a ação seja executada pelo menos uma vez. Feira de Santana - BA 41 / 552016 Estrutura de repetição do...while (continuação) Controle de programas em C 1. Estrutura de repetição for; 2. Estrutura de seleção múltipla switch; 3. Estrutura de repetição do while; 4. Comandos break e continue; 5. Operadores lógicos. Agenda Feira De Santana - BA 2016 42 / 55 A Figura 4.11 demonstra o comando break em uma estrutura de repetição for. Feira de Santana - BA 43 / 552016 Estrutura de repetição do...while (continuação) O comando continue, quando executado em uma estrutura while, for ou do…while, ‘pula’ as instruções restantes no corpo dessa estrutura de controle e realiza a próxima iteração do loop; Nas estruturas while e do…while, o teste de continuação do loop é avaliado imediatamente após o comando continue ser executado; Na estrutura for a expressão de incremento é executada e, depois, o teste de continuação do loop é avaliado; Já foi dito que a estrutura while poderia ser usada, na maioria dos casos, para representar a estrutura for; A única exceção ocorre quando a expressão de incremento na estrutura while vem após o comando for; Nesse caso, o incremento não é executado antes de a condição de continuação da repetição ser testada, e o while não é executado da mesma maneira que o for. Feira de Santana - BA 44 / 552016 Estrutura de repetição do...while (continuação) A Figura abaixo utiliza o comando continue em uma estrutura for para ‘pular’ a instrução printf e iniciar a próxima repetição do loop. Feira de Santana - BA 45 / 552016 Estrutura de repetição do...while (continuação) Controle de programas em C 1. Estrutura de repetição for; 2. Estrutura de seleção múltipla switch; 3. Estrutura de repetição do while; 4. Comandos break e continue; 5. Operadores lógicos. Agenda Feira De Santana - BA 2016 46 / 55 C oferece operadores lógicos, que podem ser usados para formar condições mais complexas ao combinar condições simples; Os operadores lógicos são && (AND lógico), || (OR lógico) e ! (NOT lógico, também chamado de negação lógica); Vejamos alguns exemplos de cada um desses operadores. Suponha que queiramos garantir que duas condições sejam verdadeiras antes de escolher certo caminho de execução. Nesse caso, podemos usar o operador lógico && da seguinte forma: if ( sexo == 1 && idade >= 65 ) ++idosoFeminino; Feira de Santana - BA 47 / 552016 Operadores Lógicos Essa estrutura if contém duas condições simples; A condição sexo == 1 poderia ser avaliada, por exemplo, para determinar se uma pessoa é do sexo feminino; A condição idade >= 65 é avaliada para determinar se uma pessoa é idosa; As duas condições simples são avaliadas primeiro, pois as precedências de == e >= são ambas maiores que a precedência de &&. Feira de Santana - BA 48 / 552016 Operadores Lógicos (continuação) A tabela mostra as quatro combinações possíveis de zero (falso) e não zero (verdadeiro) para expressão1 e expressão2; Essas tabelas normalmente são chamadas tabelas verdade; C avalia todas as expressões que incluem operadores relacionais, operadores de igualdade e/ou operadores lógicos como 0 ou 1; Embora C defina um valor verdadeiro como 1, a linguagem aceita qualquer valor não zero como verdadeiro. Feira de Santana - BA 49 / 552016 Operadores Lógicos (continuação) Agora, consideremos o operador || (OR lógico); Suponha que queiramos garantir em algum ponto de um programa que uma ou ambas as condições sejam verdadeiras antes de escolher certo caminho de execução; Nesse caso, usamos o operador || como neste segmento de programa: if (médiaSemestre >= 90 || exameFinal>= 90 ) printf( "Nota do aluno é A\n" ); Essa instrução também contém duas condições simples. A condição médiaSemestre >= 90 é avaliada para determinar se o aluno merece uma nota ‘A’, devido a um desempenho sólido durante o semestre.. Feira de Santana - BA 50 / 552016 Operadores Lógicos (continuação) A condição exameFinal >= 90 é avaliada para determinar se o aluno merece uma nota ‘A’ por um desempenho excelente no exame final. A estrutura if, então, considera a condição combinada médiaSemestre >= 90 || exameFinal >= 90 e concede um ‘A’ ao aluno se uma ou ambas as condições simples forem verdadeiras; A mensagem ‘A nota do aluno é A’ não é impressa somente se as duas condições simples forem falsas (zero) Feira de Santana - BA 51 / 552016 Operadores Lógicos (continuação) A Figura 4.14 é uma tabela verdade para o operador OR lógico (||). Feira de Santana - BA 52 / 552016 Operadores Lógicos (continuação) O operador && tem uma precedência mais alta que ||; Os dois operadores se associam da esquerda para a direita; Uma expressão contendo os operadores && ou || é avaliada somente até que sua veracidade ou sua falsidade seja conhecida; Assim, a avaliação da condição sexo == 1 && idade >= 65 terminará se sexo não for igual a 1 (ou seja, se a expressão inteira for falsa), e continuará se sexo for igual a 1 (ou seja, a expressão inteira ainda poderia ser verdadeira se idade >= 65). Esse recurso de desempenho para a avaliação de expressões AND e OR lógicas é chamado de avaliação em curto-circuito. Feira de Santana - BA 53 / 552016 Operadores Lógicos (continuação) C oferece ! (negação lógica) para permitir que um programador ‘inverta’ o significado de uma condição; Diferentemente dos operadores && e ||, que combinam duas condições (e que, portanto, são operadores binários), o operador de negação lógica tem apenas uma única condição como operando (e, portanto, é um operador unário). O operador de negação lógica é colocado antes de uma condição quando estamos interessados em escolher um caminho de execução se a condição original (sem o operador de negação lógica) for falsa, como neste segmento de programa:: if ( !( grade == valorSentinela ) ) printf( "A próxima nota é %f\n", nota ); Os parênteses em torno da condição nota == valorSentinela são necessários porque o operador de negação lógica tem uma precedência maior que o operador de igualdade. Feira de Santana - BA 54 / 552016 Operadores Lógicos (continuação) A Figura abaixo é uma tabela verdade para o operador de negação lógica Feira de Santana - BA 55 / 552016 Operadores Lógicos (continuação) A Figura 4.16 mostra a precedência e a associatividade dos operadores apresentados até agora. Feira de Santana - BA 56 / 552016 Operadores Lógicos (continuação) CETENS_121_PCI_Controle_de_Programas_em_C_ParteI Slide Number 1 Slide Number 2 Slide Number 3 Slide Number 4 Slide Number 5 Slide Number 6 Slide Number 7 Slide Number 8 Slide Number 9 Slide Number 10 Slide Number 11 Slide Number 12 Slide Number 13 Slide Number 14 Slide Number 15 Slide Number 16 Slide Number 17 Slide Number 18 Slide Number 19 Slide Number 20 CETENS_121_PCI_Controle_de_Programas_em_C_Parte2
Compartilhar