Page 1 sur 2

Petit défis code

Publié : sam. 27/févr./2016 12:50
par Shadow
Salut,

Je poste ici un code avec comme défis de me dire pourquoi ça ne fonctionne pas !
Tous le code est bon et rien ne dois être enlevé, juste ajouté.

Pourquoi ce code ne fonctionne t-il pas ?!
Que manque t-il pour qu'il puisse fonctionner ?

J'ai évidement la solution, il manques certains... éléments.

Indice, l’erreur se trouve ici dans cette portion de code, pourquoi ne fonctionne t-elle pas ?
C'est un problème de débutant et même intermédiaire je dirais:

Code : Tout sélectionner

If I = 1 And Val(Caractere$) <= 1 Or I = 2 And Val(Caractere$) <= 8 Or I = 3 And Val(Caractere$) <= 4 Or
I = 4 And Val(Caractere$) <= 4 Or I = 5 And Val(Caractere$) <= 6 Or I = 6 And Val(Caractere$) <= 7 Or
I = 7 And Val(Caractere$) <= 4 Or I = 8 And Val(Caractere$) <= 4 Or I = 9 And Val(Caractere$) = 0 Or
I = 10 And Val(Caractere$) <= 7 Or I = 11 And Val(Caractere$) <= 3 Or I = 12 And Val(Caractere$) <= 7 Or
I = 13 And Val(Caractere$) = 0 Or I = 14 And Val(Caractere$) <= 9 Or I = 15 And Val(Caractere$) <= 5 Or
I = 16 And Val(Caractere$) <= 5 Or I = 17 And Val(Caractere$) <= 1 Or I = 18 And Val(Caractere$) <= 6 Or
I = 19 And Val(Caractere$) <= 1 Or I = 20 And Val(Caractere$) <= 4
EndIf
Ont à tous déjà rencontré se genre de problème.
"Mais que diable, ce code est bon ou est le problème ? un bug ?"

Souvenez vous que généralement le bug, il est fictif et que le problème
se trouve souvent entre la chaise et l'ordinateur, c'est à dire vous !

Micoute, mon très cher ami, tu ne dois pas répondre ici, vue que je t'es déjà donné la solution !
Lui pourra affirmer se que je dis !

Le code entier est ici, regardez bien, juste là, vous le voyez ?:

Code : Tout sélectionner

Procedure.b VerificateurNombreEntrer(Instance.i, Nombre.s)
  
  For I = 1 To Len(Nombre.s)
    
    Caractere$ = Mid(Nombre.s, I, 1)
    
    Select Asc(Caractere$)
        
      Case 48 To 57
        
      Default
        MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut contenir que des chiffres !", 64)
        End
        
    EndSelect
    
  Next
  
  If Len(Nombre.s) = 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être une chaîne vide !", 64)
    End
    
  ElseIf Len(Nombre.s) > 20
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être supérieur à 20 chiffre !", 64)
    End
    
  ElseIf Len(Nombre.s) = 20
    
    Debug Nombre.s
    For I = 1 To Len(Nombre.s)
      
      Caractere$ = Mid(Nombre.s, I, 1)
      
      Select Asc(Caractere$)
          
        Case 48 To 57
          
          If I = 1 And Val(Caractere$) <= 1 Or I = 2 And Val(Caractere$) <= 8 Or I = 3 And Val(Caractere$) <= 4 Or
             I = 4 And Val(Caractere$) <= 4 Or I = 5 And Val(Caractere$) <= 6 Or I = 6 And Val(Caractere$) <= 7 Or
             I = 7 And Val(Caractere$) <= 4 Or I = 8 And Val(Caractere$) <= 4 Or I = 9 And Val(Caractere$) = 0 Or
             I = 10 And Val(Caractere$) <= 7 Or I = 11 And Val(Caractere$) <= 3 Or I = 12 And Val(Caractere$) <= 7 Or
             I = 13 And Val(Caractere$) = 0 Or I = 14 And Val(Caractere$) <= 9 Or I = 15 And Val(Caractere$) <= 5 Or
             I = 16 And Val(Caractere$) <= 5 Or I = 17 And Val(Caractere$) <= 1 Or I = 18 And Val(Caractere$) <= 6 Or
             I = 19 And Val(Caractere$) <= 1 Or I = 20 And Val(Caractere$) <= 4
            
          Else
            Debug Caractere$
            Debug Val(Caractere$)
            Debug i
            MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre est trop grand !", 64)
            End
            
          EndIf
          
        Default
          MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut contenir que des chiffres !", 64)
          End
          
      EndSelect
      
    Next
    
  EndIf
  
  ; 18446744073709551614
EndProcedure

VerificateurNombreEntrer(0, "18446744073709551614")

Re: Petit défis code

Publié : sam. 27/févr./2016 12:55
par microdevweb
Bon ce n'est vraiment pas claire ton code

tu peux faire comme ça

Code : Tout sélectionner

Select I
        Case 1
            Select Val(Caractere$)
                    Case <=1
            EndSelect
    EndSelect
ou si tu veux garder tes if
remplace tes or par elseif

Re: Petit défis code

Publié : sam. 27/févr./2016 13:02
par microdevweb
Bon ne comprenant pas vraiment ce que tu veux faire je ne sais pas t'aider. Mais essaye déjà de clarifier ton code trop de if tue le if

Re: Petit défis code

Publié : sam. 27/févr./2016 13:14
par SPH
microdevweb a écrit :Bon ne comprenant pas vraiment ce que tu veux faire je ne sais pas t'aider. Mais essaye déjà de clarifier ton code trop de if tue le if
J'ai compris ce qu'il veux faire : verifier que le nombre qui est long de 20 chiffres est inferieur ou egal a 18446744073709551614

Peu etre ca :

Code : Tout sélectionner

Procedure.b VerificateurNombreEntrer(Instance.i, Nombre.s)
  
  sph=0
  
  For I = 1 To Len(Nombre.s)
    
    Caractere$ = Mid(Nombre.s, I, 1)
    
    Select Asc(Caractere$)
        
      Case 48 To 57
        
      Default
        MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut contenir que des chiffres !", 64)
        End
        
    EndSelect
    
  Next
  
  If Len(Nombre.s) = 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être une chaîne vide !", 64)
    End
    
  ElseIf Len(Nombre.s) > 20
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être supérieur à 20 chiffre !", 64)
    End
    
  ElseIf Len(Nombre.s) = 20
    
    Debug Nombre.s
    For I = 1 To Len(Nombre.s)
      
      Caractere$ = Mid(Nombre.s, I, 1)
      
      Select Asc(Caractere$)
          
        Case 48 To 57
         
          ;"18446744073709551614"
          If I = 1 And Val(Caractere$) <= 1
            sph+1
          EndIf
          If I = 2 And Val(Caractere$) <= 8
            sph+1
          EndIf
          If I = 3 And Val(Caractere$) <= 4
            sph+1
          EndIf
          If I = 4 And Val(Caractere$) <= 4
            sph+1
          EndIf
          If I = 5 And Val(Caractere$) <= 6
            sph+1
          EndIf
          If I = 6 And Val(Caractere$) <= 7
            sph+1
          EndIf
          If I = 7 And Val(Caractere$) <= 4
            sph+1
          EndIf
          If I = 8 And Val(Caractere$) <= 4
            sph+1
          EndIf
          If I = 9 And Val(Caractere$) <= 0
            sph+1
          EndIf
          If I = 10 And Val(Caractere$) <= 7
            sph+1
          EndIf
          If I = 11 And Val(Caractere$) <= 3
            sph+1
          EndIf
          If I = 12 And Val(Caractere$) <= 7
            sph+1
          EndIf
          If I = 13 And Val(Caractere$) <= 0
            sph+1
          EndIf
          If I = 14 And Val(Caractere$) <= 9
            sph+1
          EndIf
          If I = 15 And Val(Caractere$) <= 5
            sph+1
          EndIf
          If I = 16 And Val(Caractere$) <= 5
            sph+1
          EndIf
          If I = 17 And Val(Caractere$) <= 1
            sph+1
          EndIf
          If I = 18 And Val(Caractere$) <= 6
            sph+1
          EndIf
          If I = 19 And Val(Caractere$) <= 1
            sph+1
          EndIf
          If I = 20 And Val(Caractere$) <= 4
            sph+1
          EndIf
          
          If sph=20
            
        Else
            Debug Caractere$
            Debug Val(Caractere$)
            Debug i
            MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre est trop grand !", 64)
            End
            
          EndIf
          
        Default
          MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut contenir que des chiffres !", 64)
          End
          
      EndSelect
      
    Next
    
  EndIf
  
  ; 18446744073709551614
EndProcedure

VerificateurNombreEntrer(0, "18446744073709551614")

Re: Petit défis code

Publié : sam. 27/févr./2016 14:00
par Shadow
Ceci n'est pas une demande d'aide mais un défis que je vous pose ! :)

Re: Petit défis code

Publié : sam. 27/févr./2016 14:10
par Ar-S
Tu n'est pas assez explicite... Un défis demande une explication de ce défis... UN BUT !
Pas seulement un : Dans mon code y'a une boulette, trouvez laquelle... ça c'est une demande d'aide.. Donc dis nous ce que tu ATTENDS.

Voilà en tout cas une autre manière de faire.. Tu te prends la tête avec tes conversions ASC()

Ma façon de faire

Code : Tout sélectionner

Global NewList Car()

Procedure.b VerificateurNombreEntrer(Instance.i, Nombre.s)
 
  ClearList(Car())
  For I = 1 To Len(Nombre.s)
    
    Caractere = Val (Mid(Nombre.s, I, 1))
    AddElement(Car())
    Car() = Caractere
    
  Next
  
  Debug "la liste contient "+ Str(ListSize(Car())) + " éléments"
  
  If ListSize(Car()) <> 20
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre doit contenir 20 chiffres !", 64)
    End
    
  Else
    OK = 0
    For i = 1 To 20
      SelectElement(car(),i-1) ; on met -1 car le chiffre position 20 correspond à l'élément 19 de la liste car elle va de 0 à 19    
      
      Select i
          
        Case 1,17,19
          If car() <= 1 : OK+1 : EndIf
          
        Case 2
          If car() <= 8 : OK+1 : EndIf
          
        Case 3,4,7,8,20
          If car() <= 4 : OK+1 : EndIf
          
        Case 5,18
          If car() <= 6 : OK+1 : EndIf
          
        Case 6,10,12
          If car() <= 7 : OK+1 : EndIf
          
        Case 9,13
          If car() = 0 : OK+1 : EndIf
          
        Case 11
          If car() <= 3 : OK+1 : EndIf
          
        Case 14
          If car() <= 9 : OK+1 : EndIf
          
        Case 15,16
          If car() <= 5 : OK+1 : EndIf         
          
      EndSelect
    Next
    
    If OK = 20
      Debug " il y a "+Str(OK) + " conditions sur 20"
      MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", YO !", "    Bonne réponse", 64)
      
    Else
      Debug " il y a "+Str(OK) + " conditions sur 20"
      MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre est trop grand !", 64)
      
    EndIf
    
    
  EndIf
 
  ; 18446744073709551614
EndProcedure

VerificateurNombreEntrer(0, "18446744073709551614") ; vrai
VerificateurNombreEntrer(1, "18446744073709551684") ; faux
VerificateurNombreEntrer(2, "17446644073709551614") ; vrai

End

Re: Petit défis code

Publié : sam. 27/févr./2016 14:42
par Shadow
Sph, ça fait plaisir de te voir aider et poster un code sans te moquer, je t'en félicite et t'en remercie ;)
Voilà, ça c'est fait, même si je ne t'aime pas, quand quelque chose est bien, faut le dire.
Peut être qu'un jour je t'apprécirais, si tu continue comme ça ;)

