Resolvendo vários problemas usando algoritmos
Seminário: Resolvendo vários problemas usando algoritmos. Pesquise 862.000+ trabalhos acadêmicosPor: • 25/11/2014 • Seminário • 2.476 Palavras (10 Páginas) • 505 Visualizações
ESTRUTURAS DE REPETIÇÃO
1.1 - Preliminares
Existem situações em que processar um valor uma única vez não satisfaz o problema, temos que trabalhar com a mesma informação várias vezes, no mesmo algoritmo.
O que vamos retratar nesta aula diz respeito as estruturas de repetição ENQUANTO, REPITA e PARA FAÇA as quais nos permitem executar um trecho de algoritmo quantas vezes se fizer necessário, manipulando assim a quantidade de informação necessária.
Para exemplificar-mos, suponha o seguinte algoritmo: Um clube tem a anotado a quantidade de latas de cerveja vendidas no último carnaval. Sabendo que cada lata foi vendida a 1.40, faça um algoritmo para saber o total arrecadado, no último carnaval com latas de cerveja.
Algoritmo Clube
Variáveis
Qtidade_lata : Inteira
Valor_total : Real
Inicio
Leia Qtidade_lata
Valor_total := Qtidade_lata*1.40
Escreva Valor_total
Fim
Ao observar-mos este algoritmo, conforme o enunciado ele está perfeito. Porém, se alterarmos o enunciado e pedirmos o valor arrecadado com latas de cerveja vendidas nos 3 últimos carnavais teríamos:
Algoritmo Clube
Variáveis
Qtidade_lata1, Qtidade_lata2, Qtidade_lata3 : Inteira
Valor_total : Real
Inicio
Leia Qtidade_lata1
Leia Qtidade_lata2
Leia Qtidade_lata3
Valor_total := Qtidade_lata*1.40
Escreva Valor_total
Fim
Imagine que fosse pedido o valor arrecadado com a venda de latas de cerveja dos 30 últimos carnavais! Teríamos que ter 30 instruções de leitura!? Assim, para que não tenhamos que passar este trabalho, vamos inserir neste capítulo as estruturas de repetição. Aliás, em programação, sempre que você estiver passando trabalho, "mão de obra ", pare e pense ou pesquise, com certeza existe uma maneira mais fácil de fazer.
1.2 - Enquanto Faça
Com o que estudamos até aqui, poderemos resolver vários problemas através de algoritmos, no entanto, existem situações impossíveis ou, causariam no mínimo, o dobro de trabalho para se resolver. Para que se torne mais claro vamos exemplificar.
ExeRes5.1 Fazer um algoritmo que leia o saldo bancário de um cliente e imprima CONTA ESTOURADA se o saldo for negativo e CONTA NORMAL se o saldo for positivo.
Algoritmo ExeRes5.1
VAR
saldo : Número
INÍCIO
Leia saldo
SE saldo < 0 ENTÃO
escreva 'CONTA ESTOURADA'
SEMÃO
escreva 'CONTA NORMAL'
FIM SE
FIM.
Este algoritmo resolveu o problema, no entanto, suponha o problema colocando 100, 1000, ou 10000 clientes, assim, teríamos que repetir este algoritmo (bloco de comandos) quantas vezes fosse o número de clientes. Para isto, existe um comando que repete quantas vezes for necessário um bloco de comandos dentro do seu algoritmo, sem que haja a necessidade de repetir várias vezes o mesmo bloco de comandos, esse comando é o ENQUANTO FAÇA.
Forma Geral do ENQUANTO FAÇA
ENQUANTO condição FAÇA
comando1
comando2
comando3
.
.
.
comandoN
FIM ENQUANTO
Assim como a estrutura de seleção SE tinha uma condição, aqui também temos uma condição.
A estrutura de seleção ENQUANTO FAÇA funciona da seguinte forma: É testada a condição, e desta só pode resultar dois valores possíveis: VERDADE ou FALSO. Se a condição for VERDADE o bloco de comando que está dentro do ENQUANTO é executado. Quando encontrado o FIM ENQUANTO ele retorna para o ENQUANTO e testa novamente a condição. Se a condição for VERDADE ele executa novamente o bloco de comando que está dentro do ENQUANTO, até encontrar o FIM ENQUANTO. Retorna novamente para testar a condição. Se a condição for VERDADE o processo se repete. Se a condição for FALSO ele executará a próxima instrução depois do FIM ENQUANTO.
Já podemos concluir que, se entrarmos no ENQUANTO, temos que tornar FALSO a condição.
No ExeRes5.1, tínhamos um bloco de comando que precisava ser executado N vezes dependendo do número de clientes. Vamos supor o bloco de comando:
Leia saldo
SE saldo < 0 ENTÃO
escreva 'CONTA ESTOURADA'
SENÃO
escreva 'CONTA NORMAL'
FIM SE
Suponha que o banco possua apenas três clientes. Significa temos que ler 3 saldos e verificar se eles são positivos ou negativos, e emitir a mensagem correspondente. Para este algoritmo podemos usar a estrutura de repetição ENQUANTO FAÇA.
Temos 4 maneiras de usar o ENQUANTO FAÇA que são:
Ø Usando um Contador
Ø Usando um FLAG
Ø Lendo o número de vezes a ser executado
Ø Usando um Tipo Lógico
1.2.1 Usando um Contador
O problema anterior pode ser resolvido, quando criamos uma nova variável que conte quantas vezes o bloco de comando foi executado, e esta variável também fará parte de nossa condição.
Assim, se queremos executar o bloco 3 vezes, vamos contar cada execução do bloco e paramos quando esta variável contadora chegar a 3. Veja o ExeRes5.2
Algoritmo ExeRes5.2
VAR
saldo : Número
contador : Número
INÍCIO
contador:= 0
ENQUANTO contador < 3 FAÇA
Leia saldo
SE saldo < 0 ENTÃO
escreva 'CONTA ESTOURADA'
SENÃO
escreva 'CONTA NORMAL'
FIM SE
contador:= contador + 1
FIM ENQUANTO
FIM.
ExeRes5.3 O que mudaria no caso de existir 66 contas ?
Algoritmo ExeRes5.3
VAR
saldo : Número
contador : Número
INÍCIO
contador:= 0
ENQUANTO contador < 66 FAÇA
Leia saldo
SE saldo < 0 ENTÃO
escreva 'CONTA ESTOURADA'
SENÃO
escreva 'CONTA NORMAL'
FIM SE
contador := contador + 1
FIM ENQUANTO
FIM.
Note que a única mudança ocorreu na condição do ENQUANTO foi que passou de 3 para 66.
O que mudaria no caso de existir 500 contas ?
Só teríamos que mudar na condição do ENQUANTO de 66 para 500
O que mudaria no caso de existir 1000 contas ?
Só teríamos que mudar na condição do ENQUANTO de 500 para 1000
O que mudaria no caso de existir 5000000 contas ?
Só teríamos que mudar na condição do ENQUANTO de 1000 para 5000000
No ExeRes5.4 vamos criar um algoritmo que leia o salário dos empregados da Empresa Pica-Pau e calcular a média salarial desta empresa. Para efeito didático suponhamos que esta empresa possua apenas 3 empregados.
Algoritmo ExeRes5.4
VAR
soma_dos_salarios,salario,media : Número
contador : Número
INÍCIO
soma_dos_salarios:= 0
contador:= 0
ENQUANTO contador < 3 FAÇA
leia salario
soma_dos_salarios:= soma_dos_salarios + salario
FIM ENQUANTO
media:= soma_dos_salarios/3
escreva 'média dos salários = ',media
FIM.
Entenda o teste de mesa! Suponha que os salários lidos sejam:
1000,3000,2000
soma_dos_salarios contador salario media
0 0 1000 2000
1000 1 3000
4000 2 2000
6000 3
Note que a estrutura do algoritmo continua a mesma:
Algoritmo ExeRes5.2
VAR
contador : Número
INÍCIO
contador:= 0
ENQUANTO contador < 3 FAÇA
bloco de comando a ser executado
contador:= contador + 1
FIM ENQUANTO
FIM.
A única novidade que surgiu é uma variável que acumulou todos os salários a variável SOMA_DOS_SALÁRIOS. Como se faz para calcular a média das 3 notas de uma determinada matéria.
Primeiro se soma as três notas e só depois é que dividimos por 3, que é a quantidade de notas. Assim:
(nota1 + nota2 + nota3)/3
O raciocínio usado é o mesmo para o algoritmo acima. Primeiro se acumulou todos os salários e só depois é que se achou a média dos salários. Tome muito cuidado pois o cálculo da média jamais seria dentro do enquanto, pois primeiro se acumula os salários e depois de sair do laço do enquanto é que se calcula a média.
1.2.2 Usando FLAG
Uma outra maneira de usar o ENQUANTO FAÇA seria usar um FLAG ou BANDEIRA. O que tínhamos antes era um contador que fazia com que a condição se tornasse FALSO. Agora nós vamos aprender um outro artifício que também torna falso o ENQUANTO FAÇA.
Veja os seguintes conceitos:
FLAG é uma informação igual a que se está lendo, no entanto, não será processada, apenas terá como objetivo tornar a condição do ENQUANTO FAÇA, FALSO.
Em outras palavras, FLAG será uma informação a ser lida que tornará a condição do ENQUANTO FAÇA FALSO.
O FLAG deve ser um valor ABSURDO e que seja do mesmo tipo dos dados a serem lidos.
Vamos resolver o exercício anterior usando FLAG.
ExeRes5.5 Suponha que os salários a serem lidos são: CR$ 1000,00, 3000,00, 2000,00. Assim, temos que ler, além dos dados que serão processados, um dado absurdo que terá como função parar de executar o ENQUANTO, i.é, sair do laço e prosseguir o fluxo do programa (próxima linha após o enquanto).
Qual o melhor FLAG neste caso? Se você respondeu um número negativo, está certo, pois é absurdo alguém ganhar menos alguma coisa. Vamos usar como FLAG o -1.
Algoritmo ExeRes5.5
VAR
soma_dos_salarios,salario,media : Número
INÍCIO
soma_dos_salarios:= 0
Leia salario
ENQUANTO salario <> -1 FAÇA
soma_dos_salarios:= soma_dos_salarios + salario
Leia salario
FIM ENQUANTO
media:= soma_dos_salarios/3
escreva 'média dos salários = ',media
FIM.
O teste de mesa ficaria:
soma_dos_salários
salário media
0 1000 2000
1000 3000
4000 2000
6000 -1
O que fizemos foi trocar um contador por um comando de leitura, a condição se tornará FALSO quando o dado de entrada for -1.
Alerta: Note que quando usamos um contador já sabemos o número fixo de dados que será digitado. Aqui não importa o número de dados a serem digitados, o algoritmo chega ao fim quando for digitado o FLAG -1.
Concluímos que este método é mais flexível que o anterior, pois, no outro devemos saber previamente o número de dados de entrada, enquanto que este não importa.
O algoritmo acima funciona se a quantidade de entradas for nenhuma?
O algoritmo acima funciona se a quantidade de entradas for 6?
O algoritmo acima funciona se a quantidade de entradas for 666?
O algoritmo acima funciona se a quantidade de entradas for 10000?
Funciona sem ter que alterar uma só vírgula, pois o que tornará a condição do ENQUANTO, FALSO será o valor -1. O algoritmo se tornou muito mais flexível.
Algumas perguntas que devem ainda ser respondidas. Por exemplo:
Se estamos lendo várias idades, qual seria o melhor FLAG ?
Se você respondeu um número negativo, muito bem, no entanto, poderia ser um número maior que 200 pois será difícil alguém viver mais que 200.
Se estamos lendo uma lista de nomes de pessoas, qual o melhor FLAG? Se você respondeu 'fim', 'flag', 'xxx' ou ‘sair’ você acertou, é isso aí, deve ser qualquer conjunto de caractere que não venha a ser o nome de uma pessoa, que seja um absurdo e que seja do mesmo tipo.
O FLAG acima poderia ser 16 por exemplo? Não, pois você está lendo um tipo caractere, que é o nome de uma pessoa, e está querendo ler numa variável caractere, tipo número, isso causaria um erro de tipos incompatíveis.
O inverso também não é possível, se estamos lendo uma série de números e querermos usar como FLAG 'fim', isto causaria um erro.
1.2.3 Lendo o Números de Vezes a ser Executado
Uma outra maneira de se resolver o algoritmo anterior é ler a quantidade de dados que o usuário irá digitar. Muitas das vezes em que vai se entrar com os dados, já se sabe de antemão a quantidade. Assim, esta informação pode também ser um dado que o usuário do seu algoritmo pode nos fornecer.
Este método é uma variação do primeiro, pois usa também um contador, a vantagem está em tornar o algoritmo mais flexível. No primeiro método, o usuário entraria com um número de dados já previamente estabelecido, neste o usuário vai informar a quantidade de dados que ele digitará. Veja a resolução do ExeRes5.6
Algoritmo ExeRes5.6
VAR
soma_dos_salarios,salario,media : Número
contador : Número
INÍCIO
soma_dos_salarios:= 0
contador:= 0
Leia N
ENQUANTO contador < N FAÇA
leia salario
soma_dos_salarios:= soma_dos_salarios + salario
FIM ENQUANTO
media:= soma_dos_salarios/3
escreva 'média dos salários = ',media
FIM.
Ocorrem duas mudanças do primeiro para este. Foi colocado um comando de leitura, o qual, o usuário digitará o número de dados que será digitado. Assim, se o usuário tiver 6 dados a serem digitados ele digitará 6 e o laço acontecerá 6 vezes.
Se o usuário tiver 1000 dados a serem digitados ele digitará 1000 e o laço acontecerá 1000 vezes, e assim por diante. A segunda mudança ocorreu na condição do ENQUANTO, que antes era 3 passou agora para aquele valor que o usuário digitar (N). Então, a condição se tornará FALSO quando o contador chegar a N.
Analise o teste de mesa. Suponha que quando for lido o valor de N o usuário digite 3, então, o laço acontecerá 3 vezes. Dentro do laço tem outro comando de leitura que vai ler os salários.
Obviamente, se o usuário digitou para o valor de N 3 ele terá que digitar 3 salários, pois ocorrerá o comando de leitura de salários 3 vezes.
Suponha que os salários lidos sejam: CR$ 1000,00, CR$ 3000,00, CR$ 2000,00
soma_dos_salários contador salário media N
0 1 1000 2000
1000 2 3000
4000 3 2000
6000
1.2.4 - Usando um Tipo Lógico
O uso do tipo lógico como teste da condição do ENQUANTO tem aplicações específicas, no entanto isso não impede que ele seja usado a qualquer momento, só depende de quem for usar.
Pense e responda: qual a resposta que SEMPRE vai resultar do teste de uma condição?
Muito bem: VERDADE ou FALSO
Agora responda: Existe um tipo que armazena somente VERDADE ou FALSO?
Sim, é o tipo Lógico! Então o que aconteceria se fosse declarado uma variável do tipo lógica e lhe fosse atribuída um valor verdadeiro e colocasse essa variável como condição ???
Melhor, veja o ExeRes5.7
Algoritmo ExeRes5.7
VAR
teste : lógica
INICIO
teste:= verdade
ENQUANTO teste FAÇA
escreva 'ETERNO'
FIM ENQUANTO
FIM.
O que acontecerá é que o algoritmo entrará em LOOP, i. é, ficará sempre dentro do ENQUANTO (laço) e não sairá mais.
Você já deve ter concluído que para sair do laço temos que tornar a variável teste FALSO, do contrário ele ficará escrevendo ETERNO eternamente.
Veja uma aplicação do ENQUANTO usando uma variável lógica. No capítulo passado fizemos um algoritmo que mostrava um menu na tela e pedia qual o tipo de operação a ser feita e então calculava.
No entanto, se quiséssemos fazer uma nova operação tínhamos que executar o algoritmo novamente. Usando o ENQUANTO vamos criar mais uma opção que fará a condição do enquanto se tornar falso. Execute o algoritmo ExeRes5.8
Algoritmo ExeRes5.8
VAR
a,b,resultado : Número
chave : lógica
escolha : caractere
INÍCIO
chave:= verdade
ENQUANTO chave FAÇA
escreva 'ESTE ALGORITMO CALCULA O RESULTADO DE'
escreva 'OPERAÇÕES MATEMÁTICAS SOBRE DOIS VALORES'
escreva 'Entre com o primeiro valor - '
leia a
escreva 'Entre com o segundo valor - '
leia b
escreva 'Escolha uma das seguintes opções '
escreva '+ Soma os dois valores'
escreva '- Subtraem o segundo valor do primeiro valor'
escreva '* Multiplica os dois valores'
escreva '/ Divide o primeiro valor pelo segundo valor'
escreva 'F Para finalizar o Algoritmo'
escreva 'Entre com a opção -'
leia escolha
CASO escolha DE
'+' : resultado:= a + b
escreva 'O resultado e ',resultado:10:2)
'-' : resultado:= a - b
escreva 'O resultado e ',resultado:10:2)
'*' : resultado:= a * b
escreva 'O resultado e ',resultado:10:2)
'/' : resultado:= a / b
escreva 'O resultado e ',resultado:10:2)
'F' : chave:= falso
SENÃO
escreva 'Sua opção foi indefinida'
FIM CASO
FimEnquanto
ESTE ALGORITMO CALCULA O RESULTADO DE
OPERAÇÕES MATEMÁTICAS SOBRE DOIS VALORES
Entre com o primeiro valor - ###
Entre com o segundo valor - ###
Escolha uma das seguintes opções
+ Soma os dois valores
- Subtraem o segundo valor do primeiro valor
* Multiplica os dois valores
/ Divide o primeiro valor pelo segundo valor
F Para finalizar
Entre com a opção
O resultado é @@@@@
FIM do ALGORITMO
# - valores lidos (Entrada)
@ - resultado obtido pelo algoritmo (Saída)
O que acontecerá é que ENQUANTO não for digitado a tecla F a variável lógica CHAVE nunca se tornará falso e conseqüentemente nunca sairá do algoritmo. Então quando o usuário quiser sair do algoritmo terá que digitar F para poder executar o comando chave:= falso.
VOLTAR PARA SUMÁRIO PRÓXIMO TÓPICO
...