[Pascal] Demande 2 fois le caractère sinon ca plante. (ouf Résolu)

Demande 2 fois le caractère sinon ca plante. (ouf Résolu) [Pascal] - Delphi/Pascal - Programmation

Marsh Posté le 17-01-2004 à 18:42:58    

Lorsque le programme demande la direction du vent; il faut lui répéter 2 fois avant qu'il valide la saisie.
 
J'ai passé 2 heures sur ce bug sans rien trouver...
Merci de m'aider
 
 
(*Entete du programme*)
PROGRAM Meteo;
USES Wincrt;
CONST sens: string[4] = 'NSEO';
TYPE releve=Record
                  capteur:Record
                  dep,num:integer;
                  End;
            temp:real;
            sens:char;
            end;
VAR i,nbrerel,cptdep:integer;
    tabrel:array[1..100] of releve;
    moytemp,somtemp,depmoy:real;
    a:char;
 
(*Programme*)
BEGIN
 
(*Saisie du nombre de relevés*)
Repeat
      Writeln('Veuillez entrer le nombre de relevés à saisir?');
      Read (nbrerel);
      clrscr;
Until (nbrerel>0) and (nbrerel<=100);
 
(*Saisie des données du listing*)
(*Saisie du numéro de département*)
For i:=1 to nbrerel Do
    Begin
         Writeln('Donnée du relevé n°',i,'');
         Writeln('Détails du code du capteur:');
         Writeln;
         Repeat
               begin
               Write('->Code du département: ');
               Read(tabrel[i].capteur.dep);
               end;
         Until (tabrel[i].capteur.dep>1) and (tabrel[i].capteur.dep<99);
 
(*Saisie du code de la zone*)
         Repeat
               begin
               Write('->Code de la zone: ');
               Read(tabrel[i].capteur.num);
               end;
         Until (tabrel[i].capteur.num>0) and (tabrel[i].capteur.num<99);
 
(*Saisie de la température*)
         Repeat
               begin
               Write('->Température: ');
               Read(tabrel[i].temp);
               end;
         Until (tabrel[i].temp>-50) and (tabrel[i].temp<70);
 
