Programando o Computador com PascaL: um ambiente para Auto-Aprendizagem. Resolução dos desafios propostos no Capítulo 6 Resolução do Desafio 6.1 Resolução do Desafio 6.2 a) Programa PascaL program Desafio62; var A, X : integer; begin A := 1; X := 7; while A < 10 do begin A := A + 1; if A > 5 then begin X := 1; end else begin if A < X then begin X := 3; end else repeat A := A + 1; X := X - 1; until A > X; end; end; writeln( 'X = ' , X); writeln( 'A = ' , A); end. b) Acompanhamento da execução X= 7A= 1 (Entrou no bloco de controle de repetição, pois A <10) X= 7A= 2 (acréscimo em A) (Entrou no bloco de alternativa: A >5 é falso) (Entrou no bloco de alternativa A<X é verdadeiro) X= 3A= 2 (sai dos dois blocos de alternativa) (termina um “loop” no bloco de repetição) (continua no bloco de repetição, pois A <10) X= 3A= 3 (acréscimo em A) (Entra no bloco de alternativa: A>5 é falso) (Entra no bloco de alternativa: A<X é falso) (entra no bloco de repetição até que A >X) (A cresce 1 e X decresce 1: X= 3A= 2 X= 2A= 3 (A>X : verdadeiro) (Sai do bloco de repetição) (termina outro “loop” no bloco de repetição mais externo) (Continua no bloco de repetição A< 10 : verdadeiro) X= 2A= 4 (acréscimo em A) (entra no bloco de alternativa: A> 5: é falso) (entra no bloco de alternativa( A<X : é flaso) (entra no bloco de repetição até que A >X) (A cresce 1 e X decresce 1: X= 1A= 5 (A>X : verdadeiro) (Sai do bloco de repetição) (termina outro “loop” no bloco de repetição mais externo) (Continua no bloco de repetição A< 10 : verdadeiro) X= 1A= 6 (acréscimo em A) (entra no bloco de alternativa: A> 5: é verdadeiro) X= 1A= 6 (acréscimo em A) (termina outro “loop” no bloco de repetição mais externo) (Continua no bloco de repetição A< 10 : verdadeiro) X= 1A= 7 (acréscimo em A) (entra no bloco de alternativa: A> 5: é verdadeiro) (atribui 1 a X) (termina outro “loop” no bloco de repetição mais externo) (Continua no bloco de repetição A< 10 : verdadeiro) X= 1A= 8 (acréscimo em A) (entra no bloco de alternativa: A> 5: é verdadeiro) (atribui 1 a X) (termina outro “loop” no bloco de repetição mais externo) (Continua no bloco de repetição A< 10 : verdadeiro) X= 1A= 9 (acréscimo em A) (entra no bloco de alternativa: A> 5: é verdadeiro) (atribui 1 a X) (termina outro “loop” no bloco de repetição mais externo) (Continua no bloco de repetição A< 10 : verdadeiro) X= 1A= 10 (acréscimo a A) (termina outro “loop” no bloco de repetição mais externo) (Sai do bloco de repetição A< 10 : falso) (Escreve os valores de X e A) X= 1 A= 10 Resolução do desafio 6.3. Resolução do Desafio 6.4 Supondo que exista pelo menos um valor no conjunto, podemos considerar que o primeiro valor lido seja o maior e o menor ao mesmo tempo ( afinal, seria essa a resposta se só houvesse um único valor no conjunto). Havendo mais valores, a próxima leitura compararia o novo valor com o anterior trocando o maior ou menor se for o caso. Assim, nossa estrutura de dados necessita de três variáveis: valor, maior e menor. A interface recebe um valor de cada vez e, no final, escreve qual foi o maior e o menor valor do conjunto. Podemos também escrever cada valor do conjunto: Exemplo de interface: Forneça o primeiro valor. -1 para terminar. 2, Forneça outro valor. -1 para terminar. 243, Forneça outro valor. -1 para terminar. 12, Forneça outro valor.-1 para terminar. 5, Forneça outro valor. -1 para terminar. 6, Forneça outro valor. -1 para terminar. 1, Forneça outro valor. -1 para terminar. 34, Forneça outro valor. -1 para terminar. -1 a) Programa PascaL: program Desafio64; {Desafio 6.4} var Valor, Maior, Menor : integer; begin { leitura do primeiro valor} write( ' Forneca o primeiro valor.'); writeln( ' -1 para terminar.'); readln(Valor); Maior := Valor; writeln( Valor ); Menor := Valor; { supor que é o maior } { supor que é o menor} { Lê e compara os próximos do conjunto - se houve) } while Valor <> -1 do { -1 indica que não há mais valores } begin if Valor > Maior { compara com maior} then Maior := Valor else if Valor < Menor { compara com menor } then Menor := valor; write( 'Forneça outro valor.'); writeln( ' -1 para terminar.'); readln(Valor); writeln( Valor); end; writeln; writeln( 'Maior valor lido ', Maior); writeln( 'Menor valor lido ', Menor); end. b) Execução do programa PascaL: c) Fluxograma de Chapin equivalente: d) Diagrama de atividades UML: Resolução do Desafio 6.5 Estabelecimento do Problema: Objetivos: Descobrir qual foi: a) O maior número de impulsos do mês. b) quantos clientes atingiram o maior número de impulsos. O que foi fornecido: Quantidade de impulsos de cada cliente registrados no período de um mês. Visão da solução: a) Maior numero de impulsos. Tomar o número de impulsos do primeiro cliente como o maior de todos. b) Obter o número de impulsos do segundo cliente. Se este número de impulsos for maior que o do primeiro cliente, considerar este novo valor como o maior número de impulsos entre todos. Caso contrário, manter o anterior como o maior. Proceder assim sucessivamente até avaliar todos os clientes ( Similar ao Desafio 6.4) b) Contar quantos atingiram o maior valor. Usar uma variável (digamos, Quantos) para contar quantos clientes atingiram o maior número de impulsos. Toda vez que o número de impulsos de um cliente for maior do que aquele número, que, até então, tinha sido considerado como o maior número de impulsos, começar a contar novamente, fazendo Quantos igual a 1. O fluxograma a seguir mostra as linhas gerais da solução O programa PascaL, a seguir, implementa o que está no fluxograma anterior. program Desafio65; {Desafio 6.5} { Descobre o maior número de impulsos por cliente e indica quantos clientes atingiram esse valor } var Impulsos, { contém o número de impulsos mensal por cliente } Quantos, { contém quantos MaiorImpulsos: Integer; assinantes atingiram o maior valor } { conterá o maior número de impulsos encontrado } begin Quantos := 0; { Nenhum cliente com maior número de impulsos, por enquanto } { Lê o primeiro valor} write ( 'Forneça o número de impulsos do ', 'primeiro cliente '); writeln( '-1 para indicar fim de clientes.'); readln( Impulsos); writeln(Impulsos); MaiorImpulsos := Impulsos; { Supõe que o primeiro já é o maior } {lê e processa os próximos} while Impulsos <> -1 do begin if Impulsos > MaiorImpulsos then begin MaiorImpulsos := Impulsos; Quantos := 1; { É o primeiro com este valor } end else if Impulsos = MaiorImpulsos then Quantos := Quantos + 1; { conta mais um com maior número de impulsos } write ('Forneça o número de impulsos ', 'do proximo cliente '); writeln( '-1 para indicar fim de ', ' clientes. '); readln( Impulsos); writeln(Impulsos); end; { Mostra resultados } writeln; writeln(' Maior número de impulsos no mês', ' : ', MaiorImpulsos); writeln(' Número de clientes com ', MaiorImpulsos, ' no mês: ', Quantos ); end. Execução do programa com os seguintes valores para Impulsos: 12, 345, 45, 657, 43, 657, 32, -1 [Rodando... Desafio65] Forneça o número de impulsos clientes. 12 Forneça o número de impulsos clientes. 345 Forneça o número de impulsos clientes. 45 Forneça o número de impulsos clientes. 657 Forneça o número de impulsos clientes. 43 Forneça o número de impulsos clientes. 657 Forneça o número de impulsos clientes. 32 Forneça o número de impulsos clientes. -1 do primeiro cliente -1 para indicar fim de do proximo cliente -1 para indicar fim de do proximo cliente -1 para indicar fim de do proximo cliente -1 para indicar fim de do proximo cliente -1 para indicar fim de do proximo cliente -1 para indicar fim de do proximo cliente -1 para indicar fim de do proximo cliente -1 para indicar fim de Maior número de impulsos no mês : 657 Número de clientes com 657 no mês: Resolução do Desafio 6.6 program Desafio66; {Desafio 6.6} var Capital, Juros, Montante : real; 2 Periodo : integer; begin Readln(Capital); Readln(Juros); Periodo := 1; while Periodo <= 10 do begin Montante := Capital * ( 1 - juros)*Periodo; writeln(Montante); Periodo := Periodo + 1; end; if Montante > 9000 then writeln(' Investir') else writeln('Não investir'); end. Execução para Capital = 1000 e juros = 0,12 880 1760 2640 3520 4400 5280 6160 7040 7920 8800 Não investir Fim da resolução dos desafios do capítulo 6