Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1897 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°614474
jijiz
Posté le 17-01-2004 à 18:42:58  profilanswer
 

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
mood
Publicité
Posté le 17-01-2004 à 18:42:58  profilanswer
 

n°614477
Taz
bisounours-codeur
Posté le 17-01-2004 à 18:56:34  profilanswer
 

cherche toi un truc genre flush, sinon fait un writeln

n°614479
jijiz
Posté le 17-01-2004 à 18:59:52  profilanswer
 

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
n°614487
Taz
bisounours-codeur
Posté le 17-01-2004 à 19:04:27  profilanswer
 

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

n°614492
bossamiral​2
Ctrl+Alt+Del
Posté le 17-01-2004 à 19:13:19  profilanswer
 

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

n°614497
jijiz
Posté le 17-01-2004 à 19:29:21  profilanswer
 

Avec des writeln ca bugue pareil


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
n°614506
bossamiral​2
Ctrl+Alt+Del
Posté le 17-01-2004 à 19:46:06  profilanswer
 

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  
 

n°614517
jijiz
Posté le 17-01-2004 à 20:08:02  profilanswer
 

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


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
n°614535
bossamiral​2
Ctrl+Alt+Del
Posté le 17-01-2004 à 20:36:36  profilanswer
 

non c'est uppercase pour une chaine je crois bien

n°614540
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-01-2004 à 21:00:42  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 17-01-2004 à 21:00:42  profilanswer
 

n°614557
jijiz
Posté le 17-01-2004 à 21:41:21  profilanswer
 

(*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
n°614559
jijiz
Posté le 17-01-2004 à 21:41:54  profilanswer
 

ca me tr**e le c*l


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
n°614561
jijiz
Posté le 17-01-2004 à 21:44:22  profilanswer
 

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
n°614572
bossamiral​2
Ctrl+Alt+Del
Posté le 17-01-2004 à 21:53:35  profilanswer
 

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
n°614575
bossamiral​2
Ctrl+Alt+Del
Posté le 17-01-2004 à 21:59:22  profilanswer
 

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

n°614593
jijiz
Posté le 17-01-2004 à 23:10:25  profilanswer
 

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
n°614833
itela
Posté le 18-01-2004 à 14:55:13  profilanswer
 

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
n°614897
jijiz
Posté le 18-01-2004 à 17:20:52  profilanswer
 

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


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
n°614902
itela
Posté le 18-01-2004 à 17:38:16  profilanswer
 

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 !

n°614921
jijiz
Posté le 18-01-2004 à 18:18:02  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

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

 

Sujets relatifs
Comment passer d'un code caractère numérique comme "&#233" à "é"[Python - Resolu - Soluce Inside] Serveur http, recuperation d'url
[VBA][Excel]definir la selection dans une macro [resolu]comment utiliser les couleurs en pascal ?
[Resolu] JLabel: setBackground ?Oracle insertion de caractère spéciaux
Obtenir une image a partir d'une rotation d'une autre... [RESOLU][access] Liste déroulante et requête [Résolu]
[résolu] Streaming avec FLASH[ASP+SQL SERVER] Affichage de la structure d'une BDD (Résolu)
Plus de sujets relatifs à : [Pascal] Demande 2 fois le caractère sinon ca plante. (ouf Résolu)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR