wawrcat Posted November 29, 2012 at 05:46 PM Report #485156 Posted November 29, 2012 at 05:46 PM 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.
NunoDinis Posted November 29, 2012 at 05:52 PM Report #485157 Posted November 29, 2012 at 05:52 PM TextBox1.Text = n TextBox2.Text = p A variável n e p não deveria tomar o valor da caixa de texto1 e 2, respetivamente ? Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro. ndsotware.org
thoga31 Posted November 29, 2012 at 06:06 PM Report #485158 Posted November 29, 2012 at 06:06 PM 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!
wawrcat Posted November 29, 2012 at 06:16 PM Author Report #485160 Posted November 29, 2012 at 06:16 PM 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
thoga31 Posted November 29, 2012 at 06:23 PM Report #485162 Posted November 29, 2012 at 06:23 PM 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!
wawrcat Posted November 29, 2012 at 06:28 PM Author Report #485163 Posted November 29, 2012 at 06:28 PM 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.
thoga31 Posted November 29, 2012 at 06:30 PM Report #485164 Posted November 29, 2012 at 06:30 PM 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!
wawrcat Posted November 29, 2012 at 06:48 PM Author Report #485167 Posted November 29, 2012 at 06:48 PM Procura sobre o assunto, tutoriais de introdução ao VB.NET é o que não falta. Obrigado pela dica vou ver se vou dar uma olhadela
mjamado Posted November 29, 2012 at 06:58 PM Report #485169 Posted November 29, 2012 at 06:58 PM 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.
wawrcat Posted November 29, 2012 at 07:28 PM Author Report #485175 Posted November 29, 2012 at 07:28 PM 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
thoga31 Posted November 30, 2012 at 11:05 AM Report #485223 Posted November 30, 2012 at 11:05 AM n *= a(0) - 1: sendo a(0) uma constante, estás sempre a multiplicar o n por uma constante. Não será que devias ir descontando em um o valor de a(i) à medida que vais calculando? Knowledge is free!
wawrcat Posted November 30, 2012 at 02:55 PM Author Report #485234 Posted November 30, 2012 at 02:55 PM (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 November 30, 2012 at 04:36 PM by wawrcat
thoga31 Posted November 30, 2012 at 05:20 PM Report #485260 Posted November 30, 2012 at 05:20 PM (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 November 30, 2012 at 05:25 PM by thoga31 Knowledge is free!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now