Forum Liberty Basic France
• Index
• Projets open source » Equations linéaires - Gauss-Jordan - GUI Saisie des données dans une grille de textbox
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 :
Edité par Visiteur Le 23/12/2011 à 12h38
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
Libertynaute Inactif
Groupe: Visiteur
Je me fais donc un plaisir de poster mon GAUSS-JORDAN-GRID-XL pour LB 4.0x
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
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
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."
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
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 :
Edité par cassiope01 Le 28/12/2011 à 17h54
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."
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
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.
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.
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 :
Et ici le petit texte explicatif:, dans une fenêtre de code, plus facile à récupérer:
Code :
Edité par Visiteur Le 26/12/2011 à 16h36
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
claudevdw:
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
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


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."
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
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
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
claudevdw:
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.
@+
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."
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
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
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
claudevdw:
Ah bon ???????????????
Quel ton ??????????
Mais y a aucun problème.
Je suis déjà sur autre chose.
Bonjour cassiope01,
Je suggère d'éviter de tomber dans une polémique sans objet, mais je vois que le ton monte insensiblement.
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."
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
• Index
1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie