Repetiçõeses
(Aula 4)
(Aula 4)
Uma das grandes vantagens da programa��o � que podemos agrupar c�lculos repetidos e informar ao computador atrav�s da linguagem de programa��o que trechos deve repetir, quantas vezes ou em que condi��es. Para entender melhor vamos resolver o seguinte problema.
Problema
Calcular e mostrar o quadrado de todos os n�mero inteiros de 1 at� 100
Solu��o
O problema de calcular o quadrado de um n�mero j� vimos na segunda aula. Seja N o n�mero e Q o seu quadrado, portanto Q=N*N.
Como seria a seq��ncia de procedimentos para calcular o quadrado dos primeiros 100 n�meros inteiros? Uma solu��o simples seria trocar o valor de N em todo momento, como mostra o algoritmo 1. Em vez de atribuir o valor de N em todo momento tamb�m podemos calcular somando 1 a seu valor anterior, como mostra o algoritmo 2.
Como seria a seq��ncia de procedimentos para calcular o quadrado dos primeiros 100 n�meros inteiros? Uma solu��o simples seria trocar o valor de N em todo momento, como mostra o algoritmo 1. Em vez de atribuir o valor de N em todo momento tamb�m podemos calcular somando 1 a seu valor anterior, como mostra o algoritmo 2.
| ---> |
|
Olhando os dois algoritmos vemos que o programa seria muito longo para calcular o quadrado dos 100 n�meros. Existe uma forma mais curta de dizer ao computador para resolver este problema? Olhando o algorimo 2 percebemos que a partir da linha 4 os comandos se repetem a cada tr�s linhas. Portanto pedimos ao computador simplesmente para repetir o seguinte trecho:
Adicionar 1 a N Calcular Q=N*N Mostrar Q |
Como resultado temos o algortimo 3 mostrado abaixo. Por�m existe um problema, precisamos indicar ao computador quantas vezes deve repetir o trecho. Uma forma de fazer isso � colocando uma condi��o. Neste caso a condi��o seria: repetir o trecho enquanto N for menor ou igual a 100 como est� escrito no algoritmo 4.
| ---> |
|
Observando o algoritmo 4 notamos que ainda tem linhas repetidas. Ser� poss�vel fazer ainda mais curto este algoritmo? Em algumas situa��es � poss�vel reduzir ao m�ximo o n�mero de linhas do algoritmo ou programa. Para isso vamos precisar um pouco de nossa criatividade e muitas vezes mais da experi�ncia. Voc� mesmo perceber� isso quando fizermos mais exerc�cios. Voltando ao nosso algoritmo, podemos fazer uma pequena altera��o no valor de N e eliminar as linhas 2 e 3. Se Inicializamos o N com zero, o quadrado de 1 poder� ser calculado dentro do bloco de repiti��o e teremos um algoritmo reduzido.
Algoritmo |
1. Atribuir N=0 2. Repetir enquando N <= 100 3. Adicionar 1 a N 4. Calcular Q=N*N 5. Mostrar Q |
No Pascal utilizamos Comando WHILE...DO para indicar ao computador que vamos repetir um trecho do programa enquanto uma condi��o for satisfeita. Vejamos como fica o algoritmo na linguagem Pascal.
Programa |
Program quadrados; Var N,Q: Integer; Begin N:=0; While(N <=100) do Begin N:=N+1; Q:=N*N; Writeln('o quadrado de ', N, 'eh', Q); End; End. |
Observando o programa vemos que al�m do While...Do aparecem outras duas palavras reservadas da linguagem que j� conhecemos: o Begin...End. Neste caso, estas palavras s�o utilizadas para informar ao computador onde come�a e acaba o trecho do programa que precisa ser repetido. O formato geral do comando WHILE � o seguinte:
WHILE condi��o DO BEGIN blocos de comandos END;
Entrada de dados
At� agora vimos uma forma de entrada de dados usando apenas atribu��o. Nesta aula vamos aprender uma outra forma de entrada de dados bastante utilizada. � muito trabalhoso ter que ir ao programa e mudar os valores dos dados cada vez que desejamos fazer c�lculos com novos dados. Por exemplo, no programa da m�dia temos que alterar os valores de N1, N2 e N3 se quisermos calcular a m�dia das notas de outro aluno. Ficaria mais f�cil se pud�ssemos informar isso durante a execu��o do programa. Cada vez que o programa precisar dos dados n�s fornecer�amos atrav�s do teclado. Para fazer isso em Pascal existe o comando chamadoReadln.
Este comando l� os dados do teclado quando n�s digitamos as letras e os n�meros. Por exemplo, se desejamos que o computador leia o valor de N1 do teclado, n�s escrevemos a seguinte linha:
Readln(N1);
Neste caso, o computador vai esperar que n�s digitemos o n�mero e apertemos a tecla ENTER para ler o n�mero.
Este comando l� os dados do teclado quando n�s digitamos as letras e os n�meros. Por exemplo, se desejamos que o computador leia o valor de N1 do teclado, n�s escrevemos a seguinte linha:
Readln(N1);
Neste caso, o computador vai esperar que n�s digitemos o n�mero e apertemos a tecla ENTER para ler o n�mero.
Como seria o programa da m�dia que l� as notas do teclado?
Para saber a resposta vamos alterar o programa da m�dia da aula anterior.
Programa |
Program resultado; Var N1,N2,N3 : Real; S, M : Real; Begin Readln(N1); Readln(N2); Readln(N3); S:=N1+N2+N3; M:=S/3; If(M >= 5) Then Writeln('aprovado') Else Writeln('reprovado'); End. |
Para treinar o que foi aprendido nesta aula vamos resolver um outro problema
Problema
A Bolsa de Valores de S�o Paulo tem um �ndice que mede o quanto a maioria das a��es vale, levando em conta a import�ncia relativa de cada empresa na bolsa. Esse �ndice e atualizado todos os dias.
O �ndice pode mudar devagar (1,5% ao dia, por exemplo) ou muito r�pido (3% ao dia seria muito r�pido). Voc� quer saber se o �ndice costuma "cair r�pido" mais do que "subir r�pido".
Fa�a um algoritmo que leia os percentuais de cada dia, e apenas para os dias em que o �ndice variou mais de 1%, conte ou "mais uma subida" ou "mais uma queda". O algoritmo termina quando o usu�rio entrar "-100".
Ao final da execu��o, o algoritmo deve mostrar o n�mero de subidas e quedas bruscas.
O �ndice pode mudar devagar (1,5% ao dia, por exemplo) ou muito r�pido (3% ao dia seria muito r�pido). Voc� quer saber se o �ndice costuma "cair r�pido" mais do que "subir r�pido".
Fa�a um algoritmo que leia os percentuais de cada dia, e apenas para os dias em que o �ndice variou mais de 1%, conte ou "mais uma subida" ou "mais uma queda". O algoritmo termina quando o usu�rio entrar "-100".
Ao final da execu��o, o algoritmo deve mostrar o n�mero de subidas e quedas bruscas.
Resposta:
Vamos supor que V seja o valor percentual das subidas ou quedas. Este valor vamos informar ao computador cada dia. Depois de v�rios dias, quando desejamos saber quantas quedas e subidas acima de 1% teve a bolsa, digitamos -100. Portanto o -100 � a condi��o para finalizar o c�lculo. Tamb�m precisamos guardar o n�mero de subidas e quedas, para tanto vamos utilizar as vari�veis Subidas e Quedas. O algoritmo seria o seguinte.
Algoritmo |
Subidas=0 Quedas=0 Leia V Enquanto V n�o for -100 Se V maior 1 ent�o Adicione 1 a Subidas Se V menor que -1 Adicione 1 a Quedas Leia V FimEnquanto |
O programa correspondente ao algoritmo � o seguinte:
Programa |
Program bolsa; Var V: real; Subidas, Quedas: integer; Begin Subidas := 0; Quedas := 0; While (V <> -100) do Begin Readln (v); If (V > 1) Then Subidas := Subidas + 1; If (V < -1) Then Quedas := Quedas + 1; End; writeln ('Dias em que o indice subiu: ', subidas); writeln ('Dias em que o indice caiu: ', quedas); end. |
Exerc�cios
- Voc� n�o ficou contente com o algoritmo para analisar o �ndice da bolsa de valores. Agora voc� quer saber tamb�m quanto, na m�dia, foi o percentual das mudan�as repentinas no �ndice. Modifique o programa anterior para que ele mostre o seguinte:
�ndice subiu muito : NNN vezes (em m�dia NN% a cada subida brusca)
�ndice caiu muito : NNN vezes (em m�dia NN% a cada queda brusca) - n�meros primos: se dice que um n�mero � primo se este � divisivel apenas por 1 e ele mesmo, por exemplo, 17 � um n�mero primo, enquanto o 15 n�o � primo, ja que � divisivel por 3 e 5. Os n�meros primos tem sido bastante usados na criptografia, por exemplo, para a transmiss�o mais segura de informa��es secretas. Imagina, por exemplo que desejamos transmitir pela internet uma mensagem contendo senha de acesso � conta do um banco, se enviamos sem codificar, existe a posibilidade de alguem interceptar a nossa mensagem e ficar sabendo nossa senha. Os n�meros primos s�o usados justamente para codificar uma mensagem e transmitir pela internet sem que outros possam desifrar o conteudo da mensagem. A vantagem de usar os n�meros primos se deve ao fato que � dif�cil saber se um n�mero grande (mais de 100 d�gitos) � primo ou n�o. Fa�a um algoritmo que tenha como entrada um n�mero N, e mostre os n�meros primos at� esse n�mero.
- Fa�a agora um algoritmo que, dados n�meros de zero at� um m�ximo, mostre a soma de todos os n�o-primos, subtra�da da soma dos primos.
- O fatorial de um n�mero N � o produto de todos os n�meros de 1 at� N. Por exemplo, o fatorial de 4 � 4x3x2x1 = 20. O computador sabe fazer as opera��es b�sicas, porem n�o sabe como calcular o fatorial de um n�mero. Fa�a um programa para o computador calcular o fatorial de N=10.
- Na aula anteior j� vimos como determinar se um n�mero � divisivel por outro. Fa�a um programa para calcular a soma de todos os n�meros inteiros menores que 100 e que n�o sejam divis�veis por 3.
As solu��es voce encontra aqui.
Algumas considera��es
- Os comandos IF e While podem ter mais de uma condi��o, unidos por OR ou AND. Por exemplo:
WHILE (N >0 AND N <100 ......="......" begin="begin" do="do" end="end" pre="pre">Isso significa que o bloco dentro do While sera repetido enquando o N for maior que 0 E menor que 100.
- Em um mesmo comando Readln podemos ler mais de um dado, por exemplo a leitura de dados no programa da media pode ser escrito ainda como:
Readln(N1,N2,N3);
- como calcular o resto de uma divis�o? No pascal existe um operador chamado mod, que calcula o resto de uma divis�o. Por exemplo:
10 mod 3 � igual a 1
O operador mod � util para saber se um n�mero � divisivel por outro. Por exemplo para saber se 50 � divisivel por 4, calculamos o 50 mod 4. Como o resultado e igual a 2, conclu�mos que 50 n�o � divisivel por 4. Para um n�mero ser divis�vel por outro, o resto da divis�o deve ser igual a zero
0 comentários:
Postar um comentário