Win3x.Org

Windows & DOS Community

Postez vos petits programmes en QBasic

Règles du forum

Pour tout sujet impliquant un système d'exploitation daté de 2000 à nos jours, merci de le publier dans la section intitulée « Informatique moderne ».

Répondre   Page 4 sur 5  [ 44 messages ]
Aller sur la page « 1 2 3 4 5 »
Auteur Message
0597534
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 24 févr. 2010 02:23
 
 
Rebonjour à vous tous! je vien de lire message mais désolé pour cette longue interruption de temps à répondre, j'ai laché un peu la programmation car cette année je vise à plus me concentrer au secondaire. Mais peut-etre et surement cet été je reprendrai la programmation!


Haut
Citer
gm86
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 10 avr. 2010 14:31
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 628
Inscription : 01 sept. 2008 19:07
 
Pour le jour où vous reprendrez la programmation, je vous donne un conseil supplémentaire.
En mode SCREEN 2 pour PONG, vous pouvez vous inspirer de l'exemple pour PUT (graphique) donné dans l'aide de QuickBASIC 4.5. Il s'agit d'afficher une image plus grosse que l'objet à représenter afin de recouvrir le dessin précédent. Cela évite d'effacer, rend l'animation rapide, sans clignotement et l'image est presque stable. Cependant, il faut utiliser un timer pour cadencer l'animation sinon la vitesse sera proportionnelle à celle du processeur.

Si vous voulez allez plus loin, je peux vous présenter une méthode d'animation sans contrainte de palette mais plus gourmande en mémoire.

Une animation consiste à afficher une image un certain laps de temps puis à l'effacer avant de l'afficher ailleurs mais à proximité, ce qui crée l'illusion du mouvement. L'organisation de la mémoire vidéo fait qu'on manipule le rectangle capable de l'image à l'écran. Les pixels non significatifs ont alors une valeur nulle.
C'est pourquoi l'affichage d'une image avec XOU impose un fond uni, c'est-à-dire, constitué de pixels nuls aussi. Cependant, une carte EGA dispose de 16 registres de couleur programmables, celui numéroté 0 déterminant la couleur de fond. Pour pouvoir ajouter des pixels blancs (étoiles), on attribue la couleur blanche au registre 1 et on regroupe les 14 registres de couleur suivants deux à deux ; il n'y a plus que 8 couleurs sur 16 affichées à l'écran : celle du fond, le blanc brillant et les 7 couleurs correspondant aux 14 derniers registres. Le principal avantage de XOU (OU EXCLUSIF) est qu'il est réversible, deux mêmes copies s'annulent ce qui facilite l'effacement.
Pour afficher une image devant un arrière-plan sans restriction de couleurs, il faut mettre à zéro les pixels de l'arrière-plan à remplacer par ceux de l'image avant la copie avec OU -- INCLUSIF, EXCLUSIF peu importe.
Pour cela, on applique un masque grâce à l'opérateur ET logique. Vu qu'on travaille en mode 16 couleurs, il sera constitué de deux attributs : 15 et 0. Le premier préserve, le second annule.
   xxxxxxxxb (val. orig.)       xxxxxxxxb (val. orig.)
ET 11111111b (15 ou Fh)      ET 00000000b (0)
-----------                  -----------
=  xxxxxxxxb (val. orig.)    =  00000000b (0)
Enfin, pour effacer, on restitue l'arrière-plan préalablement sauvé, ET logique n'étant pas réversible.
En conclusion, au lieu de travailler avec une seule image comme précédemment, on manipule aussi son masque et une copie de l'arrière-plan modifié, tous trois nécessitant la même quantité de mémoire. Le masque utilise la possibilité du ET logique de forcer un bit à zéro, le sprite, la possibilité contraire du OU logique.

En pratique, toutes ces copies sont longues à effectuer et il faut travailler en dehors de la mémoire vidéo avant d'afficher. Surtout que la mémoire vidéo des vieilles cartes sur connecteur ISA est lente. Malheureusement sous BASIC, il est plus facile de travailler en mémoire vidéo. En revanche, on peut avoir recours à deux pages vidéos, une sur laquelle on travaille les sorties et une utilisée pour afficher à l'écran.
Voici quelques informations à détenir :
             SCREEN 7      SCREEN 8      SCREEN 9      SCREEN 10
                                                       (MODE MONO)
EGA  64 Ko :  2 pages       1 page        1 page       N/A
             16 coul./16   16 coul./16    4 coul./64
EGA 128 Ko :  4 pages       2 pages       1 page       1 page
             16 coul./16   16 coul./16   16 coul./64   4 attributs/9
EGA 256 Ko :  8 pages	    4 pages       2 pages      2 pages
             16 coul./16   16 coul./16   16 coul./64   4 attributs/9
