Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Maple : Taille d'un nombre commençant par zéro

Posté par
Damino
19-01-14 à 12:09

Bonjour, dans le cadre de mon TIPE de 2eme année de prépa je travaille sur Maple et je me heurte à un petit problème.

Je souhaiterai vérifier la longueur d'un nombre, c'est à dire le nombre de chiffre qui le compose, y compris si il y a des zéros au début et c'est bien la toute la difficulté du problème. En effet, j'avais bien pensé à plusieurs méthodes dont celle qui utilise le logarithme décimal mais à chaque fois, la présence d'un ou plusieurs zéros au début du nombre fausse le résultat.

Si vous avez une idée je suis ouvert à toute proposition car la je sèche un peu =/

Merci.

Posté par
pyth
re : Maple : Taille d'un nombre commençant par zéro 19-01-14 à 12:51

tu peux faire une procédure qui multiplie ton nombre par une puissance de 10 jusqua que ce nombre soit superieur à 1

ensuite tu fais ce que tu voulais faire avec le log

enfin ta procédure ajoute le resultat obtenu à la puissance de 10 utilisée

je te laisse programmer ca c'est pas difficile

Posté par
Damino
re : Maple : Taille d'un nombre commençant par zéro 19-01-14 à 13:00

Merci mais votre réponse ne m'avance pas beaucoup. J'aurais du préciser que je ne travaille qu'avec des nombres entiers naturels. En fait, je souhaite vérifier, par exemple, la taille du nombre 000123456789 qui est de 12.La fonction "length" aurait été parfaite si elle ne considérait pas le 0 comme ayant une taille de 0 et non de 1, elle me donne ainsi length(000123456789)=9. Mais, lorsque je fait length("000123456789")ce qui force maple à considérer le nombre comme une suite de caractères, j'obtiens bien 12 mais je ne sais pas pourquoi ceci ne marche plus dans une procédure.

Posté par
mathafou Moderateur
re : Maple : Taille d'un nombre commençant par zéro 21-01-14 à 00:02

Bonjour,

Maple ou n'importe quoi c'est pareil tu confonds deux choses qui n'ont aucun rapport

un nombre
et à ce sujet le nombre
000123456789 est totalempent identique au nombre 123456789 ou à 0123456789 ou a le même avec autant de 0 devant que tu veux
c'est le même nombre 123456789 et rien d'autre

et sa représentation écrite dans laquelle pour des raisons mystérieuses tu tiens à rajouter des zeros devant qui ne veulent rien dire et ne servent à rien.
c'est à dire une chaine de caractères

et convertir un nombre en chaine de caractère ne rajoutera jamais les zéros devant qui n'existent pas !

si tu veux traiter des 0 à gauche non significatifs, tu ne traites aucun nombre du tout, nulle part.
tu ne traite partout et toujours que des chaines de caractères

