Forum Liberty Basic France

Projets open source » Equations linéaires - Gauss-Jordan - GUI Saisie des données dans une grille de textbox
Visiteur
Le 22/12/2011 à 14h15

Libertynaute Inactif

Groupe: Visiteur



Un "GRID" de textbox pour saisir les données,
càd les coéfficients des inconnues et les termes indépendants.
La limite en LB est ici de 9 lignes x 10 colonnes, car on ne
peut dépasser 100 textbox; donc 9 équations et 9 inconnues.
Ca paraît long à faire mais le copier-coller aide énormément.
Je n'ai pas réussi à produire une série de textbox numérotés dans
une boucle FOR / NEXT, ni à en créer plus de un avec des paramètres. Dommage.
Peut-être pour la version LB.5 qui est annoncée pour très bientôt ?

EDIT 23-12-2011: rectification d'un défaut: effacement complet d'un exemple avant d'afficher l'autre exemple

Code :


'GRID.BAS               LB404  et  JB
'========

[COMMENTS]

'9 équations et 9 inconnues et 9 termes indépendants = 90 textbox
'la limite pour LB 4.0x et JB est à 100 textbox

'on navigue de cellule en cellule avec TAB et SHIFT-TAB,
'ou avec la souris, pas (encore) avec les touches fléchées

'entrer les données à partir de l'angle supérieurs gauche
'ne pas laisser de cellules vides dans la matrice,
'sinon = 0, résultat final faux ou division par zéro

'les données de x1 - 2x3 = 4
'doivent se lire: x1 + 0*x2 - 2x3 = 4

'les solutions apparaissent dans la dernière colonne active,
'à la place des termes indépendants

'les boutons EX_1 et EX_2 chargent des exemples
'voir aussi à la fin un problème (très ressemblant) mais à saisir "à la main"

[WIDGETS]

NOMAINWIN

'9 lignes *10 colonnes de TextBox, grâce au copier-coller...

TEXTBOX #w.101, 20 + 0*55, 20, 50, 25
TEXTBOX #w.102, 20 + 1*55, 20, 50, 25
TEXTBOX #w.103, 20 + 2*55, 20, 50, 25
TEXTBOX #w.104, 20 + 3*55, 20, 50, 25
TEXTBOX #w.105, 20 + 4*55, 20, 50, 25
TEXTBOX #w.106, 20 + 5*55, 20, 50, 25
TEXTBOX #w.107, 20 + 6*55, 20, 50, 25
TEXTBOX #w.108, 20 + 7*55, 20, 50, 25
TEXTBOX #w.109, 20 + 8*55, 20, 50, 25
TEXTBOX #w.110, 20 + 9*55, 20, 50, 25

TEXTBOX #w.201, 20 + 0*55, 50, 50, 25
TEXTBOX #w.202, 20 + 1*55, 50, 50, 25
TEXTBOX #w.203, 20 + 2*55, 50, 50, 25
TEXTBOX #w.204, 20 + 3*55, 50, 50, 25
TEXTBOX #w.205, 20 + 4*55, 50, 50, 25
TEXTBOX #w.206, 20 + 5*55, 50, 50, 25
TEXTBOX #w.207, 20 + 6*55, 50, 50, 25
TEXTBOX #w.208, 20 + 7*55, 50, 50, 25
TEXTBOX #w.209, 20 + 8*55, 50, 50, 25
TEXTBOX #w.210, 20 + 9*55, 50, 50, 25

TEXTBOX #w.301, 20 + 0*55, 80, 50, 25
TEXTBOX #w.302, 20 + 1*55, 80, 50, 25
TEXTBOX #w.303, 20 + 2*55, 80, 50, 25
TEXTBOX #w.304, 20 + 3*55, 80, 50, 25
TEXTBOX #w.305, 20 + 4*55, 80, 50, 25
TEXTBOX #w.306, 20 + 5*55, 80, 50, 25
TEXTBOX #w.307, 20 + 6*55, 80, 50, 25
TEXTBOX #w.308, 20 + 7*55, 80, 50, 25
TEXTBOX #w.309, 20 + 8*55, 80, 50, 25
TEXTBOX #w.310, 20 + 9*55, 80, 50, 25

TEXTBOX #w.401, 20 + 0*55, 110, 50, 25
TEXTBOX #w.402, 20 + 1*55, 110, 50, 25
TEXTBOX #w.403, 20 + 2*55, 110, 50, 25
TEXTBOX #w.404, 20 + 3*55, 110, 50, 25
TEXTBOX #w.405, 20 + 4*55, 110, 50, 25
TEXTBOX #w.406, 20 + 5*55, 110, 50, 25
TEXTBOX #w.407, 20 + 6*55, 110, 50, 25
TEXTBOX #w.408, 20 + 7*55, 110, 50, 25
TEXTBOX #w.409, 20 + 8*55, 110, 50, 25
TEXTBOX #w.410, 20 + 9*55, 110, 50, 25

TEXTBOX #w.501, 20 + 0*55, 140, 50, 25
TEXTBOX #w.502, 20 + 1*55, 140, 50, 25
TEXTBOX #w.503, 20 + 2*55, 140, 50, 25
TEXTBOX #w.504, 20 + 3*55, 140, 50, 25
TEXTBOX #w.505, 20 + 4*55, 140, 50, 25
TEXTBOX #w.506, 20 + 5*55, 140, 50, 25
TEXTBOX #w.507, 20 + 6*55, 140, 50, 25
TEXTBOX #w.508, 20 + 7*55, 140, 50, 25
TEXTBOX #w.509, 20 + 8*55, 140, 50, 25
TEXTBOX #w.510, 20 + 9*55, 140, 50, 25

TEXTBOX #w.601, 20 + 0*55, 170, 50, 25
TEXTBOX #w.602, 20 + 1*55, 170, 50, 25
TEXTBOX #w.603, 20 + 2*55, 170, 50, 25
TEXTBOX #w.604, 20 + 3*55, 170, 50, 25
TEXTBOX #w.605, 20 + 4*55, 170, 50, 25
TEXTBOX #w.606, 20 + 5*55, 170, 50, 25
TEXTBOX #w.607, 20 + 6*55, 170, 50, 25
TEXTBOX #w.608, 20 + 7*55, 170, 50, 25
TEXTBOX #w.609, 20 + 8*55, 170, 50, 25
TEXTBOX #w.610, 20 + 9*55, 170, 50, 25

TEXTBOX #w.701, 20 + 0*55, 200, 50, 25
TEXTBOX #w.702, 20 + 1*55, 200, 50, 25
TEXTBOX #w.703, 20 + 2*55, 200, 50, 25
TEXTBOX #w.704, 20 + 3*55, 200, 50, 25
TEXTBOX #w.705, 20 + 4*55, 200, 50, 25
TEXTBOX #w.706, 20 + 5*55, 200, 50, 25
TEXTBOX #w.707, 20 + 6*55, 200, 50, 25
TEXTBOX #w.708, 20 + 7*55, 200, 50, 25
TEXTBOX #w.709, 20 + 8*55, 200, 50, 25
TEXTBOX #w.710, 20 + 9*55, 200, 50, 25

TEXTBOX #w.801, 20 + 0*55, 230, 50, 25
TEXTBOX #w.802, 20 + 1*55, 230, 50, 25
TEXTBOX #w.803, 20 + 2*55, 230, 50, 25
TEXTBOX #w.804, 20 + 3*55, 230, 50, 25
TEXTBOX #w.805, 20 + 4*55, 230, 50, 25
TEXTBOX #w.806, 20 + 5*55, 230, 50, 25
TEXTBOX #w.807, 20 + 6*55, 230, 50, 25
TEXTBOX #w.808, 20 + 7*55, 230, 50, 25
TEXTBOX #w.809, 20 + 8*55, 230, 50, 25
TEXTBOX #w.810, 20 + 9*55, 230, 50, 25

TEXTBOX #w.901, 20 + 0*55, 260, 50, 25
TEXTBOX #w.902, 20 + 1*55, 260, 50, 25
TEXTBOX #w.903, 20 + 2*55, 260, 50, 25
TEXTBOX #w.904, 20 + 3*55, 260, 50, 25
TEXTBOX #w.905, 20 + 4*55, 260, 50, 25
TEXTBOX #w.906, 20 + 5*55, 260, 50, 25
TEXTBOX #w.907, 20 + 6*55, 260, 50, 25
TEXTBOX #w.908, 20 + 7*55, 260, 50, 25
TEXTBOX #w.909, 20 + 8*55, 260, 50, 25
TEXTBOX #w.910, 20 + 9*55, 260, 50, 25


BUTTON #w.EX, "EX_1", [EXEMPLE1], UL, 140, 320, 50, 50
BUTTON #w.EX2, "EX_2", [EXEMPLE2], UL, 220, 320, 50, 50
BUTTON #w.NEW, "NEW", [RAZ], UL, 300, 320, 50, 50
BUTTON #w.CALC, "CALC", [CALC], UL, 380, 320, 50, 50
BUTTON #w.EXIT, "EXIT", [EXIT], UL, 460, 320, 50, 50

'* dimensionner la fenêtre
WindowHeight = 450
WindowWidth = 600

'* et la centrer
UpperLeftX = INT(DisplayWidth - WindowWidth) /2
UpperLeftY = INT(DisplayHeight - WindowHeight) /2

OPEN "Système d'Equations Linéaires - Méthode de Gauss-Jordan" FOR WINDOW AS #w

PRINT #w, "TrapClose [EXIT]"

'* le tableau pour enregistrer les valeurs des 9 x 10 cellules
DIM A(10, 11)

'* focus dans la première cellule
PRINT #w.101, "!setfocus"

WAIT

[CALC]

'* combien a-t-on saisi de lignes (n) ?

j = 1
FOR i = 1 TO 9
  cell$ = "#w." + STR$(100 * i + j)       'créer un handle maniable
  PRINT #cell$, "!contents? var$"
  IF var$ = "" THEN
     n = i - 1
     EXIT FOR
  ELSE
      n= i
  END IF
NEXT i

'* combien a-t-on saisi de colonnes (m) ?

i = 1
FOR j = 1 TO 10
  cell$ = "#w." + STR$(100 + j)
  PRINT #cell$, "!contents? var$"
  IF var$ = "" THEN
     m = j - 1
     EXIT FOR
  ELSE
     m = j
  END IF
NEXT j

'* vérifier si colonnes (m) vaut bien lignes (n) +1,  sinon données incomplètes

IF  m <> n + 1 THEN NOTICE "données incomplètes": WAIT

'* récupérer les données des cellules dans le tableau A( )

FOR i = 1 TO n
FOR j = 1 TO m
  cell$ = "#w." + STR$(100 * i + j)
  PRINT #cell$, "!contents? var$"
  A(i, j) = VAL(var$)
NEXT j
NEXT i

'* vérifier qu'il n'y a pas de zéro sur la diagonale principale
  'càd celle des inconnues x1, x2, ...

flag = 0
FOR i = 1 TO n
IF A(i, i) = 0 THEN flag = 1: EXIT FOR
NEXT i
IF flag = 1 THEN NOTICE "un zéro sur la diagonale" + CHR$(13) + "problème insoluble": WAIT

'* Enfin on calcule

       '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

    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         'n + 1 = m
                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

'* et renvoyer les résultats dans les cellules

FOR i = 1 TO n
FOR j = 1 TO m
  cell$ = "#w." + STR$(100 * i + j)
  PRINT #cell$, STR$(A(i, j))
NEXT j
NEXT i

WAIT

[RAZ]

FOR i = 1 TO 9
  FOR j = 1 TO 10
    cell$ = "#w." + STR$(100 * i + j)
    PRINT #cell$, ""
  NEXT j
NEXT i

PRINT #w.101, "!setfocus"

WAIT

[EXEMPLE1]

'x1 -x2 + 2x3 = 5
'3x1 + 2x2 + x3 = 10
'2x1 - 3x2 - 2x3 = -10

'solutions x1 = 1, x2 = 2, x3 = 3

DATA 1, -1, 2, 5
DATA 3, 2, 1, 10
DATA 2, -3, -2, -10

RESTORE [EXEMPLE1]

'supprimer l'exemple précédent (reset)
FOR i = 1 TO 9
  FOR j = 1 TO 10
    cell$ = "#w." + STR$(100 * i + j)
    PRINT #cell$, ""
  NEXT j
NEXT i

'charger l'exemple1
FOR i = 1 TO 3
FOR j = 1 TO 4
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

WAIT

[EXEMPLE2]

'supprimer l'exemple précédent (reset)
FOR i = 1 TO 9
  FOR j = 1 TO 10
    cell$ = "#w." + STR$(100 * i + j)
    PRINT #cell$, ""
  NEXT j
NEXT i

'charger l'exemple2
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

'solutions 1.2, 2.25, -0.63, 2.2, -0.247

RESTORE [EXEMPLE2]

FOR i = 1 TO 5
FOR j = 1 TO 6
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

WAIT

[EXIT]

CLOSE #w
END

[PROBLEME_SUPPLEMENTAIRE]

'problème supplémentaire, à saisir dans la grille, si on veut;
's'il ressemble à l'exemple n° 2, ce n'est pas fortuit

'x1 + 2x2 + 3x3 - 4x4 = - 4.99
'-2x1 - x2 + x3 + x4 = - 3.08
'x1 + x2 - x3 - 2x4 = - 0.32
'3x1 + 3x2 + 2x3 - 3x4 = 2.49

'solutions: 1.2, 2.25, -0.63, 2.2

'données à encoder:

'1, 2, 3, -4, -4.99
'-2, -1, 1, 1, -3.08
'1, 1, -1, -2, -0.32
'3, 3, 2, -3, 2.49






Edité par Visiteur Le 23/12/2011 à 12h38
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Visiteur
Le 23/12/2011 à 14h22

Libertynaute Inactif

Groupe: Visiteur



Hahaaa ! La limitation à 100 TextBox c'est seulement pour JB !

Je me fais donc un plaisir de poster mon GAUSS-JORDAN-GRID-XL pour LB 4.0x only, avec mon exemple de 10 équations et 10 inconnues (soit 110 TextBox avec les 10 termes indépendants).

EDIT 26 décembre 2011: il n'y a pas ou il n'y a plus de limitation à 100 textbox, ni pour LB 4.0x ni pour JB 1.01.

Code :


GAUSS-JORDAN-GRID-XL.BAS               LB 4.0x  
'=================

[COMMENTS]

'10 équations et 10 inconnues et 10 termes indépendants = 110 textbox
'la limite pour JB est à 100 textbox mais pas pour LB 4.0x

'on navigue de cellule en cellule avec TAB et SHIFT-TAB,
'ou avec la souris, mais pas (encore) avec les touches fléchées

'entrer les données à partir de l'angle supérieurs gauche
'ne pas laisser de cellules vides dans la matrice,
'sinon = 0, résultat final faux ou division par zéro

'les données de x1 - 2x3 = 4
'doivent se lire: x1 + 0*x2 - 2x3 = 4

'les solutions apparaissent dans la dernière colonne active,
'à la place des termes indépendants

'les boutons EX_1, EX_2 et EX_3 chargent des exemples
'voir aussi à la fin un problème (très ressemblant) mais à saisir "à la main"

[WIDGETS]

NOMAINWIN

10 lignes *11 colonnes de TextBox, grâce au copier-coller...

TEXTBOX #w.101, 20 + 0*55, 20, 50, 25
TEXTBOX #w.102, 20 + 1*55, 20, 50, 25
TEXTBOX #w.103, 20 + 2*55, 20, 50, 25
TEXTBOX #w.104, 20 + 3*55, 20, 50, 25
TEXTBOX #w.105, 20 + 4*55, 20, 50, 25
TEXTBOX #w.106, 20 + 5*55, 20, 50, 25
TEXTBOX #w.107, 20 + 6*55, 20, 50, 25
TEXTBOX #w.108, 20 + 7*55, 20, 50, 25
TEXTBOX #w.109, 20 + 8*55, 20, 50, 25
TEXTBOX #w.110, 20 + 9*55, 20, 50, 25
TEXTBOX #w.111, 20 + 10*55, 20, 50, 25

TEXTBOX #w.201, 20 + 0*55, 50, 50, 25
TEXTBOX #w.202, 20 + 1*55, 50, 50, 25
TEXTBOX #w.203, 20 + 2*55, 50, 50, 25
TEXTBOX #w.204, 20 + 3*55, 50, 50, 25
TEXTBOX #w.205, 20 + 4*55, 50, 50, 25
TEXTBOX #w.206, 20 + 5*55, 50, 50, 25
TEXTBOX #w.207, 20 + 6*55, 50, 50, 25
TEXTBOX #w.208, 20 + 7*55, 50, 50, 25
TEXTBOX #w.209, 20 + 8*55, 50, 50, 25
TEXTBOX #w.210, 20 + 9*55, 50, 50, 25
TEXTBOX #w.211, 20 + 10*55, 50, 50, 25

