Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » BASIC » Boucles FOR...NEXT emboitées

matmer
ProgBoarder
Citer Windows XP Firefox 3 - Posté le 03/02/2010 à 14:38
FOR A=0 TO 9
FOR B=0 TO 9
FOR C=0 TO 9
......
NEXT C
NEXT B
NEXT A
Comment demander au programme que A,B,C soient distincts 2 à 2 (il peut y avoir plus de 3 boucles emboîtées)?
J'y arrive mais c'est fastidieux.
Y-a-t'il une écriture standard, élégante et rapide?
Merci de bien vouloir aider un sénior redébutant.

Edité par matmer ( 03/02/2010 14:39:55 )
Freem
Modérateur
RemonterCiter Windows XP Firefox 3 - Posté le 03/02/2010 à 15:22
Si tu nous disais comment tu fais actuellement (voire le but de ce bout de code), ce serait plus simple.

En attendant, je pense que le plus simple, ça reste d'utiliser le mot-clé "STEP" des boucles FOR. Il permet de spécifier de combien tu incrémentes le compteur.
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
matmer
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 03/02/2010 à 16:05
Merci .
........................

Comme je veux éliminer les couples (X,Y) où X=Y, j'écris:
IF (A-B)*(A-C)*(B-C)=0 THEN GOTO 100
....
100
NEXT C
NEXT B
NEXT A
.....

end

Edité par matmer ( 03/02/2010 16:06:46 )
SFLPMEA
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 03/02/2010 à 17:31
(héhé Salutations.

Pourrais-tu essayer un truc du genre :

FOR A=0 TO 9
FOR B=A TO 9
FOR C=B TO 9
......
NEXT C
NEXT B
NEXT A

et nous dire si c'est la solution.

(héhé Salutations.

(gêné) J'ai fait un oubli, Je crois qu'il faut mettre :

FOR B=A + 1 TO 9
FOR C=B + 1 TO 9

(héhé Petit ajout :
Le programme ci-dessous donne 210 combinaisons et a, b, c, d ne sont pas affichés :
FOR a = 0 TO 9
FOR b = a + 1 TO 9
FOR c = b + 1 TO 9
FOR d = c + 1 TO 9
Combinaison& = Combinaison& + 1
IF a = b OR a = c OR a = d THEN
PRINT a, b, c, d
END IF
IF b = c OR b = d OR c = d THEN
PRINT a, b, c, d
END IF
NEXT d, c, b, a
PRINT Combinaison&

Tu peux continuer avec e, f, g avec FOR "lettre précédente" + 1

Nous tenir au courant. Merci.

Edité par SFLPMEA ( 03/02/2010 20:17:53 )
Moi, mon ordinateur, je l'ai baptisé "Billy" ...
En remerciement, je reçois beaucoup de pages bleues !
matmer
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 04/02/2010 à 10:27
Merci, mais tu n'obtiens pas tous les n-uplets sans répétitions
Par exemple il y a 90 couples (a,b) sans répétitions, 720 triplets (a,b,c) sans répétitions, 5040 4-uplets sans répétitions, etc...
Je vais m'en tenir à ma méthode.
.......................................
Question subsidiaire: J'ai voulu copier-coller ton programme pour l'éditer sur mon écran QB mais je n'y suis pas arrivé. Que faut-il faire ?
................
Bonne journée
Et merci également à Freem


Edité par matmer ( 04/02/2010 10:30:26 )
SFLPMEA
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 04/02/2010 à 10:48
(héhé Salutations.

En réponse à la question subsidiaire :
Sélectionner le programme en totalité (il se met en surbrillance).
Faire un copier.
Mettre Internet en veille/attente.
Ouvrir le bloc-notes, et y copier la sélection. Faire une sauvegarde sous un nom comme TOTO.BAS, dans le répertoire de ton choix.
Ensuite, quand tu seras dans la fenêtre Qbasic, tu peux ouvrir ce programme.

Il n’y a pas de liaison copier/coller entre Windows et le QB et tu dois passer par le bloc-notes.

(héhé Salutations.
Moi, mon ordinateur, je l'ai baptisé "Billy" ...
En remerciement, je reçois beaucoup de pages bleues !
SFLPMEA
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 04/02/2010 à 11:55
(héhé Salutations.

Excuse-moi, mais je comprends mal les 90 couples (a, b).
Le petit programme ci-dessous n’en trouve que 45. Ils sont affichés. Lequel manque ?

CLS
FOR a = 0 TO 9
FOR b = a + 1 TO 9
PRINT a; b
t& = t& + 1
NEXT b, a
PRINT t&


(héhé Salutations
Moi, mon ordinateur, je l'ai baptisé "Billy" ...
En remerciement, je reçois beaucoup de pages bleues !
matmer
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 04/02/2010 à 12:27
La seule restriction sur (a,b) étant a différent de b, il y a 10 choix pour a parmi les 10 chiffres puis 9 choix pour b parmi les 10 chiffres sauf le chiffre déjà pris par a. Total 10*9=90 couples avec a différent de b
De la même façon, pour les triplets sans répétitions il y a 10*9*8=720 tels triplets.
Dans tes programmes tu choisis b>a... sans raison.
Salutations

Edité par matmer ( 04/02/2010 12:34:20 )
Freem
Modérateur
RemonterCiter Linux Opera 9 - Posté le 04/02/2010 à 21:42


Il n’y a pas de liaison copier/coller entre Windows et le QB et tu dois passer par le bloc-notes.



Il existe un moyen de faire un copier coller de win vers dos, et également le contraire.
Il faut en fait effectuer le clic droit sur le titre de la fenêtre QB. Pas la barre de menu, mais bien le titre!

Pour le reste, matmer, je ne comprends pas non plus ce que tu souhaites...
Pourrais-tu nous mettre un petit exemple de valeurs?
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
SFLPMEA
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 05/02/2010 à 01:02
(héhé Salutations.

Je propose une solution adaptable sans trop d’efforts à 7 ou 8 variables et qui pourrait s’adapter à une chaîne alphanumérique en passant par les codes ASCII des caractères, et en prévoyant un autre dimensionnement de la table de contrôle CTL.
J’ai prévu une table dimensionnée de 0 à 9 et j’y fais le décompte des chiffres, tout simplement. Si une position dépasse 1, cela signifie un « doublon » et un refus, sinon acceptation. Le programme ci-dessous pour 4 chiffres donne :
Refusé : 4960 et Accepté : 5040


CLS

DIM ctl(0 TO 9) AS SINGLE

FOR a = 0 TO 9
FOR b = 0 TO 9
FOR c = 0 TO 9
FOR d = 0 TO 9
' * … completer pour e, f, g si besoin

Refuse$ = ""
ERASE ctl
ctl(a) = ctl(a) + 1
ctl(b) = ctl(b) + 1
ctl(c) = ctl(c) + 1
ctl(d) = ctl(d) + 1
' * a completer
FOR i = 0 TO 9
IF ctl(i) > 1 THEN
Refuse$ = "OUI"
END IF

NEXT i

IF Refuse$ = "OUI" THEN
Refus& = Refus& + 1
ELSE
Bon& = Bon& + 1
END IF

' * a completer
NEXT d
NEXT c
NEXT b
NEXT a

PRINT USING "REFUSE ###### ACCEPTE #######"; Refus&; Bon&

Est-ce la solution ?

(héhé Salutations.
Moi, mon ordinateur, je l'ai baptisé "Billy" ...
En remerciement, je reçois beaucoup de pages bleues !

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2012 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,034 s - Crédits - Stats
1 connecté