Forum Liberty Basic France

Général » [Réglé] Affichage de nombres Nombres entiers sans ".0"
Le 01/11/2011 à 15h00

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
Bonjour,

Dans un petit programme, j 'ai des résultats numériques entiers (mais ils pourraient ne pas être entiers).

Lorsque ce sont des nombres entiers, par exemple 1, mon programme affiche systématiquement 1.0.

Je n'arrive pas à contourner cela pour obtenir simplement l'affichage de "1" au lieu de "1.0".

On peut toujours écrire INT() mais s'il y a une partie fractionnaire, elle est perdue.
Les STR$() et les VAL() n'ont rien produit d'utile jusqu'à présent.

Cette contrariété sur l'affichage est certainement déjà apparue auparavant.

Merci à la personne qui connaît déjà la solution.
Merci aussi à celle qui n'a pas encore la solution, mais qui la trouve.

Claude



Edité par claudevdw Le 01/11/2011 à 15h06
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 01/11/2011 à 15h46

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
salut claude,

et si tu partageais le code de ton petit programme en l'insérant dans ton post par exemple... :siffle :lol
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 02/11/2011 à 08h55

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
Bonjour,
Voici mon code, que j'avais déjà développé (en moins compliqué) dans un autre Basic.
Les résultats entiers sont affichés 12.0 au lieu de 12 (p. ex.)
Je ne dois pas utiliser INT() pour ne pas faire disparaître des décimales significatives, s'il y en a.
Je ne vois vraiment pas d'où ça vient.
Merci de regarder ce code (surtout la fin)

Claude


Code VB :
'GAUSS-JORDAN - systèmes d'équations linéaires
'=============================================
'résolution d'un système d'équations linéaires par la méthode d'élimination de G-J

[PROBLEME]
'---exemple de système de  10 équations linéaires à 10 inconnues; les solutions sont  :
'   x1 = 1,  x2 =2,  x3 = 3,  x4 = -1,  x5 = -2,  x6 = -3,  x7 = 5,  x8 = -10, x9 = 12, x10 = -7

PRINT "Systeme de 10 equations et 10 inconnues:"
PRINT
PRINT "x1   - x2   + 2x3  - x4   + x5    + x6   - x7   + x8     - x9   + x10 = -33"
PRINT
PRINT "3x1  + 2x2  +  x3  + x4   - x5    - x6   + 2x7  - x8  + x9   - 2x10=  60"
PRINT
PRINT "2x1  - 3x2  - 2x3  - 2x4  - 3x5   - 2x6  - 3x7  + 2x8 - 3x9 + 3x10= -88"
PRINT
PRINT "4x1  - x2   - 3x3  + 3x4  + 2x5   + 4x6  + x7   - 2x8 + 3x9 + 4x10=  7"
PRINT
PRINT "-6x1 + 5x2  - x3   + 4x4  - 6x5   - 3x6  - 2x7  + 3x8 + 2x9  - 3x10 =  23"
PRINT
PRINT "-5x1 + x2   + x3   + x4   + x5    + x6   + 3x7  - 3x8 - 2x9  -4x10 =  43"
PRINT
PRINT "x1   + x2   + x3   + x4   + x5    + x6   + 4x7  + 4x8 + 4x9 + x10 =  21"
PRINT
PRINT "-2x1 - 2x2  - 3x3  - 4x4  - 5x5   + 6x6  + 7x7  - 8x8 - 5x9 + x10 =  29"
PRINT
PRINT "x1   +  x2  +  x3  - 2x4  - 2x5   - 2x6  + 3x7  + 3x8 + 3x9 - 2x10 =  53"
PRINT
PRINT"2x1  -  2x2 + 3x3 + 4x4 - 5x5   + 6x6  - 7x7  + 8x8 -  3x9 +2x10 = -170"
PRINT: PRINT
 
[MATRICE]
'---créer la matrice des n coefficients et des termes indépendants (en  A(n , n+1) et l'afficher

n = 10
DIM A(n+1, n+1)          'pour les coefficients

DATA  1,    -1,      2,    -1,     1,     1,   -1,    1,    -1,    1, -33
DATA  3,    2,      1,      1,     -1,   -1,    2,    -1,    1,   -2, 60
DATA  2,    -3,    -2,     -2,    -3,    -2,    -3,    2,   -3,   3,  -88
DATA  4,    -1,    -3,     3,      2,     4,     1,    -2,   3,   4,   7
DATA -6,     5,    -1,     4,     -6,    -3,   -2,     3,    2,  -3,  23
DATA  -5,     1,     1,      1,     1,      1,    3,    -3,  -2,  -4,  43
DATA  1,     1,     1,      1,     1,      1,    4,    4,     4,  1,   21
DATA  -2,   -2,   -3,     -4,    -5,      6,    7,   -8,     -5,  1,   29
DATA  1,     1,     1,     -2,    -2,     -2,     3,    3,    3,  -2,  53
DATA  2,    -2,    3,      4,     -5,     6,    -7,    8,    -3,   2, -170
 
'--- lecture des données

PRINT "Matrice des coefficients et des termes independants:" : PRINT
FOR i = 1 TO n
FOR j = 1 TO n + 1
    READ m
    A(i, j) = m
    PRINT m,
NEXT j
PRINT: PRINT
NEXT i
PRINT
 
'---vérifier s'il n'y a pas de zéro sur la diagnonale des coefficients, sinon problème insoluble

flag = 0
FOR i = 1 TO n
   IF A(i,i) = 0 THEN flag = 1
NEXT i
IF flag = 1 THEN
PRINT "Un coefficient diagonal nul, cas insoluble"
GOTO [Fin]
END IF
 
[CALCUL]
'---Calcul (en 17 instructions)---(i  et  k  indices de lignes,  j  indice des colonnes)

t1 = TIME$("ms")
 
'---réduire chaque pivot diagonal A(i,i)  à 1 en divisant toute la ligne par A(i,i)
FOR i = 1 TO n
            p = A(i, i)          'c'est le "pivot" de Gauss, il est sur la diagonale principale
    FOR j = 1 TO n + 1
            q = A(i, j)
            A(i, j) = q / p
        NEXT j
 
'combiner la ligne i avec toutes les autres lignes (donc sauf si  k = i)
'en soustrayant de la ligne k, la ligne i multipliée par le coefficient de X(i) à la ligne k, càd A(k,i) ;
'la ligne i reste intacte.

FOR k = 1 TO n
 
    p = A(k, i)
 
    IF k <> i THEN
        FOR j = 1 TO n + 1
                q = A(i, j)
                r = A(k, j)
                A(k, j) = r - p*q
        NEXT j
    END IF
NEXT k
 
NEXT i
 
'NB: éviter de diviser ou de multiplier les A(i,j)/A(m,n) ou A(i,j)*A(m,n),
'       résultats aberrants surtout avec des décimales et deux dimensions

t2 = TIME$("ms")
'--- *** Fin du calcul *** --- voyons la matrice-résultat

[MATRCE_RESULTAT]
 
PRINT "Apres transformation de Gauss-Jordan :": PRINT
 
FOR i = 1 TO n
    FOR j= 1 TO n+1
       PRINT A(i, j),
    NEXT j
    PRINT: PRINT
NEXT i
 
PRINT
 
[RESULTAT_FINAL]
'---Afficher les valeurs des inconnues      'X(i) = A(i, n+1)

PRINT "Solutions:": PRINT
FOR i = 1 TO n
PRINT "X"; STR$(i); " = "; A(i, n+1)
NEXT i
PRINT
 
PRINT "temps de calcul = "; (t2 - t1); " millisecondes"
 
'NB: temps de calcul 16 millisecondes; " millisecondes" sur mon PC très moyen
'       on ne mesure pas le temps d'affichage

'---Terminer
[Fin]
END
 
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 02/11/2011 à 11h39

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
Je viens d'exécuter ce programme avec LBB: l'affichage est normal. Un bug ?

Claude

Edit Nephthys : J'ai déplacé le sujet dans la section appropriée (;
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 02/11/2011 à 22h20

Administrateur

Groupe: Administrateur

Inscrit le: 24/09/2010
Messages: 203
Salut !

