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 3 sur 3  [ 40 messages ]
Aller sur la page « 1 2 3
Auteur Message
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 : 440
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 : 502
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 : 142
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 : 502
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 : 759
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 : 502
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 : 502
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
Afficher : Trier par : Ordre :
Répondre   Page 3 sur 3  [ 40 messages ]
Revenir à « Informatique des vieux systèmes » | Aller sur la page « 1 2 3
Aller :