TEXTBOX #w.301, 20 + 0*55, 80, 50, 25
TEXTBOX #w.302, 20 + 1*55, 80, 50, 25
TEXTBOX #w.303, 20 + 2*55, 80, 50, 25
TEXTBOX #w.304, 20 + 3*55, 80, 50, 25
TEXTBOX #w.305, 20 + 4*55, 80, 50, 25
TEXTBOX #w.306, 20 + 5*55, 80, 50, 25
TEXTBOX #w.307, 20 + 6*55, 80, 50, 25
TEXTBOX #w.308, 20 + 7*55, 80, 50, 25
TEXTBOX #w.309, 20 + 8*55, 80, 50, 25
TEXTBOX #w.310, 20 + 9*55, 80, 50, 25
TEXTBOX #w.311, 20 + 10*55, 80, 50, 25

TEXTBOX #w.401, 20 + 0*55, 110, 50, 25
TEXTBOX #w.402, 20 + 1*55, 110, 50, 25
TEXTBOX #w.403, 20 + 2*55, 110, 50, 25
TEXTBOX #w.404, 20 + 3*55, 110, 50, 25
TEXTBOX #w.405, 20 + 4*55, 110, 50, 25
TEXTBOX #w.406, 20 + 5*55, 110, 50, 25
TEXTBOX #w.407, 20 + 6*55, 110, 50, 25
TEXTBOX #w.408, 20 + 7*55, 110, 50, 25
TEXTBOX #w.409, 20 + 8*55, 110, 50, 25
TEXTBOX #w.410, 20 + 9*55, 110, 50, 25
TEXTBOX #w.411, 20 + 10*55, 110, 50, 25

TEXTBOX #w.501, 20 + 0*55, 140, 50, 25
TEXTBOX #w.502, 20 + 1*55, 140, 50, 25
TEXTBOX #w.503, 20 + 2*55, 140, 50, 25
TEXTBOX #w.504, 20 + 3*55, 140, 50, 25
TEXTBOX #w.505, 20 + 4*55, 140, 50, 25
TEXTBOX #w.506, 20 + 5*55, 140, 50, 25
TEXTBOX #w.507, 20 + 6*55, 140, 50, 25
TEXTBOX #w.508, 20 + 7*55, 140, 50, 25
TEXTBOX #w.509, 20 + 8*55, 140, 50, 25
TEXTBOX #w.510, 20 + 9*55, 140, 50, 25
TEXTBOX #w.511, 20 + 10*55, 140, 50, 25

TEXTBOX #w.601, 20 + 0*55, 170, 50, 25
TEXTBOX #w.602, 20 + 1*55, 170, 50, 25
TEXTBOX #w.603, 20 + 2*55, 170, 50, 25
TEXTBOX #w.604, 20 + 3*55, 170, 50, 25
TEXTBOX #w.605, 20 + 4*55, 170, 50, 25
TEXTBOX #w.606, 20 + 5*55, 170, 50, 25
TEXTBOX #w.607, 20 + 6*55, 170, 50, 25
TEXTBOX #w.608, 20 + 7*55, 170, 50, 25
TEXTBOX #w.609, 20 + 8*55, 170, 50, 25
TEXTBOX #w.610, 20 + 9*55, 170, 50, 25
TEXTBOX #w.611, 20 + 10*55, 170, 50, 25

TEXTBOX #w.701, 20 + 0*55, 200, 50, 25
TEXTBOX #w.702, 20 + 1*55, 200, 50, 25
TEXTBOX #w.703, 20 + 2*55, 200, 50, 25
TEXTBOX #w.704, 20 + 3*55, 200, 50, 25
TEXTBOX #w.705, 20 + 4*55, 200, 50, 25
TEXTBOX #w.706, 20 + 5*55, 200, 50, 25
TEXTBOX #w.707, 20 + 6*55, 200, 50, 25
TEXTBOX #w.708, 20 + 7*55, 200, 50, 25
TEXTBOX #w.709, 20 + 8*55, 200, 50, 25
TEXTBOX #w.710, 20 + 9*55, 200, 50, 25
TEXTBOX #w.711, 20 + 10*55, 200, 50, 25

TEXTBOX #w.801, 20 + 0*55, 230, 50, 25
TEXTBOX #w.802, 20 + 1*55, 230, 50, 25
TEXTBOX #w.803, 20 + 2*55, 230, 50, 25
TEXTBOX #w.804, 20 + 3*55, 230, 50, 25
TEXTBOX #w.805, 20 + 4*55, 230, 50, 25
TEXTBOX #w.806, 20 + 5*55, 230, 50, 25
TEXTBOX #w.807, 20 + 6*55, 230, 50, 25
TEXTBOX #w.808, 20 + 7*55, 230, 50, 25
TEXTBOX #w.809, 20 + 8*55, 230, 50, 25
TEXTBOX #w.810, 20 + 9*55, 230, 50, 25
TEXTBOX #w.811, 20 + 10*55, 230, 50, 25

TEXTBOX #w.901, 20 + 0*55, 260, 50, 25
TEXTBOX #w.902, 20 + 1*55, 260, 50, 25
TEXTBOX #w.903, 20 + 2*55, 260, 50, 25
TEXTBOX #w.904, 20 + 3*55, 260, 50, 25
TEXTBOX #w.905, 20 + 4*55, 260, 50, 25
TEXTBOX #w.906, 20 + 5*55, 260, 50, 25
TEXTBOX #w.907, 20 + 6*55, 260, 50, 25
TEXTBOX #w.908, 20 + 7*55, 260, 50, 25
TEXTBOX #w.909, 20 + 8*55, 260, 50, 25
TEXTBOX #w.910, 20 + 9*55, 260, 50, 25
TEXTBOX #w.911, 20 + 10*55, 260, 50, 25

TEXTBOX #w.1001, 20 + 0*55, 290, 50, 25
TEXTBOX #w.1002, 20 + 1*55, 290, 50, 25
TEXTBOX #w.1003, 20 + 2*55, 290, 50, 25
TEXTBOX #w.1004, 20 + 3*55, 290, 50, 25
TEXTBOX #w.1005, 20 + 4*55, 290, 50, 25
TEXTBOX #w.1006, 20 + 5*55, 290, 50, 25
TEXTBOX #w.1007, 20 + 6*55, 290, 50, 25
TEXTBOX #w.1008, 20 + 7*55, 290, 50, 25
TEXTBOX #w.1009, 20 + 8*55, 290, 50, 25
TEXTBOX #w.1010, 20 + 9*55, 290, 50, 25
TEXTBOX #w.1011, 20 + 10*55, 290, 50, 25


BUTTON #w.EX, "EX_1", [EXEMPLE1], UL, 140, 340, 50, 50
BUTTON #w.EX2, "EX_2", [EXEMPLE2], UL, 220, 340, 50, 50
BUTTON #w.EX3, "EX_3", [EXEMPLE3], UL, 300, 340, 50, 50
BUTTON #w.NEW, "NEW", [RAZ], UL, 380, 340, 50, 50
BUTTON #w.CALC, "CALC", [CALC], UL, 460, 340, 50, 50
BUTTON #w.EXIT, "EXIT", [EXIT], UL, 540, 340, 50, 50

'* dimensionner la fenêtre
WindowHeight = 450
WindowWidth = 660

'* et la centrer
UpperLeftX = INT(DisplayWidth - WindowWidth) /2
UpperLeftY = INT(DisplayHeight - WindowHeight) /2

OPEN "Système d'Equations Linéaires - Méthode de Gauss-Jordan" FOR WINDOW AS #w

PRINT #w, "TrapClose [EXIT]"

'* le tableau pour enregistrer les valeurs des 10 x 11 cellules
DIM A(11, 12)

'* focus dans la première cellule
PRINT #w.101, "!setfocus"

WAIT

[CALC]

'* combien a-t-on saisi de lignes (n) ?

j = 1
FOR i = 1 TO 10
  cell$ = "#w." + STR$(100 * i + j)       'créer un handle maniable
  PRINT #cell$, "!contents? var$"
  IF var$ = "" THEN
     n = i - 1
     EXIT FOR
  ELSE
      n= i
  END IF
NEXT i

'* combien a-t-on saisi de colonnes (m) ?

i = 1
FOR j = 1 TO 11
  cell$ = "#w." + STR$(100 + j)
  PRINT #cell$, "!contents? var$"
  IF var$ = "" THEN
     m = j - 1
     EXIT FOR
  ELSE
     m = j
  END IF
NEXT j

'* vérifier si colonnes (m) vaut bien lignes (n) +1,  sinon données incomplètes

IF  m <> n + 1 THEN NOTICE "données incomplètes": WAIT

'* récupérer les données des cellules dans le tableau A( )

FOR i = 1 TO n
FOR j = 1 TO m
  cell$ = "#w." + STR$(100 * i + j)
  PRINT #cell$, "!contents? var$"
  A(i, j) = VAL(var$)
NEXT j
NEXT i

'* vérifier qu'il n'y a pas de zéro sur la diagonale principale
  'càd celle des inconnues x1, x2, ...

flag = 0
FOR i = 1 TO n
IF A(i, i) = 0 THEN flag = 1: EXIT FOR
NEXT i
IF flag = 1 THEN NOTICE "un zéro sur la diagonale" + CHR$(13) + "problème insoluble": WAIT

'* Enfin on calcule

       '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

    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         'n + 1 = m
                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

'* et renvoyer les résultats dans les cellules

FOR i = 1 TO n
FOR j = 1 TO m
  cell$ = "#w." + STR$(100 * i + j)
  x = A(i, j)
  x$ = STR$(x)
  ' corriger les résultats 'float' parasites du genre '7.0'
  IF RIGHT$(x$, 2) = ".0" THEN x$ = LEFT$(x$, LEN(x$) - 2)
  PRINT #cell$, x$
NEXT j
NEXT i

WAIT

[RAZ]

FOR i = 1 TO 10
  FOR j = 1 TO 11
    cell$ = "#w." + STR$(100 * i + j)
    PRINT #cell$, ""
  NEXT j
NEXT i

PRINT #w.101, "!setfocus"

WAIT

[EXEMPLE1]

'x1 -x2 + 2x3 = 5
'3x1 + 2x2 + x3 = 10
'2x1 - 3x2 - 2x3 = -10

'solutions x1 = 1, x2 = 2, x3 = 3

DATA 1, -1, 2, 5
DATA 3, 2, 1, 10
DATA 2, -3, -2, -10

RESTORE [EXEMPLE1]

'supprimer l'exemple précédent (reset)
FOR i = 1 TO 10
  FOR j = 1 TO 11
    cell$ = "#w." + STR$(100 * i + j)
    PRINT #cell$, ""
  NEXT j
NEXT i

'charger l'exemple1
FOR i = 1 TO 3
FOR j = 1 TO 4
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

NOTICE "Cliquez sur [CALC]"
WAIT

[EXEMPLE2]

'supprimer l'exemple précédent (reset)
FOR i = 1 TO 10
  FOR j = 1 TO 11
    cell$ = "#w." + STR$(100 * i + j)
    PRINT #cell$, ""
  NEXT j
NEXT i

'charger l'exemple2
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

'solutions 1.2, 2.25, -0.63, 2.2, -0.247

RESTORE [EXEMPLE2]

FOR i = 1 TO 5
FOR j = 1 TO 6
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

NOTICE "Cliquez sur [CALC]"

WAIT

[EXEMPLE3]

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

'solutions: x1 = 1,  x2 =2,  x3 = 3,  x4 = -1,  x5 = -2,  x6 = -3,  x7 = 5,  x8 = -10, x9 = 12, x10 = -7

RESTORE [EXEMPLE3]

FOR i = 1 TO 10
FOR j = 1 TO 11
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

NOTICE "Cliquez sur [CALC]"

WAIT

[EXIT]

CLOSE #w
END

[PROBLEME_SUPPLEMENTAIRE]

'problème supplémentaire, à saisir dans la grille, si on veut;
's'il ressemble à l'exemple n° 2, ce n'est pas fortuit

'x1 + 2x2 + 3x3 - 4x4 = - 4.99
'-2x1 - x2 + x3 + x4 = - 3.08
'x1 + x2 - x3 - 2x4 = - 0.32
'3x1 + 3x2 + 2x3 - 3x4 = 2.49

'solutions: 1.2, 2.25, -0.63, 2.2

'données à encoder:

'1, 2, 3, -4, -4.99
'-2, -1, 1, 1, -3.08
'1, 1, -1, -2, -0.32
'3, 3, 2, -3, 2.49





Edité par Visiteur Le 26/12/2011 à 15h56
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 23/12/2011 à 14h29

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Salut Claude,

accepterais-tu que je place ici l'alternative compatible JB que j'ai écrit pour toi suite à nos discutions dans le sujet GRILLE - GRID - STRINGGRID ? (que j'ai encore amélioré d'ailleur... ;) )

@+



Edité par cassiope01 Le 23/12/2011 à 15h21
____________________
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    
Visiteur
Le 23/12/2011 à 14h33

Libertynaute Inactif

Groupe: Visiteur



Absolument ! Fais-le.

Claude
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 23/12/2011 à 14h36

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Ok.

Donc code revu et corrigé pour:
- accepter les nombres à virgule ( 5 décimales à décider ? ) en respectant le format d'affichage dont tu parlais ICI.
- pouvoir charger des petits fichiers de données à fabriquer... au format *.txt pur avec les nombres séparés par ; sans espaces, en cliquant sur le bouton "Reset".

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

ou

1;2;3;-4;-4.99
-2;-1;1;1;-3.08
1;1;-1;-2;-0.32
3;3;2;-3;2.49

ou

1;-1;2;-1;1;1;-1;1;-1;1;-33
3;2;1;1;-1;-1;2;-1;1;-2;60
2;-3;-2;-2;-3;-2;-3;2;-3;3;-88
4;-1;-3;3;2;4;1;-2;3;4;7
-6;5;-1;4;-6;-3;-2;3;2;-3;23
-5;1;1;1;1;1;3;-3;-2;-4;43
1;1;1;1;1;1;4;4;4;1;21
-2;-2;-3;-4;-5;6;7;-8;-5;1;29
1;1;1;-2;-2;-2;3;3;3;-2;53
2;-2;3;4;-5;6;-7;8;-3;2;-170

Note: en JB la commande val() ne sait interpréter que le "." comme séparateur de décimales... donc ne pas écrire 8,56 par exemple mais 8.56

@+

Code VB :
'GAUSS-JORDAN_XL - système de 10 équations linéaires et 10 inconnues
'résolution d'un système d'équations linéaires par la méthode
'd'élimination de Gauss-Jordan.

'GUI par cassiope01 d'après les codes de tsh73 et claudevdw.  22 Déc 2011.

    nomainwin
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)

    Global fmt$, fontLine$, txtFieldLen, dimCell.X, dimCell.Y, nCellX, nCellY, currX, currY, tb.x, tb.y, tb.w, tb.h
    fontLine$ = "font courier_new 12"
    charW = 9 'have to measure that
    lineH = 20  'actually could be determined later, but needed now
    txtFieldLen = 8
    dimCell.X = 10*charW
    dimCell.Y = 30
    nCellY = 10
    nCellX = nCellY + 1
    currX = 1
    currY = 1
 
    DIM info$(10,10), A(nCellX,nCellX), matrice$(nCellX,nCellX)
 
    WindowWidth = nCellX*dimCell.X+30
    WindowHeight = nCellY*dimCell.Y+120
    UpperLeftX = int((DisplayWidth-WindowWidth) / 3)
    UpperLeftY = int((DisplayHeight-WindowHeight) / 2)
    for x=1 to nCellX :titre$ = titre$ + str$(x)+space$(charW+1) :next
    statictext #g.titreX, titre$, 20+dimCell.X/2, 2, dimCell.X*nCellX, dimCell.Y/2
    FOR i = 1 TO 10: Vnum$ = Vnum$ + STR$(i) + SPACE$(2): NEXT i
    STATICTEXT #g.vertical, Vnum$, 2, 20, 15, 318
    graphicbox #g.tableau, 20, 20, nCellX*dimCell.X+2, nCellY*dimCell.Y+2
    tb.x = 22+(currX-1)*dimCell.X
    tb.y = 22+(currY-1)*dimCell.Y
    tb.w = txtFieldLen*charW + charW + 7
    tb.h = lineH + 8
    textbox #g.textbox2, tb.x, tb.y, tb.w, tb.h
    statictext #g.mess "message : ", 20, 28+(12-1)*dimCell.Y, 8*dimCell.X, 30
    BUTTON #g.reset, " Reset ", Charge, UL, (nCellX-2)*dimCell.X, (13-1)*dimCell.Y
    BUTTON #g.calcul, " CALCUL ", [calcul], UL, (nCellX-1)*dimCell.X, (13-1)*dimCell.Y
    OPEN "    Gauss Jordan..."+space$(20)+date$ for window_nf as #g  ''graphics_nf_nsb
    #g "trapclose quit"
    #g "font courier_new 10"
    #g.tableau "down"
    #g.tableau fontLine$
    #g.textbox2 "!";fontLine$
 
    call Grille
    call setMatrice "#g.tableau"
    call message "Cellule ";currY;",";currX;chr$(13);"ATTENTION : pour valider une cellule sélectionnez en une autre."
 
    #g.tableau "setfocus"
    #g.tableau "when leftButtonDown [setPos]"
    #g.tableau "when characterInput [Touche]"
 
    WAIT
 
    sub setMatrice handle$
        '"Matrice des coefficients et des termes independants:"
        restore
        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
        FOR i = 1 TO nCellY
            FOR j = 1 TO nCellY + 1
                READ m
                A(i, j) = m   '<--  !?!?!?
               ' print m,
            NEXT
            'print
        NEXT
        call redrawGrid
        call message "Cellule ";currY;",";currX;chr$(13);"ATTENTION : pour valider une cellule sélectionnez en une autre."
    end sub
 
    [calcul]
        '---vérifier s'il n'y a pas de zéro sur la diagonale des coefficients,
        '--- sinon problème insoluble

        FOR i = 1 TO nCellY
            IF A(i,i) = 0 THEN call message "Un coefficient diagonal nul, cas insoluble" :wait
        NEXT i
 
        '---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 nCellY
            p = A(i, i)   'c'est le "pivot" de Gauss, sur la diagonale principale des coefficients
            FOR j = 1 TO nCellY + 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 nCellY
                p = A(k, i)
                IF k <> i THEN
                    FOR j = 1 TO nCellY + 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
       '     PRINT
       ' NEXT

        call redrawGrid
 
        '[RESULTAT_FINAL]

        '---Afficher les valeurs des inconnues      'x(i) = A(i, n+1)
        '---Il y a une complication à l'affichage parce que les nombres entiers
        '---sont transformés par LB en 'float' en cours de calcul,
        '---par les divisions répétées je suppose, et affichent 1.0 au lieu de 1
        '---Les corrections meilleures conduisent à des résultats erronés.

        'call message "Solutions des 10 équations à 10 inconnues:"
        'PRINT
        'FOR i = 1 TO n
        '    x = A(i, n+1)
        '    x$ = STR$(x)
        '    IF RIGHT$(x$, 2) = ".0" THEN
        '        PRINT "x"; STR$(i); " = ", USING("#####", x)
        '    ELSE
        '        PRINT "x"; STR$(i); " = ", x
        '    END IF
        'NEXT i
        'PRINT

        call message "Solutions des 10 équations à 10 inconnues -> temps de calcul = "; t2 - t1; " millisecondes"
    WAIT
 
    [setPos]
        x = int(MouseX/(tb.w+1))+1
        y = int(MouseY/(tb.h+2))+1
        if x <= nCellX and y <= nCellY then
           ' #g.textbox2 "!setfocus"
            #g.textbox2 "!contents? varName$"
            isChanged = (val(matrice$(currY, currX)) <> val(varName$))
            A(currY, currX) = val(varName$)
            fmt$ = format$(A(currY, currX))
            matrice$(currY, currX) = using(fmt$,A(currY, currX))
            tb.x = 22+(x-1)*dimCell.X
            tb.y = 22+(y-1)*dimCell.Y
            #g.textbox2 matrice$(y, x)
            #g "refresh"
            currX = x :currY = y
            if isChanged then call redrawGrid
        end if
        call message "Cellule ";currY;",";currX;chr$(13);"ATTENTION : pour valider une cellule sélectionnez en une autre."
    WAIT
 
    [Touche]
        key$ = left$(Inkey$,2)   'Shift = 4,  Ctrl = 8,  Alt = 16
        select case
        case key$=chr$(0)+chr$(_VK_UP)    :currY = currY - 1 +1*(currY=1)
        case key$=chr$(0)+chr$(_VK_DOWN)  :currY = currY + 1 -1*(currY=nCellY)
        case key$=chr$(0)+chr$(_VK_RIGHT) :currX = currX + 1 -1*(currX=nCellX)
        case key$=chr$(0)+chr$(_VK_LEFT)  :currX = currX - 1 +1*(currX=1)
       ' case key$=chr$(0)+chr$(13) :#g.textbox2 "!setfocus"   'Entrée
       ' case instr("0123456789",key$)>0 :#g.textbox2 "!setfocus"  'Pav Num
        end select
        tb.x = 22+(currX-1)*dimCell.X
        tb.y = 22+(currY-1)*dimCell.Y
        #g.textbox2 matrice$(currY, currX)
        #g "refresh"
        call message "Cellule ";currY;",";currX;chr$(13);"ATTENTION : pour valider une cellule sélectionnez en une autre."
    WAIT
 
    sub redrawGrid
        for y = 1 to nCellY   'lignes
            for x = 1 to nCellX     'colonnes
                #g.tableau "place ";(x-1)*dimCell.X+2;" ";y*dimCell.Y-8
                fmt$ = format$(A(y, x))
                matrice$(y,x) = using(fmt$,A(y,x))
                #g.tableau "\";right$("                 "+trim$(matrice$(y,x)), txtFieldLen)
            next
        next
        #g.textbox2 matrice$(currY,currX)
        #g.tableau "flush; discard"
    end sub
 
    function format$(value)  'formatage de l'affichage des nombres dans les cellules...
        format$ = "#############"
        if value <> 0 then
            p = instr(str$(value),".")
            if p > 0 then
                for c = 1 to p-1 :format$ = format$+"#" :next
                format$ = format$ + "."
                decimal = len(str$(value))-p
                if decimal > 5 then decimal = 5    ' <-- nombre de décimales acceptées après la virgule: à décider.
                for c = 1 to decimal :format$ = format$+"#" :next
            end if
        end if
        format$ = right$(format$, txtFieldLen)
    end function
 
    sub message mess$
        #g.mess "message : ";mess$
    end sub
 
    sub Grille
        #g.tableau "color lightgray"
        for cy = 1 to nCellY
            for cx = 1 to nCellX
                #g.tableau "place ";(cx-1)*dimCell.X;" ";(cy-1)*dimCell.Y
                #g.tableau "box ";(cx-1)*dimCell.X+dimCell.X;" ";(cy-1)*dimCell.Y+dimCell.Y
            next
        next
        #g.tableau "color black"
    end sub
 
    SUB Charge handle$
        filedialog "Fichiers de données", "*.txt", fileName$
        if fileName$ <> "" then
            open fileName$ for input as #show
            while eof(#show) = 0 and ligne < 10
                line input #show, ln$
                ligne = ligne + 1
                tb$(ligne) = ln$
            wend
            close #show
            redim A(11,11)
            nCellY = ligne :nCellX = nCellY+1
            FOR i = 1 TO nCellY
                FOR j = 1 TO nCellY + 1
                    A(i, j) = val(word$(tb$(i),j,";"))
                NEXT
            NEXT
            currX = 1
            currY = 1
            tb.x = 22+(currX-1)*dimCell.X
            tb.y = 22+(currY-1)*dimCell.Y
            #g "refresh"
            call redrawGrid
            call message "Cellule ";currY;",";currX;chr$(13);"ATTENTION : pour valider une cellule sélectionnez en une autre."
        end if
    end sub
 
    sub quit handle$
        close #handle$
        END
    end sub




Edité par cassiope01 Le 28/12/2011 à 17h54
____________________
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    
Visiteur
Le 26/12/2011 à 12h04

Libertynaute Inactif

Groupe: Visiteur



Beau travail. C'est peut-être ce textbox multiligne multicolonne qui serait la solution définitive.
Ce code pourrait faire un beau snippet, une fois expurgé des calculs, des fichiers et de tout ce qui n'est pas indispensable, et muni de commentaires sur la nature des variables et des actions en cours. Avec un code bien aéré, ce serait un modèle précieux. Je remarque que les données des fichiers ne chargent pas bien; ce doit être à cause du séparateur, la virgule; si on sépare les données avec un espace, tout va bien.
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Visiteur
Le 26/12/2011 à 12h20

Libertynaute Inactif

Groupe: Visiteur



Mais sur ce temps-là j'ai poursuivi mon propre projet avec une nuée de textbox et de boutons.
Tous semble fonctionner sans accroc, je le considère comme fini.
Je poste le code ainsi qu'un petit texte d' "aide ".
Il n'y a pas (ou plus) de limitation à 100 textbox, ni pour LB 4.0x, ni pour JB 1.01. Ce code tourne donc aussi sous JB.

Code :


'GAUSS-JORDAN-GRID.BAS      pour LB 4.0x et JB.101, 26 déc 2011
'================

'Version finale
'domaine public
'auteur claudevdw

[COMMENTAIRE]

'contient 3 exemples dont un de 10 équations et 10 inconnues et 10 termes indépendants = 110 textbox

Les solutions apparaissent dans la dernière colonne active,
à la place des termes indépendants.

Pour plus de détails voir le petit fichier GAUSS-JORDAN-GRID.TXT.


[WIDGETS]

NOMAINWIN

'NUMEROTER les colonnes dans un statictext horizontal
Hnum$ = SPACE$(2)
FOR j = 1 TO 11: Hnum$ = Hnum$ + STR$(j) + SPACE$(16): NEXT j
STATICTEXT #w.horizontal, Hnum$, 20, 1, 580, 20
'et numéroter péniblement les lignes dans un statictext vertical
Vnum$ = SPACE$(1)
FOR i = 1 TO 10: Vnum$ = Vnum$ + STR$(i) + SPACE$(3): NEXT i
STATICTEXT #w.vertical, Vnum$, 3, 12, 9, 320

'[b]10 lignes x 11 colonnes [/b]de TextBox, grâce au copier-coller...
w = 50: MG = 20: MS = 20: d = 5: h = 25

TEXTBOX #w.101, 20 + 0*55, 20, 50, 25
TEXTBOX #w.102, 20 + 1*55, 20, 50, 25
TEXTBOX #w.103, 20 + 2*55, 20, 50, 25
TEXTBOX #w.104, 20 + 3*55, 20, 50, 25
TEXTBOX #w.105, 20 + 4*55, 20, 50, 25
TEXTBOX #w.106, 20 + 5*55, 20, 50, 25
TEXTBOX #w.107, 20 + 6*55, 20, 50, 25
TEXTBOX #w.108, 20 + 7*55, 20, 50, 25
TEXTBOX #w.109, 20 + 8*55, 20, 50, 25
TEXTBOX #w.110, 20 + 9*55, 20, 50, 25
TEXTBOX #w.111, 20 + 10*55, 20, 50, 25

TEXTBOX #w.201, 20 + 0*55, 50, 50, 25
TEXTBOX #w.202, 20 + 1*55, 50, 50, 25
TEXTBOX #w.203, 20 + 2*55, 50, 50, 25
TEXTBOX #w.204, 20 + 3*55, 50, 50, 25
TEXTBOX #w.205, 20 + 4*55, 50, 50, 25
TEXTBOX #w.206, 20 + 5*55, 50, 50, 25
TEXTBOX #w.207, 20 + 6*55, 50, 50, 25
TEXTBOX #w.208, 20 + 7*55, 50, 50, 25
TEXTBOX #w.209, 20 + 8*55, 50, 50, 25
TEXTBOX #w.210, 20 + 9*55, 50, 50, 25
TEXTBOX #w.211, 20 + 10*55, 50, 50, 25

TEXTBOX #w.301, 20 + 0*55, 80, 50, 25
TEXTBOX #w.302, 20 + 1*55, 80, 50, 25
TEXTBOX #w.303, 20 + 2*55, 80, 50, 25
TEXTBOX #w.304, 20 + 3*55, 80, 50, 25
TEXTBOX #w.305, 20 + 4*55, 80, 50, 25
TEXTBOX #w.306, 20 + 5*55, 80, 50, 25
TEXTBOX #w.307, 20 + 6*55, 80, 50, 25
TEXTBOX #w.308, 20 + 7*55, 80, 50, 25
TEXTBOX #w.309, 20 + 8*55, 80, 50, 25
TEXTBOX #w.310, 20 + 9*55, 80, 50, 25
TEXTBOX #w.311, 20 + 10*55, 80, 50, 25

TEXTBOX #w.401, 20 + 0*55, 110, 50, 25
TEXTBOX #w.402, 20 + 1*55, 110, 50, 25
TEXTBOX #w.403, 20 + 2*55, 110, 50, 25
TEXTBOX #w.404, 20 + 3*55, 110, 50, 25
TEXTBOX #w.405, 20 + 4*55, 110, 50, 25
TEXTBOX #w.406, 20 + 5*55, 110, 50, 25
TEXTBOX #w.407, 20 + 6*55, 110, 50, 25
TEXTBOX #w.408, 20 + 7*55, 110, 50, 25
TEXTBOX #w.409, 20 + 8*55, 110, 50, 25
TEXTBOX #w.410, 20 + 9*55, 110, 50, 25
TEXTBOX #w.411, 20 + 10*55, 110, 50, 25

TEXTBOX #w.501, 20 + 0*55, 140, 50, 25
TEXTBOX #w.502, 20 + 1*55, 140, 50, 25
TEXTBOX #w.503, 20 + 2*55, 140, 50, 25
TEXTBOX #w.504, 20 + 3*55, 140, 50, 25
TEXTBOX #w.505, 20 + 4*55, 140, 50, 25
TEXTBOX #w.506, 20 + 5*55, 140, 50, 25
TEXTBOX #w.507, 20 + 6*55, 140, 50, 25
TEXTBOX #w.508, 20 + 7*55, 140, 50, 25
TEXTBOX #w.509, 20 + 8*55, 140, 50, 25
TEXTBOX #w.510, 20 + 9*55, 140, 50, 25
TEXTBOX #w.511, 20 + 10*55, 140, 50, 25

TEXTBOX #w.601, 20 + 0*55, 170, 50, 25
TEXTBOX #w.602, 20 + 1*55, 170, 50, 25
TEXTBOX #w.603, 20 + 2*55, 170, 50, 25
TEXTBOX #w.604, 20 + 3*55, 170, 50, 25
TEXTBOX #w.605, 20 + 4*55, 170, 50, 25
TEXTBOX #w.606, 20 + 5*55, 170, 50, 25
TEXTBOX #w.607, 20 + 6*55, 170, 50, 25
TEXTBOX #w.608, 20 + 7*55, 170, 50, 25
TEXTBOX #w.609, 20 + 8*55, 170, 50, 25
TEXTBOX #w.610, 20 + 9*55, 170, 50, 25
TEXTBOX #w.611, 20 + 10*55, 170, 50, 25

TEXTBOX #w.701, 20 + 0*55, 200, 50, 25
TEXTBOX #w.702, 20 + 1*55, 200, 50, 25
TEXTBOX #w.703, 20 + 2*55, 200, 50, 25
TEXTBOX #w.704, 20 + 3*55, 200, 50, 25
TEXTBOX #w.705, 20 + 4*55, 200, 50, 25
TEXTBOX #w.706, 20 + 5*55, 200, 50, 25
TEXTBOX #w.707, 20 + 6*55, 200, 50, 25
TEXTBOX #w.708, 20 + 7*55, 200, 50, 25
TEXTBOX #w.709, 20 + 8*55, 200, 50, 25
TEXTBOX #w.710, 20 + 9*55, 200, 50, 25
TEXTBOX #w.711, 20 + 10*55, 200, 50, 25

TEXTBOX #w.801, 20 + 0*55, 230, 50, 25
TEXTBOX #w.802, 20 + 1*55, 230, 50, 25
TEXTBOX #w.803, 20 + 2*55, 230, 50, 25
TEXTBOX #w.804, 20 + 3*55, 230, 50, 25
TEXTBOX #w.805, 20 + 4*55, 230, 50, 25
TEXTBOX #w.806, 20 + 5*55, 230, 50, 25
TEXTBOX #w.807, 20 + 6*55, 230, 50, 25
TEXTBOX #w.808, 20 + 7*55, 230, 50, 25
TEXTBOX #w.809, 20 + 8*55, 230, 50, 25
TEXTBOX #w.810, 20 + 9*55, 230, 50, 25
TEXTBOX #w.811, 20 + 10*55, 230, 50, 25

TEXTBOX #w.901, 20 + 0*55, 260, 50, 25
TEXTBOX #w.902, 20 + 1*55, 260, 50, 25
TEXTBOX #w.903, 20 + 2*55, 260, 50, 25
TEXTBOX #w.904, 20 + 3*55, 260, 50, 25
TEXTBOX #w.905, 20 + 4*55, 260, 50, 25
TEXTBOX #w.906, 20 + 5*55, 260, 50, 25
TEXTBOX #w.907, 20 + 6*55, 260, 50, 25
TEXTBOX #w.908, 20 + 7*55, 260, 50, 25
TEXTBOX #w.909, 20 + 8*55, 260, 50, 25
TEXTBOX #w.910, 20 + 9*55, 260, 50, 25
TEXTBOX #w.911, 20 + 10*55, 260, 50, 25

TEXTBOX #w.1001, 20 + 0*55, 290, 50, 25
TEXTBOX #w.1002, 20 + 1*55, 290, 50, 25
TEXTBOX #w.1003, 20 + 2*55, 290, 50, 25
TEXTBOX #w.1004, 20 + 3*55, 290, 50, 25
TEXTBOX #w.1005, 20 + 4*55, 290, 50, 25
TEXTBOX #w.1006, 20 + 5*55, 290, 50, 25
TEXTBOX #w.1007, 20 + 6*55, 290, 50, 25
TEXTBOX #w.1008, 20 + 7*55, 290, 50, 25
TEXTBOX #w.1009, 20 + 8*55, 290, 50, 25
TEXTBOX #w.1010, 20 + 9*55, 290, 50, 25
TEXTBOX #w.1011, 20 + 10*55, 290, 50, 25

BUTTON #w.EX1, "Exemple1", [EXEMPLE1], UL, 50, 350, 80, 30
BUTTON #w.EX2, "Exemple2", [EXEMPLE2], UL, 50, 400, 80, 30
BUTTON #w.EX3, "Exemple3", [EXEMPLE3], UL, 50, 450, 80, 30

BUTTON #w.Load, "Charger", [CHARGER], UL, 150, 350, 80, 30
BUTTON #w.Save, "Sauver", [SAUVER], UL, 150, 400, 80, 30
BUTTON #w.Print, "Imprimer", [IMPRIMER], UL, 150, 450, 80, 30

BUTTON #w.REST, "RESTORE", [RESTAURER], UL, 295, 350, 75, 50
BUTTON #w.NEW, "NEW", RAZ, UL, 380, 350, 70, 50
BUTTON #w.CALC, "CALC", [CALC], UL, 460, 350, 70, 50
BUTTON #w.EXIT, "EXIT", [EXIT], UL, 540, 350, 70, 50

'* dimensionner la fenêtre
WindowHeight = 550
WindowWidth = 660

'* et la centrer
UpperLeftX = INT(DisplayWidth - WindowWidth) /2
UpperLeftY = INT(DisplayHeight - WindowHeight) /2

OPEN "Système d'Equations Linéaires - Méthode de Gauss-Jordan" FOR GRAPHICS_nsb AS #w

PRINT #w, "TrapClose [EXIT]"

PRINT #w.vertical, "!font courrier_new 9"

'* le tableau pour enregistrer les valeurs des 10 x 11 cellules
DIM A(11, 12)
'* le tableau pour sauvegarder les données de A( )
DIM B(11,12)
'* le tableau pour FILES
DIM Info$(10, 10)

'* focus dans la première cellule
PRINT #w.101, "!setfocus"

WAIT

[CALC]
'* d'abord lire le contenu de la grille...

'* combien a-t-on saisi de lignes (n) ?

j = 1
FOR i = 1 TO 10
  cell$ = "#w." + STR$(100 * i + j)       'créer un handle maniable
  PRINT #cell$, "!contents? var$"
  IF var$ = "" THEN
     n = i - 1
     EXIT FOR
  ELSE
      n= i
  END IF
NEXT i

'* combien a-t-on saisi de colonnes (m) ?

i = 1
FOR j = 1 TO 11
  cell$ = "#w." + STR$(100 + j)
  PRINT #cell$, "!contents? var$"
  IF var$ = "" THEN
     m = j - 1
     EXIT FOR
  ELSE
     m = j
  END IF
NEXT j

'* vérifier si colonnes (m) vaut bien lignes (n) +1,  sinon données incomplètes

IF  m <> n + 1 THEN NOTICE "données incomplètes": WAIT

'* récupérer les données des cellules dans le tableau A( )
'  et dans la copie de réserve B( )

FOR i = 1 TO n
FOR j = 1 TO m
  cell$ = "#w." + STR$(100 * i + j)
  PRINT #cell$, "!contents? var$"
  A(i, j) = VAL(var$)
  B(i, j) = VAL(var$)
NEXT j
NEXT i

'* vérifier qu'il n'y a pas de zéro sur la diagonale principale
  'càd celle des inconnues x1, x2, ...

flag = 0
FOR i = 1 TO n
IF A(i, i) = 0 THEN flag = 1: EXIT FOR
NEXT i
IF flag = 1 THEN NOTICE "un zéro sur la diagonale" + CHR$(13) + "problème insoluble": WAIT

'* C'est ici qu'on calcule enfin

       '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

    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         'n + 1 = m
                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

'* et renvoyer les résultats dans les cellules

FOR i = 1 TO n
FOR j = 1 TO m
  cell$ = "#w." + STR$(100 * i + j)
  x = A(i, j)
  x$ = STR$(x)
  ' corriger les résultats 'float' parasites du genre '7.0'
  IF RIGHT$(x$, 2) = ".0" THEN x$ = LEFT$(x$, LEN(x$) - 2)
  PRINT #cell$, x$ 
NEXT j
NEXT i

WAIT

SUB RAZ handle$
FOR i = 1 TO 10
  FOR j = 1 TO 11
    cell$ = "#w." + STR$(100 * i + j)
    PRINT #cell$, ""
  NEXT j
NEXT i

PRINT #w.101, "!setfocus"

END SUB

[RESTAURER]
FOR i = 1 TO n
FOR j = 1 TO m
    A(i, j) = B(i, j)
    cell$ = "#w." + STR$(100 * i + j)
    var = A(i, j)
    PRINT #cell$, STR$(var)
NEXT j
NEXT i

WAIT

[CHARGER]
CALL  RAZ "#w.RAZ"      'vider l'affichage
FILEDIALOG "Importer des données dans la grille", "*.txt; *.dat", fn$
IF fn$ = "" THEN WAIT

OPEN fn$ FOR INPUT AS #src
    INPUT #src, n   'nombre de lignes
    INPUT #src, m  'nombre de colonnes = n + 1
  FOR i = 1 TO n
    INPUT #src, ligne$
  FOR j = 1 TO m
    A(i, j) = VAL(WORD$(ligne$, j))         'mieux sans séparateur, seulement espace
    B(i, j) = A(i, j)                       'copie de A( )
  NEXT j
  NEXT i
CLOSE #src

'répartir les données dans les cellules
FOR i = 1 TO n
FOR j = 1 TO m
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(A(i, j))
NEXT j
NEXT i

WAIT

[SAUVER]

FILEDIALOG "Exporter les données de la grille dans un fichier", " *.txt; *.dat ", fn$

IF fn$ = "" THEN WAIT

FILES DefaultDir$, fn$, Info$( )
FileExists = VAL(Info$(0, 0))
IF FileExists <> 0 THEN CONFIRM "Ce fichier existe déjà" + CHR$(13) + "Sauver quand même ?"; choix$
IF choix$ = "no" THEN WAIT

OPEN fn$ FOR OUTPUT AS #dest
  PRINT #dest, n     'lignes
  PRINT #dest, m     'colonnes
  FOR i = 1 TO n
    ligne$ = ""
  FOR j = 1 TO m
    ligne$ = ligne$ + STR$(B(i, j)) + " "
  NEXT j
  PRINT #dest, ligne$
  NEXT i
CLOSE #dest

WAIT

[b][IMPRIMER][/b]

LPRINT "Coefficients:": LPRINT
FOR i = 1 TO n
FOR j = 1 TO m
   LPRINT  B(i, j),
NEXT j
   LPRINT
NEXT i
LPRINT

LPRINT "Solutions:": LPRINT
FOR i = 1 TO n
  x = A(i, m)
  x$ = STR$(x)
  IF RIGHT$(x$, 2) = ".0" THEN x$ = LEFT$(x$, LEN(x$) - 2)
  LPRINT "x"; i; " = ", x$
NEXT i

DUMP

WAIT

[EXEMPLE1
'x1 -x2 + 2x3 = 5
'3x1 + 2x2 + x3 = 10
'2x1 - 3x2 - 2x3 = -10

'solutions x1 = 1, x2 = 2, x3 = 3

DATA 1, -1, 2, 5
DATA 3, 2, 1, 10
DATA 2, -3, -2, -10

RESTORE [EXEMPLE1]

'supprimer l'exemple précédent (reset)
CALL RAZ "#w.RAZ"

'charger l'exemple1
FOR i = 1 TO 3
FOR j = 1 TO 4
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

WAIT

[EXEMPLE2]

'supprimer l'exemple précédent (reset)
CALL RAZ "#w.RAZ"

'charger l'exemple2
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

'solutions 1.2, 2.25, -0.63, 2.2, -0.247

RESTORE [EXEMPLE2]

FOR i = 1 TO 5
FOR j = 1 TO 6
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

WAIT

[EXEMPLE3]

CALL RAZ "#w.RAZ"

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

'solutions: x1 = 1,  x2 =2,  x3 = 3,  x4 = -1,  x5 = -2,  x6 = -3,  x7 = 5,  x8 = -10, x9 = 12, x10 = -7

RESTORE [EXEMPLE3]

FOR i = 1 TO 10
FOR j = 1 TO 11
   READ z
   cell$ = "#w." + STR$(100 * i + j)
   PRINT #cell$, STR$(z)
NEXT j
NEXT i

WAIT

[EXIT]

CLOSE #w
END

[b][PROBLEME_SUPPLEMENTAIRE][/b]
'problème supplémentaire, à saisir dans la grille, si on veut;
's'il ressemble à l'exemple n° 2, ce n'est pas fortuit

'x1 + 2x2 + 3x3 - 4x4 = - 4.99
'-2x1 - x2 + x3 + x4 = - 3.08
'x1 + x2 - x3 - 2x4 = - 0.32
'3x1 + 3x2 + 2x3 - 3x4 = 2.49

'solutions: 1.2, 2.25, -0.63, 2.2

'données à encoder:

'1, 2, 3, -4, -4.99
'-2, -1, 1, 1, -3.08
'1, 1, -1, -2, -0.32
'3, 3, 2, -3, 2.49



Et ici le petit texte explicatif:, dans une fenêtre de code, plus facile à récupérer:

Code :


GAUSS-JORDAN-GRID.TXT
~~~~~~~~~~~~~~~~~~~~

*** Instructions pour l'utilisation de GAUSS-JORDAN-GRID.BAS ***

Ce petit programme fonctionne en LB 4.0x et JB 1.01 en tout cas.

La grille est destinée à la saisie des coefficients et des termes indépendants
d'un système d'équations linéaires. Pas plus de 10 équations et 10 inconnues.
On se rappelle bien que l'indicateur de décimales en informatique,
c'est le point '.', pas la virgule ','. On écrit donc  8.2  mais jamais 8,2

La méthode de calcul est celle de Gauss-Jordan (1830), pratiquement inutilisable
avant l'époque informatique. Un peu comme l'algèbre logique de Boole (1850) était
inutilisable avant l'invention de l'électronique digitale.

On navigue de cellule en cellule avec TAB et SHIFT-TAB,
Ou avec la souris, mais pas avec les touches fléchées

Entrer les données à partir de l'angle supérieur gauche
Nne pas laisser de cellules vides dans la matrice,
siinon = 0, résultat final faux ou division par zéro

Les données de x1 - 2x3 = 4
doivent se lire: x1 + 0*x2 - 2x3 = 4

On se déplace dans la grille par les touches TAB, et MAJ + TAB, ou avec la souris;
mais pas avec les touches fléchées, car les cellules sont des contrôles séparés.

Cliquez sur [CALC] lorsque toutes les données ont été saisies.
Les solutions s'affichent alors (en quelques millisecondes) dans la dernière colonne
(celle où vous avez saisi les termes indépendants).

Lorsque vous cliquez cur [CALC], le nombre de lignes (n) et de colonnes (m)
est examiné, et leur contenu est copié dans le tableau A(n, m). 
Comme ce tableau est détruit par le calcul, on en fait d'abord une copie B(n, m),
pour le cas où on voudrait revoir les données de départ en cliquant sur [RESTORE].

Les données affichées (données OU solutions) sont enregistrées dans le fichier
"MesData.txt" en cliquant sur [Sauver]. Le nombre de lignes et le nombre de
colonnes sont enregistrés en premier. Les données de chaque ligne sont cumulées dans
une chaîne de caractères 'ligne$'.et séparées par un espace;
la virgule ne sépare pas bien). Chaque nouvelle sauvegarde
écrase le fichier précédent, donc si vous préférez le garder,
changez son nom avant de continuer. !! Les données de grille ne sont validées 
et enregistrées dans A( ) que après [CALC]. On peut alors sauver les solutions directement;
si on veut sauver le problème original il faut d'abord le [RESTAURER].

Les données existant dans un fichier "MesData.txt" peuvent être chargées dans la grille
en cliquant sur [Charger]. On récupère d'abord le nombre de lignes (n) et le nombre de
colonnes (m); les données de chaque 'ligne$' sont extraites par WORD$(string$, index).

Le fichier de données doit se présenter comme ceci:

n le nombre de lignes
mle nombre de colonnes
les données sous forme de chaîne 'ligne$',séparation par espaces, pas de virgule
exemple:

---8<------------------------couper ici

4
5
1 2 3 -4 -4.99        
-2 -1 1 1 -3.08
1 1 -1 -2 -0.32
3 3 2 -3 2.49

---8<------------------------et couper ici, copier-coller dans NotePad, et sauver


On peut aussi imprimer le problème ET les solutions, mais il faut d'abord
l'avoir calculé par [CALC].

On peut charger 3 exemples différents (ils sont déjà dans le code) pour se faire une idée.

[NEW] remet tout à zéro, [EXIT] termine le programme.

Il me semble qu'avec ça on sait tout ce qu'on a besoin.





Edité par Visiteur Le 26/12/2011 à 16h36
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 26/12/2011 à 17h43

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
claudevdw:
Je remarque que les données des fichiers ne chargent pas bien; ce doit être à cause du séparateur, la virgule; si on sépare les données avec un espace, tout va bien.


Tu aurais découvert un BUG dans la commande WORD$( stringExpression, n [,string delimiter] ) ?

Dans mon prog ce n'est pas la virgule le séparateur mais le point-virgule.
Je n'ai détecté aucun pb.

J'ai choisi le point-virgule pour 2 raisons:
- suivant la police par défaut d'un éditeur de texte, en supposant qu'on écrive un fichier exemple à la main, il n'est pas évidant de voir si on a bien tapé un seul Espace entre les données...
- le point-virgule est aussi le séparateur par défaut des fichiers *.csv qu'on peut générer avec Excel.

Dans ton prog, pourquoi n'affecterais-tu pas B() en même temps que A() systématiquement ?
Ca éviterait de générer un fichier erroné si par mégarde on clique sur le bouton "Sauver" avant d'avoir cliqué sur "Calcul".

Bien vu le statictext vertical pour les numéros de lignes ;) sitôt vu, sitôt appliqué dans ma version... c'est pas super précis comme placement mais ça fait économiser 10 lignes... ;)

