none
Traduzione di una funzione da VB6 a VB.NET RRS feed

  • Domanda

  • Salve

    mi dareste una mano a tradurre questa funzione da Vb6 a VB.NET 2010?
    La funzione calcola le Disposizioni Semplici.
    Questo è il risultato che dovrebbe dare con n=3 k=3

      1,  2,  3
      1,  3,  2
      2,  1,  3
      2,  3,  1
      3,  1,  2
      3,  2,  1

    Va bene anche se viene fuori una matrice DispoS che ha la prima riga e la prima colonna pari a tutti zero dovuto al fatto che in VB.NET sono zero based.
    Le funzioni "Prodotto" e "Dnk" sono gia ok.
    Grazie

     

    ****************************************************************

    Public Function DisposizioniS(ByVal N&, ByVal K&, DispoS&()) As Boolean
    '
    '   Ritorna, nella matrice DispoS(Dnk(N, K), K) con N >= K
    '   e K > 0, le disposizioni semplici di N oggetti della classe K.
    '   Se K = N calcola le permutazioni di N oggetti:
    '
        Dim R&, NR&, C&, cr&, P&, I&, J&, L&
        Dim NG1&, DG1&, NG2&, DG2&  ' Numero e dimensioni dei sottogruppi.
    '

        NR = Dnk(N, K)  ' Numero delle righe.
        ReDim DispoS(1 To NR, 1 To K)
    '
        DG2 = NR
        For C = 1 To K
            R = 1
            NG1 = NR / DG2
            DG1 = DG2
            NG2 = N - C + 1
            DG2 = DG1 / NG2
            For L = 1 To NG1
                P = 1
                For J = 1 To NG2
                    GoSub CercaP
                    For I = 1 To DG2
                        DispoS(R, C) = P
                        R = R + 1
                    Next I
                    P = P + 1
                Next J
            Next L
        Next C
    '
    '


    CercaP:
        ' Verifica la validita' di P per la posizione corrente
        ' (R, C) ed eventualmente ricerca, in modo ricorsivo,
        ' un valore alternativo:
        If P > N Then P = 1
        For cr = 1 To C - 1
            If P = DispoS(R, cr) Then
                P = P + 1
                GoSub CercaP
            End If
        Next cr
        Return
    '
    '
    '
    End Function

    *********************************************************************

     

    Le seguenti sono già tradotte:   

    ____________________________________________________________________

    Public Function Prodotto(ByVal N2 As Int16, Optional ByVal N1 As Int16 = 2) As Double
            '   ***************************************************
            '   Ritorna il prodotto dei numeri, consecutivi, interi e positivi,
            '   da N1 a N2 (0 < N1 <= N2). Se N1 > N2 ritorna 1.
            '   Se N1 manca, ritorna il Fattoriale di N2; in questo caso puo'
            '   anche essere N2 = 0 perche', per definizione, e' 0! = 1:
            '   ***************************************************
            Dim Prodotto_Consecutivo As Double
            Dim Indice As Long

            Prodotto_Consecutivo = 1

            For Indice = N1 To N2
                Prodotto_Consecutivo = Prodotto_Consecutivo * Convert.ToDouble(Indice)
            Next

            Return Prodotto_Consecutivo

        End Function

    ____________________________________________________________________


        Public Function Dnk(ByVal Numero_Oggetti As Int16, ByVal A_Gruppi_di As Int16) As Int32
            '   *************************************
            '   Ritorna il numero delle disposizioni semplici
            '   di N oggetti presi a gruppi di K:
            '   *************************************

            Return Convert.ToInt32(Prodotto(Numero_Oggetti, Numero_Oggetti - A_Gruppi_di + 1))

        End Function

    ____________________________________________________________________

    • Spostato Irina Turcu venerdì 16 settembre 2011 13:49 Spostato nel forum dedicato alla migrazione da VB6 a VB.NET (Da:Microsoft Visual Basic Forum)
    martedì 13 settembre 2011 14:29

