APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Introdução à Computação
Estruturas de Repetição I
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Conteúdo
● Conceito e aplicação– O que são e para que servem as estruturas de
repetição.
● Ciclo Do ... Loop– Apresentação das diversas variantes deste ciclo.
Negação de expressões lógicas.– Exemplos de aplicação.
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Conceito
● A maioria das linguagens de programação têm instruções que permitem repetir blocos de instruções.
● De um modo genérico, um ciclo condicional será:– Sintaxe (geral)
enquanto <expressão lógica> <bloco de instruções>repetir
– Explicação● Se a expressão lógica for verdadeira, será executado o bloco de
instruções. Uma vez terminada a execução do bloco, volta-se a avaliar a expressão e o processo repete-se. Quando a expressão for falsa, passa-se à execução da instrução a seguir ao ciclo.
● Este tipo de ciclo pode não chegar a funcionar.
Condição de Funcionamento
Corpo do CicloV
F
Condição de Termo
Corpo do CicloF
V
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Diagramas de fluxo
enquanto <condição_funcionamento_verdadeira>...repetir
até <condição_termo_verdadeira>...repetir
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Sintaxe do ciclo Do...Loop
● Há quatro variantes deste ciclo. Comecemos pelo teste no início do ciclo.
– Do .. While .. Loop (DWL), com o teste da expressão lógica no início, funciona enquanto a expressão for verdadeiraDo while <expressão lógica>
<bloco de instruções>
Loop
– Do .. Until .. Loop (DUL), com o teste da expressão lógica no início, funciona até que a expressão seja verdadeiraDo until <expressão lógica> <bloco de instruções>
Loop Podem não funcionar uma única vez!
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Sintaxe do ciclo Do...Loop
● Vamos agora ver as versões com teste no fim do ciclo.– Do .. Loop .. While (DLW), com o teste da expressão lógica
no fim, funciona enquanto a expressão for verdadeiraDo
<bloco de instruções>
Loop while <expressão lógica>
– Do .. Loop .. Until (DLU), com o teste da expressão lógica no fim, funciona até que a expressão seja verdadeiraDo
<bloco de instruções>Loop until <expressão lógica>
Funcionam pelo menos uma vez!
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Exemplo de ciclo DUL
● Elabore um programa que leia um número e determine o resto da divisão por 9 ("noves fora") da soma dos algarismos que o compõem.
● Resolução:– Exemplo: 12345 -> 6
– Divisão de número inteiros: ● a mod b - calcula resto da divisão de a por b● a \ b - calcula quociente da divisão a por b
1+2+3+4+5 -> 1515 mod 9 -> 6
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Option Explicit Private Sub cmdCalc_Click() Dim n As Long, alg As Integer, s As Integer n = Abs(Val(txtNum.Text)) Do Until n = 0 alg = n Mod 10 s = s + alg n = n \ 10 Loop lblResto.Caption = s Mod 9End Sub
Resolução
txtNum - TextBox para introdução do número.
cmdcalc - CommandButton para executar o cálculo
lblResto - Label para apresentar o resultado
Pára quando n chegar a zero
Tem que se ir somando os algarismos à medida que são extraídos
Abs() calcula o módulo de um número e Val() converte o texto da TextBox para um valor numérico.
Extrai o algarismo mais à direita
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Execução passo a passo (Traçagem)
Iteração n s n = 0 alg234 0
1 False
4
0+4 -> 4
23
2 False
3
4+3 -> 7
2
3 False
2
7+2 -> 9
0
4 True
Teste com o valor 234
Private Sub cmdCalc_Click() Dim n As Long, alg As Integer Dim s As Integer n = Abs(Val(txtNum.Text)) Do Until n = 0 alg = n Mod 10 s = s + alg n = n \ 10 Loop txtResto.Text = s Mod 9End Sub
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Option Explicit Private Sub cmdCalc_Click() Dim n As Long, alg As Integer, s As Integer
n = Abs(Val(txtNum.Text))
Do While n <> 0 alg = n Mod 10 s = s + alg n = n \ 10 Loop lblResto.Caption = s Mod 9End Sub
Exemplo de ciclo DWLO mesmo problema podia ser resolvido com o ciclo DWL:
A única alteração no programa consiste em substituir o until por while e negar a expressão lógica.
Regras de negação:
Not(A And B) ⇔ Not(A) Or Not(B)
Not(A Or B) ⇔ Not(A) And Not(B)
Op. Neg.= <>
> <=
>= <
And Or
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Option Explicit Private Sub cmdCalc_Click() Dim n As Long, alg As Integer, s As Integer
n = Abs(Val(txtNum.Text))
Do alg = n Mod 10 s = s + alg n = n \ 10
Loop Until n = 0
lblResto.Caption = s Mod 9End Sub
Exemplo de ciclo DLU
O mesmo problema podia ser resolvido com o ciclo DLU:
Em relação ao DUL, a alteração consiste em mover a avaliação da expressão lógica para o fim do ciclo.
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Execução passo a passo
Iteração n s n = 0 alg
234 0
1 4
0+4 -> 4
23
False
2 3
4+3 -> 7
2
False
3 2
7+2 -> 9
0
True
Teste com o valor 234
Private Sub cmdCalc_Click() Dim n As Long, alg As Integer Dim s As Integer
n = Abs(Val(txtNum.Text))
Do alg = n Mod 10 s = s + alg n = n \ 10 Loop Until n = 0
txtResto.Text = s Mod 9End Sub
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Option Explicit Private Sub cmdCalc_Click() Dim n As Long, alg As Integer, s As Integer
n = Abs(Val(txtNum.Text))
Do alg = n Mod 10 s = s + alg n = n \ 10
Loop while n <> 0
txtResto.Text = s Mod 9End Sub
Exemplo de ciclo DLW
O mesmo problema podia ser resolvido com o ciclo DLW:
Desta vez a alteração no programa, em relação ao DLU, consiste em negar a expressão lógica.
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Selecção do ciclo adequado
● O exemplo apresentado podia ser resolvido de forma satisfatória por qualquer um dos ciclos. Nem sempre é assim.
● Há duas situações distintas:– O ciclo deve ser executado pelo menos uma vez.
● O teste é executado no fim do ciclo● DLW e DLU
– O ciclo pode não ser executado uma única vez● Teste no início do ciclo● DWL e DUL
● As est ruturas usando while e until são equivalentes, desde que a expressão lógica seja negada.
contador = valor_inicial Do While contador <= valor_final
'Corpo do Ciclo contador = contador + 1 Loop
Cuidados a ter:• Especificar a condição de
funcionamento do ciclo • Inicializar a variável contadora • Incluir no corpo do ciclo uma instrução
que incremente ou decremente a variável contadora.
Corpo do Ciclo
Contador = Valor_inicial
Contador = Contador + 1
Contador <=
Valor_final
Sim
Não
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Ciclos controlados por Contador
Corpo do Ciclo
Leitura de Valor
Leitura de Valor
Valor <> Sentinela
Sim
Não
• Nem sempre é possível conhecer à partida o número de vezes que o ciclo vai ser executado.
• Sentinela é um valor limite que assinala o fim de uma dada sequência de valores, mas que não está incluído nesse conjunto de valores.
• A selecção do valor sentinela é da responsabilidade do programador, devendo ser escolhido fora do intervalo possível de valores a introduzir
• O valor sentinela escolhido não deve ser passível de facilmente ocorrer por mero acidente.
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Ciclos controlados por Sentinela
Dim numero As Long numero = 0Do While numero <> 1
numero = InputBox("Digite o numero de identificação", "ISEP - Entrada de dados de alunos") If numero <> 1 Then lstbox1.AddItem numero
Loop
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Ciclos controlados por Sentinela
Exemplo
!"#$"%&'('&)*+(%)*"&,&-(./&)0
!"#$%&'($* 1*$&"+%/&*2#.3&2&"*&+*45(,45&"*+#+&./#*#*.6+&"#*'&*&,&+&./#)*2#./%'#)*.(
,%)/(7*
)&*$+,*1*$&"+%/&*&)$&2%8%2("*)&*(*,%)/(*9*#5*.:#*($"&)&./('(*'&*+(.&%"(*#"'&.('(7*
-'.$")+.+/$*1*$&"+%/&*2#./"#,("*(*8#"+(*'&*)&,&2;:#*'&*&,&+&./#)*'&./"#*'(*,%)/(0
< )=*9*$#))>-&,*)&,&22%#.("*5+*&,&+&./#
? 9 * $#))>-&, * )&,&22%#.(" * -@"%#) * &,&+&./#) * )%+5,/(.&(+&./&A * $"&))%#.(.'#
2('(*&,&+&./#
B 9*$#))>-&, *)&,&22%#.(" *-@"%#) *&,&+&./#) *)%+5,/(.&(+&./&A *5)(.'#*(* /&2,(
C3%8/
%&.'0(#*1*&)$&2%8%2(*45(,*#*.6+&"#*'&*2#,5.()*&+*45&*(*,%)/(*9*($"&)&./('(7
!"#$1(,+2**1*8#".&2&*#5*&)$&2%8%2(*45(,*#*>.'%2&*'#*%/&+*(2/5(,+&./&*)&,&22%#.('#*D#5*E?*2()#
.&.35+*&)/&F(G
C%./(H&0* #IF&2/#7J%)/K.'&H*LM*%.'%2&N
!"#$**1**$&"+%/&*(2&'&"*(#)*&,&+&./#)*'5+(*,%)/(A*45&"*$("(*#)*,&"A*45&"*$("(*#)*+#'%8%2("7
C%./(H&0* #IF&2/#7J%)/D%.'%2&G*LM*)/"%.ON
3+2$*E*$&"+%/&*#I/&"*#*&,&+&./#*(2/5(,+&./&*)&,&22%#.('#
C%./(H&0 -("%(-&,*M*#IF&2/#7P&H/*
!"#$%&'(#)"*+&,
Q)/(*85.;:#*$&"+%/&*($"&)&./("*5+(*+&.)(O&+*(#*5/%,%R('#"A*"&2#,3&.'#*(#*+&)+#*/&+$#
5+(*S)/"%.OT*2#./&.'#*(*)5(*"&)$#)/(7*U))%+A*(#*2#./"@"%#*'(*85.;:#*V)OW#H*D-&"*$@O%.(
)&O5%./&GA*&)/(*85.;:#*$"#'5R*5+*"&)5,/('#*'#*/%$#*)/"%.O*&*.:#*'#*/%$#*K./&O&"7*
Q)/(*85.;:#*2"%(*5+*#IF&2/#*2#+$#)/#*D5+(*SK.$5/*W#HTG*%.2,5%.'#*5+*2(%H(*'&*/&H/#*&*5+
,(I&,*'&./"#*'&*5+(*$&45&.(*F(.&,(7
!"
!"
A função inputbox permite apresentar uma mensagem ao utilizador, recolhendo ao mesmo tempo uma “string” contendo a sua resposta.
InputBox
Sintaxe: Variável = InputBox (mensagem, título, string_de_defeito, xpos, ypos)
Método que aplicado a lstbox1 provoca o acrescento duma linha com o conteúdo da variável número
Uso: permitir ler sequências de valores
Um método pode ser visto como uma função associada a um dado objecto. Essa função possibilita efectuar uma determinada acção sobre esse objecto.Sintaxe: objecto.método lista_de_parâmetros
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Métodos
Exemplos:
Move - tem como resultado a deslocação do objecto ou form, bastando para tal, que lhe seja fornecida a informação de qual a localização final desejada.
Sintaxe: Objecto.Move Left, Top, Width, Height
AddItem - adiciona uma linha a um objecto da classe ListBox.
Sintaxe: listbox.AddItem elemento[, posição]
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Exemplo - Sequência
● Enunciado:Elabore um programa que leia uma sequência de números terminada por zero. O programa deverá apresentar como resultado a média dos números introduzido, sem considerar o zero. Todos os números introduzidos devem ainda ser visualizados numa ListBox, com a excepção do zero.
● Vamos resolver o exercício de duas formas, recorrendo aos ciclos:
– DWL– DLU
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Resolução - Form
● ListBox – objecto que permite visualizar uma lista de elementos, um em cada linha.
lstNum – ListBox onde são colocados os números lidos.
lblMed – Label onde é visualizada a média.
InputBox para leitura dos números da sequência.
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Resolução DWL - CódigoOption ExplicitPrivate Sub cmdLer_Click() Dim num As Integer Dim c As Integer, s As Long lstNum.Clear num = Val(InputBox("Elemento nº 1[0 p/ terminar]"))
Do While num <> 0
lstNum.AddItem num s = s + num c = c + 1 num = Val(InputBox("Elemento nº " & (c + 1))) Loop If c <> 0 Then lblMed.Caption = s / c Else lblMed.Caption = "" MsgBox "Não há elementos a considerar!" End IfEnd Sub
Leitura do primeiro número, recorrendo a uma InputBox.
Enquanto o número for diferente de zero (sentinela). Se o primeiro for zero, não executa o ciclo.
Adiciona o número à ListBox lstNum
Leitura de cada um dos números seguintes, usando uma InputBox.
Ciclo controlado
por Sentinela
Evita uma divisão por zero caso não tenham sido lidos quaisquer números
O p e r a d o r d e concatenação de strings
Conta número de elementos lidos (não nulos).
APROGCivil
Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007
Resolução DLU - CódigoOption ExplicitPrivate Sub cmdLer_Click() Dim num As Integer, c As Integer, s As Long lstNum.Clear Do num = Val(InputBox("Elemento nº " & (c + 1)& "[0 p/ terminar] ")) If num <> 0 Then lstNum.AddItem num s = s + num c = c + 1 End If Loop Until num = 0
If c <> 0 Then lblMed.Caption = s / c Else lblMed.Caption = "" MsgBox "Não há elementos a considerar!" End IfEnd Sub
Limpa conteúdo anterior da ListBox.
Se o número for diferente de zero então adiciona-o e conta mais um elemento lido.
Executa o ciclo até que o valor lido seja 0.
Ciclo controlado
por Sentinela
Variante usando o ciclo DLU
Top Related