alors si maintenant Maple (et perl aussi et d'autre trucs pas fait pour) considère que le truc que tu lui donnes à manger ou transmets comme paramètre à une procédure, c'est lui, Maple, qui décide arbitrairement si ce truc là c'est une chaine de caractères ou un nombre sans que tu puisses en imposer le type, tu es mal et je ne vois pas comment tu peux t'en sortir, à part rajouter un gribouillis devant la chaine de caractères pour "protéger" le nombre qui s'y trouve de toute tentative d'interprétation numérique.

bref que des "bidouiles infames"

la vraie question est plutôt à quoi donc peuvent bien te servir ces zéros sans signification que tu tiens absolument à rajouter et à comptabiliser.

Posté par
Damino
re : Maple : Taille d'un nombre commençant par zéro 21-01-14 à 20:10

Bonsoir, tout d'abord, dites mois si je me trompe mais je sens une certaine agressivité dans votre réponse.

Ensuite, pour répondre à votre question, je me suis penché sur ce problème car mon TIPE porte sur les code-barres et je cherche donc à créer un algorithme qui en entrée reçoit la valeur numérique du code-barres(qu'il soit 1234567891236 ou 0001245678912 ou encore même 0000000000000) puis qui donne en sortie le code-barres tracé graphiquement.

Cependant, comme j'aime les choses bien faites, j'y intègre une sécurité qui analyse la valeur entrée. En effet, le programme doit recevoir uniquement un nombre composé de 13 chiffres et positif, il faut donc que je vérifie la "taille" de ce qui est entré.

J'espère avoir été plus claire que précédemment.

Posté par
mathafou Moderateur
re : Maple : Taille d'un nombre commençant par zéro 21-01-14 à 23:36

L'agressivité ressentie n'existe pas, je m'excuse si cela a été perçu comme tel.

quoi qu'il en soit il n'y a qu'une seule possibilité :
on ne rentre pas un nombre mais dès le départ une chaine de caractère.
et on fait tout le traitement sur cette chaine de caractères sans jamais la transformer en nombre.
ou alors en la convertissant en (un autre) nombre pour certains calculs au besoin, mais en gardant toujours l'original "chaine".


Cela va devenir bien difficile (= impossible) si Maple ne permet pas de définir le type des variables "en dur", et si c'est lui qui le choisit de son propre chef en fonction de "la gueule du client" (de l'allure de la suite de caractères tapée : s'il n'y a que des chiffres il dit "c'est un nombre" alors qu'il faudrait une chaine)
dans ce cas il n'y a aucune solution.
enfin si : utiliser un vrai langage de programmation...

Posté par Profil Dlzlogicre : Maple : Taille d'un nombre commençant par zéro 22-01-14 à 15:09

Bonjour,
Je crois qu'il n'y avait aucune agressivité chez Mathfou, et je crois que j'aurais répondu à peu près la même chose.
Donc, à mon avis il y a plusieurs solutions
1- utiliser un langage du type C/C++
2- essayer de transformer la chaine en nombre. Ce type de problème existe aussi en PHP, et il y a des astuces pour le contourner, du type "rajouter 0" ou "multiplier par 1", ou utiliser une fonction telle que value(), tout ceci ayant pour but de "forcer à avoir un nombre".
3- garder ce nombre sous forme de chaine et utiliser les fonction de traitement de chaine pour supprimer les '0' initiaux. Cette méthode est toujours (ie encore) utilisée pour supprimer les blancs inutiles, au début ou à la fin d'une chaine ou doublés.

Posté par
mathafou Moderateur
re : Maple : Taille d'un nombre commençant par zéro 22-01-14 à 15:21

sauf que là le problème est le contraire : on veut garder les 0 devant
mais sinon cela relève effectivement de la "bidouille"
(le coup du transtypage implicite en effectuant des produits et "sommes" de trucs de types différents)

Posté par
J-P Posteur d'énigmes
re : Maple : Taille d'un nombre commençant par zéro 22-01-14 à 15:48

Je ne connais pas bien Mapple.
Peut être faut-il commencer par assigner un "string" à la variable (par x:=`A`) qui recevra la donnée du code barre (par un readline(terminal) par exemple).

Quelque chose comme ceci :

L:= 0
x:=`A`
x:= readline(terminal)
L:= length(x)

Et voir ce que cela donne.

Posté par Profil Dlzlogicre : Maple : Taille d'un nombre commençant par zéro 22-01-14 à 15:50

Bonjour Mathafou,
Rien n'empêche d'avoir une variable chaine avec les 0 et une variable int sans les 0, avec 2 noms différents, dont on pourra compter les chiffres sauf les zéros initiaux, ou chercher la position du premier chiffre non nul et faire la soustraction.
Oh non, il ne s'agit pas de transtypage.
En fait il s'agit essentiellement d'utiliser les outils prévus par le langage.
Dans le cadre d'impression, par exemple en HTML, j'utilise souvent cette méthode, ben sûr dans l'autre sens. J'ai une valeur numérique et je crée une valeur chaine au format que je décide et que je peux imprimer.
La méthode qui consiste à prendre le log en base 10 me parait très couteuse et très risquée, puisque le log est calculé par un développement en série.  

Posté par Profil Dlzlogicre : Maple : Taille d'un nombre commençant par zéro 22-01-14 à 16:09

Bon, j'ai relu les premiers messages.
Soit votre nombre est une suite de caractères et il me parait étonnant que length(num) renvoie 9 si num = "000123456789"
Par contre si vous faites length(000123456789), il est possible que la fonction se dise "tien, c'est une valeur numérique qui commence par des 0 or c'est interdit, donc d'office,je les supprime", alors oui, mais la fonction length attend habituellement une chaine.
Si vous montriez votre code ce serait plus compréhensible.

Posté par
Damino
re : Maple : Taille d'un nombre commençant par zéro 22-01-14 à 22:18

mathafou : Excusez moi j'avais en effet mal compris votre intonation.

Dlzlogic: Voici ma procédure actuelle. En attendant de trouver éventuellement une solution, je demande d'entrer la valeur du code et le nombre de zéros présents devant.

Test := proc (x,n)
local r, T;
T := length(x)+n;
if type(x, integer) = true and abs(x) = x and T = 12 then r := 1 else r := 0 end if;
end proc:

Un truc que je ne comprend pas c'est que la procédure suivante ne fonctionne pas :

test := proc (x)
local A, R;
A := 'x';
if length(A) = 12 then R := 1 else R := 0 end if;
return R ;
end proc;

J-P: Je ne connait pas trop ce que sont les fonctions readline et terminal mais elles fonctionnent, je vais me pencher dessus

Sinon, un ami a émis comme idée d'essayer de convertir le code en lettres et de faire le test sur les lettres et ensuite de retourner travailler sur les chiffres mais il reste toujours le problème de savoir si les zéros devant seront comptés ou non dans la conversion.

Posté par
J-P Posteur d'énigmes
re : Maple : Taille d'un nombre commençant par zéro 23-01-14 à 09:46

x:= readline(terminal)

Permet d'entrer, par le clavier, une donnée (string ou nombre) et de la mettre dans la variable x.
-----
Si cela ne donne pas le résultat escompté avec ce qu'il y a dans mon message précédent, peut être essayer ceci :

x:= "B".readline(terminal)

L'opération "B".readline(terminal) pourrait (à essayer) concaténer une lettre (B) à l'entrée du code barre faite par le clavier.
Ce type de concaténation, attribue au résultat le même format que le 1er "terme" concaténé, soit donc ici un string (puisque B est une lettre).

Si cela fonctionne, alors la variable x serait un string commençant par la lettre B suivie des chiffres entrés par le clavier.
On pourrait alors en évaluer la longueur (qui devrait être de 13 et pas de 12 évidemment)
-----
Sans aucune garantie.

Tu n'as pas précisé comment tu entrais le code barre dans le programme.
Ce que j'ai proposé concerne une entrée via le clavier, si l'entrée se fait différemment alors ...

Posté par
Damino
re : Maple : Taille d'un nombre commençant par zéro 23-01-14 à 12:52

Le code de 4 lignes que tu m'as donné fonctionne parfaitement, je disais juste que j'allais étudier la question pour savoir comment l'intégrer à une procédure. Et donc pour répondre à ta question, le code est entré avec le clavier, oufff ^^

Le mieu que je pourais reussir à faire c'est créer une procédure qui pourrai faire agir ta commande sans redemander une 2eme fois le code.

Posté par
mathafou Moderateur
re : Maple : Taille d'un nombre commençant par zéro 23-01-14 à 13:58

dans le genre de traductions de chaines en nombre et vice versa, un truc "à la hussarde" qui pourrait fonctionner serait :

N := "".readline() (. = concaténation, ou autre syntaxes pour concaténer deux chaines dans Maple)

N est alors la concaténation de la chaine vide "" avec ce qui est tapé, donc une chaine qui "conserve" tous les caractères tapés, y compris les 0 donc.
Et donc length(N) ou N.length devrait donner la longueur de ce qui est tapé, donc les zéros compris et pas de caractère parasite en plus.
Envoyer la chaine N vers une proc lui conserve son caractère de chaine (donc ses 0)

Si ensuite on a besoin du nombre représenté par cette chaine, il suffit de la convertir en nombre, "à la hussarde" toujours, en écrivant
x = 1*N
x est le produit de 1 (un nombre) par quelque chose qui se trouve être une chaine et que le programme décide donc de convertir de lui même en nombre pour pouvoir effectuer la multiplication
et ce faisant il prend la vraie valeur du nombre (donc en virant les 0)

de sorte que si ensuite on écrit M = "".x on retrouve une chaine, mais sans les zéros.
etc

variations à l'infini selon ce qu'on veut faire.

Posté par
J-P Posteur d'énigmes
re : Maple : Taille d'un nombre commençant par zéro 23-01-14 à 19:04

Quelque chose comme ceci :

Dans le corps de programme :

...
x:=`A`;
x:= readline(terminal);
...


Et la procédure à appeler.

Test:= proc (x)
local B, R;
B:= `A` ;
B:= x ;
if length(B) = 12 then R := 1 else R := 0 end if;
return R ;
end proc;

Posté par
Damino
re : Maple : Taille d'un nombre commençant par zéro 24-01-14 à 19:35

Bonsoir, alors ce fut un grand périple mais je peux dire ce soir que le problème est résolu !

Je suis désolé mathafou mais la méthode de ton dernier message ne fonctionne pas mais merci beaucoup pour tes interventions ! =)

J-P, merci beaucoup à toi aussi, j'ai réussit à intégrer la commande dans une procédure sans avoir besoin de rentré le code 2 fois (dans l'entrée de la procédure et ensuite dans le fenêtre qui s'ouvre), ce qui donne ceci :

Test := proc ()
local x, a, t, r;
x := readline(terminal);
a := parse(x);
t := length(x);
if t = 12 and type(a, integer) = true and abs(a) = a then r := 1 else r := 0 end if;
return r;
end proc;

Petite dernière question, à quoi sert "terminal" dans le readline ?



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !