IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Fonction récursive et deux types de retour


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut Fonction récursive et deux types de retour
    Bonjour à tous,

    Voici mon problème, j'ai entrepris de convertir une fonction récursive qui permet de générer des grilles de sudoku de PHP vers VB.

    Le problème qui se pose est le type de retour qui est à la fois un Integer(,) et un booléen.

    Je ne sais pas comment résoudre la solution, l'algorithme marche mis à part la fin de l'appel ( le damier est bien remplis ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     Private Function creer_grille(Optional ByVal grille As Integer(,) = Nothing, Optional ByVal position As Integer = 0)
            Dim i, j, v As Integer
            Dim valeurs = New List(Of Integer)
            Dim resultat As Boolean
     
            'retourne la grille trouvée si nous sommes a la fin
            If (position = 81) Then
                Return (grille)
            End If
     
            'calcul de la ligne et colonne
            i = Math.Floor(position / 9)
            j = position Mod 9
     
            'liste des nombres de 1 à 9
            valeurs.AddRange({1, 2, 3, 4, 5, 6, 7, 8, 9})
     
            'efface les valeurs déjà utilisées
            If (v > 0) Then
                For k As Integer = 0 To 8
                    'retire la valeur de la ligne
                    If (v = Int(grille(i, k))) Then
                        valeurs.RemoveAt(v - 1)
                    End If
     
                    'retire la valeur de la colonne
                    If (v = Int(grille(k, j))) Then
                        valeurs.RemoveAt(v - 1)
                    End If
     
                    'retire la valeur de la zone
                    If (v = Int(grille(i + Math.Floor(k / 3), j + (k Mod 3)))) Then
                        valeurs.RemoveAt(v - 1)
                    End If
                Next
            End If
     
            'mélange les valeurs
            valeurs = shuffleList(valeurs)
     
            For Each v In valeurs
                grille(i, j) = v
     
                resultat = creer_grille(grille, position + 1)
     
                If (resultat) Then
                    Return resultat
                End If
     
                grille(i, j) = Nothing
            Next
     
            Return False
        End Function
    Merci d'avance pour votre aide

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    tu peux transformer la fonction en sub et mettre 2 paramètres byref
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Mais je vais devoir modifier quoi dans le programme ?

    Je vois pas trop là où tu veux en venir...

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    pas grand chose, remplacer les 2 byval par des byref, retirer les optionnal



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Function creer_grille(ByRef grille As Integer(,), ByRef position As Integer)
    et déclarer les variables avant l'appel de la sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim grille As Integer(,) = Nothing
    dim position as integer = 0
    creer_grille (grille, position)
    comme ca tu récupères grille et position dans l'appelant

    mais en regardant de plus près, je suis pas sur que tu ai besoin de la position, donc que tu n'aurais pas besoin non plus d'une fonction qui retourne 2 choses
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Mais pour les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            If (position = 81) Then
                Return (grille)
     
            End If
    Je remplace par quoi ?

  6. #6
    Membre chevronné Avatar de Redouane
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    435
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 435
    Par défaut
    Citation Envoyé par dtom99 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Private Function creer_grille(Optional ByVal grille As Integer(,) = Nothing, Optional ByVal position As Integer = 0)
            Dim i, j, v As Integer
            Dim valeurs = New List(Of Integer)
            Dim resultat As Boolean
     
            'retourne la grille trouvée si nous sommes a la fin
            If (position = 81) Then
                Return (grille)
            End If
     
    '...................
     
            Return False
        End Function
    Et si tu essaye comme t'as dit Pol63 de passer les paramètres byref mais laisse la fonction et dans ce cas elle va retourner comme valeur un boolean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     Private Function creer_grille(ByRef grille As Integer(,), 
    ByRef position As Integer) as Boolean
            Dim i, j, v As Integer
            Dim valeurs = New List(Of Integer)
            Dim resultat As Boolean
     
            'retourne la grille trouvée si nous sommes a la fin
            If (position = 81) Then
                Return True    ' Veux dire que la grille est déjà remplie
            End If
     
    '...................
     
            Return False
        End Function
    Qui ce que t'en pense ?

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    sinon exit sub
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    J'ai testé vos modifications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Private Function creer_grille(ByRef grille As Integer(,), ByRef position As Integer) As Boolean
            Dim i, j, v As Integer
            Dim valeurs = New List(Of Integer)
            Dim resultat As Boolean
     
            'retourne la grille trouvée si nous sommes a la fin
            If (position = 81) Then
                Return True
                'GoTo end_creer_grille
            End If
     
            'calcul de la ligne et colonne
            i = Math.Floor(position / 9)
            j = position Mod 9
     
            'liste des nombres de 1 à 9
            valeurs.AddRange({1, 2, 3, 4, 5, 6, 7, 8, 9})
     
            'efface les valeurs déjà utilisées
            If (v > 0) Then
                For k As Integer = 0 To 8
                    'retire la valeur de la ligne
                    If (v = Int(grille(i, k))) Then
                        valeurs.RemoveAt(v - 1)
                    End If
     
                    'retire la valeur de la colonne
                    If (v = Int(grille(k, j))) Then
                        valeurs.RemoveAt(v - 1)
                    End If
     
                    'retire la valeur de la zone
                    If (v = Int(grille(i + Math.Floor(k / 3), j + (k Mod 3)))) Then
                        valeurs.RemoveAt(v - 1)
                    End If
                Next
            End If
     
            'mélange les valeurs
            valeurs = shuffleList(valeurs)
     
            For Each v In valeurs
                grille(i, j) = v
     
                resultat = creer_grille(grille, position + 1)
     
                If resultat Then
                    Return resultat
                End If
     
                'If (grille.Length > 0) Then
                'GoTo end_creer_grille
                'creer_grille(grille, position + 1, isOk)
                '  End If
     
                grille(i, j) = Nothing
            Next
     
            Return False
     
    end_creer_grille:
        End Function
    Mais voilà ce que ça donne :

    http://motx.travian-search.com/screenshots/sudoku1.JPG

    PS : en rouge ce sont les valeurs erronnées
    PS2 : Le script en php fonctionne trés bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
    function creer_grille( $grille = array(), $position = 0 ) {
     
           // Si nous sommes arrivés à la fin, la grille est trouvée
           if( $position == 81 ) {
                   return $grille;
           }
     
           // Calculer la ligne et la colonne
           $i = floor( $position / 9 );
           $j = $position % 9;
     
           // Créer une liste des nombres de 1 à 9
           $valeurs = range( 1, 9 );
     
           // Retirer les valeurs déjà utilisées
           for( $k=0; $k<9; $k++ ) {
     
                   // Oter de la liste les nombres de la ligne
                   if( $v = $grille[ $i ][ $k ] ) {
                           unset( $valeurs[ $v-1 ] );
                   }
     
                   // Oter de la liste les nombres de la colonne
                   if( $v = $grille[ $k ][ $j ] ) {
                           unset( $valeurs[ $v-1 ] );
                   }
     
                   // Oter de la liste les nombres du carré
                   if( $v = $grille[ $i + floor($k/3) ][ $j + ($k%3) ] ) {
                           unset( $valeurs[ $v-1 ] );
                   }
           }
     
           // Melanger le tableau
           shuffle( $valeurs );
     
           // Essayer les valeurs restantes jusqu'à trouver la solution
           foreach( $valeurs as $v ) {
     
                   $grille[$i][$j] = $v;
                   $resultat = creer_grille( $grille, $position + 1 );
     
                   // Si on trouve la solution, on la retourne
                   if( $resultat ) {
                           return $resultat;
                   }
     
                   unset( $grille[$i][$j] );
           }
     
           // Si nous arrivons à la fin de la boucle, aucune grille n'existe
           // avec les valeurs précédentes
           return false;
    }
    ?>

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    il serait peut etre préférable d'apprendre le vb.net, et de réécrire l'algo en réfléchissant plutot qu'en copiant collant

    http://plasserre.developpez.com/cours/vb-net/

    c'est toi qu'a écrit le code php ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Le problème c'est que je fais plein de langages différents ( C++, C#, Java, PHP, et là VB ).

    Les cours ne répondent pas un problème bien particulier, et je n'arriverais à maîtriser le VB qu'au cours d'une longue utilisation, et si j'en viens à demander sur ce forum votre aide, c'est que je n'ai malheureusement pas le temps nécessaire

    Sinon, non je n'ai pas écris ce code php

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/07/2011, 13h25
  2. [PHP 5.2] Une fonction récursive et deux tables SQL
    Par renaud26 dans le forum Langage
    Réponses: 8
    Dernier message: 16/04/2011, 12h55
  3. Réponses: 1
    Dernier message: 25/01/2006, 10h30
  4. Perte de type en retour de fonction
    Par Bebel dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2005, 12h54
  5. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo