estruturas de repetição i - dei.isep.ipp.ptasilva/page14/page16/assets/teoricas aprog... · a...

22
APROG Civil Estruturas de Repetição I ISEP–DEI, Angelo Martins © 2006 ISEP-DEI, António Silva, © 2007 Introdução à Computação Estruturas de Repetição I

Upload: vuonghuong

Post on 03-Dec-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

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