Voici un exemple :
1 ' Animation dirigée au clavier en mode EGA 320 x 200 16 couleurs.
2 ' Utilise un masque ET logique avant copie par OU INCLUSIF et
3 ' deux pages : une à l'écran et une de sortie échangeables.
4 ' Requiert : - GW-BASIC 3.2x supportant les codes BREAK du clavier
5 '              (éviter la v.3.20 pour Olivetti) ou IBM BASICA 3.20 minimum ;
6 '            - carte vidéo compatible EGA ;
7 '            - écran couleur.
8 ' Compilation : QuickBASIC 2.0 ou BASCOM 3.0 (/E/W/X) minimum.
9 :
100 ON ERROR GOTO 1000          ' Aller à TRAITEMENT D'ERREUR si erreur
110 DRAPEAUX% = 0               ' Variable initialisée (facultatif)
200 GOSUB 2000                  ' Appeler DEBUT
300 GOSUB 3000                  ' Appeler BOUCLE
699 ' ----- QUITTER -----
700 ' Mode texte avec menu des touches de fonction.
710 WIDTH 80: SCREEN 0: KEY ON  ' WIDTH avant SCREEN si page <> 437
720 ' Restaurer l'état du clavier.
730 DEF SEG = &H40
740 IF DRAPEAUX% THEN POKE &H17, DRAPEAUX%
750 DEF SEG
760 ' Afficher message d'erreur s'il y a lieu.
770 PRINT MESSAGE.ERREUR$
780 ' Arrêter l'interception d'erreur.
790 IF MESSAGE.ERREUR$ = "" THEN CLEAR                                                                      ELSE ON ERROR GOTO 0
900 END                         ' Ou SYSTEM pour quitter aussi l'interpréteur.
990 :
999 ' ===== T R A I T E M E N T   D ' E R R E U R =====
1000 IF ERR = 5 AND ERL = 31060 THEN 10000              ' Dessin hors limites
1100 ' Mode d'écran invalide
1110 IF ERR = 5 AND ERL = 23000 THEN MESSAGE.ERREUR$ = "Carte vidéo couleur non compatible EGA ou PC/BASIC antérieur à la version 3.20":                                                                    RESUME 700         ' Aller à QUITTER
1200 ' Autres erreurs
1210 MESSAGE.ERREUR$ = "Erreur" + STR$(ERR) + " à la ligne" + STR$(ERL) + " : avertir l'auteur du programme."
1220 RESUME 700                 ' Aller à QUITTER (on s'embête pas)
1990 :
1999 ' ===== D E B U T =====
2000 ' Préparer les données, l'écran et l'interception des touches du curseur.
2100 GOSUB 21000                ' Initialisation variables
2200 GOSUB 22000                ' Sauvegarde état clavier
2300 GOSUB 23000                ' Initialisation écran, base tableaux, hasard
2400 GOSUB 24000                ' Fond
2500 GOSUB 25000                ' Création sprite et masque
2600 GOSUB 26000                ' Make et break touches fléchées
2700 GOSUB 27000                ' Surveillance touches fléchées
2710 PCOPY PAGE.S%,PAGE.E%      ' Copier page à l'écran sur page de sortie.
2900 RETURN
2990 :
2999 ' ===== B O U C L E =====
3000 ' La boucle principale est celle qui gère l'affichage.
3010 WHILE TOUCHE$ <> CHR$(27)
3100   GOSUB 31000              ' Animer dessin
3110   SWAP PAGE.S%, PAGE.E%
3120   SCREEN , , PAGE.S%, PAGE.E%
3800   TOUCHE$ = INKEY$
3810 WEND
3900 RETURN
9990 :
9997 ' -------------------
9998 ' Dessin hors limites
9999 ' -------------------
10000 IF DESSIN.X1% < 0 OR DESSIN.X1% > DESSIN.XMAX% THEN DESSIN.X1% = DESSIN.X%
10010 IF DESSIN.Y1% < 0 OR DESSIN.Y1% > DESSIN.YMAX% THEN DESSIN.Y1% = DESSIN.Y%
10900 RESUME
20900 :
20997 ' ----------------------
20998 ' Initialisation valeurs
20999 ' ----------------------
21000 ' Adressage d'écran.
21010 ECRAN.X% = 319: ECRAN.Y% = 199
21020 '
21030 ' Variables de boucle et flags.
21040 I% = 0   : J% = 0: COULEUR% = 0
21050 FLAG% = 0: TOUCHE$ = ""
21060 '
21070 ' Paramètres de l'animation.
21080 DESSIN.PAS.X% = 1: DESSIN.PAS.Y% = 1      ' Pixel par pixel.
21090 PAGE.S% = 0: PAGE.E% = 1                  ' Pages : sortie et écran.
21100 '
21110 ' Dimensions, vecteurs, coordonnées et taille du dessin à déplacer.
21120 DESSIN.LARGEUR% = 20: DESSIN.HAUTEUR% = 20
21130 DESSIN.VX% = 0      : DESSIN.VY% = 0
21140 DESSIN.X%  = 0      : DESSIN.Y% =  0
21150 DESSIN.X1% = DESSIN.X%  : DESSIN.Y1% = DESSIN.X%
21160 DESSIN.X2% = DESSIN.X1% + DESSIN.LARGEUR% - 1
21170 DESSIN.Y2% = DESSIN.Y1% + DESSIN.HAUTEUR% - 1
21180 DESSIN.XMAX%   = ECRAN.X% - DESSIN.LARGEUR% + 1
21190 DESSIN.YMAX%   = ECRAN.Y% - DESSIN.HAUTEUR% + 1
21200 DESSIN.TAILLE% = (4 + INT((DESSIN.LARGEUR% + 7) / 8) * DESSIN.HAUTEUR% * 4) / 2
21210 '
21220 ' Tableaux où sont stockés le dessin, son masque et son arrière-plan.
21230 OPTION BASE 1     ' Les tableaux commencent par 1 au lieu de 0.
21240 DIM DESSIN.FOND%(DESSIN.TAILLE%)
21250 DIM DESSIN.SPRITE%(DESSIN.TAILLE%)
21260 DIM DESSIN.MASQUE%(DESSIN.TAILLE%)
21270 '
21280 ' Message d'erreur.
21290 MESSAGE.ERREUR$ = ""
21900 RETURN
21910 ' **********************************************************************
21920 ' Le mode 320 x 200 16 couleurs comporte 4 plans et 4 bits par pixel.
21930 '   4 + INT((largeur * bit par pixel par plan + 7) / 8) * hauteur * plan
21940 ' = taille du tableau en octets (un entier comporte deux octets)
21950 ' **********************************************************************
21997 ' -----------------------
21998 ' Sauvegarde état clavier
21999 ' -----------------------
22000 ' On manipule la mémoire à partir du segment 0040h.
22010 DEF SEG = &H40
22020 ' On ignore les touches Crtl, Alt ou Maj (poids faible) avant de sauver.
22030 DRAPEAUX% = PEEK(&H17) AND &HF0
22040 ' Désactiver le pavé numérique et le verrouillage majuscule (bits 6 & 7).
22050 POKE &H17, DRAPEAUX% AND &H9F
22060 ' On restitue absolument le segment BASIC par défaut.
22070 DEF SEG
22900 RETURN
22997 ' ------------------------------
22998 ' Initialisation écran et hasard
22999 ' ------------------------------
23000 SCREEN 7          ' EGA 320 X 200, 16 couleurs.
23010 CLS: KEY OFF
23020 PAINT (0, 0), 1   ' Une façon de colorier sans connaître les limites.
23030 RANDOMIZE TIMER   ' On initialise la liste des nombres pseudo-aléatoires
23900 RETURN            ' grâce à l'horloge.
23997 ' ----
23998 ' Fond
23999 ' ----
24000 ' Ciel étoilé de confettis (16 couleurs).
24010 FOR I% = 1 TO 2000
24020   PRESET ((ECRAN.X% + 1) * RND, (ECRAN.Y% + 1) * RND), 15 * RND + 1
24030 NEXT I%
24900 RETURN
24997 '--------------------------
24998 ' Création sprite et masque
24999 '--------------------------
25000 GET (DESSIN.X1%, DESSIN.Y1%)-(DESSIN.X2%, DESSIN.Y2%), DESSIN.FOND%
25010 '
25020 FLAG% = 0                         ' 0 : flag pour dessin.
25030 GOSUB 53000                       ' Afficher soit dessin soit masque
25040 GET (DESSIN.X1%, DESSIN.Y1%)-(DESSIN.X2%, DESSIN.Y2%), DESSIN.SPRITE%
25050 LOCATE 25, 1
25060 PRINT "Dessin utilisé...";
25070 WHILE INKEY$ = "": WEND
25080 '
25090 RESTORE
25100 FLAG% = -1                        ' -1 : flag pour masque.
25110 GOSUB 53000                       ' Afficher soit dessin soit masque
25120 GET (DESSIN.X1%, DESSIN.Y1%)-(DESSIN.X2%, DESSIN.Y2%), DESSIN.MASQUE%
25130 LOCATE 25, 1
25140 PRINT "Masque utilisé...";
25150 WHILE INKEY$ = "": WEND
25160 '
25170 PUT (DESSIN.X1%, DESSIN.Y1%), DESSIN.FOND%, AND
25180 PUT (DESSIN.X1%, DESSIN.Y1%), DESSIN.SPRITE%, OR
25190 LOCATE 25, 1
25200 PRINT "Animation avec masque ET et sprite OU.";
25900 RETURN
25997 ' ------------------------------
25998 ' Make et break touches fléchées
25999 ' ------------------------------
26000 ' CHR$(0) signifie pavé numérique et verrouillage majuscule désactivés.
26010 ' ... + CHR$(&H80 + scancode) : code de relâchement d'une touche.
26020 KEY 15, CHR$(&H0) + CHR$(&HC8)    ' &HC8 = &H80 + &H48, haut
26030 KEY 16, CHR$(&H0) + CHR$(&HCB)    ' &HCB = &H80 + &H4B, gauche
26040 KEY 17, CHR$(&H0) + CHR$(&HCD)    ' &HCD = &H80 + &H4D, droite
26050 KEY 18, CHR$(&H0) + CHR$(&HD0)    ' &HD0 = &H80 + &H50, bas
26060 ON KEY(11) GOSUB 51000            ' Aller à MAKE HAUT
26070 ON KEY(12) GOSUB 51200            ' Aller à MAKE GAUCHE
26080 ON KEY(13) GOSUB 51400            ' Aller à MAKE DROITE
26090 ON KEY(14) GOSUB 51600            ' Aller à MAKE BAS
26100 ON KEY(15) GOSUB 52000            ' Aller à BREAK HAUT
26110 ON KEY(16) GOSUB 52200            ' Aller à BREAK GAUCHE
26120 ON KEY(17) GOSUB 52400            ' Aller à BREAK DROITE
26130 ON KEY(18) GOSUB 52600            ' Aller à BREAK BAS
26900 RETURN
26997 ' -----------------------------
26998 ' Surveillance touches fléchées
26999 ' -----------------------------
27000 FOR I% = 11 TO 18
27010   KEY(I%) ON
27020 NEXT I%
27900 RETURN
30990 :
30997 ' -------------
30998 ' Animer dessin
30999 ' -------------
31000 PUT (DESSIN.X%,  DESSIN.Y%), DESSIN.FOND%, PSET   ' Efface avant-dernier.
31010 GET (DESSIN.X1%, DESSIN.Y1%)-(DESSIN.X2%, DESSIN.Y2%), DESSIN.FOND%
31020 LET DESSIN.X%  = DESSIN.X1%
31030 LET DESSIN.Y%  = DESSIN.Y1%
31040 LET DESSIN.X1% = DESSIN.X1% + DESSIN.VX%  ' LET A=A+X mieux que A=A+X
31050 LET DESSIN.Y1% = DESSIN.Y1% + DESSIN.VY%
31060 PUT (DESSIN.X1%, DESSIN.Y1%), DESSIN.MASQUE%, AND ' Risque hors limite.
31070 PUT (DESSIN.X1%, DESSIN.Y1%), DESSIN.SPRITE%, OR
31080 LET DESSIN.X2% = DESSIN.X1% + DESSIN.LARGEUR% - 1
31090 LET DESSIN.Y2% = DESSIN.Y1% + DESSIN.HAUTEUR% - 1
31900 RETURN
49990 :
50000 ' Pas de REM (commentaires) dans les routines MAKE : pas de diagonales.
50997 ' ---------
50998 ' Make haut
50999 ' ---------
51000 REM DESSIN.VX% = 0
51010 DESSIN.VY% = -DESSIN.PAS.Y%
51090 RETURN
51197 ' -----------
51198 ' Make gauche
51199 ' -----------
51200 DESSIN.VX% = -DESSIN.PAS.X%
51210 REM DESSIN.VY% = 0
51290 RETURN
51397 ' -----------
51398 ' Make droite
51399 ' -----------
51400 DESSIN.VX% = DESSIN.PAS.X%
51410 REM DESSIN.VY% = 0
51490 RETURN
51597 ' --------
51598 ' Make bas
51599 ' --------
51600 REM DESSIN.VX% = 0
51610 DESSIN.VY% = DESSIN.PAS.Y%
51690 RETURN
51997 ' ----------
51998 ' Break haut
51999 ' ----------
52000 IF DESSIN.VY% < 0 THEN DESSIN.VY% = 0
52090 RETURN
52197 ' ------------
52198 ' Break gauche
52199 ' ------------
52200 IF DESSIN.VX% < 0 THEN DESSIN.VX% = 0
52290 RETURN
52397 ' ------------
52398 ' Break droite
52399 ' ------------
52400 IF DESSIN.VX% > 0 THEN DESSIN.VX% = 0
52490 RETURN
52597 ' ---------
52598 ' Break bas
52599 ' ---------
52600 IF DESSIN.VY% > 0 THEN DESSIN.VY% = 0
52690 RETURN
52997 ' --------------------------------
52998 ' Afficher soit dessin soit masque
52999 ' --------------------------------
53000 ' FLAG% = -1 (var. booléenne non nulle donc VRAIE) : masque sinon dessin.
53010 FOR J% = DESSIN.Y1% TO DESSIN.Y2%
53020   FOR I% = DESSIN.X1% TO DESSIN.X2%
53030     READ COULEUR%
53040     IF FLAG% THEN IF COULEUR% THEN COULEUR% = 0                                                               ELSE COULEUR% = 15
53050     PSET (I%, J%), COULEUR%
53060 NEXT I%, J%
53900 RETURN
60990 :
60999 ' Dessin 20 x 20 pixels pour palette 16 couleurs par défaut.
61000 DATA 00,00,00,00,00,00,00,00,00,02,02,00,00,00,00,00,00,00,00,00
61010 DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
61020 DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
61030 DATA 00,00,00,00,00,00,00,02,02,02,02,02,02,00,00,00,00,00,00,00
61040 DATA 00,00,00,00,00,00,00,02,02,02,02,02,02,00,00,00,00,00,00,00
61050 DATA 00,00,00,00,00,00,02,02,02,04,04,02,02,02,00,00,00,00,00,00
61060 DATA 00,00,00,00,00,00,02,02,04,10,10,04,02,02,00,00,00,00,00,00
61070 DATA 00,00,00,00,00,00,02,02,02,02,02,02,02,02,00,00,00,00,00,00
61080 DATA 00,00,00,00,00,00,00,02,02,06,06,02,02,00,00,00,00,00,00,00
61090 DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
61100 DATA 00,00,00,00,00,00,00,00,00,02,02,00,00,00,00,00,00,00,00,00
61110 DATA 00,00,00,00,00,00,00,00,05,05,05,05,00,00,00,00,00,00,00,00
61120 DATA 00,00,00,00,11,11,11,07,07,07,07,07,07,11,11,11,00,00,00,00
61130 DATA 00,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,00
61140 DATA 07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07
61150 DATA 08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08
61160 DATA 00,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,08,00
61170 DATA 00,00,00,00,08,08,08,08,08,08,08,08,08,08,08,08,00,00,00,00
61180 DATA 00,00,00,00,00,00,00,00,08,08,08,08,00,00,00,00,00,00,00,00
61190 DATA 00,00,00,00,00,00,00,00,00,08,08,00,00,00,00,00,00,00,00,00

