Informations sur: TRI!F!R.BAS

Publié par SFLPMEA le 23/10/2006

Description

Source QBASIC TRI!F!R.BAS (Version 4.5 ou 1.1). Création d'un fichier RANDON à accès direct avec tri permanent après l'ajout de chaque enregistrement. Par SFLPMEA.

Code source (langage qbasic)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
' ******************************************
' * TRI d'un FICHIER RANDOM (ACCES DIRECT) *
' ******************************************
' - - ->  C:\\CLAUDIE\\TRIFICH\\TRI!F!R.BAS
' Ecrit par SFLPMEA le 10/09/2006
    OPTION BASE 1: DEFSTR A-Z: CLOSE
    SCREEN 12: WINDOW SCREEN (1, 1)-(640, 480): CLS
    DIM N.Alpha AS STRING * 12
    ON ERROR GOTO XXX.ERREUR
    Etape% = 1: MKDIR "C:\\ACLAUDIE": MKDIR "C:\\ACLAUDIE\\TRIFICH"
    Etape% = 2: KILL "C:\\ACLAUDIE\\TRIFICH\\FICHIER.RND"
    Etape% = 0
    Maxi& = 2147483647: Enr = "º>" + SPACE$(12) + "<º"
    GOSUB GS01.OPEN
    RANDOMIZE TIMER * 100
' *** Cr‚ation d'un Fichier de base
    LOCATE 2, 2: COLOR 11
    PRINT "Cr‚ation de 2.000 Enregistrements al‚atoires en :";
    Debut! = TIMER
    FOR N1& = 1 TO 1999
        Nombre& = RND * Maxi&: GOSUB GS01.ECRITURE
    NEXT N1&
    Nombre& = Maxi&: N1& = 2000
    GOSUB GS01.ECRITURE
    LOCATE 2, 53: PRINT USING "####.### secondes"; TIMER - Debut!
    LOCATE 3, 10: COLOR 14: PRINT "(Fichier de 16 x 2000 = 32.000 octets)";
    Debut! = TIMER
    LOCATE 5, 2: COLOR 11: PRINT "TRI du Fichier en : ";
    GOSUB GS25.TRI
    LOCATE 5, 23: PRINT USING "#####.### secondes"; TIMER - Debut!
    LOCATE 6, 10: COLOR 15: PRINT USING "(######### Echanges)"; Echange&
' ***
    LOCATE 8, 2: COLOR 11: PRINT "Ajout d'un SEUL Enregistrement de valeur 1"
    Debut! = TIMER
    Nombre& = 1&: N1& = 2001: GOSUB GS01.ECRITURE
    LOCATE 9, 2: COLOR 11: PRINT "TRI du Fichier en : ";
    GOSUB GS25.TRI
    LOCATE 9, 23: PRINT USING "#####.### secondes"; TIMER - Debut!
    LOCATE 10, 10: COLOR 15: PRINT USING "(######### Echanges)"; Echange&
' ***
    LOCATE 12, 2: COLOR 11
    PRINT "Ajout de 20 Enregistrements de valeur al‚atoire";
    RANDOMIZE TIMER * 100
    FOR N1& = 2002 TO 2021
        Nombre& = RND * Maxi&: GOSUB GS01.ECRITURE
    NEXT N1&
    Debut! = TIMER
    LOCATE 13, 2: COLOR 11: PRINT "TRI du Nouveau Fichier en : ";
    GOSUB GS25.TRI
    LOCATE 13, 30: PRINT USING "#####.### secondes"; TIMER - Debut!
    LOCATE 14, 10: COLOR 15: PRINT USING "(######### Echanges)"; Echange&;
 
