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 fouune fois que mon EDI sera opérationnel...
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 fouune fois que mon EDI sera opérationnel...
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.
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
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%
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![]()
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...
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 ?
![]()
salut,
@Laurent,
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'
c'est vrai qu'avec ce 'group-object' on peux faire des miracles (ou presque)
merci pour cette compilation powershellique![]()
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:
@hackoofr,
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
+1
@sachadee
je n'ai rien fais du tout, c'est vous qui meritez les +1000 , moi, je ne fais que passez...
et qui a dit que le scripting de commandes NT est mortbravo sachadee pour ton travail jusqu'a maintenant tu es en tête devant les vbscripteurs
et les PowerShelleurs
![]()
@minnesota
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'.
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 '*****************************************************************
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![]()
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
Exercice 5:
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
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
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'
salut,
tu sera servi
comme dab +19
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:
je sais que c'est plus gourmand en resource mais ça peux nous aider dans au
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 @
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
* 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 setlocal enabledelayedexpansion %comspec% /c exit 60 echo !=exitcodeascii!
REMARQUE 2:
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!
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.
sympa la fonction surtout l'utilisation de la fonction tryparse()
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
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![]()
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 '*****************************************************************
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
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"
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
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.
le problème n'ai pas d'ordetransgénitaletransgé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
* performance
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
elle est la plus gourmande en ressource, et la plus longue en temps d'execution.
* appel de commande avant expansion
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
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:
* 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
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 aucune commande n'est trouvé alors le plan B, c'est l'une des raisons pour laquel cette expansion est lente.
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
plan B:
stopper la recherche (je sais c'est bête mais il faut le dire) et activer une expansion de variable spéciale.
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
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 ditbon 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![]()
salut,
@minnesota
c'etait une faute de frappe
pas du tout, c'est moi qui m'excuse si je t'ai fais sentir que je suis agressé
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.
exercice9:
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
créer un programme qui peux générer une Suite de Fibonacci
Bon codage
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 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).
Notonsle 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 moiset 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 moisque 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.
- 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 '*****************************************************************
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager