Module de calcul mathématiques/string divers

Soyez le premier à donner votre avis sur cette source.

Vue 24 649 fois - Téléchargée 895 fois

Description

C'est un module simple pour effectuer tout vos calculs mathématiques sans avoir à recréer à chaque fois vos fonctions
Permet aussi d'effectuer des opérations sur les strings (4 ou 5 dispo car en cours de création :-) )

Ce sont donc des calculs simples, je n'invente rien, mais je regrouppe tout dans un module, çà peux faciliter le vie.
A noter que la variable MathState prend les valeurs 0,1,2 en fonction de l'état des calculs (impossible, done, working)
De même pour StringState

Au point de vue mathématique, rien de bien nouveau (à vous de voir)
Point de vue prog, rien de bien nouveau non plus (permet aux débutants de comprendre enum, des algos et des fonctions sur les strings, c'est à peu près tout) Code commenté.
Je vais finir de mettre les fonctions sur les strings quand j'aurais le temps !

Source / Exemple :


J'ai viré tout le code de cette zone, y en avait trop !
A la place, je met l'aide du module (dispo dans le module). Vous pourrez voir comme çà quelle fonctions sont/seront traitées

'___________String

'   Sans_Espaces
'enlève les espaces d'une chaîne de carcatères. Arguments : 1 string
'Exemple: sans_espaces("azerty ui  p ")="azertyuip"
'   ParentFolder
'cette fonction doit être utilisée avec 1 chaîne comportant le path d'un folder/fichier
'Arguments : 2 string et 1 booléenne, la 1ere string comporte le path, la 2eme
'comporte le string de séparation . Cette string est facultatif ("\" par défaut).
'cette string ne doit comporter qu'un caractère. La première string doit
'comporter au moins 2 fois la 2eme. La booléenne détermine si oui ou non
'on doit afficher la deuxième string à la fin du résultat, si celle ci n'y est pas.
'La booléenne est facultative (false par défaut)
'Exemple: ParentFolder("c:\aze\ert\tyui\","\",true)="c:\aze\ert\"
'ParentFolder("c:\aze\")="c:\"
'   ExtensionFichier
'donne l'extension d'un fichier. Arguments : 1 string. La string doit comporter le
'path d'un fichier ayant une extension.
'Exemple: ExtensionFichier("c:\aze.tXt")="tXt"
'   NomFichier_avec_extension
'Extrait le nom d'un fichier + son extension dans un path. Arguments : 1 string
'Exemple: NomFichier_avec_extension("c:\aze.tXT")="aze.tXT"
'   NomFichier_sans_extension
'donne le nom d'un fichier à parit d'un path, en enlevant l'extension. Arguments : 1 string
'Exemple: NomFichier_sans_extension("c:\az.txt")="az"
'   Inverser_string
'inverse la string. Argument : 1 string
'Exemple: Inverser_string("azerty")="ytreza"
'   Reduire_racine_nombre
'donne la racine carrée d'un nombre, de façon réduite. Arguments : 2 string
'Exemple: Reduire_racine_nombre("405","*sqr ")="9*sqr 5"
'       Convertions diverses entre hexa/decimal/binaire Arguments : 1 string 1 long
'       La string contient la valeur à convertir, et la long le nombre de bits
'   Decimal_to_binaire
'   Hexa_to_binaire
'   Hexa_to_decimal
'   Decimal_to_hexa
'   Binaire_to_hexa
'   Binaire_to_decimal
'Exemple:
'Decimal_to_binaire("45", ,6)="101101"
'   Path_only
'donne juste le chemin dans le path d'un fichier. Arguments : 1 string
'Exemple: Path_only("c:\az\ze.txt")="c:\az\"
'   Verifier_string
'Verifie que la string est compatible avec les conditions. Arguments : 2 string
'et une booléenne.
'si la boolean est vraie, alors TOUTES les lettres de la string 2 doivent etre
'dans string 1 pour que l'opération soit vraie.
'Si la booléenne est fausse, si une lettre de la string 2 apparait dans la string 1
'alors l'opération est fausse.
'Exemples: 1) StringOp(Verifier_string, "cceccii est unn exemmplee", "ceci", , True)
'renvoie Vrai car toutes les lettres de "ceci" sont dans "cceccii est unn exemmplee"
'2) StringOp(Verifier_string, "cceccii est unn exemmplee", "ceci a", , True)
'renvoie Faux car "a" n'apprait pas dans "cceccii est unn exemmplee"
'3) StringOp(Verifier_string, "cceccii est unn exemmplee", "azry", , False)
'renvoie Vrai car aucune lettre de "azry" n'apparait dans "cceccii est unn exemmplee"
'4) StringOp(Verifier_string, "cceccii est unn exemmplee", " ", , False)
'renvoie Faux car le " " apprait au moins une fois dans "cceccii est unn exemmplee"
'   Convertir_minuscule
'convertis les lettres sélectionnées en minuscule. Arguments : 2 string 1 booléenne
'La première string donne la string à convertir, la deuxième les lettres qui
'doivent être convertis (booléenne vraie) ou ne pas etre converties (booléenne fausse)
'Exemple: Convertir_minuscule("ESSAI,"e", ,True)="ESSAI"
'Convertir_minuscule("ESSAI", "E", ,True) = "eSSAI"
'Convertir_minuscule("EsSai","S", ,False)="esSai"
'   Convertir_majuscule
'Idem que la fonction Convertir_minuscule, mais pour les majuscules
'   Rechercher_dans_string
'recherche dans une string le nombre de fois qu'apparait la string désirée.
'Arguments : 2 string et 1 booléenne. La première string donne la chaîne dans laquelle
'on doit chercher, la deuxième la chaîne à chercher, et la booléenne si la casse
'est ou non respectée (false par défaut)
'Exemple: Rechercher_dans_string("Essai de recherche","he", ,false)="2"
'Rechercher_dans_string("Essai de recHErcHe","HE", ,true)="1"
'   Evaluer_string
'évalue une expression mathématique, et donne une expression numérique. Arguments :
'1 string et 1 long. Attention ! Le résultat est donnée sous forme de string !
'La long défini l'arrondi (après la virgule) (5 par défaut)
'Exemple: Evaluer_string("1+2*(9*cos(4))", ,4)="-10.7655"
'   Sans_accents
'enlève les accents désirés d'une string. Arguments : 2 string. La premiere donne
'la string à modifier, et la deuxième les accents à enlever.
'Exemple: Sans_accents("Îôömple","ö")="Îôomple"
'   Give_folder
'donne le folde désigné par le nom du path. Arguments : 1 string
'Exemple: Give_folder("C:\az\ae.txt")="C:\az\"
'   Selection_mot_X
'donne le Xieme mot d'une chaîne. Arguments : 2 string et 1 long. La premiere string
'donne la string qui possède les mots séparés, la deuxième demande par quel
'caractère sont espacés les mots, et la long le rang du mot.
'Exemple: Selection_mot_X("za      az un deux trois quatre"," ",3)="un"

'___________Mathématiques

'enum qui recense toutes ls fonctions dispo
'   Pi
'donne la valeur de Pi. Arguments : 1 long (qui détermine l'arrondi; 10 par défaut)
'   Racine_N_ieme_de_X
'calcule la racine Nième de X Arguments : 2 double
'Exemple: Calcul(Racine_N_ieme_de_X ,6561,4)=9
'   Factorielle
'calcul de factorielle de X Arguments : 1 long
'Exemple: Factorielle(5)=120
'   Sommielle
'calcule de la "somielle" de X (somme de 1+2+3+...+x) Arguments : 1 long
'Exemple: Sommielle(4)=10
'       Maintenant, diverses fonctions de trigo circulaire et hyperbolique
'       ne nécessite qu'1 argument (double). Si le double est hors domaine
'       de définition, le programme renvoie 0.
'       Secante 'calcul de la sécante de X
'Cosecante 'calcul de la cosécante de X
'Cotangente 'calcul de la contangente de X
'Arcsinus    'calcul de l'arcsinus de X
'Arccosinus  'calcul de l'arccosinus de X
'Arcsecante  'calcul de l'arcsécante de X
'Arccosecante    'calcul de l'arccosécante de X
'Arccotangente   'calcul de l'arccotangente de X
'Sinus_hyperbolique  'calcul du sinus hyperbolique de X
'Cosinus_hyperbolique    'calcul du cosinus hyperbolique de X
'Tangente_hyperbolique   'calcul de la tangente hyperbolique de X
'Secante_hyperbolique    'calcul de la sécante hyperbolique de X
'Cosecante_hyperbolique 'calcul de la cosécante hyperbolique de X
'Cotangente_hyperbolique 'calcul de la cotangente hyperbolique de X
'Arcsinus_hyperbolique   'calcul de l'arcsinus hyperbolique de X
'Arccosinus_hyperbolique 'calcul de l'arccosinus hyperbolique de X
'Arctangente_hyperbolique    'calcul de l'arctangente hyperbolique de X
'Arcsecante_hyperbolique 'calcul de l'arcsécante hyperbolique de X
'Arccosecante_hyperbolique   'calcul de l'arccosécante hyperbolique de X
'Arccotangente_hyperbolique  'calcul de l'arccotangent hyperbolique de X
'   Logarithme_base_N
'calcule le log de X à base N. Arguments : 2 long
'Exemple: calcul(Logarithme_base_N,100,10)=2
'   Est_premier
'renvoie si X est premier ou non. Arguments : 1 long. Renvoie 0 ou 1
'Exemple: Est_premier(17)=1
'   Exposant
'calcule X^N Arguments : 2 double
'Exemple: calcul(exposant,2,3)=8
'   PGCD
'calcule le pgcd de X et N   Arguments : 2 long
'Exemple: calcul(PGCD,4,8)=4
'   PPCM
'calcule le ppcm de X et N   Arguments : 2 long
'Exemple: calcul(PPCM,4,8)=8
'   Liste_nombres_premiers_jusqu_à_X
'donne tous les nombres premiers jusqu'au nombre X. Arguments : 1 long
'les résultats sont renvoyés dans la liste CalculR, et Calcul prend la valeur de X
'Par exemple, pour X=25, calcul=25, CalculR(1)=2, CalculR(2)=3, CalculR(3)=5 ....
'   Liste_des_X_premiers_nombres_premiers
'donne la liste des X premiers nombres premiers Arguments : 1 long
'calcul prend la valeur de X, et les résultats sont renvoés dans CalculR
'Par exemple, pour X=5, Calcul=5, CalculR(1)=2, CalculR(2)=3,CalculR(3)=5,CalculR(4)=7,CalculR(5)=11
'   Division_euclidienne
'effectue la division euclidienne de X par N  Arguments : 2 long
'Exemple: calcul(Division_euclidienne,17,4) nre renvoie rien. Les résultats sont
'stockés dans CalculR (le quotient dans calculr(1) et le reste dans calculr(2))
'   Liste_diviseurs
'donne la liste des diviseurs de X  Arguments : 1 long
'calcul prend la valeur de 0 ou 1 et les résultats sont données dans calculR
'   Decomposition_facteurs_premiers
'décompose X en facteurs premiers  Calcul prend la valeur 0 ou 1. Arguments : 1 long
'les résultats sont donnés dans calculR
'   Combinaison_X_parmi_N
'donne X parmis N. Arguments : 2 long
'Exemple: calcul(Combinaison_X_parmi_N,0,7)=1
'   Arrangement_X_parmi_N
'donne le nombre d'arrangement de X dans N. Arguments : 2 long
'Exemple: calcul(Arrangement_X_parmi_N,0,7)=1
'       Diverses convertion d'unités d'angles
'       Ne nécessite qu'1 argument (double)
'Convertion_Rad_vers_Degre
'Convertion_Degre_vers_Rad
'Convertion_Grade_vers_Degre
'Convertion_Grade_vers_Rad
'Convertion_Rad_vers_Grade
'Convertion_Degre_vers_Grade
'   Gamma
'calcul APPROCHE de la fonction Gamma. Plus X est grand, plus la valeur est proche
'du résultat    Arguments : 1 double. Calcul exact pour les valeurs entières.
'Exemple: Gamma(0.5)=1.772453  (racine de Pi)