Je ne comprend pas pourquoi tu ne veux pas utiliser int( ??
De toute façon, ce n'est que de l'affichage et tu ne veux pas afficher la partie décimale. Donc int( est adapté ?

Par contre, si le nombre est 12.8, la fonction int( te retournera 12 et non 13.
Pour cela, tu peux recoder ta fonction qui te donne l’arrondie et non la troncature.

Code VB :
print int(12.8)
print round(12.8)
end
 
function round(nb)
    round = int(nb)
    if nb-int(nb) >= 0.5 then round = round + 1
end function
 

Mail MSN Web    
Le 03/11/2011 à 01h17

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
ou au pire Code VB :
...
if int(A(i, n+1)) <> A(i, n+1) then PRINT "X";i;" = "; using("###,###",A(i, n+1)) else PRINT "X";i;" = "; A(i, n+1)
...

mais ça n'arrive jamais un résultat avec décimales après tes calculs de toute façon !?


claudevdw:
Je viens d'exécuter ce programme avec LBB: l'affichage est normal. Un bug ?

Claude

Edit Nephthys : J'ai déplacé le sujet dans la section appropriée (;


à bon ????



Edité par cassiope01 Le 03/11/2011 à 01h23
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 03/11/2011 à 08h34

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
En fait ce que je souhaite, c'est afficher 12.8 si le résultat est 12.8, et 12 si le résultat est entier.
Je désire donc éviter d'obtenir 12.0 au lieu de 12.
Je ne peux pas employer INT() ni ROUND() car je veux conserver les décimales significatives s'il y en a.

IF A(i, n+1) <> INT(A(i, n+1)) THEN ... donne aussi 12.0.

Maintenant, ce n'est pas capital car 12.0 est compréhensible et utilisable dans des calculs.

Mais c'est intrigant.

Claude
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 03/11/2011 à 13h43

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
c'est donc bien ce que j'avais compris et chez moi ça donne bien le résultat que tu escomptais...

où as-tu inséré le using( "###,###" ) conditionné exactement ?



Edité par cassiope01 Le 03/11/2011 à 13h44
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 03/11/2011 à 14h38

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
Je le mets ici (pour l'essai), donc pour l'affichage final:


[RESULTAT_FINAL]
'---Afficher les valeurs des inconnues 'X(i) = A(i, n+1)

PRINT "Solutions:": PRINT
FOR i = 1 TO n
IF A(i, n+1) <> INT(A(i, n+1)) THEN
PRINT "X"; STR$(i); " = "; USING("###.###", A(i, n+1))
ELSE
PRINT"X"; STR$(i); " = "; A(i, n+1)
END IF
NEXT i
PRINT

Mais au lieu de 12.0, je reçois 12.000. Si je comprends bien, tu obtiens 12 ?

Note1: le code (précédent) est complet, il doit tourner tel quel par copier-coller dans l'éditeur;
j'ai d'ailleurs un autre exemple sans problèmes avec rien que des décimales.

Note2: les [RESULTAT_FINAL] et les autres ne sont pas ici des procédures mais des titres, c'est bien lisible et ça ne gêne pas vraiment.

Claude



Edité par claudevdw Le 03/11/2011 à 14h43
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 03/11/2011 à 20h11

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
oui oui j'obtiens 12 et non 12.0 !!!

essaye l'inverse :

if int(A(i, n+1)) = A(i, n+1) then PRINT "X";i;" = "; using("####",A(i, n+1)) else PRINT "X";i;" = "; A(i, n+1)


fait voir l'exemple avec plus de mélange avec/sans décimales stp :siffle

@+
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 03/11/2011 à 21h11

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
J'ai copié-collé ton exemple, mais sur mon PC ça donne ceci:

Solutions:

X1 = 1.0
X2 = 2.0
X3 = 3.0
X4 = -1.0
X5 = -2.0
X6 = -3.0
X7 = 5.0
X8 = -10.0
X9 = 12.0
X10 = -7.0

'-------------------------------------------
Maintenant un exemple avec quelques décimales:
(désolé, je n'arrive pas à le placer dans une fenêtre ad hoc, mais ça doit fonctionner par copier-coller))

'GAUSS-JORDAN++.BAS LB404 25-10-2011
'============================
'résolution d'un système d'équations linéaires par la méthode d'élimination de Gauss-Jordan

PRINT "5 équations à 5 inconnues avec décimales, résolution par Gauss-Jordan"
PRINT "---------------------------------------------------------------------------------------------------"
PRINT

PRINT "1 - Enoncé du problème:"
PRINT
PRINT "2.36*x1 + 0.2*x2 + 3.56*x3 - 4.12*x4 + 3.56*x5 = -8.90412"
PRINT "-2,4*x1 - 0.6*x2 + 1.45*x3 + 0.458*x4 - 0.21*x5 = -23.595970"
PRINT "0.24*x1 + 0.65*x2 - 0.36*x3 - 2.5*x4 + 4.25*x5 = -4.57245"
PRINT "3.41*x1 + 0.23*x2 + 1.2*x3 - 1.3*x4 - 1.6*x5 = 1.3887"
PRINT "0.36*x1 - 1.69*x2 + 0.56*x3 - 3.45*x4 - 6.24*x5 = -9.77202"
PRINT

'solutions: x1 = 1.2: x2 = 2.25: x3 = -0.63 : x4 = 2.2: x5 = -0.247

'--------------------------------- lecture des données
n = 5

DATA 2.36, 0.2, 3.56, -4.12, 3.56, -8.90412
DATA -2.4, -0.6, 1.45, 0.458, -0.21, -4.08403
DATA 0.24, 0.65, -0.36, -2.5, 4.25, -4.57245
DATA 3.41, 0.23, 1.2, -1.3 , -1.6, 1.3887
DATA 0.36, -1.69, 0.56, -3.45, -6.24, -9.77202

DIM A(n+1, n+2)
DIM X(n)

PRINT "2 - Matrice des coefficients et des termes independants (affichage arrondi):"
PRINT
FOR i = 1 TO n
FOR j = 1 TO n + 1
READ m
A(i, j) = m
PRINT USING ("###.###", m),
NEXT j
PRINT: PRINT
NEXT i
PRINT

'--------------------------------Vérifier s'il n'y a pas de coefficient diagonal nul

flag = 0
FOR i = 1 TO n
IF A(i, i) = 0 THEN flag = 1
NEXT i
IF flag = 1 THEN
PRINT "PAS DE SOLUTION car un des coefficients diagonaux est nul !"
GOTO [Fin]
END IF

'--------------------------------start chrono
t1 = TIME$("ms")

'--------------------------------Calcul (en 14 lignes)

FOR i = 1 TO n
a = A(i, i) 'c'est le Pivot de Gauss
FOR j = 1 TO n + 1
b = A(i, j)
A(i, j) = b / a 'càd A(i, j) = A(i, j) / A(i, i)
NEXT j

FOR k = 1 TO n
a = A(k, i)
IF k <> i THEN
FOR j = 1 TO n + 1
b = A(k, j)
c = A(i, j)
A(k, j) = b - a * c 'càd A(k, j) = A(i, j) - A(k, i)*A(i, j)
NEXT j
END IF
NEXT k

NEXT i

'NB: A(i, j) * A(m, n) et A(i, j) / A(m, n), surtout avecdes nombres décimaux,
'donne des résultats aberrants, également dans d'autres langages Basic
'd'où la nécessité d'employer des variables intermédiaires (a, b, et c)

'------------------------------stop chrono
t2 = TIME$("ms")

'------------------------------Voir la matrice-résultat (arrondie)

PRINT "3 - Après transformation de Gauss-Jordan :": PRINT
FOR i = 1 TO n
FOR j= 1 TO n+1
m = A(i, j)
PRINT USING ("###.###", m),
NEXT j
PRINT: PRINT
NEXT i

PRINT

'-------------------------------Afficher les valeurs des inconnues 'X(i) = A(i, n+1)

PRINT "4 - Solutions (affichage arrondi):": PRINT
FOR i = 1 TO n
x = A(i, n+1)
PRINT "X"; STR$(i); " = "; USING ("###.###", x)
NEXT i
PRINT

PRINT "temps de calcul = "; t2 - t1; " msec": PRINT

'--------------------------------Terminer
[Fin]
END

'------
'Claude
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 03/11/2011 à 21h52

Administrateur

Groupe: Administrateur

Inscrit le: 24/09/2010
Messages: 203
Et tout simplement faire un truc comme ça :

Code VB :
 
FOR i = 1 TO n
x = A(i, n+1)
PRINT "X"; STR$(i); " = ";
if int(x) <> x then PRINT x else PRINT int(x)
NEXT i
 


??

Mail MSN Web    
Le 04/11/2011 à 06h43

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
j'ai essayé en écrivant ça :Code VB :
...
if str$(int(A(i, n+1))) = str$(A(i, n+1)) then PRINT "X";i;" = "; using("####",A(i, n+1)) else PRINT "X";i;" = "; using("####,####",A(i, n+1))
...


et ça a l'air de marcher, mais c'est vrai qu'il faut vraiment tout expliquer à JB ;)

y a sûrement une autre solution...

@+


C'est simple [le mot 'code=vb'] code [/ le mot 'code']
Un code indenté est tellement plus facile et agréable à lire... :top



Edité par cassiope01 Le 04/11/2011 à 06h44
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 04/11/2011 à 08h17

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
Salut !

IF x <> INT(x> THEN...
ça je l'avais déjà essayé sans succès.

Par contre:

if str$(int(A(i, n+1))) = str$(A(i, n+1)) then PRINT "X";i;" = "; using("####",A(i, n+1)) else PRINT "X";i;" = "; using("####,####",A(i, n+1))

donne le résultat correct ! incroyable !

Eh bien grand merci, ce problème est ainsi réglé.

Claude

____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Général » [Réglé] Affichage de nombres Nombres entiers sans ".0"  

 |  |

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