Les procédures du programme ont été tapées en partie sous un éditeur de texte puis mis en forme sous GW-BASIC. On remarquera que les versions 3.xx permettent de traiter les erreurs sans arrêter les interceptions d'événements.
Il faut ajouter la ligne suivante pour la synchronisation verticale sous QuickBASIC 4.5 et sous IBM BASICA :
3130   WAIT &H3DA, 8            ' Synchro verticale après échange de pages.
A noter que le message de la ligne 1110 ne s'applique pas à la version 3.21 d'IBM qui est un GW/BASIC 2, et que le Compaq BASIC 3.20 considère LOCATE 25 comme une erreur, même après KEY OFF.

P.S. : la synchronisation verticale doit s'effectuer après l'échange d'écran et avant les différentes manipulations vidéo afin d'éviter que le dessin animé ne disparaisse à certaines hauteurs d'écran -- phénomène à prendre en compte pour les processeurs les moins rapides capables d'assurer une animation fluide.

Dernière modification par gm86 le 09 oct. 2012 21:12, modifié 91 fois.

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
Dr Frankenstein
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 10 avr. 2010 20:09
Membre d'honneur
Hors-ligne
 
Messages : 418
Inscription : 28 oct. 2004 01:31
 
gm86 : Merci pour l'article détaillé, très pertinant.

