IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

[Débutant] Déterminer si un caractère est un nombre


Sujet :

Langage Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut [Débutant] Déterminer si un caractère est un nombre
    Salut à tous, je suis étudiant en informatique et là on vient de commencer le langage Pascal.
    J'essaie de faire un petit programme dérivé d'un exercice qu'on a dû faire la semaine passée et je me retrouve face à un problème que je n'arrive pas à résoudre, malgré de nombreuses tentatives, aussi me permets-je de vous demander comment on fait dans ces cas-là ?
    C'est un programme qui demande d'entrer soit un nombre et cela retourne alors le caractère ASCII associé, soit un caractère et cela retourne alors son nombre en ASCII. Mon problème est justement la réciprocité du phénomène, je n'arrive pas à trouver comment faire pour lui faire dire : si c'est un nombre, fais ça, mais si c'est un caractère, fais ci.
    Je vous met là mon essai tel qu'il est actuellement, ne fonctionnant pas.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    program itoASCII;
     
    var a: integer;
    	 b: char;
     
    begin
    	writeln ('Entrer un nombre, cela retourne la lettre ASCII correspondante et réciproquement:');
     
    	writeln ('Entrer la valeur 0 pour sortir');
     
    	repeat
    		begin
    			readln (a);
    			writeln (chr (a));
    		end;
    	until (a=0 or readln (b));
     
    	repeat
    		begin
    			readln (b);
    			writeln (ord (b));
    		end;
    	until (a=0 or readln(a));
    end.

    Merci du coup de main!
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Boa,

    Pour la présentation du code, il faut l'encadrer avec les balises [*code] et [*/code], sans les * qui ne sont là que pour les invalider.

    Pour ton problème, une démarche simple est de lire une chaine, puis de la tester pour savoir si elle correspond à un nombre ou un caractère.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Ok, merci du conseil, je m'en vais faire mes essais de ce pas..

    Merci!

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    ...mais,.. euuh,.. je vois pas comment tester ma chaîne. J'ai essayé de faire un ord (chaîne) en me disant que si la valeur était comprise entre 48 et 57 cela serait un nombre, sinon un caractère, mais cela ne fonctionne pas étant donné qu'on ne peut faire ord(..) que d'un caractère.
    ..et puis, pourrais-je faire un truc genre: readln (ce que tu frappes au clavier) et dire: si c'est un entier fais ci, si c'est un caractère fais ça..?
    En gros, puis-je définir par exemple 3 variables et demander au programme: "lis ce qui est frappé au clavier" sans savoir à l'avance la nature de la variable frappée?
    Comme vous voyez je n'ai pas encore beaucoup d'outils en Pascal, j'ai eu mon premier cours jeudi...

    Merci

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Voa,

    Comme Ord ne prend qu'un caractère, peut-être qu'en testant le 1er caractère de la chaine lue ?

    Ça ne suffit pas, mais il faut bien commencer quelque part ...


    ... et imaginer ce qui va être nécessaire pour la suite.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    il y a plusieurs problème :

    pour les caractères, simple.
    mais pour les caractères numerique (0..9) moins simple.

    c'est d'ailleur pour cela qu'en prog on utilise des symboles pour eviter des tests alambiqué et farfelus :

    # pour l'ordre d'un caractère dans la table ASCII (#0..#255)
    #$ pour l'ordre d'un caractère dans la table ASCII sous forme hexa (#$00..#$FF)
    $ pour un nombre hexadecimal

    etc.

    on pourrait imaginer ici la même chose :

    #[0..255] pour l'ordre d'un caractère
    sinon est un caractere.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    var 
      BTC : array[byte] of char;
      CTB : array[char] of byte;
      Erreur : boolean;
      S : string;
      O : byte;
      C : char;
    begin
      for O := 0 to 255 do
      begin
        BTC[O] := char(O);
        CTB[BTC[O]] := O;
      end;
     
      repeat
        erreur := false;
     
        clrscr;
     
        write('saisissez un caractère [09AZaz+= ...] ou un nombre #[0..255] : ');
        readln(S);
     
        if S[1] = '#' then
        begin
          val(copy(S, 2, Length(S), O);
          C := BTC[O];
        end
        else
        if Length(S) = 1 then
        begin
          C := S[1];
          O := CTB[C];
        end
        else
          erreur := true;
      until not erreur;
     
      writeln('caractere : ', C, ' = ', O );
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Joe,

    Je suis bien sûr que ce programme ne répond pas au problème tel qu'il est posé, qui ne présuppose absolument pas un formatage par l'utilisateur, et fait d'ailleurs partie des exercices très classiques pour les débutants.
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    ou alors on à une plage définie :

    on ne peut choisir que des caractère allant de A..Z à a..z
    on ne peut choisir que des nombres allant de 32 à 127

    ce qui faciliterai les choses.

    de toute façon on aurat un problème pour les caractère 0..9 qui pourrait être interprété soit comme nombre (donc caractères #0 à #9) soit comme caractère (donc nombre $30 à $39).


    considérer une saisie de longueur 1 etant un caractère, cela empeche de saisir les caractères #0 à #9 grace à ALT GT+[0..9]


    sinon, une structure simple peut nous aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TByteOrChar = record
        case byte of
          0: (C : char);
          1: (B : byte);
      end;
    mais je ne sais pas si ce type de déclaration est supporté par TP.

    cela permet de s'exempter de toute méthode de conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    var
      BOC = TByteOrChar;
      S : string;
      ErrorFlag : integer;
    begin
      readln(S);
     
      ErrorFlag := 0;
     
      if Length(S) = 1 then
        BOC.C := S[1]
      else
        Val(S, BOC.B, ErrorFlag);
     
      if ErrorFlag = 0 then
        Writlen('Caractère : ', BOC.C, ' = ', BOC.B)
      else
        Writeln('Erreur de saisie');
    end;

    j'ajoute une petite fonction de mon programme DHEX pour les caractères non-visible :

    ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    program Saisie;
     
    uses Crt;
     
    type
      TByteOrChar = record
        case byte of
          0: (C : char);
          1: (B : byte);
      end;
     
    const
      MAP0_32 : array[boolean,#0..#32] of string =
        (('NUL','SOH','STX','ETX','EOT','ENQ','ACK','BEL','BS','HT','LF','VT','FF',
          'CR','SO','SI','DLE','DC1','DC2','DC3','DC4','NAK','SYN','ETB','CAN','EM',
          'SUB','ESC','FS','GS','RS','US','SP'),
         ('Null','Start of header','Start of text','End of text',
          'End of transmission','Enquiry','Acknowledge','Bell','Backspace',
          'Horizontal Tab','Line feed','Vertical Tab','Form feed','Carriage Return',
          'Shift out','Shift in','Data link escape','Device control 1',
          'Device control 2','Device control 3','Device control 4',
          'Negative acknowledge','Synchronous idle','End of transmission block',
          'Cancel','End of medium','Substitute','Escape','File separator',
          'Group separator','Record separator','Unit separator','Space'));
      MAP127 : array[boolean] of string = ('DEL','Delete');
     
    function SpCharAscii(const CharCode : char; const UseLongName : boolean) : string;
    var
      Ret : string;
    begin
      case CharCode of
        #0..#32 : Ret := '('+MAP0_32[UseLongName, CharCode]+')';
        #127   : Ret := '('+MAP127[UseLongName]+')';
        else
          Ret := CharCode;
      end;
      SpCharAscii := Ret;
    end;
     
     
    var
      BOC : TByteOrChar;
      S : string;
      ErrorFlag : integer;
    begin
      readln(S);
     
      ErrorFlag := 0;
     
      if Length(S) = 1 then
        BOC.C := S[1]
      else
        Val(S, BOC.B, ErrorFlag);
     
      if ErrorFlag = 0 then
        Writlen('Caractère : ', SpCharAscii(BOC.C, false), ' = ', BOC.B:3)
      else
        Writeln('Erreur de saisie');
    end;

    si le type TByteOrChar ne compile pas on peu le remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    var
      CB : char;
      B : byte absolute CB;
      C : char absolute B;
    begin
     
      { ... }
     
      if Length(S) = 1 then
        CB := S[1]
      else
        Val(S, B, ErrorFlag);
     
      { ... }
     
      if ErrorFlag = 0 then
        Writlen('Caractère : ', SpCharAscii(C, false), ' = ', B:3)
      else
        Writeln('Erreur de saisie');
     
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  9. #9
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Dr.Who, je ne crois pas que la solution doit etre aussi complexe pour un exercice d'ecole.
    D'apres ce que j'ai compris, on demande de donner le code d'un caractere, ou le caractere associé à un code ascii. Il y'a d'abord un truc qu'il faut comprendre. Si l'utilisateur entre par exemple 5, est il un caractere ou un nombre? L'ordinateur ne pourra pas se decider, alors c'est à l'utilisateur de le dire.
    Donc pour moi, on doit proposer un petit menu demandant à l'utilisateur d'entrer soit un nombre, soit un caractere. Selon le choix de l'utilisateur on affichera ensuite le resultat voulu.

    Exemple de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    writeln('1 : entrez un nombre entre 0 et 255');
    writeln('2: entrez un caractere');
    writeln('autre : quitter');
    readln(choix);
    case choix of
     1:begin
         readln(nombre);
         //affichage du caractere correspondant
        end;
     2:begin
         readln(carac);
         //affichage du code ascii
        end;
    end;

  10. #10
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    en fait, l'exercice était simplissime, je devais faire un programme qui retournait le caractère ASCII correspondant à un nombre entré.

    Voilà le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    program lettretoASCII;
     
    var a: integer;
     
    begin
    	writeln ('Entrer un nombre et cela retourne son caractère ASCII');
     
    	writeln ('Entrer 0 pour sortir');
     
    	repeat
    		begin
    			readln (a);
    			writeln (chr(a));
    		end;
    	until a=0;
    end.
    et encore, la boucle n'était pas demandée.
    Le reste c'est moi qui ai voulu le corser en le rendant récirpoque, et cela quelle que soit l'entrée, un nombre (auquel cas cela fonctionne comme ci-dessus) ou un caractère (auquel cas cela serait sa réciproque), au choix de celui qui frappe sur le clavier. Etant débutant, je n'avais aucune idée à priori de la difficulté de l'exercice, cela pouvant en fait me demander encore plusieurs leçons avant de pouvoir le faire..

    Je n'y suis pas encore, mais je crois effectivement que je dois utiliser un tableau pour y arriver..

    (J'ai pondu ce post sans avoir encore lu les dernières propositions de solutions, je m'y met de suite)

    Ouala quoua

  11. #11
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    a ben oui c'est plus pareil
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. Déterminer si une variable est un nombre
    Par elisabeta dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 30/08/2012, 23h38
  2. Déterminer si un caractère est un chiffre
    Par Arsene12 dans le forum VBA Word
    Réponses: 3
    Dernier message: 06/08/2012, 14h13
  3. Réponses: 3
    Dernier message: 12/10/2006, 16h39
  4. Comment déterminer si un .class est un nombre ?
    Par kisame dans le forum Langage
    Réponses: 9
    Dernier message: 10/04/2006, 14h14
  5. Réponses: 3
    Dernier message: 24/10/2005, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo