Convertir du C ou C++ en Visual Basic [Résolu]

Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
- - Dernière réponse : cs_ShayW
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
- 23 janv. 2011 à 15:14
Bonjour,
j'ai essayé avec des logiciels de convertir le code suivant en C vers le VB mais cela n'a pas fonctionné
Y'aurait-il un pro du C pour m'aider à le convertir ou du moins le comprendre
#include <stdio.h>
#include 
#include <math.h>


#define TAILLE 2147



void fact(int n)
{
int tab[TAILLE];
int k=1;
int m,i,p;
int base=1000000;
int x,y;

//initialisation du tableau de stockage
for(i=0;i<TAILLE;i++) tab[i]=0;
tab[TAILLE-1]=1;


//Calcul des composantes du résultats et stockage ds le tableau
for(m=1;m<=n;m++)
{
p=0;

for(i=1;i<=k;i++)
{
x=(p+m*tab[TAILLE-i]); 
y=x%base;
p=(x-y)/base;  
tab[TAILLE-i]=y;

}
if(p!=0) tab[TAILLE+1-k]=p;
k++;
}

//affichage du résultat
k=0;
while(tab[k]==0) k++;


cout<<tab[k];
for(i=k+1;i<TAILLE;i++) 
{
if (tab[i]<10) cout<<"00000"<<tab[i];
else if (tab[i]<100) cout<<"0000"<<tab[i];
else if (tab[i]<1000) cout<<"000"<<tab[i];
else if (tab[i]<10000) cout<<"00"<<tab[i];
else if (tab[i]<100000) cout<<"0"<<tab[i];
else cout<<tab[i];
}
cout<<endl;
}


void main()
{
int n;int stop=1;
while(stop==1)
{
cout<<" Valeur de n(<=2147) : ";
cin>>n;

if((n<2148)&&(n>=0)) {cout<<n<<"!= ";fact(n);}
else if(n<0) stop=0;
else cout<<"En base 10^6, 2147! est le plus gros factoriel calculable"<<endl;
}
}


Merci d'avance.
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
3
Merci
pour mettre 1 ! j'en sais rien du tout, c'est toi qui à récupérer ce code pour le mettre en VB, je ne sais pas ce que tu veux en faire ^^

tit' note au passage
au lieu de faire
taVariable = taVariable + 1
tu peux également faire en VB :
taVariable += 1
sa va plus vite à l'execution

et pour la dernière boucle, d'après le code elle n'a pas l'air d'etre dans while.

la ligne
if (p!=0)

C'est tout simplement "Si p est différent de zéro"
en vb :
if p <> 0 Then ...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de scottmat
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
0
Merci
Salut,

déjà tu peux faire sauter les #include ^^


Fonction fact avec paramètre "n" en integer pour commencer

int tab[TAILLE]; bon bin sa c'est un tableau d'integer apparemment à 2147 dans ton code

la boucle "initialisation du tableau" est faites sur le tableau "tab" et initialise chaque case du tableau ensuite. (et si je m'en souviens bien avec le framework tu n'as pas à initialiser les variables à la création, y'a pas de risque de données récupéré dans la mémoire vive avec d'autre appli)

la première boucle sa te donnerai :

For i as integer = 0 to 2147 - 1
...
Next

pour accéder à ces cases tu change les [] en parenthèse tout simple, sans le point virgule bien entendu ^^

quand tu as une variable et ++ derrière sa additionne 1 à valeur déjà présente dans la variable.

jette un coup d'œil sur ce tuto http://www.siteduzero.com/tutoriel-3-13968-les-boucles.html je pense que sa va t'aider

dans le fond, c'est un langage de prog', si tu as l'habitude sous VB, tu va vite comprendre ces lignes, surtout que ton code a l'air d'être simple.

Bon courage ;)
Commenter la réponse de scottmat
Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
0
Merci
Merci Scottmat pour des explications
Voilà le code VB que je propose:
Public Function facto(ByVal N As Integer) As String
        Dim tab(2147) As Integer
        Dim k As Integer = 1
        Dim base As Integer = 1000000
        Dim x, y As Integer
        Dim i As Integer
        Dim m As Integer
        Dim p As Integer

        'initialisation du tableau de stockage

        For i = 0 To 2147 - 1
            tab(i) = 0
        Next
        tab(2146) = 1

        ' Calcul des composantes du résultats et stockage ds le tableau

        For m = 1 To N
            p = 0
            For i = 1 To k
                x = (p + m) * tab(2147 - i)
                y = x Mod base
                p = x - y / base
                tab(2147 - i) = y
                If p = 0 Then
                    tab(2147 + 1 - k) = p
                End If
                k = k + 1
            Next
        Next

        'affichage du résultat
        k = 0
        While tab(k) = 0
            k = k + 1
        End While

        For i = k + 1 To 2147
            If tab(i) < 10 Then
                tab(i) = "00000"
            ElseIf tab(i) < 100 Then
                tab(i) = "0000"
            ElseIf tab(i) < 1000 Then
                tab(i) = "000"
            ElseIf tab(i) < 10000 Then
                tab(i) = "00"
            ElseIf tab(i) < 100000 Then
                tab(i) = "0"
            Else : tab(i) = tab(i)
            End If
        Next

    End Function

Cependant c'est la fin du code qui me pose problème
Peux-tu me dire si le code est bon.

Cordialement.
Commenter la réponse de Taur33
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
0
Merci
Salut sa ma l'air par trop mal,

les else if imbriquer, a ta place j'utiliserai un Select Case, ca serai plus simple à comprendre

la propriété main c'est l'événement Load en VB.

Je vois que tu as fait sauté la ligne :
cout<<tab[k];
cout (http://www.siteduzero.com/tutoriel-3-11131-premier-programme-c-avec-cout-et-cin.html) correspond à writeline si mes souvenirs sont bon en VB. donc c'est un app console.

donc dans tes else if c'est faux. sa imprime a l'écran les données seulement.
Commenter la réponse de scottmat
Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
0
Merci
la boucle "initialisation du tableau" est faites sur le tableau "tab" et initialise chaque case du tableau ensuite. (et si je m'en souviens bien avec le framework tu n'as pas à initialiser les variables à la création, y'a pas de risque de données récupéré dans la mémoire vive avec d'autre appli)

en effet la boucle:
For i = 0 To 2147 - 1
tab(i) = 0
Next
ne sert à rien
Aprés pourquoi mettre 1 dans l'index 2146 du tableau ?
La 2 ème boucle pou le calcul des composantes comme je l'est écrite est une boucle infinie car for i=1 to k alors que k est incrémenté dans la boucle ça doit pas etre cà
En fait la partie Main j'ai compris
Enfin pour la derniére boucle For i = k + 1 To 2147 ne serait-elle pas plutot à l'intérieur du while tab(k)=0 ?
Commenter la réponse de Taur33
Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
0
Merci
je ne comprends pas aussi dans cette ligne le "if (p!=0)":
if(p!=0) tab[TAILLE+1-k]=p;
k++;
Commenter la réponse de Taur33
Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
0
Merci
Ok çà marche cet algo calcule la factorielle d'un nombre jusqu'à 50000 (avec quelques modif)(temps d'exécution très rapide environ 2mn )

Merci pour ton aide précieuse scottman et tes astuces de code(notamment taVariable += 1 /je ne savais qu'on pouvait écrire comme ça)et puis j'appris un peu de C grace à toi.

Voilà l'algo avec tes indications et pour ceux qui seraient interessé :
Public Function facto(ByVal N As Integer) As String
        Dim tab(100000) As Integer
        Dim k As Integer = 1
        Dim base As Long = 1000000
        Dim x As Long
        Dim y As Long
        Dim i As Long
        Dim m As Long
        Dim p As Long
        Const TAILLE As Long = 100000

        'initialisation du tableau de stockage

       
        tab(TAILLE - 1) = 1

        ' Calcul des composantes du résultats et stockage ds le tableau
        For m = 1 To N
            p = 0

            For i = 1 To k
                x = (p + m * tab(TAILLE - i))
                y = x Mod base
                p = (x - y) / base

                tab(TAILLE - i) = y
            Next
            If p <> 0 Then
                tab(TAILLE + 1 - k) = p
            End If
            k += 1
        Next

        'affichage du résultat
        k = 0
        While tab(k) = 0
            k += 1
        End While


        facto = tab(k)

        For i = k + 1 To TAILLE - 1
            Select case tab(i)
                Case Is < 10
                    facto = facto & "00000" & tab(i)
                Case Is < 100
                    facto = facto & "0000" & tab(i)
                Case Is < 1000
                    facto = facto & "000" & tab(i)
                Case Is < 10000
                    facto = facto & "00" & tab(i)
                Case Is < 100000
                    facto = facto & "0" & tab(i)
                Case Else
                    facto = facto & tab(i)
            End Select
        Next

    End Function
Commenter la réponse de Taur33
Messages postés
440
Date d'inscription
samedi 24 mai 2003
Dernière intervention
23 janvier 2011
0
Merci
Mais de rien, content que tu es pu en venir à bout ^^

Bon week'end ;)
Commenter la réponse de scottmat
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
Salut
Essayes encore d'améliorer
la caculatrice windows xp met environ 45 sec pour
calculer 50000!
Commenter la réponse de cs_ShayW
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
Commenter la réponse de cs_ShayW
Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
0
Merci
t'as quelle version de windows car moi avec Windows 7 leur calculatrice me dis Dépassement de capacité à partir de 10000!
problème de mémoire ?
Commenter la réponse de Taur33
Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
0
Merci
Merci ShayW pour ton lien qui est très interessant
j'ai amélioré mon algo 1mn10 pour calculer 50000!,2sec10 pour 10000!

Public Function fact1(ByVal A As Integer) As String
        Dim b As Long ' base
        Dim longueur_tableau As Integer 'c'est longueur de la factorielle\ 9
        Dim F(0) As Long ' tableau contenant le résultat par bloc de 9
        Dim m As Long
        Dim p As Long
        Dim q As Long
        Dim i As Integer
        Dim T As String ' contiendra le résultat 

        '  cas ou A vaut "0" et A négatif(à compléter)
        If A = "0" Then
            fact1 = "1"
            Exit Function
        End If


        ' fact1 ne contient rien au départ
        fact1 = ""

        'taille de chaque nombre contenu dans le tableau (soit 9 chiffres maxi)
        b = 1000000000

        ' dimensionne le tableau
        longueur_tableau = CLng(Int((0.92 + 0.5 * (CUShort(A) + 0.5) * Math.Log(CUShort(A) ^ 2 + CUShort(A) + 1 / 6) - (CUShort(A) + 0.5)) / Math.Log(10)) + 1)
        longueur_tableau = (longueur_tableau \ 9) + 1
        ReDim F(longueur_tableau)

        ' la dernière entrée du tableau contient la valeur initiale de A
        F(longueur_tableau) = A

        ' les calculs
        For m = A - 1 To 2 Step -1
            q = 0
            For i = longueur_tableau To 1 Step -1
                p = F(i) * m + q
                q = p \ b
                F(i) = p - q * b
            Next i


        Next m

        ' on récupère les valeurs à partir du début jusqu'à la fin du tableau
        ' si on trouve une valeur avec - de 9 chiffres on complète par des zéros
        For i = LBound(F) To longueur_tableau
            T = Str$(F(i))
            T = Mid$(T, 2, Len(T))
            While Len(T) < 9
                T = "0" + T
            End While

            fact1 &= T
        Next

        'on purge les zéros devant la factorielle
        While Left(fact1, 1) = "0" And Len(fact1) > 1
            fact1 = Replace(fact1, Left(fact1, 1), "", , 1)
        End While




    End Function
Commenter la réponse de Taur33
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
Salut
j'ai le windows xp pack 2
j'ai bien calculé 50000 !
ça dépend de chaque pc certain avec des math processor
que fais tu avec 50000 ! ou 35^444040404040 ?
Commenter la réponse de cs_ShayW
Messages postés
85
Date d'inscription
vendredi 24 septembre 2010
Dernière intervention
20 mai 2011
0
Merci
je fais une calculatrice (meme interface que celle de windows) mais qui donne tous les chiffres
j'ai regardé les algo du lien Le probleme c'est que 4 d'entre eux utilise des class
BigInteger à part The poor man mais il me donne des valeurs fausses si tu vois ou est l'erreur j'ai convertit du c au vb.net avec un logiciel
' The Poor Man's Implementation of the factorial. 
    ' All math is on board, no additional libraries  
    ' are needed. Good enough to compute the factorial  
    ' up to n=10000 in a few seconds.   

    'Namespace Luschny.Math.Factorial
    Public Class FactorialPoorMans
        Public Sub New()
        End Sub

        Private A As Long

        Public Function Factorial(ByVal n As Integer) As String
            'If n < 0 Then
            'Throw New System.ArgumentException(": n >= 0 required, but was " & n)
            'End If

            If n < 2 Then
                Factorial = "1"
                Exit Function
            End If

            Dim p As New DecInteger(1)
            Dim r As New DecInteger(1)

            A = 1

            Dim h As Integer 0, shift As Integer 0, high As Integer = 1
            Dim log2n As Integer = CInt(Math.Truncate(System.Math.Floor(System.Math.Log(n) * 1.44269504088896)))

            While h <> n
                shift += h
                h = n >> System.Math.Max(System.Threading.Interlocked.Decrement(log2n), log2n + 1)
                Dim len As Integer = high
                high = (h - 1) Or 1
                len = (high - len) \ 2

                If len > 0 Then
                    p = p * Product(len)
                    r = r * p
                End If
            End While

            r = r * DecInteger.Pow2(shift)
            Return r.ToString()
        End Function

        Private Function Product(ByVal n As Integer) As DecInteger
            Dim m As Integer = n \ 2
            If m = 0 Then
                Return New DecInteger(A + 2)
            End If
            If n = 2 Then
                Return New DecInteger((A + 2) * (A + 2))
            End If
            Return Product(n - m) * Product(m)
        End Function
    End Class
    ' endOfFactorialPoorMans 
    Friend Class DecInteger
        Private Const [mod] As Long = 100000000L
        Private digits As Integer()
        Private digitsLength As Integer

        Public Sub New(ByVal value As Long)
            digits = New Integer() {CInt(value), CInt(value >> 32)}
            digitsLength = 2
        End Sub

        Private Sub New(ByVal digits As Integer(), ByVal length As Integer)
            Me.digits = digits
            digitsLength = length
        End Sub

        Public Shared Function Pow2(ByVal e As Integer) As DecInteger
            If e < 31 Then
                Return New DecInteger(CInt(Math.Truncate(System.Math.Pow(2, e))))
            End If
            Return Pow2(e \ 2) * Pow2(e - e \ 2)
        End Function

        Public Shared Operator *(ByVal a As DecInteger, ByVal b As DecInteger) As DecInteger
            Dim alen As Integer a.digitsLength, blen As Integer b.digitsLength
            Dim clen As Integer = alen + blen + 1
            Dim digits As Integer() = New Integer(clen - 1) {}

            For i As Integer = 0 To alen - 1
                Dim temp As Long = 0
                For j As Integer = 0 To blen - 1
                    temp = temp + (CLng(a.digits(i)) * CLng(b.digits(j))) + digits(i + j)
                    digits(i + j) = CInt(temp Mod [mod])
                    temp = temp / [mod]
                Next
                digits(i + blen) = CInt(temp)
            Next

            Dim k As Integer = clen - 1
            While digits(k) = 0
                k -= 1
            End While

            Return New DecInteger(digits, k + 1)
        End Operator

        Public Overrides Function ToString() As String
            Dim sb = New System.Text.StringBuilder(digitsLength * 10)
            sb = sb.Append(digits(digitsLength - 1))
            For j As Integer = digitsLength - 2 To 0 Step -1
                sb = sb.Append((digits(j) + CInt([mod])).ToString().Substring(1))
            Next
            Return sb.ToString()
        End Function
    End Class


    ' public static void Main (string[] arguments) 
    ' {
    '    int n = 1000; 
    '    if (arguments.Length != 0)
    '    { 
    '        n = System.Convert.ToInt32(arguments[0]);
    '    }
    '    else 
    '    { 
    '        System.Console.WriteLine("Please give an argument!"); 
    '    } 
    '    FactorialPoorMans f = new FactorialPoorMans(); 
    '    System.Console.WriteLine(n + "! = " + f.Factorial(n)); 
    '    System.Console.ReadLine(); 
    ' }
Commenter la réponse de Taur33
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
Salut
A mon avis tu devrais développer une caculatrice
plus sophistiquée
par exemple qui sache faire des caculs de permutation
comme n = n! /(n-k)! ^ k!
k
aussi
la calculatrice windows ne sait faire les calculs avec les nombres
binaires plus petit que 1

peut etre aussi calcul de temps
comme 12:23:45 + 45:34:10
donne en jour heure etc

c'est seulement une proposition
je n'ai pas encore étudié les algo du lien
Commenter la réponse de cs_ShayW

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.