none
Loop RRS feed

  • Pergunta

  • Olá,

    Gostaria da ajuda de vocês pra resolver um problema. É o seguinte:

    Estou desenvolvendo uma ferramenta na qual quero fazer um loop, a variável é o valor de x1, ela varia de 0,01 até h1 (h1 é um dado de entrada) incrementando 0,01 a cada tentativa, para cada valor de x1 são feitos algumas equações e resultam em um valor de R1, o critério a ser atendido é quando R1 for igual a zero.

    Gostaria de saber quais funções são aplicáveis ao meu problema, pelo que andei lendo, posso utilizar o For Each para o loop, abaixo um rascunho do que pensei, mas ainda não obtive sucesso.

                Dim list As Integer
                For x1 = 0.01 To h1.Text
                    For Each x1 As Decimal In list
                        '----equações que dependem de x1
                        Dim d11 = Val(h1.Text) - Val(cinf.Text) - x1
                        Dim d21 = x1 - Val(csup.Text)
                        Dim dn1 = (Val(h1.Text) / 2) - x1
                        Dim Sel1 = st1 - (Val(hm1.Text) * Val(ainf.Text) * d11) + (Val(hm1.Text) * Val(asup.Text) * d21)
                        Dim Iel1 = it1 + (Val(hm1.Text) * Val(ainf.Text) * (d11 ^ 2)) + (Val(hm1.Text) * Val(asup.Text) * (d21 ^ 2))
                        Dim No1 = (Val(aton.Text) / Sel1)
                        Dim Mo1 = (((Val(atom.Text) * 100) - (Val(aton.Text) * dn1)) / Iel1)
                        Dim R1 = ABS((No1 - Mo1)*1000)
                        '---- fim das equações, o valor a ser comparado é R1
                        Continue For
                        R1 > 0
                        Exit For
                        R1 = 0

    Abraço.


    terça-feira, 20 de outubro de 2015 16:14

Respostas

  • Renantxr, pelo que entendi deveria ficar algo assim (usando seu esboço):

    Dim Limit As Double = CDbl(h1.Text) 'imagino que "h1" seja um TextBox?
    Dim Aux1 As Double = 0.00 'apenas uma variavel termporária
    Dim Aux2 As Double = 0.00 'outra - aparentemente você precisa muito...
    For x1 = 0.01 As Double = 0.01 To Limit  Step 0.01
            Dim d11 As Double = CDbl(h1.Text) - CDbl(cinf.Text) - x1
    	Dim d21 As Double = x1 - CDbl(csup.Text)
    	Dim dn1 As Double = (Limit / 2) - x1
    	Aux1 = CDbl(hm1.Text)
    	Aux2 = Aux1 * CDbl(asup.Text)
    	Aux1 *= CDbl(ainf.Text) 'evitanto as divesar conversões CDbl() ou Val()...
    	Dim Sel1 As Double = st1 - (Aux1 * d11) + (Aux2 * d21) '"st1" não sei de onde veio!
    	Dim Iel1 As Double = it1 + (Aux1 * (d11 ^ 2)) + (Aux2 * (d21 ^ 2))
    	Aux1 = CDbl(aton.Text) 'isso porquê você colocou 2 atom (um com "n" e outro com "m")
    	Aux2 = CDbl(atom.Text) 'por isso não sei se é erro de digitação ou são 2 mesmo...
    	Dim No1 As Double = Aux1 / Sel1
    	Dim Mo1 As Double = ((Aux2 * 100) - (Aux1 * dn1)) / Iel1
    	Dim R1 = ABS((No1 - Mo1) * 1000)
    	If R1 = 0 Then
    	    '... qualquer coisa.... o For fará continue de qualquer jeito
    	Else
    	    Exit For 'Exit no zero? não entendi se era no zero ou quando não zero...
    	End If
    Next x1

    • Sugerido como Resposta SammuelMiranda terça-feira, 20 de outubro de 2015 18:15
    • Marcado como Resposta Marcos SJ terça-feira, 20 de outubro de 2015 18:24
    • Editado SammuelMiranda quarta-feira, 21 de outubro de 2015 10:24 Formatação... identação
    terça-feira, 20 de outubro de 2015 16:32