_________________

Introducing Windows 95.
It lets you use more than eight characters to name your files. Imagine that. ~Apple.


Haut
Profil Citer
gm86
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 10 avr. 2010 20:18
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 628
Inscription : 01 sept. 2008 19:07
 
S'agissant de la ligne 3130, j'ai testé le programme sous une version patchée de IBM BASICA. En effet, BASICA livré avec les anciens PC/DOS nécessite un PC ou XT ou AT d'IBM, ou encore un PS/2. Ce sont pratiquement les seuls à posséder un BASIC en ROM. Donc, je ne fais que supposer son fonctionnement et j'aurai besoin de l'avis d'une personne possédant un vrai IBM.

P.S. : merci pour le compliment. Je regrette seulement d'avoir joué la facilité : il aurait été plus judicieux de travailler directement avec les tableaux en mémoire, ce qui évite l'usage de deux pages d'écran. C'est justement la raison de déclarer des tableaux d'entiers.

Dernière modification par gm86 le 10 juil. 2010 12:36, modifié 5 fois.

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
joeydu79100
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 20 avr. 2010 20:08
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 135
Inscription : 24 janv. 2010 17:34
 
Ouah 6120 lignes j'aurai pas fait :lol:

Sinon en QBasic j'ai fait (enfin commencé) une sorte de test sur les fonctions de MS-DOS, pour voir si on le connait bien (je sais ça sert pas vraiment à grand chose :lol:)
Et on pourrait faire chacun sa partie du test, par exemple moi la partie 1 que j'ai commencé (nommée "Une seule commande", et ça consiste à... bah à utiliser une seule commande à chaque fois).
Par contre il est là haut dans ma chambre, sur mon 3.1. Je l'apporterais plus tard.

_________________

[ img ]


Haut
Profil Citer
0597534
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 20 avr. 2010 23:40
 
 
@gm86 vu que j'ai un IBM ps/2 avec basic en rom je le testerai et je t'en redirai des nouvelles, si ca fonctionne ou pas


Haut
Citer
gm86
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 22 avr. 2010 10:10
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 628
Inscription : 01 sept. 2008 19:07
 
Pour copier le code inscrit dans mon message dans un fichier ASCII, il faut procéder ainsi :
- sélectionner le code et faire « copier » ;
- ouvrir Wordpad, créer un nouveau fichier texte ;
- faire « coller » ;
- s'assurer que la dernière ligne soit suivie d'un retour à la ligne afin qu'elle soit prise en compte lorsque le programme est lancée par l'interprète depuis la ligne de commande ;
- enregistrer sous le format de fichier texte MS-DOS (ASCII) si possible ;
- remplacer l'extension .TXT par .BAS .
A présent, il doit tourner sous GW-BASIC ou IBM BASICA. Reste à voir son fonctionnement sous ce dernier avec ou sans la ligne 3130. Pour note, la version 3.20 ou supérieure de BASICA.COM est livrée avec PC-DOS de la version 3.20 à la version 5.

P.S. :
0597534 a écrit :
Aussi, j'ai discuté avec mon oncle qui est technicien d'informatique et il me disait que le problème de rafraichissement (clignotement de l'écran) pourrait se régler en ajoutant comme deux écrans et interchanger entre ceux-ci.
Finalement, j'ai utilisé la technique proposée par votre oncle puisque le BASIC préconise cette méthode.
0597534 a écrit :
vu que j'ai un IBM ps/2 avec basic en rom je le testerai
S'il s'agit d'un modèle 25 ou 30, il comporte un circuit MCGA et non VGA qui peut être incompatible avec le mode EGA. De toute façon, mieux vaut essayer avec un modèle supérieur car les animations en BASIC interprété, sans le secours de routines en code machine, sont très lentes.


----
Publié : mardi 6 juillet 2010 19:52

Veuillez excuser mon double-post mais je crains d'encombrer le précédent.

Il est inutile de scruter les codes BREAK et MAKE des touches suivantes pour savoir si elles sont enfoncées : Alt, Ctrl, Maj, Inser, Verr Maj, Arrêt défil et Sys Req. En effet, le BIOS note leur état dans deux octets (voir détail ci-dessous). Remarquez comment j'ai fait dans mon programme précédent pour désactiver les verrouillages numérique, majuscule et défilement.
Octet 0040:0017

76543210  bit
x.......  Etat Inser : 1|0
.x......  Etat Verr maj : 1, actif ; 0, inactif
..x.....  Etat Verr num : 1, actif ; 0, inactif
...x....  Etat Arrêt défil : 1, actif ; 0, inactif
....x...  1 : Alt enfoncée
.....x..  1 : Ctrl enfoncée
......x.  1 : Maj gauche enfoncée
.......x  1 : Maj droite enfoncée


Octet 0040:0018

76543210  bit
x.......  1 : Ins enfoncée
.x......  1 : Verr maj enfoncée
..x.....  1 : Verr num enfoncée
...x....  1 : Arrêt défil enfoncée
....x...  1 : Etat Pause actif (Ctrl-Verr num ou Pause)
.....x..  1 : Sys Req enfoncée
......x.  1 : Alt gauche enfoncée
.......x  1 : Ctrl gauche enfoncée
Tous les PC ont ces deux octets mais touts les bits ne sont pas mis à jour suivant le type de clavier employé. Seul le clavier étendu 101/102 touches des AT et PS/2 discrimine les touches Alt gauche et Ctrl gauche. Sys Req est apparue sur le clavier 84 touches du AT et correspond à la combinaison Alt-Sys Req sur le clavier étendu. A noter que la touche Pause n'existe ni sur le clavier 83 touches des PC et XT ni sur le clavier 84 touches du AT, elle est remplacée par la combinaison Ctrl-Verr num.
Le jeu « Night Mission Pinball » de Bruce Artwick utilise l'octet 0040:0017 (adresse 20 bits segment:offset en hexadécimal) pour contrôler les touches Maj gauche et droite. J'ai trouvé sur Internet une version de Space Invaders en QuickBASIC datant de décembre 2000 et écrite par James Eibisch qui lit aussi cet octet :
http://www.calhoun.edu/WD/GamesPage/Spa ... v78-02.bas
http://www.rakelly.com/space_invaders/d ... v78-02.bas
(remplacer l'extension .bas de l'adresse par .txt pour lire le fichier d'accompagnement et par .exe pour obtenir la version compilée)
De plus, ce jeu joue sa célèbre musique avec le synthétiseur FM des cartes Adlib et Sound Blaster. A essayer.

Revenant à mon exemple de programmation en GW-BASIC, il se peut qu'il n'y ait pas besoin d'ajouter la ligne 3130 pour la synchronisation verticale sous IBM BASICA et QuickBASIC. Je m'explique.
Un problème de GW-BASIC est que la palette est réinitialisée à chaque emploi de SCREEN ou de PCOPY. Une solution est de la redéfinir à chaque fois. Le plus pratique est d'employer PALETTE USING tableau(début) qui peut s'avérer être, hélas, trop lente sur une machine antérieure au Pentium. Dans mon programme, le problème est de maintenir le fond bleu. Je l'ai rempli de pixels bleus mais l'idéal reste de définir l'attribut 0 avec la couleur 1 tout en sachant que COLOR , fond% est aussi une commande de palette : PALETTE 0, 1 ou COLOR , 1. Or, j'ai l'impression que ces deux instructions résolvent aussi le problème de synchronisation verticale sous IBM BASICA et QuickBASIC tant que le matériel n'est pas des plus récents. Entrez les lignes suivantes dans mon programme afin d'implanter la couleur de fond tout en supprimant l'instruction de remplissage PAINT :
3040   COLOR , 1                ' Fond bleu après chaque échange sous GW-BASIC.
23010 CLS
23020 KEY OFF
Avec un peu de chance, avec du matériel ni trop lent ni trop rapide, le programme devrait à présent tourner sans modification sous les versions 3.2x de GW-BASIC qui gèrent les codes BREAK du clavier, IBM BASICA 3.20 et supérieur, QuickBASIC 2.0 et supérieur, et enfin QBASIC.

NOTA : sous QuickBASIC 4.5, les trois instructions graphiques COLOR, PALETTE et SCREEN se comportent comme sous le BASICA d'IBM et non comme sous GW-BASIC ou les versions précédentes de QuickBASIC.
Le fichier exécutable produit par QuickBASIC 4.5 est fluide et son instruction SCREEN n'attend pas le retour du balayage d'écran ; l'instruction PALETTE ou COLOR qui suit permet donc cette synchronisation. Au contraire, l'exécutable produit par une version antérieure de QuickBASIC est lente et son instruction SCREEN attend le retour du balayage mais réinitialise la palette ; l'instruction PALETTE ou COLOR sert alors à réactiver la palette ce qui peut faire clignoter l'écran. Paradoxalement, ce phénomène est plus visible sous QuickBASIC 3.x et surtout 2.x que sous GW-BASIC, sans parler de l'interception manquée de la plupart des codes clavier. En fait, l'instruction SCREEN perd du temps durant l'échange des deux pages d'affichage. En acceptant le risque de perdre en qualité d'animation, on peut remplacer l'échange de pages d'écran par une copie grâce à l'instruction PCOPY et ainsi préserver la palette sous GW-BASIC et QuickBASIC 2.x, 3.x et 4.0. Voici les changements à effectuer :
3 ' deux pages : une à l'écran copiant celle de sortie.

1000 IF ERR = 5 AND ERL = 31120 THEN 10000              ' Dessin hors limites

3110   PCOPY 0, 1
3120
3130

10020 RESUME 31100

21080 DESSIN.PAS.X% = 1
21090 DESSIN.PAS.Y% = 1

23010 CLS
23020 KEY OFF

DELETE 31030-31090
31010 LET DESSIN.X1% = DESSIN.X1% + DESSIN.VX%  ' LET A=A+X mieux que A=A+X
31020 LET DESSIN.Y1% = DESSIN.Y1% + DESSIN.VY%
31100 LET DESSIN.X2% = DESSIN.X1% + DESSIN.LARGEUR% - 1 ' Ligne de retour après
31110 LET DESSIN.Y2% = DESSIN.Y1% + DESSIN.HAUTEUR% - 1 ' traitement d'erreur.
31120 GET (DESSIN.X1%, DESSIN.Y1%)-(DESSIN.X2%, DESSIN.Y2%), DESSIN.FOND%:            PUT (DESSIN.X1%, DESSIN.Y1%), DESSIN.MASQUE%, AND
31130 PUT (DESSIN.X1%, DESSIN.Y1%), DESSIN.SPRITE%, OR
31140 LET DESSIN.X%  = DESSIN.X1%
31150 LET DESSIN.Y%  = DESSIN.Y1%
A la ligne 31120, ont été rassemblées les deux instructions risquant de provoquer une erreur 5 suivant la version de BASIC utilisée. Seuls les sous-programmes Initialisation valeurs, Initialisation écran et hasard & Animer dessin ont été modifiés ainsi que le Traitement d'erreur et la Boucle.

Je rappelle que sous QuickBASIC 4.5 et IBM BASICA cette copie est inutile et ne fait que baisser les performances.
En conclusion, mieux vaut utiliser l'échange de pages avec le BASICA d'IBM comme interpréteur sur un micro IBM avec BASIC de ROM — sur un compatible, cf. viewtopic.php?f=2&t=6199. En effet, l'instruction SCREEN du GW-BASIC correspond à celle du BASICA suivie de l'instruction PALETTE sans paramètre. Or, cette dernière réinitialise la palette de couleurs et, à l'instar de PALETTE USING qui modifie toute la palette, est plus lente que si elle possédait des paramètres dans le but de modifier un seul attribut de couleur. Il est désolant de constater que l'instruction SCREEN du GW-BASIC avec ces deux défauts peut empêcher une animation de profiter d'un échange fluide des pages d'écran. Néanmoins, si l'animation est lisse et avec un grain fin, il devient possible d'augmenter le pas, en pixels, à la ligne 21080.


----
Publié: lundi 11 octobre 2010 17:46
Le 18 Juin 09, MisterWario a écrit :
J'avais une petite question :
Je sais qu'il est possible d'une façon ou d'une autre de récupérer le chemin d'accès de l'application QBASIC depuis une interruptions ou un autre truc.
Mais comment ont fait ? (curdir$ ne donne que le répertoire actif et non pas celle de l'executable)
Je comprends enfin qu'il s'agit d'une application faite par QuickBASIC PDS.
Depuis DOS 3, un compteur 16 bits et la spécification complète du fichier exécutée suivent le mot nul signalant la fin de l'environnement du programme. Sous QuickBASIC, on peut compiler le programme d'exemple suivant avec le fichier à inclure QBX.BI (ou QB.BI) et grâce à la bibliothèque QBX.QLB (ou QB.QLB) :
REM $INCLUDE: 'QBX.BI'                          ' QB.BI pour QuickBASIC 4.x
DIM ENTREE AS RegType
DIM SORTIE AS RegType


' Obtenir le segment du PSP du programme en cours
ENTREE.AX = &H6200                              ' Fonction 62h
CALL INTERRUPT(&H21, ENTREE, SORTIE)            ' Interruption 21h (DOS)
PSP = SORTIE.BX                                 ' BX donne le segment du PSP

' Obtenir le segment de l'environnement du programme
DEF SEG = PSP
ENVIRONNEMENT = PEEK(&H2D) * 256 + PEEK(&H2C)   ' Lire le mot à l'offset 2Ch

' Faire pointer l'offset sur le mot nul
DEF SEG = ENVIRONNEMENT
OFFSET = 0
WHILE PEEK(OFFSET + 1) OR PEEK(OFFSET)          ' Tant que mot non nul,
  OFFSET = OFFSET + 1                           ' incrémente par octet.
WEND

' Faire pointer l'offset après le mot nul et le compteur
OFFSET = OFFSET + 4                             ' Pointe la spécification

' Lire la spécification complète du fichier exécuté
SPECIFICATION$ = ""
CARACTERE = PEEK(OFFSET)
WHILE CARACTERE
  SPECIFICATION$ = SPECIFICATION$ + CHR$(CARACTERE)
  OFFSET = OFFSET + 1
  CARACTERE = PEEK(OFFSET)
WEND

DEF SEG


PRINT "La chaîne qui contient la spécification complète du programme exécuté"
PRINT "est longue de"; LEN(SPECIFICATION$); "caractères :"
PRINT SPECIFICATION$
Si le fichier source est lancé par QuickBASIC (avec l'option /L), ce sera la spécification de ce dernier qui sera donnée.


----
Publié: mercredi 13 mars 2013 23:49

Je vais présenter une technique intéressante pour traiter les différents éléments d'une chaîne de caractères.
J'ai pris l'exemple du numéro de sécurité sociale car la décomposition des nombres le constituant n'est pas fixe. Les extraire est facile avec l'instruction FIELD# décrivant les champs d'accès direct à un fichier. Comme on ne veut pas créer un fichier physique, on va utiliser un périphérique qui ne fait rien sous DOS, et c'est là son rôle, le fichier NUL :
OPEN"R",1,"NUL"
L'intérêt de FIELD# est de s'en servir autant de fois qu'on a besoin de représentations du numéro de sécu. La première représentation sera le numéro entier lui-même. Deux autres seront suffisantes pour les trois différentes interprétations de ce numéro.

Le numéro de sécu comporte 13 chiffres pour faire simple. Il peut donc être stocké dans une variable double précision (14 chiffres).
Chiffre     Signification
1           sexe
2,3         année de naissance
4,5         mois de naissance

Si 6&7 valent 97 ou 98 (cas B)
6-8         DOM de naissance
9,10        commune de naissance
Si 6&7 valent 99 alors naissance à l'étranger (cas C)
8-10        pays de naissance
Sinon (cas A)
6,7         département métropolitain de naissance
8-10        commune de naissance

11-13       numéro d'ordre de l'acte de naissance
Le département métropolitain n'est pas forcément un simple nombre : 2A pour la Corse-du-Sud et 2B pour la Haute-Corse.
La clef du numéro de sécu, pratique pour éviter les erreurs de saisie, est la différence entre 97 et le reste de la division euclidienne du numéro de sécu par 97 (plus grand nombre premier inférieur à 100) :
CLEF% = 97-(S.NOSS#-INT(S.NOSS#/97)*97)
Pour ce calcul, les départements 2A et 2B sont remplacés respectivement par 19 et 18.
Cf. http://therese.eveilleau.pagesperso-ora ... s/cles.htm

En prenant les symboles suivants pour les valeurs à obtenir,
S : SEXE%
A : ANNEE%
M : MOIS%
D : DEPARTEMENT$
C : COMMUNE%
O : ORDRE%
P : PAYS%

on représente ainsi les trois cas (métropole, DOM, étranger),
Cas A : SAAMMDDCCCOOO
Cas B : SAAMMDDDCCOOO
Cas C : SAAMM99PPPOOO
On peut simplifier en deux cas :
SAAMMDDLLLOOO pour les cas A & C
SAAMMdddVVOOO pour le cas B
avec
L : lieu
d : DOM
V : ville

En utilisant la variable bidon D$, on obtient les champs suivants depuis le même objet :
FIELD#1,13 AS NOSS$
FIELD#1,5 AS D$,2 AS DEP$,3 AS LIEU$,3 AS ORDRE$
FIELD#1,1 AS SEXE$,2 AS ANNEE$,2 AS MOIS$,3 AS DOM$,2 AS VILLE$

Le premier champ est le numéro entier de sécu.
Le deuxième champ décrit les chiffres 6-10 pour les cas A & C et les derniers chiffres.
Le troisième champ décrit les chiffres 1-5 ainsi que les chiffres 6-10 pour le cas B.

Le programme suivant en BASIC Microsoft effectue quelques vérifications sur la chaîne obtenue S.NOSS$ avant de continuer le traitement :
- treize caractères forment le numéro ;
- le chiffre du sexe correspond à 1 ou 2 ;
- les caractères sont tous des chiffres à l'exception des départements la Corse ;
- demande si la clef obtenue est bonne (le modulo 97 évite pratiquement toute erreur) ;
- le mois est valide.
5 DEFINT A-Z
10 OPEN"R",1,"NUL"
20 FIELD#1,13 AS NOSS$
30 FIELD#1,5 AS D$,2 AS DEP$,3 AS LIEU$,3 AS ORDRE$			'Cas A&C
40 FIELD#1,1 AS SEXE$,2 AS ANNEE$,2 AS MOIS$,3 AS DOM$,2 AS VILLE$	'Cas B
50 GOSUB 100	'* Entrée *
60 IF ERREUR THEN ERREUR=0: INPUT "Continuer et recommencer (O/N)";REPONSE$:
	IF REPONSE$="o" OR REPONSE$="O" THEN 50 ELSE END
70 GOSUB 1000   '* Traitement *
80 GOSUB 10000	'* Sortie *
90 END
97 '
98 '	*** Entrée ***
99 '
100 INPUT "Les treize caractères du numéro de sécurité sociale : ",S.NOSS$
110 IF LEN(S.NOSS$)<>13
	THEN PRINT "Mauvais nombre de caractères":GOTO 900
	ELSE IF INSTR("12",LEFT$(S.NOSS$,1))=0
	THEN PRINT "Le 1er chiffre doit être 1 ou 2":GOTO 900	'Va à Erreur
120 TMP$=S.NOSS$		'Chaîne intermédiaire
130 CORSE$=MID$(TMP$,6,2)	'Prend en compte les départ. 2A & 2B en Corse
140 IF CORSE$="2a" OR CORSE$="2A" THEN CORSE$="19"
	ELSE IF CORSE$="2b" OR CORSE$="2B" THEN CORSE$="18"
150 MID$(TMP$,6,2)=CORSE$
160 ' Recherche le premier caractère invalide
170 S.NOSS#=VAL(TMP$)		'Nombre utilisé pour le calcul de la clef
180 TMP%=LEN(STR$(INT(S.NOSS#)))
190 IF TMP%<14 THEN PRINT "Le";STR$(TMP%)+"ème caractère est invalide":
	GOTO 900		'Va à Erreur
200 '
210 ' Vérifie la clef auprès de l'utilisateur et contrôle le mois
220 CLEF=97-(S.NOSS#-INT(S.NOSS#/97)*97)
230 PRINT "La clef de votre numéro vaut-elle";CLEF;:INPUT "(O/N)";REPONSE$
240 IF REPONSE$<>"o" AND REPONSE$<>"O" THEN PRINT "Numéro erroné":
	GOTO 900		'Va à Erreur
250 LSET NOSS$=S.NOSS$		'Enregistre la chaîne dans le tampon #1
260 ANNEE=VAL(ANNEE$): MOIS=VAL(MOIS$)
270 IF MOIS=0 OR MOIS>12
	THEN PRINT "Les quatrième et cinquième chiffres sont faux (mois)":
	GOTO 900		'Va à Erreur
280 ' Autres tests possibles : département, commune et ordre non nuls.
290 ' ...
300 RETURN
900 ERREUR=-1			'Erreur
910 RETURN
997 '
998 ' *** Traitement ***
999 '
1000 IF DEP$="99" THEN PAYS=VAL(LIEU$): CAS$="C"
	ELSE IF DEP$>"96" THEN DEPARTEMENT$=DOM$: COMMUNE=VAL(VILLE$): CAS$="B"
	ELSE DEPARTEMENT$=DEP$: COMMUNE=VAL(LIEU$): CAS$="A"
1010 SEXE=VAL(SEXE$): ORDRE=VAL(ORDRE$)
1020 RETURN
9997 '
9998 '	*** Sortie ***
9999 '
10000 IF SEXE=1 THEN PRINT "Homme" ELSE PRINT "Femme"
10010 PRINT "Année :";ANNEE
10020 PRINT "Mois :";MOIS
10030 IF CAS$="C" THEN PRINT "Pays :";PAYS
	ELSE PRINT "Département : ";DEPARTEMENT$: PRINT "Commune :";COMMUNE
10040 PRINT "Ordre :";ORDRE
10050 RETURN
Si vous désirez copier ce programme, veillez à la continuité des lignes BASIC. Il est constitué de trois sous-programmes :
- Entrée : saisie du numéro de sécu et vérification ;
- Traitement : interprète les valeurs ;
- Sortie : affiche les valeurs concernées par le cas (A, B ou C).


----
Publié: mercredi 3 juin 2015 18:44

Aujourd'hui, je poste rapidement un petit programme linéaire qui calcule pi en double précision. J'avais écrit l'original pour une calculatrice TI-82. La fonction récursive utilisée n'est pas rapidement convergente. Elle équivaut au quadruple de l'arc-tangente de 1 radian. C'est la formule Gregory : Pi/4=1-1/3+1/5...
J'avais remarqué que la moyenne de l'avant-dernier résultat et de la moyenne elle-même de l'antépénultième résultat et du dernier résultat donnait une bien meilleure approximation du quart de pi.
Ce programme démontre cette convergence progressive vers le nombre pi.
100 DEFDBL A-Z
110 D=1
120 S=0
130 P1=0
140 P2=0
150 PI=0
160 WHILE P1>P2 IMP PI-P1<.0000000000000013#
170 P=S
180 P1=P2
190 R=P+4/D
200 S=R-4/(D+2)
210 P2=((S+P)/2+R)/2
220 IF P2>PI THEN PI=P2
230 PRINT P2-3
240 LET D=D+4
250 WEND
260 PI=P1
270 PRINT "Antépénultième approximation :"; P
280 PRINT "Avant-dernière" SPC(7) CHR$(34) SPC(7) ":";R
290 PRINT "Dernière" SPC(13) CHR$(34) SPC(7) ":"; S
300 PRINT "Les décimales de pi obtenues : "; PI-3
On obtient la même valeur de pi avec un interprète Microsoft pour DOS 2 et plus :
C>gwbasic /d
print 4*atn(1#)
P.S. : ci-dessous, le résultat du programme.
Antépénultième approximation : 3.141576638728005
Avant-dernière       "       : 3.141608668195114
Dernière             "       : 3.14157663924094
Les décimales de pi obtenues :  .1415926535897932
Pi ≃ ((3.141576638728005 + 3.14157663924094) / 2 + 3.141608668195114) / 2

Dernière modification par gm86 le 18 sept. 2011 18:38, modifié 6 fois.

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
INDEPTEKNO
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 03 juin 2015 19:15
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 809
Inscription : 04 déc. 2007 16:51
PC Rétro : COMPAQ PRESARIO 486SX25
 
On va essayer de faire un démarrage de windows
SCREEN 0
CLS
LOCATE 1,1
PRINT "Démarrage de Ms Winbug 10"
LOCATE 2,1
PRINT "Fatal Error at Hex 05/FE/0A/65"
LOCATE 3,1
PRINT "Veuillez Formater votre disque dur et reinstallez Winbug 10"
LOCATE 4,1
PRINT "System Halted..."

_________________

Fan des Vieux PC et Vieux Système d'exploitation et Vieux logiciel.

« Là où règne le désespoir, j’apporte l’espoir. Là où règne la tristesse, j’apporte la joie. Permet-moi de consoler plutôt que d’être consolée, de comprendre plutôt que d’être comprise, d’aimer, plutôt que d’être aimée. Car, donner c’est recevoir, c’est en pardonnant que nous sommes pardonnés, c’est en mourant que nous naissons à la vie éternelle. »


Haut
Profil Citer
gm86
Sujet du message : Re: Postez vos petits programmes pour DOS en QBasic
Publié : 04 juin 2015 17:40
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 628
Inscription : 01 sept. 2008 19:07
 
En parlant de bug, mon programme ne fonctionne pas de manière souhaitée sous QBasic. Je l'ai conçu dans un interprète BASIC Microsoft, les nombres sont donc sous la forme propriétaire de Microsoft. Sous QBasic, la formule ne permet pas de converger ainsi vers Pi ! J'ai donc ajouté les valeurs à obtenir dans un post-scriptum.

Je tiens à expliquer deux lignes :
160 WHILE P1>P2 IMP PI-P1<.0000000000000013#
220 IF P2>PI THEN PI=P2
À la base, les modifications suivantes suffiraient :
160 WHILE P1<=P2
220
Mais c'est sans compter l'imprécision des arrondis. On risque d'arrêter la boucle trop tôt.
L'actuelle ligne 160 comporte donc une valeur empirique pour arrêter la programme lorsqu'il dépasse par erreur le nombre pi et s'en rapproche à nouveau. On a donc affaire à un faux programme de calcul ! Quant à la ligne 220, elle évite au programme d'utiliser une valeur de comparaison inférieure à la précédente, et donc de boucler trop longtemps.

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
gm86
Sujet du message : Re: Postez vos petits programmes en QBasic
Publié : 23 mai 2017 19:42
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 628
Inscription : 01 sept. 2008 19:07
 
J'avais mis auparavant un programme de calcul d'oculaires pour télescope.
Soyez indulgent !
Le grossissement se mesure par le rapport entre le champ apparent de l'oculaire et le champ réel observé. Le rapport entre la focale du télescope et celle de l'oculaire n'est qu'une grossière approximation. Il nous faut connaître le diaphragme de l'oculaire (field stop).
                diaphragme
champ = 2 arctg ——————————
                 2 focale
Pour le télescope qui a un angle faible, nous pouvons simplifier la formule. Ce qui donne en BASIC pour les deux champs, en degrés et non radians :
CHAMP.REEL=57.3*DIAPH/FOC.TEL
CHAMP.APPARENT=90*atn(DIAPH/(2*FOC.OCUL))/atn(1)

Sans transition, un petit programme.
Allez, hop ! Un menu pour la route :
10 PRINT"Entrer chiffre ou initiale :":PRINT
20 PRINT"	1. Tri
30 PRINT"	2. Liste
40 PRINT"	3. Fin

50 C$=""			' C H O I X
60 WHILE C$=""
70	C$=INKEY$
80 WEND
90 C%=VAL(C$)

100 ON C% GOSUB 1000,2000,3000
110 ON INSTR("TLF",C$) GOSUB 1000,2000,3000
120 ON INSTR("tlf",C$) GOSUB 1000,2000,3000
130 GOTO 50			'Va à CHOIX

1000 PRINT"Tri...
1010 RETURN
2000 PRINT"Liste...
2010 RETURN
3000 PRINT"Fin.
3010 END

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
Afficher : Trier par : Ordre :
Répondre   Page 4 sur 5  [ 44 messages ]
Revenir à « Informatique des vieux systèmes » | Aller sur la page « 1 2 3 4 5 »
Aller :