Programme juste mais n'affichre rien!!!

Résolu
Bonjour,

voici l'énoncé de l'exercice :
One se propose d'écrire un programme pascal qui permet de :
Ø Remplir un vecteur d'enregistrement T par n enregistrement nommé enreg1 avec (n>2). Chaque enregistrement comporte 4 champs.
Nom et prénom : chaîne de caractère [50].
NT : réel.
NC : réel.
NS : réel.
Ø à partir de vecteur T Créer un fichier type qui comporte n enregistrement nommé enreg2 dont le nom est « C:\notes.dat ». chaque enregistrement comporte 3 champs.
Nom et prénom : chaîne de caractère [50].
Moyenne : réel.
Décision : chaîne de caractère [10].
N.B
Moyenne = (NT+NC+2*NS)/4
La décision est « admis » si la moyenne>=10, « refuser » sinon.
Ø Afficher le contenu de fichier « C:\notes.dat ».

voici l'a corrigé de l'exercice :

PROGRAM DC1;
USES WINCRT;
TYPE enreg1=record
     nom_prenom:string[50];
     NT,NC,NS:real;
     end;
     enreg2=record
     nom_prenom2:string[50];
     moy:real;
     decision:string[10]
     end;
notes=file of enreg2;
tab=array [3..100] of enreg1;
var t:tab;
    e1:enreg1;
    e2:enreg2;
    f:notes;
    n:integer;

procedure remplir(var t:tab;n:integer);
var i:integer;
begin
repeat
writeln('Entrer le nombre d''enregistrements');
readln(n);
until(n>2);
for i:=1 to n do
begin
with t[i] do
begin
write('donner le nom et le prénom: ');
readln(Nom_prenom);
write('donner NT: ');
readln(NT);
write('donner NC: ');
readln(NC);           
write('donner NS: ');
readln(NS);
end;
end;
end;

procedure creation (var f:notes;t:tab;n:integer;VAR e2:enreg2);
var i:integer;
begin

for i:=1 to n do
begin
e2.nom_prenom2:=t[i].nom_prenom;
e2.moy:=(t[i].nt+t[i].nc+2*t[i].ns)/4;
if e2.moy>=10 then e2.decision:='admis'
           else e2.decision:='refuser';
write(f,e2);
end;
end;

procedure afficher(var f:notes;e2:enreg2);
begin
reset(f);
while(not eof(f)) do
begin
read(f,e2);
with e2 do
begin
write(nom_prenom2,'  ',moy:5:2,'  ',decision);
end;
end;
close(f);
end;

begin
assign(f,'c:\notes.dat');
rewrite(f);
remplir(t,n);
creation(f,t,n,e2);
afficher(f,e2);
end.


vos commentaires VU QUE CA M'AFFICHE RIEN

7 réponses

  1. Bonjour

    Il y a longtemps que je n'ai pas fait de Pascal, mais il me semble qu'un flush(f) à la fin de creation ne ferait pas de mal.
    Les "write" écrivent dans un buffer et pas vraiment dans le fichier. Donc si tu ne le refermes pas avant d'essayer de le lire, il faut au moins vider ce buffer dans le fichier réel, c'est le rôle de flush.
    0
    1. merci mon ami mais flash ne fais pas parti de programme
      est ce qu'il y a une solution dans ce programme même pour qu'il fonctionne
      merci
      0
      1. flash ne fais pas parti de programme
        Ça n'est pas gênant, je ne t'ai pas dit d'utiliser flash, mais flush.
        Si tu n'es pas attentif, tes programmes ne sont pas près de marcher.

        J'ai dit "si tu ne le refermes pas".
        Ça sous-entend que si tu le refermes, ça va bien écrire dans le fichier.
        Donc tu le refermes quand tu as fini d'écrire, ce qui est d'ailleurs bien plus logique. Mais n'oublie pas de le rouvrir pour le relire ensuite.
        0
      2. toujours le même problème
        tous marche sauf il n'écrit pas dans le fichier et donc rien ne marche par la suite
        comment je dois faire ?
        merci
        0
      3. Quand je lis ton programme un peu plus attentivement, je vois un tas d'autres trucs bizarres. Par exemple le type tab=array [3..100] : pourquoi commencer à 3 alors que tu utilises les indices 1 et 2 ?
        0
      4. parce que la taille du tableau est >2
        0
      5. j4ai déjà modifié et toujours la même résultat
        0
    2. Tu pourrais essayer par toi même de mettre un writeln à l'écran à côté de chaque write dans ton fichier pour voir si au moins ton programme essaye d'écrire dans le fichier. Tu verrais qu'il n'essaye même pas.
      D'où vient la valeur de n qui définit le nombre de boucles ? Elle a été saisie dans la procedure remplir. Mais elle n'est pas passée en var dans cette procedure : autrement dit, quand tu la modifies à l'intérieur de la procedure, elle n'est pas modifiée à l'extérieur. Donc n vaut toujours 0.
      0
      1. oui vous avez raison pour le n,j'ai ajouter var devant n dans la procédure remplir et là le programme s'arrête au niveau de test 4
        0
    3. j'attends toujours vos aides mes amis
      ça m'étonne ce programme vraiment...
      0
      1. j'attends toujours vos aides mes amis
        Si je ne vais pas assez vite à ton goût, il faut le dire

        ça m'étonne ce programme vraiment
        Pas moi.

        Tu devrais changer le sujet "programme juste..." Sois un peu modeste : il n'est pas juste, s'il ne marche pas c'est ta faute.

        Pour en revenir à ton problème, qu'est ce que tu appelles le test 4 ? Et quand tu dis que le programme s'arrête, que se passe-t-il ? il s'arrête simplement ou il y a un message d'erreur ?
        0
        1. oh mon père!soit un peu doux avec moi!:)
          ben le programme n'as aucune erreur et il s'exécute normal mais il n'écrit pas dans le premier fichier et il s'arrête dans le message de test au niveau de test ' sans erreur ni rien mais il ne passe pas a test 5 et test 6...
          0
        2. Si, le programme a de nombreuses erreurs, je t'en ai déjà relevé quelques unes
          et il s'exécute normal mais S'il y a un mais, c'est qu'il ne s'exécute pas normalement.
          Tu ne m'as toujours pas dit ce qu'étaient test 4 , test 5 ou test 6, je ne sais pas où il faut chercher l'erreur suivante.
          0
        3. c moi qui as ajouter ces simples messages de test pour savoir au quel point le programme s'arrête de s'exécuter
          ben maintenant il s'arrête au niveau de test 4 vu que il m'écrit la dernière chose qui s'affiche sur écran, pascal est test4...
          0
      2. Tu es désespérant....
        Comment veux-tu que je devine où se trouvent tes messages de test ?
        Tu crois que j'ai une boule de cristal ? Aide-moi à t'aider.
        Redonne le programme avec tes messages de test
        0
        1. ah oui pardon mon père j'ai pas fais attention vraiment...
          tenez ce nouveau programme:
          PROGRAM DC1;
          USES WINCRT;
          TYPE enreg1=record
               nom_prenom:string[50];
               NT,NC,NS:real;
               end;
               enreg2=record
               nom_prenom2:string[50];
               moy:real;
               decision:string[10]
               end;
          notes=file of enreg2;
          tab=array [1..100] of enreg1;
          var t:tab;
              e1:enreg1;
              e2:enreg2;
              f:notes;
              n:integer;
          
          procedure remplir(var t:tab;n:integer);
          var i:integer;
          begin
          
          for i:=1 to n do
          begin
          with t[i] do
          begin
          write('donner le nom et le prénom: ');
          readln(Nom_prenom);
          write('donner NT: ');
          readln(NT);
          write('donner NC: ');
          readln(NC);           
          write('donner NS: ');
          readln(NS);
          end;
          end;
          end;
          
          procedure creation (var f:notes;var t:tab;n:integer;VAR e2:enreg2);
          var i:integer;
          begin
          for i:=1 to n do
          begin
          e2.nom_prenom2:=t[i].nom_prenom;
          e2.moy:=(t[i].nt+t[i].nc+2*t[i].ns)/4;
          if e2.moy>=10 then e2.decision:='admis'
                     else e2.decision:='refuser';
          read(e2.nom_prenom2);
          read(e2.moy);
          read(e2.decision);
          write(f,e2);
          end;
          end;
          
          procedure afficher(var f:notes;e2:enreg2);
          begin
          reset(f);
          while(not eof(f)) do
          begin
          read(f,e2);
          with e2 do
          begin
          write(nom_prenom2,'  ',moy:5:2,'  ',decision);
          end;
          end;
          close(f);
          end;
          
          begin
          repeat
          writeln('Entrer le nombre d''enregistrements');
          readln(n);
          until(n>2);
          writeln('test1');
          assign(f,'c:\notes.dat');
          writeln('test2');
          rewrite(f);
          writeln('test3');
          remplir(t,n);
          writeln('test4');
          creation(f,t,n,e2);
          writeln('test5');
          afficher(f,e2);
          writeln('test6');
          end.
          
          0
      3. Dans mon message #3 je t'ai dit de refermer le fichier puis de le rouvrir. Pourquoi est-ce que ça n'apparaît pas dans ce code ?

        Pour continuer à détecter l'erreur, ajoute des writeln ('test') à l'intérieur de ta fonction creation. Ça te donnera une idée plus précise de l'endroit où ça ne va pas
        0
        1. c bon mon père
          le problème est résolu
          voilà le programme fonctionnel:
          PROGRAM DC1;
          USES WINCRT;
          TYPE enreg1=record
               nom_prenom:string[50];
               NT,NC,NS:real;
               end;
               enreg2=record
               nom_prenom2:string[50];
               moy:real;
               decision:string[10]
               end;
          notes=file of enreg2;
          tab=array [1..100] of enreg1;
          var t:tab;
              e1:enreg1;
              e2:enreg2;
              f:notes;
              n:integer;
          
          procedure remplir(var t:tab;n:integer);
          var i:integer;
          begin
          
          for i:=1 to n do
          begin
          with t[i] do
          begin
          write('donner le nom et le prénom: ');
          readln(Nom_prenom);
          write('donner NT: ');
          readln(NT);
          write('donner NC: ');
          readln(NC);           
          write('donner NS: ');
          readln(NS);
          end;
          end;
          end;
          
          procedure creation (var f:notes;var t:tab;n:integer;VAR e2:enreg2);
          var i:integer;
          begin
          for i:=1 to n do
          begin
          e2.nom_prenom2:=t[i].nom_prenom;
          e2.moy:=(t[i].nt+t[i].nc+2*t[i].ns)/4;
          if e2.moy>=10 then e2.decision:='admis'
                     else e2.decision:='refuser';
          write(f,e2);
          end;
          end;
          
          procedure afficher(var f:notes;e2:enreg2);
          begin
          reset(f);
          while(not eof(f)) do
          begin
          read(f,e2);
          with e2 do
          begin
          writeln(nom_prenom2,'  ',moy:5:2,'  ',decision);
          end;
          end;
          close(f);
          end;
          
          begin
          repeat
          writeln('Entrer le nombre d''enregistrements');
          readln(n);
          until(n>2);
          assign(f,'c:\notes.dat');
          rewrite(f);
          remplir(t,n);
          creation(f,t,n,e2);
          afficher(f,e2);
          end.
          

          merci pour votre aide
          0