(*Saisie de l'orientation du vent*)
         Write('->Sens du vent: ');
         Readln(tabrel[i].sens);
         tabrel[i].sens:=upcase(tabrel[i].sens);
         while (tabrel[i].sens<>'E') and (tabrel[i].sens<>'O') and (tabrel[i].sens<>'S') and (tabrel[i].sens<>'N') Do
                       Begin
                       Write ('Sens du vent érroné: ');
                       readln(tabrel[i].sens);
                       tabrel[i].sens:=upcase(tabrel[i].sens);
                       end;
         writeln;

end;
 
(*On demande à l'utilisateur le département dont il veut calculer la moyenne*)
clrscr;
Repeat
      Begin
           Writeln('Entrez le département dont vous voulez connaitre la température moyenne');
           Readln(depmoy);
      End;
Until (depmoy>0) and (depmoy<99);
 
(*Calcul pour un département donné de la température moyenne sur la journée*)
(*Calcul de la somme*)
cptdep:=0;
For i:=1 to nbrerel Do
    Begin
         If tabrel[i].capteur.dep=depmoy Then
            begin
                 somtemp:=somtemp+tabrel[i].temp;
                 cptdep:=cptdep+1;
            End;
    End;
(*Calcul de la moyenne*)
If cptdep=0 Then
   Begin
        moytemp:=0;
   End
Else
    Begin
         moytemp:=somtemp/cptdep;
    End;
END.


Message édité par jijiz le 18-01-2004 à 17:22:28

---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 17-01-2004 à 18:42:58   

Reply

Marsh Posté le 17-01-2004 à 18:56:34    

cherche toi un truc genre flush, sinon fait un writeln

Reply

Marsh Posté le 17-01-2004 à 18:59:52    

j'ai fait plein de test avec writeln et il affiche un "vide" a la place du carac pr la première saisie.
 
c'est quoi flush?
 
Merci


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 17-01-2004 à 19:04:27    

tu veux dire que write ou writeln, tu as le même problème ? remplace tous tes write pas des writeln pour voir

Reply

Marsh Posté le 17-01-2004 à 19:13:19    

C'est permit d'avoir un nom identique pour une constante globale et une variable dans le record " SENS " ???

Reply

Marsh Posté le 17-01-2004 à 19:29:21    

Avec des writeln ca bugue pareil


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 17-01-2004 à 19:46:06    

ouias je viens de faire l'essai avec delphi 8 même chose. En attendant utilise un string et tu récupère la première lettre  
 

Reply

Marsh Posté le 17-01-2004 à 20:08:02    

mais si j'utilise un string, je ne peux plus mettre le upcase!


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 17-01-2004 à 20:36:36    

non c'est uppercase pour une chaine je crois bien

Reply

Marsh Posté le 17-01-2004 à 21:00:42    

upcase(s[1])
 
pour s qui est un string non vide (si s = '' ça plantera)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-01-2004 à 21:00:42   

Reply

Marsh Posté le 17-01-2004 à 21:41:21    

(*Saisie de l'orientation du vent*)
         Write('->Sens du vent: ');
         Readln(tet[1]);
         tet[1]:=upcase(tet[1]);
         tabrel[i].sens:=tet[1];
         while (tabrel[i].sens<>'E') and (tabrel[i].sens<>'O') and (tabrel[i].sens<>'S') and (tabrel[i].sens<>'N') Do
                       Begin
                       Write ('Sens du vent érroné: ');
                       Readln(tet);
                       tabrel[i].sens:=upcase(tet[1]);
                       end;
         writeln;
 
 
Marche pas. var tet:string[1];


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 17-01-2004 à 21:41:54    

ca me tr**e le c*l


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 17-01-2004 à 21:44:22    

Pourquoi il m'envoie chier qd je fais la première saisie? ( c un autre pb que le précédent qui reste en suspend).
 
 
PROGRAM TP9_saisie;
USES Wincrt;
TYPE releve=Record
                  capteur:Record
                  dep,num:integer;
                  End;
            temp:real;
            sens:char;
            end;
 
VAR nbrerel,i:integer;
    fichier: file of releve;
    rel: releve;
    nomfichier:string[12];
 
BEGIN
(*Programme*)
BEGIN
 
(*Saisie du nom de fichier qui va sauvegarder les donnée*)
Writeln('Donnez le nom de fichier à créer');
Readln(nomfichier);
Assign(fichier,nomfichier);
Rewrite(fichier);
 
(*Saisie du nombre de relevés*)
Repeat
      Writeln('Veuillez entrer le nombre de relevés à saisir?');
      Read (nbrerel);
      clrscr;
Until (nbrerel>0) and (nbrerel<=100);
 
(*Saisie des données du listing*)
(*Saisie du numéro de département*)
For i:=1 to nbrerel Do
    Begin
         Writeln('Donnée du relevé n°',i,'');
         Writeln('Détails du code du capteur:');
         Writeln;
         Repeat
               begin
               Read(fichier,rel);
               Write('->Code du département: ');
               Read(rel.capteur.dep);
               end;
         Until (rel.capteur.dep>1) and (rel.capteur.dep<99);
 
(*Saisie du code de la zone*)
         Repeat
               begin
               Read(fichier,rel);
               Write('->Code de la zone: ');
               Read(rel.capteur.num);
               end;
         Until (rel.capteur.num>0) and (rel.capteur.num<99);
 
(*Saisie de la température*)
         Repeat
               begin
               Read(fichier,rel);
               Write('->Température: ');
               Read(rel.temp);
               end;
         Until (rel.temp>-50) and (rel.temp<70);
 
(*Saisie de l'orientation du vent*)
         Read(fichier,rel);
         Write('->Sens du vent: ');
         Readln(rel.sens);
         rel.sens:=upcase(rel.sens);
         while (rel.sens<>'E') and (rel.sens<>'O') and (rel.sens<>'S') and (rel.sens<>'N') Do
                       Begin
                       Write ('Sens du vent érroné: ');
                       readln(rel.sens);
                       rel.sens:=upcase(rel.sens);
                       end;
         writeln;
end;
Close(fichier);
end;
END.


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 17-01-2004 à 21:53:35    

c'est le même problème. je ne pige pas trop je dois dire quand tu lui demandes de lire une entrée alphanuméric, il continue comme si tu lui avais saisie du texte.  
Je n'ai pas trop l'habitude des applications consoles sous delphi, mais franchement je ne comprend pas pourquoi le readln se comporte comme ça.


Message édité par bossamiral2 le 17-01-2004 à 21:54:29
Reply

Marsh Posté le 17-01-2004 à 21:59:22    

ok c'est bon j'ai peut être trouvé. en tout cas cela fonctionne sous delphi 8.
 
Au lieu de readln essaie   "console.readline", mais j'ai bien peur que cela ne soit valide que pour le  .net car cela ressemble trop au commande VB.net

Reply

Marsh Posté le 17-01-2004 à 23:10:25    

mais console.readline ne marche pas sous mon compilo tpw. en + on ne l'a pas vu en cours. Il doit y avoir une solution cartésienne; pascal c pas de la magie que je sache?


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 18-01-2004 à 14:55:13    

Peut-être que ça n'a rien à voir et ça fait longtemps que je n'ai pas programmé en pascal mais j'avais pris l'habitude d'initialiser toutes les variables "texte" pour éviter les merdes aléatoires : essaie de mettre tabrel[i].sens:=' ' avant de débuter la saisie.
 
[Edit]
J'ai cru que j'allais y perdre mon pascal !
Le truc précédent ne marche pas mieux.
 
En fait, il suffit de remplacer le read(...) de la boucle précédente (saisie de la température) par un readln.
En effet, à la suite d'un read, le buffer-clavier contient le retour chariot et c'est celui-ci qui se retrouve dans .sens au lieu du caractère saisi.
 
Pascal est décidément très sensible avec la gestion des variables de type char !
 
A+


Message édité par itela le 18-01-2004 à 15:59:09
Reply

Marsh Posté le 18-01-2004 à 17:20:52    

Merci bcp Itela, je n'aurais jamais pensé à ca.... MERCI


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 18-01-2004 à 17:38:16    

jijiz a écrit :

Merci bcp Itela, je n'aurais jamais pensé à ca.... MERCI  


 
De rien...
Les fonctions de deboggage (point d'arrêt et visualisation des variables) m'ont aidé, sinon c'était à n'y rien comprendre !

Reply

Marsh Posté le 18-01-2004 à 18:18:02    

je vais quand meme poser la colle a ma prof d'algo pour voir si elle trouve. :lol:


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed