Forum Liberty Basic France

Le 29/05/2012 à 18h19

Administrateur

Groupe: Administrateur

Inscrit le: 24/09/2010
Messages: 238
J'ai reprogrammé les fonctions PHP en LB, j'espère que ça vous plaira et que ça vous sera utile ;) Il y a au dessus de chaque fonction un 'petit programme' de démonstration.

Code VB :
 
'Created by William N. Havard aka Nephthys
'Distributed under the CC BY-NA 3.0 licence (http://creativecommons.org/licenses/by-sa/3.0/)

let true = 1
let false = 0
 
'//Vérifie que la variable contient quelque chose
'notice empty(test$)
'if empty(test$) then
'   notice "Variable vide"
'else
'   notice "Variable pleine"
'end if
function empty(string$)
   if (string$="NULL") or (string$="")then
        empty=1
   else
        empty=0
   end if
end function
 
'//Récupère la chaine située après (0) ou avant (1) needle
'test$="USER@EXAMPLE.com"
'print strstr$(test$, "E", 0)
function strstr$(string$, needle$, val)
    lenString=len(string$)
    posFirstOcc=instr(string$, needle$)
 
    if val=0 then
        strstr$=right$(string$, lenString-posFirstOcc+1-len(needle$))
    else
        strstr$=left$(string$, posFirstOcc)
    end if
end function
 
'//Met chaque caractère d'un chaine dans un array
'/!\ Ne pas oublié d'utilisé STA dans la boucle while (pour lire le tabelau que ça soit ici ou ailleurs) et non i/p/z/etc. sinon bug.
'Utilisé STAi$ pour lire le tableau
'STA$=STA$("William")
'while empty(STAi$(STA))=false
'print STAi$(STA)
'STA=STA+1
'wend
function STA$(string$)
    GLOBAL STA
    lenS=len(string$)
    let STA=0
    redim STAi$(lenS)
 
    while (i<>lenS)
        STAi$(i)=left$(right$(string$,lenS-i),1)
        i=i+1
    wend
    STA$=STAi$
end function
 
'//Shuffle. Permet de mélanger les lettres à l'intérieur d'une chaine. Supp Espace (1)
'machin$="Je suis à la plage avec ma mère"
'print strShuffle$(machin$, 0)
function strShuffle$(string$, val)
    STA$=STA$(string$)
    lenS=len(string$)
 
    while (p<>lenS)
        rand=rand(0, lenS)
        if empty(STAi$(rand)) then
            p=p
        else
            if val=1 then
                chaine$=trim$(chaine$;STAi$(rand))
            else
                chaine$=chaine$;STAi$(rand)
            end if
            STAi$(rand)=""
            p=p+1
        end if
    wend
    strShuffle$=chaine$
end function
 
'//Première lettre d'une chaine en minuscule
function lcFirst$(string$)
    lenM=len(string$)
    lcFirst$=lower$(left$(string$,1));right$(string$, lenM-1)
end function
 
'//Première lettre d'une chaine en majuscule
function ucFirst$(string$)
    lenM=len(string$)
    ucFirst$=upper$(left$(string$,1));right$(string$, lenM-1)
end function
 
'//Première lettre de chaque mot en majuscule
function ucWords$(string$)
    STA$=STA$(string$)
    lenS=len(string$)
 while (p<>lenS)
        if p = 0 then
            chaine$=chaine$;upper$(STAi$(p))
        end if
        if p>0 then
            if STAi$(p-1)=chr$(32) then
                chaine$=chaine$;upper$(STAi$(p))
            else
                chaine$=chaine$;STAi$(p)
            end if
        end if
        p=p+1
 wend
 ucWords$=chaine$
end function
 
'//Supprime les espace à gauche de la chaine
function ltrim$(string$)
    STA$=STA$(string$)
    lenS=len(string$)
 
    while (p<>lenS)
        if empty(STAi$(p))=false then
            number=p
            exit while
        end if
        p=p+1
    wend
ltrim$=right$(string$, lenS-number)
end function
 
'//Supprime les espace à droite de la chaine
function rtrim$(string$)
    STA$=STA$(string$)
    lenS=len(string$)
 
    while (p<>lenS)
        if empty(STAi$(p))=false then
                while (p+i<>lenS)
                    if empty(STAi$(p+i)) then
                            number=p+i
                            exit while
                    end if
                    i=i+1
                wend
            exit while
        end if
        p=p+1
    wend
rtrim$=left$(string$, number)
end function
 
'Inverse l'ordre d'une chaine. Supp Espace (1)
function strrev$(string$, val)
    STA$=STA$(string$)
 
    while empty(STAi$(STA))=false
        STA=STA+1
    wend
    while STA<>-1
        chaine$=chaine$;STAi$(STA)
        STA=STA-1
    wend
 
    if val = 1 then
        strrev$=trim$(chaine$)
    else
        strrev$=chaine$
    end if
end function
 
'//Permet de répéter val fois string$
function strrepeat$(string$, val)
    for i=0 to val
        chaine$=chaine$;string$
    next i
    strrepeat$=chaine$
end function
 
'//Retourne string$ complétée à droite (0) ou à gauche (1) par padString$ jusqu'à ce que sa longueur soit égale à val
function strpad$(string$, padString$, val, pos)
    while lenS<>val
        chaine$=chaine$;padString$
        lenS=len(chaine$)
    wend
    if pos=1 then '//on remplit à gauche
        strpad$=chaine$;string$
    else '//on remplit à droite
        strpad$=string$;chaine$
    end if
end function
 
'//Function explode
'a$="       test1-test2-test3&test4&test5&test6&test7&test8&test9&test10&test11&test12&test13"
'explode$ = explode$(a$, "&")
'while i<explodei
'    if parametre$(i)<>"" then
'        print i;")";parametre$(i)
'    end if
'    i=i+1
'wend
function explode$(chaineSansSigne$, modifier$)
 
    GLOBAL explodei
 
    explodei=10
    dim parametre$(explodei)
 
    chaineSansSigne$=trim$(chaineSansSigne$;modifier$;"foo")
    chaineO$=chaineSansSigne$
 
    [loop]
    iP=0
    while instr(chaineSansSigne$, modifier$)<>0
 
        if iP=explodei then
            explodei=explodei+10     'Je rajoute par 10 et non 1 par 1 sinon ça ferait ramer le programme.
                                       'Faites le test en faisant une 20ene de c/c de a$ et en changant le 10 par un 1
            chaineSansSigne$=chaineO$
            redim parametre$(explodei)
            gosub [loop]
        end if
 
 
        a=instr(chaineSansSigne$, modifier$)
        b$=trim$(left$(chaineSansSigne$,a-1))
        c=len(b$)+1
        totallen=len(chaineSansSigne$)
        d$=right$(chaineSansSigne$,totallen-c)
        e$=trim$(d$)
 
        parametre$(iP)=b$
 
        chaineSansSigne$=e$
        iP=iP+1
    wend
end function
 
 
 
 
 
 
function rand(min,max)
    rand = int(rnd(1)*(max-min+1))+min
end function
 
 
 
____________________

MSN Yahoo Web    
Le 03/08/2012 à 13h34

Administrateur

Groupe: Administrateur

Inscrit le: 24/09/2010
Messages: 238
Bonjour,

Cette fonction permet de compter le nombre d’occurrence d'une chaîne dans une autre.

Code VB :
 
'input "Entrez une phrase : ";string$
'input "Entrez la chaîne à compter : ";word$
'print "La chaîne '";word$;"' apparaît "; searchWord(string$, word$);" fois dans la chaîne '";string$;"'."

function searchWord(string$, word$)
    lenC=len(string$)
    i=0
 
    while i<lenC
        if instr(string$, word$, i)=0 then
            i=i+1
        else
            i=1+instr(string$, word$, i)
            a=a+1
        end if
    wend
    searchWord=a
end function
 


Il faut encore que je l'améliore pour connaitre la position des chaînes recherchées par rapport à la chaîne principale :)
____________________

MSN Yahoo Web    
Le 03/08/2012 à 14h19

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
Houla ! word$ est un mot clef, tu l'utilise pour nommer la chaine à détecter.
C'est pas bon pour les newbees ça...confusage assuré.
je propose: thechain$, thischain$, mychain$, ou: theword$, thisword$, myword$
Tu a de la chance que string$ ne soit pas un mot clef.....t'aurais eu double dose . ;)
A part ça, pas mal, ça peut servir.;



Edité par Roland Le 03/08/2012 à 14h20
____________________
Roro

   
Le 03/08/2012 à 14h50

Administrateur

Groupe: Administrateur

Inscrit le: 24/09/2010
Messages: 238
Effectivement word$() est une fonction réservée par LB, mais pas la variable word$ donc normalement ça n'engendre pas de problème. Mais effectivement ça peut perturber les newbies, je changerai ça ;)
____________________

MSN Yahoo Web    
Le 24/03/2014 à 22h16

Administrateur

Groupe: Administrateur

Inscrit le: 24/09/2010
Messages: 238
Qui est motivé pour faire une fonction inArray et not ?
____________________

MSN Yahoo Web    
Le 25/03/2014 à 09h40

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
L'homme au chapeau mou. lol! :p
____________________
Roro

   
Le 25/03/2014 à 22h32

Administrateur

Groupe: Administrateur

Inscrit le: 24/09/2010
Messages: 238
en fait la fonction not existe déjà j'avais oublié ! C'est drôlement pratique en vrai couplé à une la fonction empty :)

Code VB :
 
string$ = "e"
 
if not(empty(string$)) then
    print "String is not null"
 else
    print "String is null"
end if
end
 
function empty(string$)
   if (string$="NULL") or (string$="")then
        empty=1
   else
        empty=0
   end if
end function
 
 
 
 
____________________

MSN Yahoo Web    
Le 19/03/2021 à 15h19

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 124
je recherche une fonction REMPLACE$ §()

print remplace$ (chaine$, a$, b$)

... qui remplacerait la chaine a$ par b$ à l'intérier de chaine$ ^^
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 19/03/2021 à 23h15

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
joan74:
je recherche une fonction REMPLACE$ §()

print remplace$ (chaine$, a$, b$)

... qui remplacerait la chaine a$ par b$ à l'intérier de chaine$ ^^


Avant de constituer ta chaine$; a$ et b$ existent
Fait ton remplacement d'abord et constitue la chaine$ après.
Tu peut faire tourner les contenus dans une sub ou un gosub
Si tu expose un cas précis, ça sera plus précis.
____________________
Roro

   
Le 29/03/2021 à 09h45

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Y'a qu'à demander ;) Quelques manips de chaines plus loin, je propose ceci :
Code VB :
 
a$="789"
b$="---"
chaine$="123456789"
 
print "voici la chaine : ";chaine$
print "on y recherche ";a$
print "qu'on va remplacer par ";b$
 
chaine$=REMPLACE$(chaine$,a$,b$)
 
print "ce qui nous donne ";chaine$
 
end
 
'***********************
function REMPLACE$(chaine$,enlever$,remplacer$)
enl=len(enlever$)
cha=len(chaine$)
tour=1
while tour<cha
 
    if mid$(chaine$,tour,enl)=enlever$ then
        deb$=left$(chaine$,tour-1)
        fin$=right$(chaine$,cha-tour-enl+1)
        REMPLACE$=deb$+remplacer$+fin$
    end if
 
    tour=tour+1
wend
 
end function
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 10/04/2021 à 12h11

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Une version un peu plus légère, parce que j'étais parti sur une boucle WHILE/WEND alors que dans notre cas un FOR/NEXT convient parfaitement et est plus bref et plus simple à mettre en oeuvre

Cette version remplace toutes les occurences de a$ trouvées dans chaine$
Code VB :
 
a$="345"
b$="---"
 
chaine$="123456789123456789"
print "En remplaçant ";a$;" par ";b$;" dans ";chaine$
print "   on obtient ";REMPLACE$(chaine$,a$,b$)
 
end
 
'***********************
function REMPLACE$(chain$,enlever$,remplacer$)
    enl=len(enlever$)
    cha=len(chain$)
    dercar=cha-enl+1
 
    for tour=1 to dercar
 
        if mid$(chain$,tour,enl)=enlever$ then
            deb$=left$(chain$,tour-1)
            fin$=right$(chain$,dercar-tour)
            chain$=deb$+remplacer$+fin$
        end if
 
    next
 
    REMPLACE$=chain$
    end function
 
 
 


J'ai ajouté une variable "dercar", dernier caractère, après avoir constaté qu'avec le FOR/NEXT on avait deux utilisations différentes de la somme cha-enl+1



Edité par Christophe Le 10/04/2021 à 13h26
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 11/04/2021 à 13h50

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 124
Génial ! Merci

A noter que a$ et b$ doivent être de même longueur sinon ...

En remplaçant 3 par --- dans 123456789123456789
on obtient 12---45678912---6789

ou

En remplaçant 345 par - dans 123456789123456789
on obtient 12-678912-456789


;)
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 11/04/2021 à 13h59

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 124
c bon, j'ai corrigé :
Code VB :
 
a$="345"
b$="-"
 
chaine$="123456789123456789"
print "En remplaçant ";a$;" par ";b$;" dans ";chaine$
print "   on obtient ";REMPLACE$(chaine$,a$,b$)
 
end
 
'***********************
function REMPLACE$(chain$,enlever$,remplacer$)
    enl=len(enlever$)
    'cha=len(chain$)    'pas utile
    dercar=len(chain$)-enl+1
 
    for tour=1 to dercar
 
        if mid$(chain$,tour,enl)=enlever$ then
            deb$=left$(chain$,tour-1)
            fin$=right$(chain$,dercar-tour)
            chain$=deb$+remplacer$+fin$
            dercar=len(chain$)-enl+1    'il manquait cette maj
        end if
 
    next
 
    REMPLACE$=chain$
    end function
 
 


[edit]
Houston, on a encore un problème :

En remplaçant 9 par -- dans 123456789123456789
on obtient 12345678--123456789




Edité par joan74 Le 11/04/2021 à 14h17
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 12/04/2021 à 12h37

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
Ma contribution, pour toutes longueurs:
Code VB :
 
a$="abc": b$="defghij"
print "a$: ";a$
print "b$: ";b$
aa$="1234567abc8910111213141516"
print "aa$: ";aa$
c=instr(aa$, a$)
for x=1 to c-1
  bb$=bb$+mid$(aa$,x,1)
next x
for x=1 to len(b$)
  bb$=bb$+mid$(b$,x,1)
next x
for x=c+len(a$) to len(aa$)
  bb$=bb$+mid$(aa$,x,1)
next x
print "bb$: ";bb$
 
____________________
Roro

   
Le 12/04/2021 à 19h32

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 124
Caché:
Ma contribution, pour toutes longueurs:
Code VB :
 
a$="abc": b$="defghij"
print "a$: ";a$
print "b$: ";b$
aa$="1234567abc8910111213141516"
print "aa$: ";aa$
c=instr(aa$, a$)
for x=1 to c-1
  bb$=bb$+mid$(aa$,x,1)
next x
for x=1 to len(b$)
  bb$=bb$+mid$(b$,x,1)
next x
for x=c+len(a$) to len(aa$)
  bb$=bb$+mid$(aa$,x,1)
next x
print "bb$: ";bb$
 


Merci Roland, mais ta version donne :

a$: 1
b$: -
aa$: 012345678901234567890123456789
bb$: 0-2345678901234567890123456789

a$: 2
b$: --
aa$: 012345678901234567890123456789
bb$: 01--345678901234567890123456789

a$: 12
b$: -
aa$: 012345678901234567890123456789
bb$: 0-345678901234567890123456789