Donc, en fait, il n'y avait pas de limite à 100 textbox dans JB ... ???

@+



Edité par cassiope01 Le 26/12/2011 à 17h45
____________________
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    
Visiteur
Le 26/12/2011 à 20h35

Libertynaute Inactif

Groupe: Visiteur



Le point-virgule fonctionne en effet aussi bien qu'un espace comme séparateur, je viens de l'essayer.

Pour ce genre de calcul particulier-ci, on n'a toutefois plus vraiment besoin d'Excel.

Mais je n'arrive pas à charger tes données séparées par ' ; ' correctement, avec ton code qui pourtant semble impeccable.

La copie B( ) est mise à jour chaque fois que le tableau de référence A( ) est créé ou recréé, mais pas lorsque A( ) risque d'être altéré par les calculs; pas d'inquiétude de ce côté donc.

Cordialement,

Claude.



Edité par Visiteur Le 26/12/2011 à 20h49
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 27/12/2011 à 09h30

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
claudevdw:
Mais je n'arrive pas à charger tes données séparées par ' ; ' correctement, avec ton code qui pourtant semble impeccable.


Il y a toute les chances pour que ce soit dû à ta fabrication des fichiers *.txt ;)

Ils doivent être au format TXT pur: c'est un choix au moment de l'enregistrement, en tout cas avec NotePad.
Ils ne doivent pas non plus avoir de lignes vides supplémentaires.

@+
____________________
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    
Visiteur
Le 28/12/2011 à 17h00

Libertynaute Inactif

Groupe: Visiteur



Bonjour cassiope01,

Je suggère d'éviter de tomber dans une polémique sans objet, mais je vois que le ton monte insensiblement. Si tu veux on peut arrêter les échanges sur ce sujet-ci.

En attendant, je sauve sous *NotePad" et sans 'à-la-ligne' final, ces données-ci, copiées-collées de ton post, et sans ligne vide:

1;2;3;-4;-4.99
-2;-1;1;1;-3.08
1;1;-1;-2;-0.32
3;3;2;-3;2.49

Je les récupère avec ton code, et j'obtiens cet affichage-ci:

1;2;3;-4;-4.99 0
-2;-1;1;1;-3.08 0
1;1;-1;-2;-0.32 0
3;3;2;-3;2.49 0
0 0 0 0 0 0

Il doit y avoir un petit quelque chose dans la récupération des données et je ne vois pas du tout ce que c'est.

Toutefois on peut laisser reposer tout cà pendant un moment.

Claude

PS: donc, pas de limite connue au nombre de textbox en effet




Edité par Visiteur Le 28/12/2011 à 17h02
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 28/12/2011 à 18h06

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
claudevdw:
Bonjour cassiope01,

Je suggère d'éviter de tomber dans une polémique sans objet, mais je vois que le ton monte insensiblement.


Ah bon ???????????????

Quel ton ??????????

Mais y a aucun problème.

Je suis déjà sur autre chose.
____________________
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    
Projets open source » Equations linéaires - Gauss-Jordan - GUI Saisie des données dans une grille de textbox  

 |  |

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