Sph, ton code est très long :wink:
Bon... mais ta compris.

Ar-S, merci bien...

En faite la bonne réponse était celle-ci:

Code : Tout sélectionner

If (I = 1 And Val(Caractere$) <= 1) Or (I = 2 And Val(Caractere$) <= 8) Or (I = 3 And Val(Caractere$) <= 4) Or
(I = 4 And Val(Caractere$) <= 4) Or (I = 5 And Val(Caractere$) <= 6) Or (I = 6 And Val(Caractere$) <= 7) Or
(I = 7 And Val(Caractere$) <= 4) Or (I = 8 And Val(Caractere$) <= 4) Or (I = 9 And Val(Caractere$) = 0) Or
(I = 10 And Val(Caractere$) <= 7) Or (I = 11 And Val(Caractere$) <= 3) Or (I = 12 And Val(Caractere$) <= 7) Or
(I = 13 And Val(Caractere$) = 0) Or (I = 14 And Val(Caractere$) <= 9) Or (I = 15 And Val(Caractere$) <= 5) Or
(I = 16 And Val(Caractere$) <= 5) Or (I = 17 And Val(Caractere$) <= 1) Or (I = 18 And Val(Caractere$) <= 6) Or
(I = 19 And Val(Caractere$) <= 1) Or (I = 20 And Val(Caractere$) <= 4)
Voilà pourquoi le code 1 ne fonctionne pas, problème de parenthèses !
Bon puisqu'on est partie pour optimiser, continuons !

Merci à vous mais aussi à Gally-HC !

Code : Tout sélectionner

Procedure.q VerificateurNombreChaine(Nombre.s)
  
  LongueurNombre.i = Len(Nombre.s)
  
  For I = 1 To LongueurNombre.i
    
    CaractereAscii = Asc(Mid(Nombre.s, I, 1))
    
    If CaractereAscii < '0' Or CaractereAscii > '9'
      MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut contenir que des chiffres !", 64)
      End
    EndIf
    
  Next
  
  If LongueurNombre.i = 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être une chaîne vide !", 64)
    End
    
  ElseIf LongueurNombre.i > 20
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être supérieur à 20 chiffre !", 64)
    End
    
  ElseIf LongueurNombre.i = 20
    
    Maxi$ = "18446744073709551615"
    
    For I = 1 To LongueurNombre.i
      
      CaractereNombre$ = Mid(Nombre.s, I, 1)
      CaractereMaxi$ = Mid(Maxi$, I, 1)
      
      If Val(CaractereNombre$) > Val(CaractereMaxi$)
        
        MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre est trop grand !" + Chr(13) + "    Le nombre doit être compris entre 0 et 18446744073709551615 inclus !", 64)
        End
        
      EndIf
      
    Next
    
  EndIf
  
  ProcedureReturn Val(Nombre.s)
  
EndProcedure

; Debug VerificateurNombreChaine("00000000000000000000"); OK !
; Debug VerificateurNombreChaine("23456789123456789123"); Le nombre est trop grand !, Le nombre doit être compris entre 0 et 18446744073709551615 inclus !"
; Debug VerificateurNombreChaine("-18446744073709551615"); Le nombre ne peut contenir que des chiffres !
; Debug VerificateurNombreChaine("18446744073709551616"); Le nombre est trop grand !, Le nombre doit être compris entre 0 et 18446744073709551615 inclus !"
; Debug VerificateurNombreChaine("18446744073709551615"); OK !
; Debug VerificateurNombreChaine(""); Le nombre ne peut pas être une chaîne vide !
Debug VerificateurNombreChaine("123456789123456789123"); Le nombre ne peut pas être supérieur à 20 chiffre !

Re: Petit défis code

Publié : sam. 27/févr./2016 14:51
par GallyHC
ma façon ^^

Code : Tout sélectionner

EnableExplicit