... dans chacun des cas, seul la première portion de chaine est trouvé et remplacé.



Edité par joan74 Le 13/04/2021 à 04h56
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 13/04/2021 à 06h28

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Eh bien ça n'a pas l'air si simple que ça... Je propose une version à base de "while" qui devrait fonctionner quelle que soit la taille et le nombre d'occurences dans la chaine. Et je travaille sur une version avec des FOR/NEXT, qui me donne bien du fil à retordre.

La version "while" :

Code VB :
a$="567"
b$="--"
 
chaine$="123456789123456789"
print "En remplaçant ";a$;" par ";b$;" dans ";chaine$
print "   on obtient ";REMPLACE$(chaine$,a$,b$)
 
end
 
'***********************
function REMPLACE$(chain$,enlever$,remplacer$)
    enl=len(enlever$)
    cha=len(chain$)
 
    tour=1
    fini=0
    while fini=0
        dercar=cha-enl+1
        if mid$(chain$,tour,enl)=enlever$ then
            deb$=left$(chain$,tour-1)
            fin$=right$(chain$,dercar-tour)
            chain$=deb$+remplacer$+fin$
            cha=len(chain$)
        end if
 
        if tour>=cha then fini=1 else tour=tour+1
    wend
 
 
    REMPLACE$=chain$
    end function
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 13/04/2021 à 10h25

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
Citation:
a$: 1: b$: -: a$: 2: b$: --

On doit pouvoir trouver plus "tordu" comme situation.
____________________
Roro

   
Le 13/04/2021 à 10h51

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 124
Caché:
Christophe:
Eh bien ça n'a pas l'air si simple que ça... Je propose une version à base de "while" qui devrait fonctionner quelle que soit la taille et le nombre d'occurences dans la chaine. Et je travaille sur une version avec des FOR/NEXT, qui me donne bien du fil à retordre.

La version "while" :

Code VB :
a$="567"
b$="--"
 
chaine$="123456789123456789"
print "En remplaçant ";a$;" par ";b$;" dans ";chaine$
print "   on obtient ";REMPLACE$(chaine$,a$,b$)
 
end
 
'***********************
function REMPLACE$(chain$,enlever$,remplacer$)
    enl=len(enlever$)
    cha=len(chain$)
 
    tour=1
    fini=0
    while fini=0
        dercar=cha-enl+1
        if mid$(chain$,tour,enl)=enlever$ then
            deb$=left$(chain$,tour-1)
            fin$=right$(chain$,dercar-tour)
            chain$=deb$+remplacer$+fin$
            cha=len(chain$)
        end if
 
        if tour>=cha then fini=1 else tour=tour+1
    wend
 
 
    REMPLACE$=chain$
    end function
 


Merci, c parfait ! [edit] Finalement non :/[/edit]



Edité par joan74 Le 13/04/2021 à 19h07
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 13/04/2021 à 15h01

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 124
Roland:
On doit pouvoir trouver plus "tordu" comme situation.


Y'a qu'à demander ! essai sa :

Code VB :
a$="1"
b$="11"
 
chaine$="123456789123456789"
print "En remplaçant ";a$;" par ";b$;" dans ";chaine$
print "   on obtient ";REMPLACE$(chaine$,a$,b$)
 
end
 
'***********************
function REMPLACE$(chain$,enlever$,remplacer$)
    enl=len(enlever$)
    cha=len(chain$)
 
    tour=1
    fini=0
    while fini=0
        dercar=cha-enl+1
        if mid$(chain$,tour,enl)=enlever$ then
            deb$=left$(chain$,tour-1)
            fin$=right$(chain$,dercar-tour)
            chain$=deb$+remplacer$+fin$
            cha=len(chain$)
        end if
 
        if tour>=cha then fini=1 else tour=tour+1
    wend
 
 
    REMPLACE$=chain$
    end function
 
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 13/04/2021 à 18h34

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2489
Citation:
Y'a qu'à demander ! essai sa :

Pfff... J'suis dèg'.. :(
____________________
Roro

   

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie