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

Scripts/Batch Discussion :

Qui est pour de petits execices pour manipulation de chaînes de caractères ?


Sujet :

Scripts/Batch

  1. #21
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    coucou sachadee

    J'aurais bien voulu participer mais je suis occupé à faire une boite à outils génériques pour la ligne de commande... + des extensions... et un programme de fou une fois que mon EDI sera opérationnel...

  2. #22
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Voici ma solution pour le problème No 5.

    Je renvoi sur :aff qui affiche l'errorlevel juste pour faciliter la vérification du test.


    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
    @echo off&cls
    setlocal enabledelayedexpansion
    
    set /p $var=Entrez votre string :
    if ["%$var%"]==[""] set $var=route66
    echo Traitement de : %$var%
    
    @echo off
    
    :::On decompose le string et on recherche un numéro sur chaque
    :::caractère si le test réussi on incrémente la liste de sortie ($l)
    
    :decompose
    if defined $var (set $car=%$var:~0,1%
                     echo !$car!| findstr /r "^[0-9]">nul && set $l=!$l!!$car!
                     set $var=%$var:~1%
                     goto:decompose)
    
    :::On test si le dernier numero est membre des valeurs paires
    if defined $l (for %%a in (0 2 4 6 8) do (if !$l:~-1! equ %%a goto:pair)
                   goto:impair)
    cmd /c exit 2
    goto:aff
    
    :pair
    cmd /c exit 0
    goto:aff
    
    :impair
    cmd /c exit 1
    
    :aff
    echo Errorlevel : %errorlevel%
    Ou pour faire plaisir a I'm Here :

    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
    @echo off&cls
    setlocal enabledelayedexpansion
    
    set /p $var=Entrez votre string :
    if ["%$var%"]==[""] set $var=route66
    echo Traitement de : %$var%
    
    @echo off
    :decompose
    if defined $var (set $car=%$var:~0,1%
                     echo !$car!| findstr /r "^[0-9]">nul && set $l=!$l!!$car!
                     set $var=%$var:~1%
                     goto:decompose)
    if defined $l echo !$l:~-1!| findstr "0 2 4 6 8" && (endlocal & exit /b 0) || (endlocal & exit /b 1)
    endlocal
    exit /b 2

  3. #23
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Je viens de lire ton code, et comme tu fais un tri sur des chiffres, tu devrais utiliser "if" au lieu de "findstr", le traitement sera plus rapide...

  4. #24
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    C'était effectivement ma première idée mais je trouve intèressant de montrer d'autre possibilité de tri que le if.

    Intèressante ta boîte à outil Minnesota et je me réjouis de voir ton EDI.
    T'as une prévision, pour sa sortie ?


  5. #25
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    @Laurent,

    Citation Envoyé par Laurent Dardenne Voir le message
    Peux-tu reformuler ?
    créer une fonction "isEven" qui valide la saisi de l'utilisateur pour voir si c'est un nombre ou pas, si la saisi n'est pas un nombre alors le programme retourne un '2', si c'est un nombre alors chercher si c'est paire ou impaire, s'il est paire alors le programme retourne un '0' par contre s'il est impaire alors '1'


    Citation Envoyé par Laurent Dardenne Voir le message
    exercice 1
    c'est vrai qu'avec ce 'group-object' on peux faire des miracles (ou presque)

    Citation Envoyé par Laurent Dardenne Voir le message
    exercice 2
    merci pour cette compilation powershellique


    Citation Envoyé par Laurent Dardenne Voir le message
    exercice 3
    merci, mais il manque le nombre d'occurence(s) et l'affichage en liste:

    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
    
    $sb = {
       param([String]$S,[String]$Char,[int]$Count) 
       $O = 1 | Select Before,Character,Reduce,After,Maxcount
       $O.Before = $S
       $O.Character = $Char
       $O.Reduce = $Count
       $O.After = $S -creplace "$Char{$count,}","$($char*$count)"
       $O.MaxCount = &{
            param($a,$c)
              # On capture la propriété 'length' de l'objet 'Match' 
            @([regex]::Matches($a,"${c}+") | sort length -Des)[0].length
       } $S $Char
       Write-Output $O
    }
    
    PS II> &$sb $s 'a' 1

    sinon, si on veux coder la propriété MaxCount "Nous-mêmes" on peux faire une chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      $O.MaxCount = &{
         param($S,$Char)
    
         $_continue=$true
         for($i=$S.length; $i -ge 0 -and $_continue; $i--) {
            $Chars = $Char * $i
            if($S.contains($Chars)) 
            {  Write-Output $i
               $_continue = $false
            }   
          }
      } @PSBoundParameters
    @hackoofr,

    Citation Envoyé par hackoofr Voir le message
    "and i need my +1"
    +1

    @sachadee

    Citation Envoyé par sachadee Voir le message
    n'oubliez pas les +1 pour I'm_HERE
    je n'ai rien fais du tout, c'est vous qui meritez les +1000 , moi, je ne fais que passez...


    Citation Envoyé par sachadee Voir le message
    oici ma solution pour le problème No 5.
    et qui a dit que le scripting de commandes NT est mort bravo sachadee pour ton travail jusqu'a maintenant tu es en tête devant les vbscripteurs et les PowerShelleurs

    @minnesota

    Citation Envoyé par minnesota Voir le message
    vous voulez du vert..
    sympa le vert
    bon courage pour ton projet

    Exercice 6:

    tester si une chaine est composé de lettres qui se suivent alphabetiquement, par exemple: 'abc', 'aaabbc' sont des chaînes corrects mais 'bac' est une chaine incorrect car 'b' précede 'a'.

  6. #26
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 840
    Points : 9 225
    Points
    9 225
    Par défaut [VBS] Solution de l'Exercice N°5
    Citation Envoyé par I'm_HERE Voir le message
    Exercice5:
    créer une fonction qui affiche qui parse la chaine introduite par l'utilisateur et exclu tous ce qui n'est pas un nombre puis si le nombre trouvée est paire alors elle retourne un '0', si il est impaire '1', et s'il ne s'agit pas de nombre '2'
    et j'espère que ma solution en Vbscript devient verdâtre moi aussi avec les +1 et ceci bien sûr dépend de la participation d'autres membres
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Option Explicit
    Dim MyStr,Titre,fso,ws,LogFile
    Titre = "Extraction des nombres dans une chaîne de caractères + Test de Parité"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ws = CreateObject("Wscript.Shell")
    'Nom du fichier qui va stocker le résultat
    LogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "txt"
    if fso.FileExists(LogFile) Then 'Si le fichier LogFile existe 
    	fso.DeleteFile LogFile 'alors on le supprime
    end If
    'La boîte de saisie de la chaîne de caractères
    MyStr = inputbox("Entrez la chaîne de caractères :",Titre,"Radar123456")
    If MyStr = "" Then WScript.Quit
    MsgBox "Dans la chaîne " & DblQuote(MyStr) & vbCrLF & "On extrait le nombre " & DblQuote(ExtractionNombre(MyStr)) & " ==> " & EstPair(ExtractionNombre(MyStr)),64,Titre
    WriteLog String(100,"*"),LogFile
    WriteLog "Dans la chaîne " & DblQuote(MyStr) & vbCrLF & "On extrait le nombre " & DblQuote(ExtractionNombre(MyStr)) & " ==> " & EstPair(ExtractionNombre(MyStr)),LogFile
    WriteLog String(100,"*"),LogFile
    MyStr = Trim(MyStr)
    MyStr = Replace(MyStr," ","") 'Pour enlever les espaces dans la chaîne
    MsgBox Check(MyStr),64,Titre
    WriteLog String(100,"*"),LogFile
    ws.Run LogFile,1,False
    
    Function ExtractionNombre(MyStr) 
        Dim regEx,occurrences,myMatch
        Set regEx = New RegExp
        regEx.Pattern = "(\d+)"
        regEx.IgnoreCase = True 'Ne pas distinguer les minuscules des majuscules
        regEx.Global = False 'Renvoyer seulement la première occurrence
        Set occurrences = regEx.Execute(MyStr)
        For Each myMatch in occurrences
            ExtractionNombre = myMatch.Value
        Next
    End Function
    
    Function EstPair(n)
    'a mod b, represente le reste de la division de a par b
    If n = "" Then Exit Function
      If  EstPair = (n Mod 2) Then
          EstPair  = 0
          'EstPair  = True
          EstPair  = "Le nombre " & DblQuote(n) &" est pair !"
      Else
          EstPair = 1
          'EstPair  = False
          EstPair  = "Le nombre " & DblQuote(n) &" est impair !"
      End If    
    End Function 
    
    Function Check(MyStr)
        Dim LongeurChaine,i,Str
        LongeurChaine = Len(MyStr)
    'Boucle For : on parcourt et on extrait caractère par caractère
    For i = 1 To LongeurChaine
            Str = Mid(MyStr,i,1)
    'On teste si le caractère extrait est de type numérique
        If IsNumeric(Str) Then
    'On teste, alors sa parité
            If EstPair(Str)  = "Le nombre " & DblQuote(Str) &" est pair !" Then
                Msgbox DblQuote(Str) & " ==> est pair",64,Titre
                Check = 0
                WriteLog DblQuote(Str) & " ==> est pair",LogFile
            ElseIf EstPair(Str) = "Le nombre " & DblQuote(Str) &" est impair !" Then
                Msgbox DblQuote(Str) & " ==> est impair",64,Titre
                Check = 1 
                WriteLog DblQuote(Str) & " ==> est impair",LogFile
            End If 
       Else 
                Check = 2 
                WriteLog DblQuote(Str) & " ==> Pas de résultat !",LogFile  
       End If 
    Next
    End Function
    '*****************************************************************
    'Fonction pour ajouter des guillemets dans une variable
    Function DblQuote(Str)
        DblQuote = Chr(34) & Str & Chr(34)
    End Function
    '*****************************************************************
    
    '*****************************************************************
    'Fonction pour écrire le résultat dans un fichier texte
    Sub WriteLog(strText,LogFile)
    	Dim fs,ts 
    	Const ForAppending = 8
    	Set fs = CreateObject("Scripting.FileSystemObject")
    	Set ts = fs.OpenTextFile(LogFile,ForAppending,True)
    	ts.WriteLine strText
    	ts.Close
    End Sub
    '*****************************************************************

  7. #27
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Citation Envoyé par sachadee Voir le message
    Intèressante ta boîte à outil Minnesota et je me réjouis de voir ton EDI.
    T'as une prévision, pour sa sortie ?
    Aucune idée sachadee... j'espère avant Noël

    Coucou hackoofr

  8. #28
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sachadee Voir le message
    ça me donne vraiment envie de m'y mettre.
    Hé bien, lance toi !
    Citation Envoyé par I'm_HERE Voir le message
    merci, mais il manque le nombre d'occurence(s) et l'affichage en liste:
    Exacte, un oubli.
    Citation Envoyé par I'm_HERE Voir le message
    c'est vrai qu'avec ce 'group-object' on peux faire des miracles (ou presque)
    Effectivement, ce cmdlet est très utile et puissant.
    Citation Envoyé par I'm_HERE Voir le message
    bravo sachadee pour ton travail
    +1

  9. #29
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut les amis,

    Voici ma solution au problème no 6

    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
    @echo off&cls
    setlocal enabledelayedexpansion
    
    set $alphn=a1 b2 c3 d4 e5 f6 g7 h8 i9 j10 k11 l12 m13 n14 o15 p16 q17 r18 s19 t20 u21 v22 w23 x24 y25 z26
    
    set /p $var=Entrez votre string :
    if ["%$var%"]==[""] set $var=bbaaccddef
    echo Traitement de : %$var%
    
    @echo off
    :decompose
    if defined $var (set $car=%$var:~0,1%
                     set $l=!$l! !$car!
                     set $var=%$var:~1%
                     goto:decompose)
    
    for %%a in (!$l!) do (for %%b in (!$alphn!) do (set $test=%%b
                                                    set $lettre=!$test:~0,1!
                                                    if %%a==!$lettre! (set $numero=!$test:~1,2!
                                                                       if not defined $ancien set $ancien=!$numero!
                                                                       set /a $vtest=!$ancien!+1
                                                                       if !$numero! gtr !$vtest! goto:error
                                                                       if !$numero! lss !$ancien! goto:error
                                                                       set $ancien=!$numero!)))
    endlocal
    echo cette chaine est une suite de caractere
    goto:eof
    
    :error
    endlocal
    echo la chaine n'est pas une suite de caractere

  10. #30
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Coucou,

    bon allez je le fais aussi, histoire de dire que j'ai participé...
    mais ce sera le seul

    les noms des fonctions et variables ne sont pas idéaux mais suffisamment explicites pour que je n'aie pas à commenter le code...

    voilà, la chaine est à transmettre en paramètre... c'est tout

    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
    @echo off
    setlocal
    set "retinfo=invalid"
    call :load_ascii a b c d e f g h i j k l m n o p q r s t u v w x y z
    call :analyse_str "%~1"
    echo %~1 : %retinfo% string
    endlocal
    goto :eof
    
    :load_ascii
    set code=97
    :continue_load
    if "%~1"=="" set "code="& goto :eof
    set "%~1=%code%"& set /a code+=1& shift 
    @goto :continue_load
    
    :analyse_str
    if "%~1"=="" goto :eof
    set "tstr=%~1"& set "comparator=0"
    :continue_analyse
    if "%tstr%"=="" goto :eof
    set "retinfo=invalid"
    set "tstr=%tstr:~1%"& call set ascii_code=%%%tstr:~,1%%%
    if "%ascii_code%"=="" goto :eof
    if %ascii_code% lss %comparator% goto :eof
    set "comparator=%ascii_code%"& set "retinfo=valid"
    goto :continue_analyse

  11. #31
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Exercice 5:
    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
    Function Test-Number{
     param (
      [Decimal]$InputObject,
      [switch] $Even
     )
      #est-ce un nombre?
     [Decimal]$Result=0
     if (-not ([Decimal]::Tryparse($InputObject, [ref] $Result)))
     {
       #Si la saisie n'est pas un nombre, retourne 2
       return 2
     }
     else
     {
       if (($Result % 2) -eq 0)
       { 
          #s'il est paire
         return 0 
       }
       else 
       { return 1 }
     }
    }#Test-Number
     
    1..6|% { Test-Number $_}
    Test-Number '23568,12'
    Test-Number -'23568,12'
    Test-Number 10e5
    Test-Number ((10e5)+1)
    #Limite : Test-Number 79228162514264337593543950336
    Exercice 6:
    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
    function Test-AlphabeticOrder{
     param( [string] $s)
     foreach ($Current in $S.GetEnumerator())
     {
       [void]$foreach.MoveNext()
       $Next=$foreach.Current
       Write-debug "Next=$Next`tCurrent=$Current"
       if (($Next -ne $null) -and ($Next -lt $Current))
       {return $false}
     }
     return $true
    }#Test-AlphabeticOrder
     
    Test-AlphabeticOrder '12345'
    Test-AlphabeticOrder '11122334444455'
    Test-AlphabeticOrder '54321'
    Test-AlphabeticOrder '123450'
    Test-AlphabeticOrder 'aaabbc'
    Test-AlphabeticOrder 'aaabbc'
    Test-AlphabeticOrder 'bac'
    Test-AlphabeticOrder 'abc'
    Test-AlphabeticOrder 'ab c'

  12. #32
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    Citation Envoyé par hackoofr Voir le message
    et j'espère que ma solution en Vbscript devient verdâtre moi aussi
    tu sera servi

    Citation Envoyé par sachadee Voir le message
    Voici ma solution au problème no 6
    comme dab +19

    Citation Envoyé par minnesota Voir le message
    bon allez je le fais aussi, histoire de dire que j'ai participé
    nous sommes ravi de ta participation, juste deux toutes petites remarques sur ton code:

    REMARQUE 1:


    on peux généner la suite de caractères ascii automatiquement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @echo off
    setlocal enabledelayedexpansion
    
    for /l %%a in (97 1 122) do (
      %comspec% /c exit %%a
      set @!=exitcodeascii!=1
    )
    set @
    je sais que c'est plus gourmand en resource mais ça peux nous aider dans au

    moins trois cas:

    * génération automatique d'une suite de caractères ascii
    * affichage de caractères spécials sans se soucier de les échapper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    setlocal enabledelayedexpansion
    %comspec% /c exit 60
    echo !=exitcodeascii!
    * rendre le caractère '!' litteral même si l'expansion de variables est activé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      setlocal enabledelayedexpansion
      %comspec% /c exit 33
      set a=!=exitcodeascii!
      echo !a!
    REMARQUE 2:

    l'expansion CALL est l'une des quatres expansions de variable du scripting de commandes NT , mais ça reste l'expansion la plus expansible mais aussi la plus déconseillée en raison de son mechanisme "abominable", donc, si je conseille une chose est de switcher vers l'une des autres expansions et n'utiliser l'expansion-call qu'avec des cas particuliers.

    Citation Envoyé par Laurent Dardenne Voir le message
    Exercice 5:
    sympa la fonction surtout l'utilisation de la fonction tryparse()

    Citation Envoyé par Laurent Dardenne Voir le message
    Exercice 6:
    merci pour ton code, mais quand j'ai tester avec "aaaaacb" ça me retourne un TRUE

    Exercice 7:

    la chaine introduite par l'utilisateur "abc" le programme va retourner une liste de toutes les combinaisons possibles de cette chaine de caractères:

    abc
    acb
    bac
    bca
    cab
    cba

  13. #33
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    c'est bien que tu soulèves le point I'm_HERE, et comme le sous-entend le nom "load_ascii" c'est ce que j'avais vite fait en premier jet, un chargement "automatique" et dynamique. Le principe est simple et élégant au premier abord, mais comme je m'en doutais, c'était beaucoup trop lent pour ce qui était demandé, à savoir, la simple analyse d'une chaine de caractère. Et encore, là c'était que pour 24 lettres (majuscules et minuscules confondues), si ça avait été fait pour tous les caractères de 32 à 127 (les suivants dépendants de la langue), ça devient tout simplement catastrophique surtout si on analyse plus d'une chaine, et n'importe quel "utilisateur" pesterait dessus. Pour remédier à cela, une solution consistait à ne faire le chargement qu'une fois en empiétant et apposant un flag dans l'environnement initial, du coup, ça devenait moins élégant...

    En finale, la solution retenue est simple, rapide, extensible et elle répond parfaitement au problème initial... et elle n'en est pas moins dynamique et élégante puisqu'elle en internalise (et j'ai veillé à en reproduire) le fonctionnement de "for" "cmd exit" pour des raisons évidentes de performances... Aucun programmeur ou développeur digne de ce nom ne peut laisser passer ça juste parce que c'est automatique...


    Quant à l' "expansion call", faut juste savoir qu'elle n'a rien de transgénique...


    Moi qui ne voulais pas faire de commentaires


    voili voilou


    et que ça ne t'empêche pas de proposer ta solution aux exercices que tu poses

  14. #34
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 840
    Points : 9 225
    Points
    9 225
    Par défaut Solution de l'Exercice N°7 : "Combinaison de chaînes de caractères"
    Citation Envoyé par I'm_HERE Voir le message
    Exercice 7:
    La chaine introduite par l'utilisateur "abc" le programme va retourner une liste de toutes les combinaisons possibles de cette chaine de caractères:
    abc
    acb
    bac
    bca
    cab
    cba
    Solution de l'Exercice N°7 : "Combinaison de chaînes de caractères" en Vbscript :
    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
    Option Explicit
    Dim MyStr,Titre,fso,ws,LogFile,resultat
    Titre = "Combinaison de chaînes de caractères"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ws = CreateObject("Wscript.Shell")
    'Nom du fichier qui va stocker le résultat
    LogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "txt"
    if fso.FileExists(LogFile) Then 'Si le fichier LogFile existe 
        fso.DeleteFile LogFile 'alors on le supprime
    end If
    'La boîte de saisie de la chaîne de caractères
    MyStr = inputbox("Entrez la chaîne de caractères :",Titre,"abc")
    MyStr = Trim(MyStr) 'Pour enlever les espaces de gauche et à droite
    If MyStr = "" Then WScript.Quit
    MsgBox Traitement("",MyStr),64,Titre
    WriteLog String(70,"*"),LogFile
    WriteLog Space(10) & Titre & " de type " & DblQuote(MyStr),LogFile
    WriteLog String(70,"*"),LogFile
    'On réinitialise notre variable globale "resultat" pour ne pas la cumuler dans le fichier LogFile
    resultat = "" 
    WriteLog Traitement("",MyStr),LogFile
    ws.Run LogFile,1,False
    
    Function Traitement(chaine,liste)
        Dim nouvelle_chaine,nouvelle_liste,j
        If liste = "" Then
            resultat = resultat & chaine & VbcrLF
        Else
            For j=1 to Len(liste)
                nouvelle_chaine = chaine & Mid(liste,j,1)
                nouvelle_liste = Replace(liste,Mid(liste,j,1),"")
                Traitement nouvelle_chaine,nouvelle_liste
                nouvelle_chaine = ""
                nouvelle_liste = ""
            Next
        End If    
        Traitement = resultat
    End Function
    '*****************************************************************
    'Fonction pour écrire le résultat dans un fichier texte
    Sub WriteLog(strText,LogFile)
        Dim fs,ts 
        Const ForAppending = 8
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set ts = fs.OpenTextFile(LogFile,ForAppending,True)
        ts.WriteLine strText
        ts.Close
    End Sub
    '*****************************************************************
    'Fonction pour ajouter des guillemets dans une variable
    Function DblQuote(Str)
        DblQuote = Chr(34) & Str & Chr(34)
    End Function
    '*****************************************************************

  15. #35
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    mais quand j'ai tester avec "aaaaacb" ça me retourne un TRUE
    Bien vue ! Un manque dans le jeu de test.
    Je voulais sortir de l'ordinaire tout en me méfiant de la modification de la variable d'itération...

    Une solution ordinaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function Test-AlphabeticOrder{
     param( [string] $s)
     $Last=$null
     foreach ($Current in $S.GetEnumerator())
     {
       Write-debug "last=$last`tCurrent=$Current"
       Write-debug "$($Last -lt $Current)"
       if ( ($last -ne $null) -and ( $Current -lt $Last) )
       {return $false}
       $Last=$Current
     }
     return $true
    }#Test-AlphabeticOrder

  16. #36
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,


    @minnesota


    il y a une différence entre générer automatiquement une suite de caractères ascii et entre écrire manuellement une suite de caractères ascii puis automatiser un processus sur ces caractères.

    l'alternative de for_exitcodeascii n'avait pas pour but de le favoriser contre le dynamisme de ton code mais plutot d'enrichir ton post avec d'autres alternatives qui permettent de faire au fond "la même chose"

    Citation Envoyé par minnesota Voir le message
    Auncun programmeur ou dévéloppeur digne de ce nom peut laisser passer ça juste parce que c'est automatique
    d'abord, je n'ai pas écarter le problème de la performance du for_exitcodeascii, tu peux relire mon post précédent "je sais que c'est gourmand en ressource..." , ensuite je n'ai pas favoriser "l'automatique" à la "performance"..ou j'ai dit ça

    Citation Envoyé par minnesota Voir le message
    si ça avait fait pour tous les caractères de 32 à 127 ça devient tout simplement catastrophique.

    c'est vrai que la performance est un point qui peux être capitale pour la vie d'un code, mais coder en dur peux aussi être un point faible pour un code car il peux créer plusieurs autres problèmes comme:

    * une perte de temps pour le codage en dur
    * la difficulté de maintenance du code
    * un code "sale"


    je n'ai jamais dit que l'alternative for_exitcodeascii est 'plus belle' ou est 'plus automatique' mais j'ai dit seulement qu'elle permet de génerer automatiquement des caractères ascii qu'en en mode manuel peuvent prendre un temps à écrire..en plus j'ai dit aussi que cette alternative peux être une solution pour éviter des problèmes de caractères reservés (voir le post précédent)...et puisque je crois que chaque chose à des points faible je n'ai pas négligé le problème de performance.


    Citation Envoyé par minnesota Voir le message
    faut juste savoir qu'elle n'a rien de transgénitale
    le problème n'ai pas d'orde transgénitale transgénique, le problème se situe sur le méchanisme de l'expansion-call, qui certes est la plus expansible mais souffre de beaucoup de problèmes:

    * interpretations de caractères reservés

    l'expansion-call peux nous provoquer beaucoup de problèmes avec les caractères reservés plus que les autres expansions


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (CMD) > type rw.cmd
    
    @echo off
    set "x=&^"
    setlocal enabledelayedexpansion
    echo delayedexp !x!
    call echo callexp %x%
    goto :eof
    
    (CMD) > rw.cmd
    delayedexp &^
    callexp
    * performance

    elle est la plus gourmande en ressource, et la plus longue en temps d'execution.

    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
    PS > type delayedexp.cmd
    setlocal enabledelayedexpansion
    for /l %%a in (1 1 10000) do (
      set x=%%a
      echo !x!
    )
    
    PS > type call-exp.cmd
    for /l %%a in (1 1 10000) do (
      set x=%%a
      call echo %%x%%
    )
    
    PS > (Measure-Command {./call-exp.cmd}).TotalMilliseconds
    10941,7702
    
    PS > (Measure-Command {./delayedexp.cmd}).TotalMilliseconds
    2302,8574
    * appel de commande avant expansion

    la commande interne 'call' suit deux plan: le plan A, si ça ne marche pas alors le plan B:

    plan A:
    essaye toujours d'executer la commande qui la suit comme étant un programme externe (si cette dernière n'est pas précédé par deux point ":")* elle commence ses recherches dans le chemin en cours et cherche des fichiers ayant des extensions stockés dans la variable %pathext% la recherche des fichiers suit l'ordre des extensions dans cette variable , si aucune commande externe de se nom n'est trouvé alors elle cherche dans les chemins de la variable PATH, on peux voir ceci par ce petit exemple:

    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
    (CMD) > echo @echo external_bat >%windir%\echo.bat
    (CMD) > echo @echo external_cmd >%windir%\echo.cmd
    (CMD) > set x=var
    (CMD) > call echo %x%
    
    external_bat
    
    (CMD) > set pathext
    
    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1
    
    (CMD) > set pathext_=%pathext%
    (CMD) > set pathext=.COM;.EXE;.CMD;.BAT;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1
    (CMD) > call echo %x%
    
    external_cmd
    
    (CMD) > set pathext=%pathext_%
    
    (CMD) > set pathext
    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1
    * si la commande est précédé par deux point et les extensions de variables sont activés alors la commande interne call va appelé le label ':commande'

    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
    (CMD) > type label_call.cmd
    @echo off
    :: SETLOCAL DISABLEEXTENSIONS
    
    set x=1
    call :echo %x%
    echo %x%
    pause
    goto :eof
    
    :echo
    echo 2 
    
    
    (CMD) > label_call.cmd
    2
    1
    si aucune commande n'est trouvé alors le plan B, c'est l'une des raisons pour laquel cette expansion est lente.

    plan B:
    stopper la recherche (je sais c'est bête mais il faut le dire) et activer une expansion de variable spéciale.


    Citation Envoyé par minnesota Voir le message
    et que ça ne t'empêche pas de proposer ta solution aux exercices que tu poses
    je poste des solutions mais pas pour tous les exercices, je contribue aussi avec les autres membres en décortiquant un peu leurs codes pour essayer d'enrichir leurs contributions, mon but était 10 exercices, qui permetteront aux membres d'entrer en compétition et surtout voire diverses techniques..puis, quand mon but sera réalisé je vais vous quitter et laisser champs libres aux autres membres à choisir de continuer/ou pas avec une autre suite d'exercices..c'est tout.

    merci pour ton excellent travail

    @hackoofr,

    excellent hackoofr +17

    @Laurent

    super Laurent ça marche à merveille

    Exercice 8:

    mettre de l'ordre dans une chaine de caractères:

    l'utilisateur rentre une suite de caractères: zdra
    le programme la trie en: adrz

  17. #37
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Pourquoi dans la citation t'as modifié transgénique en "trangénitale" ?

    Sinon, il faut pas te sentir agressé, hein, désolé je voulais pas te mettre mal à l'aise... et j'ai pas dit que t'as dit, c'est moi qui dit bon par contre je me garderai de commenter certains points de ton dernier message, mais no souci !

    et tu vas nous quitter où, comment, j'ai pas compris

  18. #38
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    @minnesota


    Citation Envoyé par minnesota Voir le message
    Pourquoi dans la citation t'as modifié transgénique en "trangénitale" ?
    c'etait une faute de frappe

    Citation Envoyé par minnesota Voir le message
    Sinon, il faut pas te sentir agressé, hein, désolé je voulais pas te mettre mal à l'aise...
    pas du tout, c'est moi qui m'excuse si je t'ai fais sentir que je suis agressé


    Citation Envoyé par minnesota Voir le message
    bon par contre je me garderai de commenter certains points de ton dernier message, mais no souci !
    comment no souci, pour moi c'est un souci majeur de ne pas voir les critiques et/ou commentaires d'autres membres sur ce que j'ecris...

    @Laurent,

    je crois qu'on peux reproduire ton code de l'exercice 6 en scripting de commandes NT, mais il faut verifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    setlocal enabledelayedexpansion
    
    set "__str=abc"
    
    set result=True
    for /f %%a in ('"%comspec% /u /c set __str | more +6"') do (
      if "%%a" LSS "!last!" set result=False
      set "last=%%a"
    )
    set result
    exercice9:

    créer un programme qui peux générer une Suite de Fibonacci

    Bon codage

  19. #39
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 840
    Points : 9 225
    Points
    9 225
    Par défaut Solution en Vbscript : "Calcul des nombres de la suite de Fibonacci"
    J'ai cherché un peu dans le Net pour avoir une idée de l'origine de la suite de Fibonacci
    Le problème de Fibonacci est à l'origine de la suite dont le -ième terme correspond au nombre de paires de lapins au -ème mois. Dans cette population (idéale), on suppose que :

    • au (début du) premier mois, il y a juste une paire de lapereaux ;
    • les lapereaux ne procréent qu'à partir du (début du) troisième mois ;
    • chaque (début de) mois, toute paire susceptible de procréer engendre effectivement une nouvelle paire de lapereaux ;
    • les lapins ne meurent jamais (donc la suite de Fibonacci est strictement croissante).

    Notons le nombre de couples de lapins au début du mois . Jusqu’à la fin du deuxième mois, la population se limite à un couple (ce qu'on note : ).
    Dès le début du troisième mois, le couple de lapins a deux mois et il engendre un autre couple de lapins ; on note alors .
    Plaçons-nous maintenant au mois et cherchons à exprimer ce qu'il en sera deux mois plus tard, soit au mois : désigne la somme des couples de lapins au mois et des couples nouvellement engendrés.
    Or, n'engendrent au mois que les couples pubères, c'est-à-dire ceux qui existent deux mois auparavant. On a donc, pour tout entier strictement positif :
    On choisit alors de poser , de manière que cette équation soit encore vérifiée pour .
    On obtient ainsi la forme récurrente de la suite de Fibonacci : chaque terme de cette suite est la somme des deux termes précédents ; pour obtenir chacun de ces deux termes, il faut faire la somme de leurs termes précédents… et ainsi de suite, jusqu'à ce que ces deux termes soient les deux termes initiaux, et , qui sont connus.
    On suppose que :

    • le premier mois, il y a juste une paire de lapins ;
    • les lapins ne sont pubères qu'à partir du deuxième mois ;
    • chaque mois, toute paire susceptible de procréer engendre effectivement une nouvelle paire de lapins ;
    • les lapins ne meurent jamais (donc la suite de Fibonacci est strictement croissante).

    Sont notés en gras, les couples productifs.
    En janvier : 1 couple
    En février : 1 couple
    En mars : 1 + 1 = 2 couples
    En avril : 1 + 2 = 3 couples
    En mai : 2 + 3 = 5 couples
    En juin : 3 + 5 = 8 couples
    En juillet : 5 + 8 = 13 couples
    En août : 8 + 13 = 21 couples
    En septembre : 13 + 21 = 34 couples
    En octobre : 21 + 34 = 55 couples
    En novembre : 34 + 55 = 89 couples
    En décembre : 55 + 89 = 144 couples
    Les réponses constituent les nombres de la suite de Fibonacci : 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - ..., dont chaque terme à partir du 3ème est la somme des deux précédents.

    Solution en Vbscript : "Calcul des nombres de la suite de Fibonacci"
    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
    Option Explicit
    Dim N,Titre,fso,ws,LogFile,resultat
    Titre = "Calcul des nombres de la suite de Fibonacci"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ws = CreateObject("Wscript.Shell")
    'Nom du fichier qui va stocker le résultat
    LogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "txt"
    if fso.FileExists(LogFile) Then 'Si le fichier LogFile existe 
        fso.DeleteFile LogFile 'alors on le supprime
    end If
    'La boîte de saisie de la chaîne de caractères
    N = inputbox("Entrez un entier numérique < 91"&vbCrLf&_
    "pour évaluer la suite de Fibonacci d'ordre (n)"&vbCrLf&_
    "fibo(n) = fibo(n-1) + fibo(n-2)",Titre,"12")
    N = Trim(N) 'Pour enlever les espaces de gauche et à droite
    If N = "" Or Not IsNumeric(N) Or CInt(N) > 91 Then
        MsgBox "Il faut choisir un nombre < 91",48,Titre
        WScript.Quit
    End If
    MsgBox "Le nombre de Fibonacci de terme " & DblQuote(N) & vbCrLf & "fibo("&N&") = fibo("&N-1&") - fibo("&N-2&") = " & DblQuote(Fibonacci(N)),64,Titre
    WriteLog String(70,"*"),LogFile
    WriteLog Space(7) & Titre & " de terme " & DblQuote(N),LogFile
    WriteLog String(70,"*"),LogFile
    WriteLog "Le nombre de Fibonacci de terme " & DblQuote(N) & vbCrLf & "fibo("&N&") = fibo("&N-1&") - fibo("&N-2&") = " & DblQuote(Fibonacci(N)),LogFile
    ws.Run LogFile,1,False
    
    Function Fibonacci(n)
    'si n > 91, cela entraîne un overflow
        Dim resultat
        resultat = 0
        If n <= 2 Then
            resultat = 1
        Else
            resultat = Fibonacci(n - 1) + Fibonacci(n - 2)
        End If    
        Fibonacci = resultat
    End Function
    
    '*****************************************************************
    'Fonction pour écrire le résultat dans un fichier texte
    Sub WriteLog(strText,LogFile)
        Dim fs,ts 
        Const ForAppending = 8
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set ts = fs.OpenTextFile(LogFile,ForAppending,True)
        ts.WriteLine strText
        ts.Close
    End Sub
    '*****************************************************************
    'Fonction pour ajouter des guillemets dans une variable
    Function DblQuote(Str)
        DblQuote = Chr(34) & Str & Chr(34)
    End Function
    '*****************************************************************

  20. #40
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Citation Envoyé par hackoofr Voir le message
    J'ai cherché un peu dans le Net pour avoir une idée de l'origine de la suite de Fibonacci
    On suppose que :

    • le premier mois, il y a juste une paire de lapins ;
    • les lapins ne sont pubères qu'à partir du deuxième mois ;
    • chaque mois, toute paire susceptible de procréer engendre effectivement une nouvelle paire de lapins ;
    • les lapins ne meurent jamais (donc la suite de Fibonacci est strictement croissante).

    Sont notés en gras, les couples productifs.
    En janvier : 1 couple
    En février : 1 couple
    En mars : 1 + 1 = 2 couples
    En avril : 1 + 2 = 3 couples
    En mai : 2 + 3 = 5 couples
    En juin : 3 + 5 = 8 couples
    En juillet : 5 + 8 = 13 couples
    En août : 8 + 13 = 21 couples
    En septembre : 13 + 21 = 34 couples
    En octobre : 21 + 34 = 55 couples
    En novembre : 34 + 55 = 89 couples
    En décembre : 55 + 89 = 144 couples
    Les réponses constituent les nombres de la suite de Fibonacci : 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - ..., dont chaque terme à partir du 3ème est la somme des deux précédents.

    Solution en Vbscript : "Calcul des nombres de la suite de Fibonacci"
    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
    Option Explicit
    Dim N,Titre,fso,ws,LogFile,resultat
    Titre = "Calcul des nombres de la suite de Fibonacci"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ws = CreateObject("Wscript.Shell")
    'Nom du fichier qui va stocker le résultat
    LogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "txt"
    if fso.FileExists(LogFile) Then 'Si le fichier LogFile existe 
        fso.DeleteFile LogFile 'alors on le supprime
    end If
    'La boîte de saisie de la chaîne de caractères
    N = inputbox("Entrez un entier numérique < 91"&vbCrLf&_
    "pour évaluer la suite de Fibonacci d'ordre (n)"&vbCrLf&_
    "fibo(n) = fibo(n-1) + fibo(n-2)",Titre,"12")
    N = Trim(N) 'Pour enlever les espaces de gauche et à droite
    If N = "" Or Not IsNumeric(N) Or CInt(N) > 91 Then
        MsgBox "Il faut choisir un nombre < 91",48,Titre
        WScript.Quit
    End If
    MsgBox "Le nombre de Fibonacci de terme " & DblQuote(N) & vbCrLf & "fibo("&N&") = fibo("&N-1&") - fibo("&N-2&") = " & DblQuote(Fibonacci(N)),64,Titre
    WriteLog String(70,"*"),LogFile
    WriteLog Space(7) & Titre & " de terme " & DblQuote(N),LogFile
    WriteLog String(70,"*"),LogFile
    WriteLog "Le nombre de Fibonacci de terme " & DblQuote(N) & vbCrLf & "fibo("&N&") = fibo("&N-1&") - fibo("&N-2&") = " & DblQuote(Fibonacci(N)),LogFile
    ws.Run LogFile,1,False
    
    Function Fibonacci(n)
    'si n > 91, cela entraîne un overflow
        Dim resultat
        resultat = 0
        If n <= 2 Then
            resultat = 1
        Else
            resultat = Fibonacci(n - 1) + Fibonacci(n - 2)
        End If    
        Fibonacci = resultat
    End Function
    
    '*****************************************************************
    'Fonction pour écrire le résultat dans un fichier texte
    Sub WriteLog(strText,LogFile)
        Dim fs,ts 
        Const ForAppending = 8
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set ts = fs.OpenTextFile(LogFile,ForAppending,True)
        ts.WriteLine strText
        ts.Close
    End Sub
    '*****************************************************************
    'Fonction pour ajouter des guillemets dans une variable
    Function DblQuote(Str)
        DblQuote = Chr(34) & Str & Chr(34)
    End Function
    '*****************************************************************
    Salut hackoofr,

    Excellent travail, je te remerci pour ton effort et tes recherches

    Exercice 10:

    L'utilisateur entre une suite de chiffres "78231" le programme fait leur sommes (récursivement) et retourne "3"

    7 + 8 + 2 + 3 + 1 = 21
    2 + 1 = 3

    Bonne chance

Discussions similaires

  1. Réponses: 11
    Dernier message: 13/12/2011, 17h41
  2. Réponses: 3
    Dernier message: 17/08/2011, 14h40
  3. Réponses: 3
    Dernier message: 26/05/2010, 23h39
  4. un petit probleme pour vous un grand pour moi
    Par forstyle dans le forum Réseau
    Réponses: 6
    Dernier message: 04/11/2009, 20h03
  5. Meilleur algorithme pour trier de très grandes quantités de chaînes de caractères
    Par Cecilka dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/05/2006, 11h23

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