146 pág.

Pré-visualização | Página 16 de 50
amortização e a taxa de juros. Observação Para receber as respostas dos exercícios propostos, encaminhe mensagem para jaime@ccen.ufal.br, assunto RESPOSTAS EXERCÍCIOS PASCAL, contendo NOME, INSTITUIÇÃO (se for o caso), CIDADE/ESTADO e CATEGORIA (docente, estudante ou auto-didata). Capítulo 3 Estruturas de Seleção 3.1 O que é uma estrutura de seleção O último exemplo do capítulo anterior apresentava um programa para calcular a área de um triângulo, dados os comprimentos dos seus lados. Foi visto que o comando que calculava a área solicitada só deveria ser executado com a certeza anterior de que os valores dados como entrada poderiam ser comprimentos dos lados de um triângulo. Em outras palavras, o tal comando só deveria ser executado se x < y + z e y < x + z e z < x + y, condição que garante que os valores armazenados nas variáveis x, y e z são comprimentos dos lados de um triângulo. Assim, e reforçando o que foi dito na seção 1.6, existem situações em que alguns comandos só devem ser executados se alguma condição for verificada. A verificação de que um condição é satisfeita e, a partir daí, a decisão em relação à execução ou não de uma determinada seqüência de comandos é chamada de estrutura de seleção, estrutura de decisão ou comando de seleção. 3.2 O comando if then O comando if then é uma estrutura de decisão que define se uma seqüência de comandos será ou não executada. Sua sintaxe é if Expressão lógica then begin seqüência de comandos end; sendo os delimitadores opcionais se a seqüência de comandos contém um único comando. A semântica deste comando é muito simples: se o valor da Expressão lógica for true, o sistema executará a seqüência de comandos; caso contrário, o sistema não executará a seqüência de comandos e a instrução após o comando if then passa a ser executada. 3.3 Exemplos Parte III 1. Se queremos um programa que determine o maior de dois números dados, podemos supor que o primeiro deles é o maior, armazenando-o numa variável Maior e depois, através de um comando if then, verificar se o maior procurado é o segundo dos números dados; neste caso o conteúdo da variável Maior deve ser alterado. {Programa para determinar o maior de dois números dados} program MaiorDe2; var a, b, Maior : real; begin writeln('Digite dois números'); readln(a, b); Maior := a; if (b > a) then Maior = b; writeln('O maior dos números ', a, ' e ', b, ' é ', Maior); end. 2. Um outro exemplo de utilização do comando if then aparece num programa que pretenda ordenar os conteúdos de variáveis x e y. Para isto só há de necessidade de se realizar alguma ação se o conteúdo de y for maior do que o conteúdo de x. Neste caso, o que deve ser feito é a permuta dos conteúdos de x e de y. Temos então o seguinte programa: {Programa para ordenar os conteúdos de duas variáveis} program Ordena2; var x, y, Aux : real; begin writeln('Digite os dois números '); readln(x, y); writeln('Números digitados: 'x = ', x:4:2, ' y = ', y:4:2); if x > y then begin Aux := x; x := y; y := Aux; end; writeln('Números ordenados: x = ', x:4:2, ' y = ', y:4:2); end. Observe que a seqüência de comandos Aux :=x; x := y; y := Aux; realiza a permuta dos conteúdos das variáveis x e y como discutido no exemplo 5 da seção 2.9. Outra observação importante é que, como os delimitadores begin e end são opcionais quando a seqüência de comandos vinculada ao comando if then possui um único comando, a não colocação deles faz com que o sistema só vincule ao comando de decisão o primeiro comando da seqüência. O esquecimento de delimitadores necessários, fatalmente, trará problemas de lógica para o programa. Por exemplo, se executarmos o programa Ordena2 acima para x = 8 e y = 5, teríamos: x y Aux exibe na tela 8 5 Números digitados: x = 8 y = 5 8 5 8 Números ordenados: x = 5 y = 8 Se os delimitadores, porém, forem esquecidos e escrevermos o programa acima da forma abaixo program Ordena2; var x, y, Aux : real; begin writeln('Digite os dois números '); readln(x, y); writeln('Números digitados: 'x = ', x, ' y = ', y); if x > y then Aux := x; x := y; y := Aux; writeln('Números ordenados: x = ', x:4:2, ', y = ', y:4:2); end. e o executarmos para x = 5 e y = 8, a expressão lógica que controla o if é falsa e então o comando Aux := x, não seria executado, mas os comandos x := y e y := Aux seriam e assim o conteúdo de x passaria a ser 8 e o conteúdo de y armazenaria o "conteúdo" de Aux, sobre os quais não se tem controle (alguns compiladores Pascal armazenam o valor 0 (zero) quando a variável é declarada. Este armazenamento inicial é chamado inicialização da variável). É interessante notar que, mesmo com o erro de lógica, esta nova versão do programa funciona corretamente para entradas em que x > y. O fato de termos escrito os comandos vinculados ao comando de seleção com uma tabulação "maior" será comentado na seção 3.6. 3. Considere agora a questão de se determinar o número de anos bissextos entre dois anos dados. Sabe-se que um ano é bissexto se ele é múltiplo de quatro, exceto aqueles que são múltiplos de 100, mas não são múltiplos de 400 (por exemplo, 2012, múltiplo de 4, será bissexto; 1900, múltiplo de 100, mas não de 400, não foi bissexto; 2000, múltiplo de 100 e de 400, foi bissexto). Assim a determinação do número de anos bissextos entre dois anos dados consiste em se determinar o número de múltiplos de 4, Multiplos4, o número de múltiplos de 100, Multiplos100, e o número de múltiplos de 400, Multiplos400, todos compreendidos entre os anos dados, e se calcular a expressão Multiplos4 – Multiplos100 + Multiplos400. Para se determinar o número de múltiplos de 4 (e mutatis mutandis os números dos múltiplos de 100 e de 400) situados entre dois anos Ano1 e Ano2, basta calcular a expressão (Ano1 div 4) - (Ano2 div 4), diminuída de uma unidade quando Ano2 for múltiplo de 4. Temos então o seguinte programa, no qual só há diminuição referida quando é necessário: {Programa para determinar o numero de anos bissextos entre dois anos} program NumeroAnosBissextos; var Ano1, Ano2, AnBiss, Multiplos4, Multiplos100, Multiplos400 : integer; begin writeln('Digite os dois anos'); readln(Ano1, Ano2); Multiplos4 := Ano2 div 4 - Ano1 div 4; if Ano2 mod 4 = 0 then Multiplos4 := Multiplos4 - 1; Multiplos100 := Ano2 div 100 - Ano1 div 100; if Ano2 mod 100 = 0 then Multiplos100 := Multiplos100 - 1; Multiplos400 := Ano2 div 400 - Ano1 div 400; if Ano2 mod 400 = 0 then Multiplos400 := Multiplos400 - 1; AnBiss := Multiplos4 - Multiplos100 + Multiplos400; writeln('Numero de anos bissextos entre os anos ', Ano1, ' e ', Ano2, ': ', AnBiss); end. 3.4 O comando if then else O comando if then else é uma estrutura de decisão que decide entre duas seqüências de comandos qual vai ser executada, sendo definido através da seguinte sintaxe: if Expressão lógica then begin seqüência de comandos 1; end else begin seqüência de comandos 2; end; A semântica deste comando é a seguinte: se o valor de Expressão lógica for true, o sistema executará a seqüência de comandos 1; caso contrário, o sistema executará a seqüência de comandos 2. 3.5 Exemplos Parte IV 1. No último exemplo do capítulo 2, apresentamos um programa que calculava a área de um triângulo, dados os comprimentos dos seus lados. No final dele, mostramos que o mesmo não fornecia respostas satisfatórias para todas as entradas e comentamos que o cálculo da área deveria ser precedido da verificação de que os dados de entrada são de fato comprimentos dos lados de um triângulo. O programa referido