introdução à computação - dei.isep.ipp.ptasilva/page14/page16/assets/teoricas aprog... ·...

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

Upload: phungphuc

Post on 11-Jan-2019

224 views

Category:

Documents


0 download

TRANSCRIPT

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Introdução à Computação

Estruturas de Repetição II

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Conteúdo

● Ciclo For ... Next– Apresentação da sintaxe e de exemplos deste ciclo.

● Validação de entrada de dados– Apresentação de dois algoritmos de validação de entrada de

dados através de InputBox.● Ciclos encadeados

– Exemplos de aplicação com ciclos encadeados.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Ciclo For … Next

● A estrutura FOR...NEXT permite construir de uma forma compacta ciclos que percorrem o conjunto de valores de um intervalo predefinido.

– Sintaxe (geral)Para <variável> = <valor inicial> até <valor final> <bloco de instruções>Próximo valor <variável>

– Explicação● A variável de controlo do ciclo vai percorrer o intervalo de valores

compreendidos entre o valor inicial e o valor final. ● O ciclo termina quando o valor dessa variável ultrapassar o valor

final (num ciclo crescente). ● A variável de controlo do ciclo deve ser do tipo integer e o seu

incremento (ou decremento) tem que ser um valor inteiro.

Ciclos controlados por contador

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Sintaxe do ciclo For … Next

● Há duas variantes deste ciclo.– Ciclo com incremento unitário

For <variável> = <val_inicial> To <val_final> <bloco de instruções>Next

– Ciclo com incremento definido pelo programador (positivo ou negativo)For <variável> = <val_inicial> To <val_final> Step <valor> <bloco de instruções>

Next Em ambos os casos:• o incremento ou decremento da

variável de controle do ciclo é automático.

• A condição de funcionamento do ciclo é implícita.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Exemplo de aplicação

● Elabore um programa que leia uma sequência de N números inteiros, em que N é dado pelo utilizador. O programa deverá apresentar a média dos números introduzidos. Deverá ainda apresentar cada um dos números lidos.

● Sugestão:– Como o número de elementos a ler é antecipadamente

conhecido (neste caso, dado pelo utilizador) pode ser utilizado um ciclo For.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Resolução - Form

txtNE - TextBox para introdução do número de elementos a ler

InputBox para leitura dos elementos

lstNUm - ListBox para apresentar os números lidoslblMed

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Resolução - Código

Option ExplicitPrivate Sub cmdLer_Click() Dim ne As Integer, x As Integer, s As Long, num As Integer lstNum.Clear lblMed.Caption = "" ne = Val(txtNE.Text) If ne <= 0 Then MsgBox "Não há elementos a considerar!“, vbCritical Else

For x = 1 To ne

num = Val(InputBox("Elemento nº " & x)) lstNum.AddItem num s = s + num Next

lblMed.Caption = s / neEnd If

End Sub

Leitura e validação do número de elementos da sequência.

Termina quando x ultrapassar o valor de ne

Incrementa x e volta ao início do ciclo.A variável

de controlo não pode ser

alterada dentro do ciclo!

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Execução passo a passo

Iteração ne x x <= ne num s

3 0 0 0

1 1 True

2

0+2 -> 2

2 2 True

3

2+3 -> 5

3 3 True

4

5+4 -> 9

4 4 False

Teste com sequência de 3 elementos: 2,3,4

...ne = Val(txtNE.Text)If ne <= 0 Then MsgBox "Não há...Else

For x = 1 To ne num = Val(InputBox...) lstNum.AddItem num s = s + num

NextEnd if...

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Ciclos encadeados

● Elabore um programa que apresente numa ListBox todos as capicuas existentes num intervalo dado pelo utilizador (os limites do intervalo devem ser validados).

● Resolução– Um número é capicua se for idêntico à sequência dos seu

algarismos, por ordem inversa.

– É preciso verificar se cada um dos números do intervalo é capicua.

((((0*10+5)*10+4)*10+3)*10+2)*10+1 -> 54321

12345 <> 54321 => não é capicua!

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Resolução - Form

Option Explicit

Private Sub cmdSair_Click() EndEnd Sub

lstCap – ListBox com as capicuas do intervalo

txtInf e txtSup – TextBoxes com limite inferior e superior

MsgBox com a mensagem de erro no intervalo.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil

Private Sub cmdProc_Click() Dim num As Long, aux As Long, cap As Long, alg As Integer Dim inf As Long, sup As Long lstCap.Clear inf = Val(txtInf.Text) sup = Val(txtSup.Text) If inf < 0 Or inf > sup Then MsgBox "Atenção: Intervalo errado!", vbCritical

Else

For num = inf To sup aux = num cap = 0 Do While aux <> 0

alg = aux Mod 10 aux = aux \ 10 cap = cap * 10 + alg

Loop

If cap = num Then lstCap.AddItem cap End If

Next End If

End Sub

Resolução - Código

Leitura e validação dos limites do intervalo

É calculado o “inverso” de cada número do intervalo.

Se o número for igual ao inverso então é capicua.

Cada número é copiado para aux de forma a ser processado sem afectar o valor de num

A variável de controle (v.c.) do ciclo num foi também usada para guardar os sucessivos valores a processar. Fizeram-se coincidir os limites da gama a processar com os valores inicial e final a assumir pela v.c. do ciclo.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Resolução - Traçagem

Iteração alg aux cap aux <> 00 121 0

1 TRUE

1

12

1

2 TRUE

2

1

12

3 TRUE

1

0

121

4 FALSE

aux = numcap = 0Do While aux <> 0