Todas as Respostas

  • Renantxr, pelo que entendi deveria ficar algo assim (usando seu esboço):

    Dim Limit As Double = CDbl(h1.Text) 'imagino que "h1" seja um TextBox?
    Dim Aux1 As Double = 0.00 'apenas uma variavel termporária
    Dim Aux2 As Double = 0.00 'outra - aparentemente você precisa muito...
    For x1 = 0.01 As Double = 0.01 To Limit  Step 0.01
            Dim d11 As Double = CDbl(h1.Text) - CDbl(cinf.Text) - x1
    	Dim d21 As Double = x1 - CDbl(csup.Text)
    	Dim dn1 As Double = (Limit / 2) - x1
    	Aux1 = CDbl(hm1.Text)
    	Aux2 = Aux1 * CDbl(asup.Text)
    	Aux1 *= CDbl(ainf.Text) 'evitanto as divesar conversões CDbl() ou Val()...
    	Dim Sel1 As Double = st1 - (Aux1 * d11) + (Aux2 * d21) '"st1" não sei de onde veio!
    	Dim Iel1 As Double = it1 + (Aux1 * (d11 ^ 2)) + (Aux2 * (d21 ^ 2))
    	Aux1 = CDbl(aton.Text) 'isso porquê você colocou 2 atom (um com "n" e outro com "m")
    	Aux2 = CDbl(atom.Text) 'por isso não sei se é erro de digitação ou são 2 mesmo...
    	Dim No1 As Double = Aux1 / Sel1
    	Dim Mo1 As Double = ((Aux2 * 100) - (Aux1 * dn1)) / Iel1
    	Dim R1 = ABS((No1 - Mo1) * 1000)
    	If R1 = 0 Then
    	    '... qualquer coisa.... o For fará continue de qualquer jeito
    	Else
    	    Exit For 'Exit no zero? não entendi se era no zero ou quando não zero...
    	End If
    Next x1

    • Sugerido como Resposta SammuelMiranda terça-feira, 20 de outubro de 2015 18:15
    • Marcado como Resposta Marcos SJ terça-feira, 20 de outubro de 2015 18:24
    • Editado SammuelMiranda quarta-feira, 21 de outubro de 2015 10:24 Formatação... identação
    terça-feira, 20 de outubro de 2015 16:32
  • Samuel,

    Aquelas variáveis necessitam ficar antes do For Each?

    A ideia é mostrar o valor de x1 obtido no TextBox ln.text

    Omiti algumas partes para não ficar muito extenso, a programação inteira é a listada abaixo, que não consegui deixar funcionando:

    Private Sub calcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calcular.Click ea.Text = 210000 ec.Text = 5600 * (fck.Text) ^ (1 / 2) n.Text = ea.Text / ec.Text Dim Limit As Double = CDbl(h1.Text) For x1 = 0.01 As Double = 0.01 To Limit Step 0.01 Dim delta = x1 / 20 Dim h3 = (CDbl(h1.Text) / ((CDbl(h1.Text) / 0.01) - 1)) / 3 Dim b = CDbl(b1.Text) Dim n1 = 0 Dim n2 = delta Dim n3 = n2 + delta Dim n4 = n3 + delta Dim n5 = n4 + delta Dim n6 = n5 + delta Dim n7 = n6 + delta Dim n8 = n7 + delta Dim n9 = n8 + delta Dim n10 = n9 + delta Dim n11 = n10 + delta Dim n12 = n11 + delta Dim n13 = n12 + delta Dim n14 = n13 + delta Dim n15 = n14 + delta Dim n16 = n15 + delta Dim n17 = n16 + delta Dim n18 = n17 + delta Dim n19 = n18 + delta Dim n20 = n19 + delta Dim n21 = n20 + delta Dim a1 = (1 * b * h3) / 20 Dim a2 = (4 * b * h3) / 20 Dim a3 = (2 * b * h3) / 20 Dim a4 = (4 * b * h3) / 20 Dim a5 = (2 * b * h3) / 20 Dim a6 = (4 * b * h3) / 20 Dim a7 = (2 * b * h3) / 20 Dim a8 = (4 * b * h3) / 20 Dim a9 = (2 * b * h3) / 20 Dim a10 = (4 * b * h3) / 20 Dim a11 = (2 * b * h3) / 20 Dim a12 = (4 * b * h3) / 20 Dim a13 = (2 * b * h3) / 20 Dim a14 = (4 * b * h3) / 20 Dim a15 = (2 * b * h3) / 20 Dim a16 = (4 * b * h3) / 20 Dim a17 = (2 * b * h3) / 20 Dim a18 = (4 * b * h3) / 20 Dim a19 = (2 * b * h3) / 20 Dim a20 = (4 * b * h3) / 20 Dim a21 = (1 * b * h3) / 20 Dim s1 = (n1 * 1 * b * h3) / 20 Dim s2 = (n2 * 4 * b * h3) / 20 Dim s3 = (n3 * 2 * b * h3) / 20 Dim s4 = (n4 * 4 * b * h3) / 20 Dim s5 = (n5 * 2 * b * h3) / 20 Dim s6 = (n6 * 4 * b * h3) / 20 Dim s7 = (n7 * 2 * b * h3) / 20 Dim s8 = (n8 * 4 * b * h3) / 20 Dim s9 = (n9 * 2 * b * h3) / 20 Dim s10 = (n10 * 4 * b * h3) / 20 Dim s11 = (n11 * 2 * b * h3) / 20 Dim s12 = (n12 * 4 * b * h3) / 20 Dim s13 = (n13 * 2 * b * h3) / 20 Dim s14 = (n14 * 4 * b * h3) / 20 Dim s15 = (n15 * 2 * b * h3) / 20 Dim s16 = (n16 * 4 * b * h3) / 20 Dim s17 = (n17 * 2 * b * h3) / 20 Dim s18 = (n18 * 4 * b * h3) / 20 Dim s19 = (n19 * 2 * b * h3) / 20 Dim s20 = (n20 * 4 * b * h3) / 20 Dim s21 = (n21 * 1 * b * h3) / 20 Dim i1 = (n1 ^ 2 * 1 * b * h3) / 20 Dim i2 = (n2 ^ 2 * 4 * b * h3) / 20 Dim i3 = (n3 ^ 2 * 2 * b * h3) / 20 Dim i4 = (n4 ^ 2 * 4 * b * h3) / 20 Dim i5 = (n5 ^ 2 * 2 * b * h3) / 20 Dim i6 = (n6 ^ 2 * 4 * b * h3) / 20 Dim i7 = (n7 ^ 2 * 2 * b * h3) / 20 Dim i8 = (n8 ^ 2 * 4 * b * h3) / 20 Dim i9 = (n9 ^ 2 * 2 * b * h3) / 20 Dim i10 = (n10 ^ 2 * 4 * b * h3) / 20 Dim i11 = (n11 ^ 2 * 2 * b * h3) / 20 Dim i12 = (n12 ^ 2 * 4 * b * h3) / 20 Dim i13 = (n13 ^ 2 * 2 * b * h3) / 20 Dim i14 = (n14 ^ 2 * 4 * b * h3) / 20 Dim i15 = (n15 ^ 2 * 2 * b * h3) / 20 Dim i16 = (n16 ^ 2 * 4 * b * h3) / 20 Dim i17 = (n17 ^ 2 * 2 * b * h3) / 20 Dim i18 = (n18 ^ 2 * 4 * b * h3) / 20 Dim i19 = (n19 ^ 2 * 2 * b * h3) / 20 Dim i20 = (n20 ^ 2 * 4 * b * h3) / 20 Dim i21 = (n21 ^ 2 * 1 * b * h3) / 20 Dim at1 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21 Dim st1 = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 + s16 + s17 + s18 + s19 + s20 + s21 Dim it1 = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12 + i13 + i14 + i15 + i16 + i17 + i18 + i19 + i20 + i21 Dim d11 = CDbl(h1.Text) - CDbl(cinf.Text) - x1 Dim d21 = x1 - CDbl(csup.Text) Dim dp1 = 0 Dim dn1 = (CDbl(h1.Text) / 2) - x1 Dim Sel1 = st1 - (CDbl(n.Text) * CDbl(ainf.Text) * d11) + (CDbl(n.Text) * CDbl(asup.Text) * d21) Dim Iel1 = it1 + (CDbl(n.Text) * CDbl(ainf.Text) * (d11 ^ 2)) + (CDbl(n.Text) * CDbl(asup.Text) * (d21 ^ 2)) Dim No1 = (CDbl(Nd.Text) / Sel1) Dim Mo1 = (((CDbl(Md.Text) * 100) - (CDbl(Nd.Text) * dn1)) / Iel1) Dim R1 = ((No1 - Mo1) * 1000) If R1 = 0 Then Else Exit For End If Next x1

    ln.text = x1 End Sub


    quinta-feira, 22 de outubro de 2015 04:35
  • Veja, escrevi como função. Os argumentos "ByRef" vão retornar valores para os TextBoxes, os "ByVal" não, são so leitura. Fiz 2 funções, uma próxima ao que você escreveu, a outra "otimizada". Pelo que entendi, no final você quer o "ln" com valor do último "x1" feito. O problema é que "x1" deixa de existir ao final do laço "FOR". Assim fica:

    Função "igual":

    Private Function CalcularAsIs(ByRef EA As Double, ByRef EC As Double, ByRef N As Double, ByVal FCK As Double, ByVal H1 As Double, ByVal B1 As Double, ByVal CINF As Double, ByVal CSUP As Double, ByVal AINF As Double, ByVal ASUP As Double, ByVal MD As Double, ByVal ND As Double) As Double
            EA = 210000
            EC = 5600 * FCK ^ (1 / 2)
            N = EA / EC
            Dim Result As Double = 0
            For x1 As Double = 0.01 To H1 Step 0.01
                Dim delta As Double = x1 / 20
                Dim h3 As Double = (H1 / ((H1 / 0.01) - 1)) / 3
                Dim b As Double = B1
                Dim n1 As Double = 0
                Dim n2 As Double = delta
                Dim n3 As Double = n2 + delta
                Dim n4 As Double = n3 + delta
                Dim n5 As Double = n4 + delta
                Dim n6 As Double = n5 + delta
                Dim n7 As Double = n6 + delta
                Dim n8 As Double = n7 + delta
                Dim n9 As Double = n8 + delta
                Dim n10 As Double = n9 + delta
                Dim n11 As Double = n10 + delta
                Dim n12 As Double = n11 + delta
                Dim n13 As Double = n12 + delta
                Dim n14 As Double = n13 + delta
                Dim n15 As Double = n14 + delta
                Dim n16 As Double = n15 + delta
                Dim n17 As Double = n16 + delta
                Dim n18 As Double = n17 + delta
                Dim n19 As Double = n18 + delta
                Dim n20 As Double = n19 + delta
                Dim n21 As Double = n20 + delta
                'Dim a1 As Double = (1 * b * h3) / 20 'o que está comentado eu removi pois simplesmente não é usado nunca...
                'Dim a2 As Double = (4 * b * h3) / 20
                'Dim a3 As Double = (2 * b * h3) / 20
                'Dim a4 As Double = (4 * b * h3) / 20
                'Dim a5 As Double = (2 * b * h3) / 20
                'Dim a6 As Double = (4 * b * h3) / 20
                'Dim a7 As Double = (2 * b * h3) / 20
                'Dim a8 As Double = (4 * b * h3) / 20
                'Dim a9 As Double = (2 * b * h3) / 20
                'Dim a10 As Double = (4 * b * h3) / 20
                'Dim a11 As Double = (2 * b * h3) / 20
                'Dim a12 As Double = (4 * b * h3) / 20
                'Dim a13 As Double = (2 * b * h3) / 20
                'Dim a14 As Double = (4 * b * h3) / 20
                'Dim a15 As Double = (2 * b * h3) / 20
                'Dim a16 As Double = (4 * b * h3) / 20
                'Dim a17 As Double = (2 * b * h3) / 20
                'Dim a18 As Double = (4 * b * h3) / 20
                'Dim a19 As Double = (2 * b * h3) / 20
                'Dim a20 As Double = (4 * b * h3) / 20
                'Dim a21 As Double = (1 * b * h3) / 20
                Dim s1 As Double = (n1 * 1 * b * h3) / 20
                Dim s2 As Double = (n2 * 4 * b * h3) / 20
                Dim s3 As Double = (n3 * 2 * b * h3) / 20
                Dim s4 As Double = (n4 * 4 * b * h3) / 20
                Dim s5 As Double = (n5 * 2 * b * h3) / 20
                Dim s6 As Double = (n6 * 4 * b * h3) / 20
                Dim s7 As Double = (n7 * 2 * b * h3) / 20
                Dim s8 As Double = (n8 * 4 * b * h3) / 20
                Dim s9 As Double = (n9 * 2 * b * h3) / 20
                Dim s10 As Double = (n10 * 4 * b * h3) / 20
                Dim s11 As Double = (n11 * 2 * b * h3) / 20
                Dim s12 As Double = (n12 * 4 * b * h3) / 20
                Dim s13 As Double = (n13 * 2 * b * h3) / 20
                Dim s14 As Double = (n14 * 4 * b * h3) / 20
                Dim s15 As Double = (n15 * 2 * b * h3) / 20
                Dim s16 As Double = (n16 * 4 * b * h3) / 20
                Dim s17 As Double = (n17 * 2 * b * h3) / 20
                Dim s18 As Double = (n18 * 4 * b * h3) / 20
                Dim s19 As Double = (n19 * 2 * b * h3) / 20
                Dim s20 As Double = (n20 * 4 * b * h3) / 20
                Dim s21 As Double = (n21 * 1 * b * h3) / 20
                Dim i1 As Double = (n1 ^ 2 * 1 * b * h3) / 20
                Dim i2 As Double = (n2 ^ 2 * 4 * b * h3) / 20
                Dim i3 As Double = (n3 ^ 2 * 2 * b * h3) / 20
                Dim i4 As Double = (n4 ^ 2 * 4 * b * h3) / 20
                Dim i5 As Double = (n5 ^ 2 * 2 * b * h3) / 20
                Dim i6 As Double = (n6 ^ 2 * 4 * b * h3) / 20
                Dim i7 As Double = (n7 ^ 2 * 2 * b * h3) / 20
                Dim i8 As Double = (n8 ^ 2 * 4 * b * h3) / 20
                Dim i9 As Double = (n9 ^ 2 * 2 * b * h3) / 20
                Dim i10 As Double = (n10 ^ 2 * 4 * b * h3) / 20
                Dim i11 As Double = (n11 ^ 2 * 2 * b * h3) / 20
                Dim i12 As Double = (n12 ^ 2 * 4 * b * h3) / 20
                Dim i13 As Double = (n13 ^ 2 * 2 * b * h3) / 20
                Dim i14 As Double = (n14 ^ 2 * 4 * b * h3) / 20
                Dim i15 As Double = (n15 ^ 2 * 2 * b * h3) / 20
                Dim i16 As Double = (n16 ^ 2 * 4 * b * h3) / 20
                Dim i17 As Double = (n17 ^ 2 * 2 * b * h3) / 20
                Dim i18 As Double = (n18 ^ 2 * 4 * b * h3) / 20
                Dim i19 As Double = (n19 ^ 2 * 2 * b * h3) / 20
                Dim i20 As Double = (n20 ^ 2 * 4 * b * h3) / 20
                Dim i21 As Double = (n21 ^ 2 * 1 * b * h3) / 20
                'Dim at1 As Double = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21
                Dim st1 As Double = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 + s16 + s17 + s18 + s19 + s20 + s21
                Dim it1 As Double = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12 + i13 + i14 + i15 + i16 + i17 + i18 + i19 + i20 + i21
                Dim d11 As Double = H1 - CINF - x1
                Dim d21 As Double = x1 - CSUP
                Dim dn1 As Double = (H1 / 2) - x1
                Dim Sel1 As Double = st1 - (N * AINF * d11) + (N * ASUP * d21)
                Dim Iel1 As Double = it1 + (N * AINF * (d11 ^ 2)) + (N * ASUP * (d21 ^ 2))
                Dim No1 As Double = (ND / Sel1)
                Dim Mo1 As Double = (((MD * 100) - (ND * dn1)) / Iel1)
                Dim R1 As Double = ((No1 - Mo1) * 1000)
                Result = x1
                If Not R1 = 0 Then Exit For
            Next x1
            Return Result
        End Function

    Função "otimizada":

    Private Function CalcularMelhor(ByRef EA As Double, ByRef EC As Double, ByRef N As Double, ByVal FCK As Double, ByVal H1 As Double, ByVal B1 As Double, ByVal CINF As Double, ByVal CSUP As Double, ByVal AINF As Double, ByVal ASUP As Double, ByVal MD As Double, ByVal ND As Double) As Double
            EA = 210000
            EC = 5600 * FCK ^ (1 / 2)
            N = EA / EC
            Dim Result As Double = 0
            For x1 As Double = 0.01 To H1 Step 0.01
                Dim delta As Double = x1 / 20
                Dim h3 As Double = (H1 / ((H1 / 0.01) - 1)) / 3
                Dim st1 As Double = 0 '(n1 * 1 * b * h3) / 20 onde n1 = 0, esse resultado é zero
                For I As Integer = 1 To 19
                    st1 += ((delta * I) * If(I Mod 2 = 0, 2, 4) * B1 * h3) / 20
                Next I
                st1 += ((delta * 20) * 1 * B1 * h3) / 20
                Dim it1 As Double = 0 '(n1 ^ 2 * 1 * b * h3) / 20 onde n1 = 0, esse resultando também é zero
                For I As Integer = 1 To 19
                    it1 += ((delta * I) ^ 2 * If(I Mod 2 = 0, 2, 4) * B1 * h3) / 20
                Next I
                it1 += ((delta * 20) ^ 2 * 1 * B1 * h3) / 20
                Dim d11 As Double = H1 - CINF - x1
                Dim d21 As Double = x1 - CSUP
                Dim Sel1 As Double = st1 - (N * AINF * d11) + (N * ASUP * d21)
                Dim Iel1 As Double = it1 + (N * AINF * (d11 ^ 2)) + (N * ASUP * (d21 ^ 2))
                Dim No1 As Double = (ND / Sel1)
                Dim Mo1 As Double = (((MD * 100) - (ND * (H1 / 2) - x1)) / Iel1)
                Dim R1 As Double = ((No1 - Mo1) * 1000)
                Result = x1
                If Not R1 = 0 Then Exit For
            Next x1
            Return Result
        End Function

    Chamada:

    Private Sub calcular_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim EA As Double = 0
            Dim EC As Double = 0
            Dim N As Double = 0
            Me.ln.Text = CStr(Me.CalcularMelhor(EA, EC, N, CDbl(Me.fck.Text), CDbl(Me.h1.Text), CDbl(Me.b1.Text), CDbl(Me.cinf.Text), CDbl(Me.csup.Text), CDbl(Me.ainf.Text), CDbl(Me.asup.Text), CDbl(Me.md.Text), CDbl(Me.nd.Text)))
            Me.ea.Text = CStr(EA)
            Me.ec.Text = CStr(EC)
            Me.n.Text = CStr(N)
        End Sub

    Fiz a chamada com a função "otimizada". Use a outra se achar melhor. Outra coisa, note que no seu algoritmo as variáveis "a..." não são usadas nunca, é um calculo que não entra em lugar nenhum.

    • Sugerido como Resposta SammuelMiranda quinta-feira, 22 de outubro de 2015 12:22
    quinta-feira, 22 de outubro de 2015 12:22