QBasic 1.1
Résolu/Fermé
tonyhawk
Messages postés
22
Date d'inscription
jeudi 14 février 2008
Statut
Membre
Dernière intervention
21 février 2008
-
14 févr. 2008 à 15:14
tonyhawk Messages postés 22 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 21 février 2008 - 15 févr. 2008 à 16:28
tonyhawk Messages postés 22 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 21 février 2008 - 15 févr. 2008 à 16:28
A voir également:
- QBasic 1.1
- Qbasic - Télécharger - Édition & Programmation
- 192.168.l.1.1 - Guide
- Vitesse processeur 1.1 ghz - Guide
- Ms 7613 ver 1.1 - Forum Carte-mère/mémoire
- 192.168.o.1.1 jazztel - Forum WiFi
2 réponses
Bonjour,
Je te propose cette solution:
Pour lire ce genre de fichier séquentiel, il faut en connaitre sa structure.
C'est surtout vrai pour la première ligne si les données quelle contient ont une importance.
En supposant que seules les lignes suivantes nous intéressent, et sachant que chaque ligne a 6 valeurs, voici le code:
REM Dimensionner 2 tables de 6 elements
Dim TAB1#(6), TAB2#(6)
Open "MonFichier" for input as #1
REM On lit la première ligne, mais on ne la traite pas
Line input #1, texte$
While not eof(1)
REM On lit les lignes suivantes 2 par 2 et on stocke les valeurs dans TAB1 et TAB2
For i%=1 to 6
On Error Goto FIN
Input #1, TAB1(i%)
Next i%
For i%=1 to 6
Input #1, TAB2(i%)
Next i%
On Error Goto 0
REM On dispose des valeurs de 2 lignes qu'on peut exploiter par leurs indices
REM
REM Appel du sous-programme de traitement
Gosub MaSubroutine
REM
REM On boucle jusqu'a la fin du fichier
Wend
REM
:FIN
REM On ferme le fichier
Close #1
END
:MaSubroutine
.
.
Return
La gestion des erreurs avec ON ERROR GOTO permet d'eviter l'arret du programme pour "Input past end".
Je ne suis pas très sur de la syntaxe, il y a longtemps que je n'utilise plus QBAsic, mais la logique est bonne.
Salut.
Je te propose cette solution:
Pour lire ce genre de fichier séquentiel, il faut en connaitre sa structure.
C'est surtout vrai pour la première ligne si les données quelle contient ont une importance.
En supposant que seules les lignes suivantes nous intéressent, et sachant que chaque ligne a 6 valeurs, voici le code:
REM Dimensionner 2 tables de 6 elements
Dim TAB1#(6), TAB2#(6)
Open "MonFichier" for input as #1
REM On lit la première ligne, mais on ne la traite pas
Line input #1, texte$
While not eof(1)
REM On lit les lignes suivantes 2 par 2 et on stocke les valeurs dans TAB1 et TAB2
For i%=1 to 6
On Error Goto FIN
Input #1, TAB1(i%)
Next i%
For i%=1 to 6
Input #1, TAB2(i%)
Next i%
On Error Goto 0
REM On dispose des valeurs de 2 lignes qu'on peut exploiter par leurs indices
REM
REM Appel du sous-programme de traitement
Gosub MaSubroutine
REM
REM On boucle jusqu'a la fin du fichier
Wend
REM
:FIN
REM On ferme le fichier
Close #1
END
:MaSubroutine
.
.
Return
La gestion des erreurs avec ON ERROR GOTO permet d'eviter l'arret du programme pour "Input past end".
Je ne suis pas très sur de la syntaxe, il y a longtemps que je n'utilise plus QBAsic, mais la logique est bonne.
Salut.
tonyhawk
Messages postés
22
Date d'inscription
jeudi 14 février 2008
Statut
Membre
Dernière intervention
21 février 2008
15 févr. 2008 à 16:28
15 févr. 2008 à 16:28
La première ligne contient effectivement des données importantes sur la première ligne : un des chiffres me donne le nombre de lignes qui suivent
Mais merci qand même ça va m'aider pour des applications ultérieurs
CLS 0
DIM SHARED nom AS STRING
DIM SHARED vol AS STRING
DIM SHARED a AS STRING
DIM SHARED nb AS INTEGER
DIM SHARED i AS INTEGER
DIM SHARED arbre AS STRING
INPUT "fichier a cuber: "; nom
INPUT "fichier de volume: "; vol
OPEN nom FOR INPUT AS #1
OPEN vol FOR OUTPUT AS #2
PRINT #2, "**arbre**";
PRINT #2, "**nb sec";
PRINT #2, "***dhs**";
PRINT #2, "**dm3***"
DO WHILE NOT EOF(1)
LINE INPUT #1, a
IF ASC(LTRIM$(a)) > 64 THEN
nb = VAL(MID$(LTRIM$(a), 17, 8))
arbre = MID$(LTRIM$(a), 1, 8)
END IF
REDIM mes(nb - 1, 2) AS SINGLE
REDIM mesure(0) AS SINGLE
FOR i = 0 TO (nb - 1)
LINE INPUT #1, b$
mes(i, 1) = VAL(MID$(b$, 4, 4))
mes(i, 2) = VAL(MID$(b$, 25, 8))
NEXT i
volume# = 0
FOR i = 0 TO (nb - 2)
volume(0) = volume(0) + ((3.141592654# / 3000) * ((mes(i, 2) * 2.54 / 2) ^ 2) * ((mes(i + 1, 1) - mes(i, 1)) * 30.48) * (1 + (mes(i + 1, 2) / mes(i, 2)) + ((mes(i + 1, 2)) ^ 2 / (mes(i, 2) ^ 2))))
NEXT i
diam = 2.54 * mes(0, 2)
PRINT #2, arbre;
PRINT #2, USING "########"; nb;
PRINT #2, USING "#####.##"; diam;
PRINT #2, USING "####.###"; volume(0)
ERASE mes
ERASE volume
LOOP
CLOSE #1
CLOSE #2
END
Mais merci qand même ça va m'aider pour des applications ultérieurs
CLS 0
DIM SHARED nom AS STRING
DIM SHARED vol AS STRING
DIM SHARED a AS STRING
DIM SHARED nb AS INTEGER
DIM SHARED i AS INTEGER
DIM SHARED arbre AS STRING
INPUT "fichier a cuber: "; nom
INPUT "fichier de volume: "; vol
OPEN nom FOR INPUT AS #1
OPEN vol FOR OUTPUT AS #2
PRINT #2, "**arbre**";
PRINT #2, "**nb sec";
PRINT #2, "***dhs**";
PRINT #2, "**dm3***"
DO WHILE NOT EOF(1)
LINE INPUT #1, a
IF ASC(LTRIM$(a)) > 64 THEN
nb = VAL(MID$(LTRIM$(a), 17, 8))
arbre = MID$(LTRIM$(a), 1, 8)
END IF
REDIM mes(nb - 1, 2) AS SINGLE
REDIM mesure(0) AS SINGLE
FOR i = 0 TO (nb - 1)
LINE INPUT #1, b$
mes(i, 1) = VAL(MID$(b$, 4, 4))
mes(i, 2) = VAL(MID$(b$, 25, 8))
NEXT i
volume# = 0
FOR i = 0 TO (nb - 2)
volume(0) = volume(0) + ((3.141592654# / 3000) * ((mes(i, 2) * 2.54 / 2) ^ 2) * ((mes(i + 1, 1) - mes(i, 1)) * 30.48) * (1 + (mes(i + 1, 2) / mes(i, 2)) + ((mes(i + 1, 2)) ^ 2 / (mes(i, 2) ^ 2))))
NEXT i
diam = 2.54 * mes(0, 2)
PRINT #2, arbre;
PRINT #2, USING "########"; nb;
PRINT #2, USING "#####.##"; diam;
PRINT #2, USING "####.###"; volume(0)
ERASE mes
ERASE volume
LOOP
CLOSE #1
CLOSE #2
END