alg = aux Mod 10 aux = aux \ 10 cap = cap * 10 + alg

Loop

Teste com num = 121

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Validação de entrada de dados

● Problema:– Pretende-se validar os dados introduzidos pelo utilizador

durante um ciclo, através de InputBoxes. Caso os dados estejam errados, o utilizador deve voltar a introduzi-los.

● Solução– Utiliza-se um ciclo para controlar a entrada de dados. Há

duas abordagens possíveis:● Ciclo DLU / DLW

– A leitura é feita dentro do ciclo.● Ciclo DWL / DUL

– A primeira leitura é feita fora do ciclo. Só entra no ciclo se o valor lido estiver errado.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Validação - Exemplo

● Exemplo: leitura de notas entre 0 e 20– DLU

– DWL

Do

nota = Val(InputBox("Nota nº " & x))

Loop Until nota >= 0 And nota <= 20

A InputBox informa também o utilizador do erro.

O ciclo só termina quando a nota for válida.

nota = Val(InputBox("Nota nº " & x))

Do While nota < 0 Or nota > 20

nota = Val(InputBox(“Erro: Introduza novamente “ _ & “ a nota nº " & x))

Loop

O ciclo só é executado se a nota for inválida.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Exemplo de aplicação

● Elabore um programa que leia as notas dos alunos de uma disciplina (número de alunos dado pelo utilizador) e apresente a média das notas e a melhor e a pior nota. Devem também ser apresentadas numa ListBox todas as notas lidas.

● Notas para a resolução:– O número de alunos deve ser validado (>0)– Como o número de alunos é conhecido, pode utilizar-se um

ciclo For para leitura das notas. Para cada nota usa-se um ciclo para validar a nota (entre 0 e 20).

– A leitura das notas é efectuada através de uma InputBox.– Para cada nota lida, verificar se é menor do que a pior ou

maior do que a melhor.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Resolução - Form

MsgBox com a mensagem de erro de Nº de alunos inválido.

InputBox para intrudução de cada uma das notas.

TextBox para introdução do Número de alunos.

L i s t B o x p a r a apresentar as notas

3 Label para apresentar resultados.

botão cmdLer ao qual se associa o programa

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Resolução – Código (I)

Option Explicit

Private Sub cmdSair_Click() EndEnd Sub

Private Sub cmdLer_Click() Dim na As Integer, nota As Integer, soma As Integer Dim max As Integer, min As Integer, x As Integer na = Val(txtNA.Text)

If na <= 0 Then MsgBox "Erro: Número de alunos inválido!" Else

soma = 0

max = -1 ' valores iniciais min = 21

' continua ....

Comentário

Os valores iniciais devem, neste caso, ser impossíveis. Assim, na primeira iteração são de certeza alterados.

Variáveis para a melhor e pior notas até ao momento.

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Resolução – Código (cont.)

For x = 1 To nanota = Val(InputBox("Nota nº " & x))

Do While nota < 0 Or nota > 20 nota = Val(InputBox("Nota inválida! - Nota nº " & x)) Loop

lstNotas.AddItem Format(x, "00") & " - " & nota soma = soma + nota

If nota > max Then ' compara com melhor anterior max = nota End If

If nota < min Then ' compara com pior anterior min = nota End If

Next lblMed.Caption = soma / na ' calcula a média das notas lblMelhor.Caption = max lblPior.Caption = min End If

End Sub

Ciclo interior para validação da nota.

Se a nota é maior do que o máximo actual passa a ser o novo máximo.

Se a nota é menor do que o mínimo actual passa a ser o novo mínimo.

Ciclo

exte

rior

A função Format permite formatar o resultado de uma expressão de acordo com as instruções contidas numa “string” de formatação.

Sintaxe: Format (expressão, string_de_formatação)

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Formatação de saída de dados

Formatos especificados pelo programador - Símbolos utilizados0 Localizador de dígitos Mostra um dígito ou um zero

# Localizador de dígitos Mostra um dígito ou nada

. Separador decimal

, Separador dos milhares

% Localizador de percentagem Resultado da expressão multiplicado por 100, com % na posição especificada

Consultar pag. 22 e 23 da sebenta

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Formatação de saída de dados

Formatos standardGeneral Number Número sem separador dos milhares

Fixed Nº c/ pelo menos 1 dígito à esquerda e 2 à direita do ponto dec.Standard Como o Fixed mas com separador dos milharesPercent Multiplica o valor por 100 e acrescenta símbolo %

Scientific Usa notação científica padrãoCurrency Formato monetário

> Passa todos os caracteres para maiúsculas< Passa todos os caracteres para minúsculas

O que é pedido O que é mostradomeuTexto = Format(256.3, “###0.000”) 256.3meuTexto = Format(3256.3, “fixed”) 3256.30meuTexto = Format(0.125, “#.0000”) 0.1250

meuTexto = Format(14.3256, “000.0”) 014.3meuTexto = Format(“Olá”, “>”) OLÁ

Exemplos

Estruturas de Repetição II ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007

APROGCivil Conclusão

● Estudamos dois ciclos:– Do … Loop

● 4 variantes – DWL, DUL, DLW, DLU● Pode ser utilizado em qualquer situação.

– For … Next● 2 variantes – ciclo crescente e decrescente● Só pode ser aplicado a intervalos de valores.● Os limites do intervalo têm que ser numéricos, inteiros e constantes.● O incremento tem que ser constante.

● Introduzimos o conceito de padrão– O que permite agilizar a resolução de problemas,

identificando blocos conhecidos que se repetem frequentemente em problemas.