Jump to content

Recommended Posts

Posted

Olá estou a começar a aprender visual BASIC e gostava que me ajudassem.Eu estou a tentar calcular combinações para isso usei 3 textboxs sendo uma delas para o resultado final e as outras para o utilizador nos dar o valor de n e de p e um botão para pedir o resultado.

Usei o seguinte código:

Public Class Form3
   Dim n, p, c As Integer
   Dim d As Double
   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       TextBox1.Text = n
       TextBox2.Text = p
       c = n - p
       For i = 0 To n - 1
           n *= (n - 1)
       Next
       For i = 0 To p - 1
           p *= (p - 1)
       Next
       For i = 0 To c - 1
           c *= (c - 1)
       Next
       d = n / (p * c)
       TextBox4.Text = d
   End Sub

No entanto quando peço o resultado diz que não é um numero.

Agradeço ajuda.

Posted

1) Utilizem as tags code para colorir o código.

2) As atribuições estão mal feitas. Os dados são atribuídos da direita para a esquerda: variável = valor.

3) Deve-se evitar a conversão implícita. A propriedade Text de uma TextBox é do tipo String que deverá ser convenientemente convertida para Integer, que é o tipo de dados das 3 variáveis numéricas.

4) Uma solução com recurso a funções deveria ser a melhor. Assim, se for necessário calcular as combinações num outro sítio, bastará chamar a devida função.

5) O código utilizado nos ciclos For não calcula os factoriais. Por exemplo, o factorial de 5 está-me a dar 430214650034342688020 em vez do resultado real, 120.

Knowledge is free!

Posted

Obrigado, tens razão eu acabei de fazer esses reparos mas experimentei alguns valores:

n= 3 p=1 resultado +infinito

n=9 p=1 Deu erro

Assinalei no codigo onde deu o erro , tambem não percebo porque deu mais infinito e não um numero!

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       n = TextBox1.Text
       p = TextBox2.Text
       c = n - p
       For i = 0 To n - 1
           n *= (n - 1) <-- O erro deu-se aqui
       Next
       For i = 0 To p - 1
           p *= (p - 1)
       Next
       For i = 0 To c - 1
           c *= (c - 1)
       Next
       d = n / (p * c)
       TextBox4.Text = d
   End Sub

Agradeço ajuda

Posted

A ver: Como colorir correctamente um código

Deu + infinito porque ultrapassaste o limite do Integer e o VB assume bem os resultados "+ infinito", "- infinito" e "Not a Number".

Tu pegas no n e multiplica-lo por n-1, atribuindo o resultado no próprio n. Assim, na iteração seguinte, será este novo n a fazer o cálculo.

Aqui vai os valores que o n assume ao longo do ciclo a cada iteração quando n(inicial)=5:

Iteracao 0: n(inicial)=5            n(final)=5*4= 20
Iteracao 1: n(inicial)=20           n(final)=20*19= 380
Iteracao 2: n(inicial)=380          n(final)=380*379= 144020
Iteracao 3: n(inicial)=144020       n(final)=144020*144019= 20741616380
Iteracao 4: n(inicial)=20741616380  n(final)=20741616380*20741616379= 430214650034342688020

Knowledge is free!

Posted
3) Deve-se evitar a conversão implícita. A propriedade Text de uma TextBox é do tipo String que deverá ser convenientemente convertida paraInteger, que é o tipo de dados das 3 variáveis numéricas.

4) Uma solução com recurso a funções deveria ser a melhor. Assim, se for necessário calcular as combinações num outro sítio, bastará chamar a devida função.

5) O código utilizado nos ciclos For não calcula os factoriais. Por exemplo, o factorial de 5 está-me a dar 430214650034342688020 em vez do resultado real, 120.

3) Ok podes explicar como deveria converter dados string em integer?

4) Desculpa mas não percebi o que queres dizer com isto importas-te de dar um exemplo ou explicar melhor se possível este tópico agradeço

5)ok vou ver o que posso fazer acho que percebi este erro

thoga31 obrigado

realmente n*=(n-1) não faz sentido deveria usar uma variável diferente no segundo n e esta variavel deve ser ao valor inicial de n no caso do teu exemplo 5.

Posted

3) Ok podes explicar como deveria converter dados string em integer?

Há vários modos de o fazer, e eu costumo utilizar este:

Dim n As Integer = Convert.ToInt32(TextBox1.Text)

4) Desculpa mas não percebi o que queres dizer com isto importas-te de dar um exemplo ou explicar melhor se possível este tópico agradeço

Public Function dobro(ByVal n As Integer) As Integer
   Return n * 2
End Function

Procura sobre o assunto, tutoriais de introdução ao VB.NET é o que não falta.

Knowledge is free!

Posted

Quando tiveres esta função a funcionar convenientemente, nunca mais a uses. É muito giro para aprendizagem, mas nunca vais conseguir calcular combinações de jeito com isto.

Porquê? Porque, mesmo que uses UInt64, o factorial de 21 já não cabe.

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Posted

Olhem eu posso estar a ser mesmo parvo e não me aperceber mas não percebo porque é que anda está a dar mais infinito:

Public Class Form3
   Dim n, p, c As Integer
   Dim d As Double
   Dim a(2) As Integer
   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       n = Convert.ToUInt64(TextBox1.Text)
       p = Convert.ToUInt64(TextBox2.Text)
       c = n - p
       a(0) = n
       For i = 0 To n - 1
           n *= (a(0) - 1)
       Next
       a(1) = p
       For i = 0 To p - 1
           p *= (a(1) - 1)
       Next
       a(2) = c
       For i = 0 To c - 1
           c *= (a(2) - 1)
       Next
       d = n / (p * c)
       TextBox4.Text = d
   End Sub
   Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub
End Class
Posted (edited)

Não percebi o que quiseste dizer mas fiz isto mas ainda dá erro:

//
Public Class Form3
Dim n, p, c As Integer
Dim d, f As Integer
Dim a(2) As Integer
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 n = Convert.ToUInt64(TextBox1.Text)
 p = Convert.ToUInt64(TextBox2.Text)
 c = n - p
 a(0) = n
 f = n
 For i = 0 To f - 1
	 a(0) -= 1
	 n *= (a(0))
 Next
 a(1) = p
 f = p
 For i = 0 To f - 1
	 a(1) -= 1
	 p *= (a(1))
 Next
 a(2) = c
 f = c
 For i = 0 To c - 1
	 a(2) -= 1
	 c *= (a(2))
 Next
 d = n / (p * c)
 TextBox4.Text = Convert.ToString(d)
End Sub
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub
End Class
Edited by wawrcat
Posted (edited)

Eu estou a ver o teu ciclo For e detecto um problema: se pretenderes calcular o factorial de 5, o resultado que sai desse ciclo é 5*4*3*2*1*0 = 0. Tens de terminar o cálculo antes de a(i)=0.

btw, não concordo que esse seja a melhor forma de aplicar o ciclo For para calcular um factorial. Estás a utilizar variáveis auxiliares desnecessárias.

Explica-me porque é que este ciclo te calcula logo o factorial sem essa tralha toda que estás a utilizar:

For i As Integer = n - 1 To 2 Step -1
   n *= i
Next
Edited by thoga31

Knowledge is free!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.