Risposte

  • Ciao, prova se questo codice può fare al caso tuo.

    Public Class Form4
        Dim Elementi() As String
        Dim K As Integer = 0
    
        Private Sub DisposizioniBT_Click(sender As System.Object, e As System.EventArgs) Handles DisposizioniBT.Click
            Elementi = nTb.Text.ToString.Split(",")
            K = kTb.Text
            Permutazioni()
        End Sub
        Sub Permutazioni()
            Dim c(K) As Integer
            Dim P As String = ""
    
            While c(0) < Elementi.Count
    
                P = ""
                For t = 0 To K - 1
                    P = P + Elementi(c(t)) + ","
                Next
    
                'capisce se è una disposizione. Tutti gli elementi sono diversi.
                If IsADisposition(P) Then
                    TB.Text = TB.Text + P + vbCrLf
                End If
    
    
                ' TB.Text = TB.Text + P + vbCrLf
    
                For t = K - 1 To 0 Step -1
                    c(t) = c(t) + 1
                    If c(t) = Elementi.Count And t > 0 Then
                        c(t) = 0
                    Else
                        Exit For
                    End If
                Next
    
    
            End While
    
    
        End Sub
        Function IsADisposition(p As String) As Boolean
    
            'determina se p è una disposizione oppure no controllando che lo stesso elemento appaia solo una volta
    
            Dim e() As String
            Dim o As Integer
            e = p.Substring(0, p.Length - 1).Split(",")
    
            For a = 0 To e.Count - 1
                o = 0
                For b = 0 To e.Count - 1
                    If e(a) = e(b) Then o = o + 1
                    If o > 1 Then Exit For
                Next
                If o > 1 Then Exit For
            Next
    
            If o > 1 Then
                Return False
            Else
                Return True
            End If
    
        End Function
    End Class
    


    mario formosa
    • Contrassegnato come risposta Irina Turcu martedì 27 settembre 2011 12:55
    martedì 13 settembre 2011 16:29
  • Ho effettuato ua prima modifica intermedia in VB6 che sembra funzionare.
    La modifica i questione lo rende piu facilmente traducibile.
    Protreste dare un'occhiata?

    Grazie

     

    Public Function DisposizioniS(ByVal N&, ByVal K&, DispoS&()) As Boolean
    '
        Dim R&, NR&, C&, cr&, P&, I&, J&, L&
        Dim NG1&, DG1&, NG2&, DG2&  ' Numero e dimensioni dei sottogruppi.
    '
    '
        NR = Dnk(N, K)  ' Numero delle righe.
        ReDim DispoS(1 To NR, 1 To K)
    '
        DG2 = NR
        For C = 1 To K
            R = 1
            NG1 = NR / DG2
            DG1 = DG2
            NG2 = N - C + 1
            DG2 = DG1 / NG2
            For L = 1 To NG1
                P = 1
                For J = 1 To NG2
                       If P > N Then P = 1
                                                   
                           '*****************
                           Dim Indice As Integer
                           Indice = 0

                           While Indice < C

                                    Indice = Indice + 1

                                    If P = DispoS(R, Indice) Then
                                         P = P + 1
                                        Indice = 0
                                    End If

                           Wend
                          
                           '*****************
                          
                    For I = 1 To DG2
                        DispoS(R, C) = P
                        R = R + 1
                    Next I
                    P = P + 1
                Next J
            Next L
        Next C
    '
    '
    '
    '
    '
    End Function

    • Contrassegnato come risposta Irina Turcu martedì 27 settembre 2011 12:54
    martedì 13 settembre 2011 18:09