Procedure.b VerificateurNombreEntrer(instance.i, number.s)
  
  Define.i i, ilen, char
  Define.s value = "18446744073709551615"
  ;
  ;
  ;
  ilen = Len(number)
  If ilen > 0 And ilen <= 20
    ;
    ;
    ;
    For i=1 To ilen
      char = Asc(Mid(number, i, 1))
      If char < '0' And char > '9'
        MessageRequester("GenerateurDeBase Instance n°" + Str(instance) + ", ATTENTION !", "    Le nombre ne peut contenir que des chiffres !", 64)
        ProcedureReturn
      EndIf
    Next i
    If ilen = 20
      For i=1 To ilen
        If Val(Mid(number, i, 1)) > Val(Mid(value, i, 1)) 
          Debug "ERREUR"
          ProcedureReturn
        EndIf
      Next i
    EndIf
    Debug "PASS"
    ;
    ;
    ;
  Else
    If ilen = 0
      MessageRequester("GenerateurDeBase Instance n°" + Str(instance) + ", ATTENTION !", "    Le nombre ne peut pas être une chaîne vide !", 64)
    Else
      MessageRequester("GenerateurDeBase Instance n°" + Str(instance) + ", ATTENTION !", "    Le nombre ne peut pas être supérieur à 20 chiffre !", 64)
    EndIf
  EndIf
 
EndProcedure

VerificateurNombreEntrer(0, "18446744073709551614")
GallyHC

Re: Petit défis code

Publié : sam. 27/févr./2016 15:10
par Ar-S
Bien vu GallyHC

Re: Petit défis code

Publié : sam. 27/févr./2016 15:40
par GallyHC
bonjour,

Spock > je penses qui aura un problème dans ton code car Maxi$ = "18446744073709551615" dépasse les possibilité d'un "Quad", exemple :

Code : Tout sélectionner

Maxi$ = "18446744073709551615"
debug val(Maxi$)
Te renvois "-1"

Cordialement,
GallyHC

Re: Petit défis code

Publié : sam. 27/févr./2016 15:54
par GallyHC
Non

Code : Tout sélectionner

Maxi$ = "18446744073709551615"
Debug ValD(Maxi$)
te donne "18446744073709552000.0" et non "18446744073709551615"

Cordialement,
GallyHC

Re: Petit défis code

Publié : sam. 27/févr./2016 16:01
par GallyHC
Je suis bien d'accord, mais la pour répondre à la demande de "shadow", il faut testé caractère par caractère, du à la limitation.

sinon pour son code un simple :

Code : Tout sélectionner

max = 18446744073709551615
val = xxxxxxxxxxx

If val => 0 And val <= max
  Debug "Ok"  
EndIf
Aurait suffit ^^.

Cordialement,
GallyHC

Re: Petit défis code

Publié : sam. 27/févr./2016 16:25
par Ollivier
Et ça? :

Code : Tout sélectionner

x.Q = Val(n.S)
If Str(x) = n
Debug "Mouille bouen"
Else
Debug "Mouille pas bouen"
EndIf
Edit: Ah y'a pas

Re: Petit défis code

Publié : sam. 27/févr./2016 16:30
par falsam
Allez je met mon grain de sable dans ce topic.

Shadow vous montre un code qui bugue un peu
Shadow a écrit :Je poste ici un code avec comme défis de me dire pourquoi ça ne fonctionne pas !
Un peu de moquerie pour ne pas dire foutage de gueule
Shadow a écrit :Tous le code est bon et rien ne dois être enlevé, juste ajouté.
Le code est bon ? Allez une couche de plus
Shadow a écrit :J'ai évidement la solution,
Ha bon il a la solution ? Mais alors pourquoi poster dans ce cas !!.

Le forum est jalonné de codes qui ne fonctionnaient pas et qui grâce aux utilisateurs de ce forum ont trouvés une solution. Il est facile de les consulter et suivre le cheminement. Il ne me semble pas utile de poster ce genre de défit.

Des défis oui mais pas ça !!!

Re: Petit défis code

Publié : sam. 27/févr./2016 19:29
par Shadow
J'INVOQUE MICOUTE ! :lol:

Micoute, raconte donc à monsieur si se que je dis est vraie ou pas !