' *** Bouclette d'ajouts d'UN enregistrement al‚atoire
' *** et nouveau tri aprŠs chacun d'eux
    RANDOMIZE TIMER * 100
    ' *** ATTENTION, le SEEK(1) donne des RESULTATS 'IDIOTS'
    ' *** Il donne la position du pointeur. Or, aprŠs un tri, o— est-il ?
    AJOUT = "UN": Debut2! = TIMER: En.Plus% = 10000 ' **** Modifiable
    FOR ZOE% = 1 TO En.Plus%
        Debut! = TIMER: N1& = LOF(1) / 16 + 1
        Nombre& = RND * Maxi&: LOCATE 17, 10: COLOR 11
        PRINT USING "Enregistrement cr‚‚ : #####/#####/#####"; ZOE%; En.Plus%; N1&
        GOSUB GS01.ECRITURE
        Debut! = TIMER
        LOCATE 18, 10: COLOR 11: PRINT "TRI du Nouveau Fichier en : ";
        GOSUB GS25.TRI
        Duree! = TIMER - Debut!
        LOCATE 18, 40: COLOR 15: PRINT USING "#####.### secondes "; Duree!;
        IF Duree! > 1! THEN BEEP
        LOCATE 19, 10: PRINT USING "(######### Echanges)"; Echange&;
    NEXT ZOE%
    Duree2! = TIMER - Debut2!: Moyenne! = Duree2! / En.Plus%
    LOCATE 21, 10: COLOR 12
    PRINT USING "##### Ajouts tri‚s avec dur‚e moyenne #.###"; En.Plus%; Moyenne!
' *** Controle du tri
    LOCATE 23, 10: COLOR 10: PRINT " CONTROLE du TRI du FICHIER : "
    CLOSE : GOSUB GS01.OPEN: Nb.Enr& = LOF(1) / 16
    N1& = 1: GOSUB GS01.LECTURE: N.Precedent& = Nombre&
    FOR N1& = 1 TO Nb.Enr&
        LOCATE 23, 41: PRINT USING "######"; N1&
        GOSUB GS01.LECTURE: IF Nombre& < N.Precedent& THEN BEEP: BEEP
        N.Precedent& = Nombre&
    NEXT N1&
    COLOR 15: END
 
GS01.OPEN: OPEN "C:\\ACLAUDIE\\TRIFICH\\FICHIER.RND" FOR RANDOM AS #1 LEN = 16
    FIELD #1, 16 AS EnregistREMent: RETURN
GS01.LECTURE: GET #1, N1&
    Nombre& = VAL(MID$(EnregistREMent, 4, 11)): RETURN
GS01.ECRITURE: RSET N.Alpha = STR$(Nombre&): MID$(Enr, 3) = N.Alpha
    LSET EnregistREMent = Enr: PUT #1, N1&: RETURN
 
GS25.TRI: ' ***** TRI FICHIER
    Indic% = 0: Num.E& = 0: Echange& = 0
    Nbre.EnregistREMents& = LOF(1) / 16
    IF AJOUT = "UN" THEN Num.E& = LOF(1) / 16 - 1
GS25A: IF Indic% = 1 THEN Num.E& = Num.E1&: Indic% = 0
    Num.E& = Num.E& + 1
    IF Num.E& > Nbre.EnregistREMents& GOTO GS25C
    IF Num.E& = 1 GOTO GS25A
GS25B: Num.Pr& = Num.E& - 1
    IF Num.Pr& = 0 THEN GOTO GS25C
    N1& = Num.E&: GOSUB GS01.LECTURE: N.Act& = Nombre&
    N1& = Num.Pr&: GOSUB GS01.LECTURE: Nombre.Pr& = Nombre&
    IF Nombre& <= N.Act& GOTO GS25A
    ' *** Permutation n‚cessaire
    N1& = Num.E&: Nombre& = Nombre.Pr&: GOSUB GS01.ECRITURE
    N1& = Num.Pr&: Nombre& = N.Act&: GOSUB GS01.ECRITURE
    Echange& = Echange& + 1
    IF Num.Pr& = 1 THEN
        GOTO GS25A
    ELSE
        IF Indic% = 0 THEN Num.E1& = Num.E&: Indic% = 1
    END IF
    Num.E& = Num.E& - 1: GOTO GS25B
GS25C: RETURN
 
XXX.ERREUR:
    SELECT CASE Etape%
        CASE 1: IF ERR = 75 THEN RESUME NEXT
        CASE 2: IF ERR = 53 THEN RESUME NEXT
        CASE ELSE: Message = "ERREUR PROGRAMME " + STR$(ERR)
            Message = Message + " ?? VOIR PROGRAMMEUR (Pressez une Touche)"
            LOCATE 30, 10: COLOR 12: PRINT Message
            SLEEP: COLOR 15: END
    END SELECT
 
v6 © Computaid SPRL 2005-2008 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,041 s - Crédits - Stats
1 connecté