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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
| //les variables, et records
// Begin of Records
Type
Texaminer = record
ExaminerName : string [15];
Examinerno : string[10];
ExaminerAddress: string [30];
TotalScripts: integer;
PaymentNet : real;
PaymentBrut : real;
end ;{of Texaminer}
Tsubject = record
SubjectName : String [15];
SubRefCode: string [5];
SubPaymentScript: real;
ExaminerNo: integer;
end;{of Tsubject}
Tcentre = record
SubRefCode : string [15];
CentreNo : string[10];
CentreName : string [15];
TotCand: integer;
end; {of Tcentre}
//Begin of Variables
var
// Variables of Choices in the menu
MenuChoice: char;
NewRequestChoice: char;
ExaminerListChoice: char;
SubjectListChoice: char;
RepeatRequest : integer;
// Variables of Files
{ l'examen du code, du moins la partie que tu m'as fournie,
montre que tu n'as pas besoin de tableaux,
et que si tu veux les maintenir, il va falloir systématiquement
en vérifier les limites.
Voir particulièrement la procédure qui affiche les données }
ExaminerFile: file of Texaminer;
Examiner: array [1..20] of Texaminer;
SubjectFile: file of Tsubject;
{ pourquoi moins de place pour "Tsubject" ? }
Subject: array [1..15] of Tsubject;
CentreFile: file of Tcentre;
centre: array [1..20] of Tcentre;
//la procedure Newdetails
Procedure NewDetails;
var a: integer;
Position:longint;
begin
if FileExists('Examiner.dat')then // change the position if you copy, cut the program !
begin
Assign(ExaminerFile, 'Examiner.dat'); // if file exists then take the right position in the file
Reset (examinerFile) ;
Position := Filesize(ExaminerFile); //calcul the all the details registered
Seek(ExaminerFile, Position); //take the position after the last details registered (for a new request)
{ les 2 lignes précédentes
Position := Filesize(ExaminerFile); //calcul the all the details registered
Seek(ExaminerFile, Position); //take the position after the last details registered (for a new request)
"calent" l'accès au fichier "ExaminerFile"
à la fin, ce qui fait que les prochains "write" se feront
à la suite de ce qui existe déjà, ce qui est bien ce que tu veux
Il faut donc faire la même chose avec les 2 autres fichiers,
"reset" se contentant d'ouvrir un fichier, en se calant au
début : les nouveaux "write" écrasent le contenu existant.
L'erreur se situe essentiellement ici, voir plus loin }
Assign(SubjectFile, 'Subject.dat');
Reset (SubjectFile) ;
Assign (CentreFile, 'Centre.dat');
Reset (CentreFile);
end
else
begin
AssignFile (ExaminerFile, 'Examiner.dat'); // if the file doesn't exist then create a new file
Rewrite(ExaminerFile);
AssignFile (SubjectFile, 'Subject.dat');
Rewrite(SubjectFile);
AssignFile (Centrefile, 'Centre.dat');
Rewrite(CentreFile);
end;
Write ('How many examiner details do you want to enter? ');
Readln (RepeatRequest);
{ comme déjà dit, une boucle "for" n'es pas du tout l'idéal
pour gérer des entrées comme tu le fais }
{ au lieu de mettre tes données dans un tableau, ce qui limite forcément
la quantité que tu peux entrer, tu peux te contenter d'utiliser de simples
variables de type du type correct.
Plus de tableau, plus d'indice à gérer, qui en plus ne sert à rien,
puisque tu stockes immédiatement les données }
for a:= 1 to RepeatRequest
do
begin
Writeln ('');
Writeln ('NEW DETAILS N',a);
Writeln ('--------------');
Write (' Enter the examiner name: ');
Readln (Examiner[a].ExaminerName);
GetValidExaminerno(a);
Write (' Enter the examiner address: ');
Readln (Examiner[a].ExaminerAddress);
Write (' Enter the total number of script marked: ');
Readln (Examiner[a].TotalScripts);
GetValidSubRefCode (a);
Write (' Enter the subject name: ');
Readln( Subject[a].SubjectName);
Write (' Enter the payment for marking each script: ');
Readln (Subject [a].SubPaymentScript);
GetValidCentreno (a);
Write (' Enter the centre name: ');
Readln (Centre[a].Centrename);
Write (ExaminerFile, Examiner[a]);
Write (SubjectFile, Subject[a]);
Write (CentreFile, Centre[a]);
end;
Closefile (ExaminerFile);
Closefile (SubjectFile);
Closefile (CentreFile);
Writeln ('');
Writeln ('');
Writeln (' Sub-menu of New Request ');
Writeln (' ------------------------');;
end; {of procedure}
//et la procedure ou j'appelle mes données pour la blackscreen.
begin
AssignFile (examinerFile, 'examiner.dat');
Reset (examinerFile);
AssignFile (Centrefile, 'centre.dat');
Reset (centrefile);
Ptr := 0;
Writeln ('-Name- -Centre Number- -Centre Name- -Number of scripts marked-');
{ ici, l'utilisation de tableaux est également inutile,
et de plus te conduit droit dans un mur, vu que tu ne contrôles
jamais les limites (Ptr par rapport à la taille déclarée des tableaux).
En effet, que va-t-il se passer s'il y a plus de données dans le fichier
que le tableau peut contenir ?
Comme pour l'entrée des données, de simples variables du type correct
suffisent.
L'erreur qui fait que pour chaque nouvelle série de données
tu écrases les données des fichiers autre que
entre en jeux ici : le test contrôlant la boucle "while"
fait que ça s'arrête quand la fin le fichier le plus court
(en nombre de données) est atteinte }
while not eof (examinerfile) and not eof (centrefile)
do
begin
Ptr := Ptr + 1;
Writeln ('');
Read (examinerfile, examiner[ptr]);
Read (centrefile, centre[ptr]);
Writeln ('');
Write (examiner[ptr].examinername,' ',centre[ptr].centreno,' ');
Writeln (centre[ptr].centrename,' ',examiner[ptr].totalscripts);
end;
Readln;
Closefile (examinerfile);
Closefile (centrefile);
Writeln ('');
Writeln ('');
Writeln (' Sub-menu of Examiner List ');
Writeln (' -------------------------');
end; |
Partager