Tutte le risposte

  • Ciao, prova se questo codice può fare al caso tuo.

    Public Class Form4
        Dim Elementi() As String
        Dim K As Integer = 0
    
        Private Sub DisposizioniBT_Click(sender As System.Object, e As System.EventArgs) Handles DisposizioniBT.Click
            Elementi = nTb.Text.ToString.Split(",")
            K = kTb.Text
            Permutazioni()
        End Sub
        Sub Permutazioni()
            Dim c(K) As Integer
            Dim P As String = ""
    
            While c(0) < Elementi.Count
    
                P = ""
                For t = 0 To K - 1
                    P = P + Elementi(c(t)) + ","
                Next
    
                'capisce se è una disposizione. Tutti gli elementi sono diversi.
                If IsADisposition(P) Then
                    TB.Text = TB.Text + P + vbCrLf
                End If
    
    
                ' TB.Text = TB.Text + P + vbCrLf
    
                For t = K - 1 To 0 Step -1
                    c(t) = c(t) + 1
                    If c(t) = Elementi.Count And t > 0 Then
                        c(t) = 0
                    Else
                        Exit For
                    End If
                Next
    
    
            End While
    
    
        End Sub
        Function IsADisposition(p As String) As Boolean
    
            'determina se p è una disposizione oppure no controllando che lo stesso elemento appaia solo una volta
    
            Dim e() As String
            Dim o As Integer
            e = p.Substring(0, p.Length - 1).Split(",")
    
            For a = 0 To e.Count - 1
                o = 0
                For b = 0 To e.Count - 1
                    If e(a) = e(b) Then o = o + 1
                    If o > 1 Then Exit For
                Next
                If o > 1 Then Exit For
            Next
    
            If o > 1 Then
                Return False
            Else
                Return True
            End If
    
        End Function
    End Class
    


    mario formosa
    • Contrassegnato come risposta Irina Turcu martedì 27 settembre 2011 12:55
    martedì 13 settembre 2011 16:29
  • Ho effettuato ua prima modifica intermedia in VB6 che sembra funzionare.
    La modifica i questione lo rende piu facilmente traducibile.
    Protreste dare un'occhiata?

    Grazie

     

    Public Function DisposizioniS(ByVal N&, ByVal K&, DispoS&()) As Boolean
    '
        Dim R&, NR&, C&, cr&, P&, I&, J&, L&
        Dim NG1&, DG1&, NG2&, DG2&  ' Numero e dimensioni dei sottogruppi.
    '
    '
        NR = Dnk(N, K)  ' Numero delle righe.
        ReDim DispoS(1 To NR, 1 To K)
    '
        DG2 = NR
        For C = 1 To K
            R = 1
            NG1 = NR / DG2
            DG1 = DG2
            NG2 = N - C + 1
            DG2 = DG1 / NG2
            For L = 1 To NG1
                P = 1
                For J = 1 To NG2
                       If P > N Then P = 1
                                                   
                           '*****************
                           Dim Indice As Integer
                           Indice = 0

                           While Indice < C

                                    Indice = Indice + 1

                                    If P = DispoS(R, Indice) Then
                                         P = P + 1
                                        Indice = 0
                                    End If

                           Wend
                          
                           '*****************
                          
                    For I = 1 To DG2
                        DispoS(R, C) = P
                        R = R + 1
                    Next I
                    P = P + 1
                Next J
            Next L
        Next C
    '
    '
    '
    '
    '
    End Function

    • Contrassegnato come risposta Irina Turcu martedì 27 settembre 2011 12:54
    martedì 13 settembre 2011 18:09
  • Ciao PinkFloyd11,

    Ti ha aiutato quanto suggerito sopra da Mario? Avresti bisogno ancora del nostro aiuto a quanto riguarda questo quesito?

     

    Grazie in anticipo per la tua risposta.


    Irina Turcu

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    LinkedIn

    lunedì 19 settembre 2011 15:06
  • Ciao Irina

    Ho risolto con la modifica riportata su che permette una facile traduzione in VB.NET

    martedì 27 settembre 2011 11:13
  • PinkFloyd11 ha scritto:

    Ciao Irina

    Ho risolto con la modifica riportata su che permette una facile traduzione in VB.NET


    Perfetto, grazie. Intanto, ho segnato come valida anche la risposta di Mario, che porta una soluzione alternativa.

    Nel caso avessi ancora delle difficoltà, non esitare a postare sul Forum.

     

    Ciao!


    Irina Turcu

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    LinkedIn

    martedì 27 settembre 2011 12:54