Conclusion :


Alors si vous trouvez des bugs, si vous avez des questions, si vous voulez que j'ajoute des fonctions, je suis preneur !
Ne notez pas tout de suite SVP, le code n'est pas finit. Le code n'est pas optimisé au point de vue des algos, c'est pour plus tard ! (bientôt quand même)

Par contre, postez vos critiques/remarques/suggestions !!!

Merci, @+

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Salut us_30.
Je répond à tes deux messages :
1) factorielle : je vais étudier ton code, car effectivement le type de donnée limite le calcul.
2) la "sommielle". Alors là je suis INEXCUSABLE. C'est évidemment la somme des termes d'une suite arithmétique de raison 1. D'où S=1er terme * dernier terme * nb terme /2.
C'est Euler qui a eu ce raisonnement ?? Je ne me rappelais pas exactement du nom du (futur) mathématicien ayant fait çà à cet âge là, c'est donc Euler... Pour la petite histoire, que tu connais déjà je suppose, Euler s'ennuyait en cours de maths à son âge. (8 ans, donc)
Le professeur, le voyant bavarder, lui donna alors une punition censée l'occuper jusqu'à la fin du cours : faire la somme des 100 premiers nombres : 1+2+3+4+...+99+100. Euler réfléchissa alors, puis écrit le chiffre 1 en face du nombre 100. De même avec 2 et 99, 3 et 98 .... et s'aperçu alors que la somme était toujours de 101. Il donna donc après 1 minute de réfléxion le résultat à son professeur : 100*101/2. Ce dernier fut, on peut l'imaginer, vraiment surpris.

Enfin, concernant mon programme, j'ai pris en compte ta première remarque (celle du 20 novembre) : je compte optimiser. D'ailleurs tu as pu t'apercevoir que mon module est incomplet; je compte le terminer pendant ces vancances. Et l'optimiser par la même occasion.
Le temps me manque, ces derniers temps je n'ai programmé qu'un programme (le jeu de la vie) qui m'a pris à peine 3h le soir du premier jour de mes vacances...
Donc je prend, bien entendu, en compte tes remarques pertinentes, et je posterais une mise à jour (d'ici à la fin de l'année je pense) qui terminera le programme (les fonctions string) et qui améliorera les algos (où, dans le cas de la somielle, les chamboulera complétement !).

Je te remercie us_30 pour tes conseils !
Bonne prog, @+
us_30
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8 -
Euh... encore moi... j'ai pas fini...

La fonction Somi, cette fois... Telle que tu la code, elle réalise la somme de 1 jusqu'à Nombre... Or, on peut très facilement remplacer cette fonction, par un calcul direct, au lieu de faire une boucle... En effet, si tu veux connaître la somme de 1+2+3+4+5+6+...+(N-1)+N alors il suffit de regrouper les termes deux par deux en prenant le premier et le dernier, puis le deuxième avec l'avant-dernier, etc... et on voit qu'on peut former (N/2) fois la somme (N+1), soit N*(N+1)/2.

Voilà, ce raisonnement a été tenu par Euler, à l'âge de 8 ans...

Amicalement,
Us.
us_30
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8 -
Salut,

Voici qlq remarques supplémentaires.

=

Le calcul de la factorielle n'est pas terrible !

En effet, tu déclares la fonction en type "Long"... Donc tu limites la valeur à renvoyer à 2 147 483 647 ; soit fact(12) car fact(13) dépasse la valeur limite, et renvoi une erreur (gérée)... c'est beaucoup trop peu...

Private Function Fact(Nombre As Double) As Long

... je passe sur le reste du code...


Après réflexion, je pense que pour faire une fonction factorielle la plus efficace possible sans passer par le calcul des nombres de grande taille, donc en restant en Double, qu'il est préférable de coupler ce calcul avec la fonction de Stirling. L'idée c'est de calculer Fact en double en nombre entier jusqu'à la limite de 10^16, puisqu'en suite on aura automatiquement un calcul en puissance (ex : 1E16), il sera plus rapide d'utiliser la formule de stinrling. A noter qu'on dépasse 10^16, pour fact(19). Attention, l'affichage lui peut être en puissance avant, mais la précision du calcul en interne ne sera pas affectée.

Voici ce que cela donne :

=

Function Fact(Nombre As Long) As Double
'fonction de calcul de la factorielle (jusqu'à 170!)

'gestion erreur
On Error GoTo erreur

'Définition
Dim Z As Long
Nombre = Abs(Nombre)
Fact = 1

If Nombre < 18 Then
For Z = 1 To Nombre
Fact = Fact * Z 'on multiplie jusqu'à Nombre
Next Z
Else
Dim K As Double
'K est un terme correctif de l'approximation de stirling
K = 1 + 1 / (12 * Nombre) + 1 / (288 * Nombre ^ 2) _
- 139 / (51480 * Nombre ^ 3) - 571 / (2488320 * Nombre ^ 4) _
+ 163879 / (209018880 * Nombre ^ 5)
Fact = K * Sqr(8 * Atn(1) * Nombre) * (Nombre / Exp(1)) ^ Nombre
End If

MathState = done
Exit Function
erreur:
'erreur (dépassement de capacité)
MathState = impossible

End Function

=

Après vérification, on peut constater qu'on ne peut pas dépassé 170!

Voilà, bon courage.

Amicalement,
Us.
mmptj
Messages postés
21
Date d'inscription
mardi 4 mars 2003
Statut
Membre
Dernière intervention
20 janvier 2009
-
pour calculer Pi j'utise le calcul suivant:

pi = 4# * Atn(1#)

je ne sais pas si c'est plus précis, c'est plus beau et cela m'évite de connaitre les n decimales de Pi

@+
violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Pas grave, @+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.