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

Pascal Discussion :

Exercice clé de contrôle


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut Exercice clé de contrôle
    Salut;
    Je suis une étudiante en première année informatique et j'ai cet exercice. Je ne trouve pas où est l'erreur.
    Svp svp j'ai besoin d'aide, voilà l'anoncé de l'exo :
    Dans un hôpital, on donne à chaque malade un numéro (indicatif) pour l'identifier et, afin d'éviter toute erreur, on associe une clé de contrôle à chaque indicatif. Dans notre cas, la clé de contrôle est un caractère alphabéthique dont le rang dans l'alphabet est donné par :
    (le reste de la division de l'indicatif par 26 ) +1
    Exemple : si l'indicatif d'un malade est 1624, la clé de controle est M et on ecrira 1624M.

    A) Construire la solution qui consistera à associer une clé de contrôle à chaque indicatif, au moment de sa création puis chaque à chaque fois que l'indicatif est utilisé. Il faudra vérifier s'il est correct ou non; pour cela, on recalcule la clé de controle et on la compare à celle qui a été associée à l'indicatif au départ; si c'est la même, l'indicatif a été écrit correctement; sinon, il y erreur.
    Exemple : soient l'indicatif et sa clé 1264M. La clé de contrôle après son recalcul est Q, il y a donc erreur.

    B) Construire la solution qui nous permet de retrouver toute erreur dans
    la manipulation des indicatifs.
    Et voila le programme :
    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
    PROGRAM exo62;
    uses crt;
    var Id:integer;
        cl,xx: char;
        function cle ( A: integer): char;
           var i :integer;
               cc:char;
           begin
           cc:='A';
           for i:=2 to (a mod 26)+1 do cc:= succ(cc);
           cle:=cc;
           end;
        function vercle (A:integer; cc:char):boolean;
           var i: integer;
           var cc1: char;
           var test: boolean;
           begin
           i:=0;
           for cc1:= cc to cle(A) do i:=i+1;
           if i=0 then test:=true
           else test:= false;
           vercle:=test;
           end;
    BEGIN
    clrscr;
    textcolor(15);
    writeln ('Si vous voulez calculer un clé tapez A');
    writeln ('Si vous voulez vérifiez un clé tapez Z');
    readln (xx);
    if xx='a' then
        begin
        writeln ( 'Entrez l''indicatif');
        readln (id);
        writeln( 'La clé est:  ', cle (id) );
        end;
    if xx= 'z' then
        begin
        writeln ('Entrez l''indicatif et sa clé');
     
        readln (id,cl);
        if vercle(id,cl)=false then
             begin
             textcolor(4 + blink);
             writeln('Erreur');
             textcolor(15);
             writeln ( cle( id),'  c''est la clé');
             end
        else
            begin
            textcolor(10);
            writeln (' votre cle est juste');
            end;
        end;
        readln;
    END.
    Pouvez-m'aider ?

  2. #2
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut Element de solution
    salut,

    petits conseils:
    tu fais des indentations après un (begin, var, else)
    si tu veux en mettre plus, tu les met après (function, procedure, …) .
    il est préférable de faire la déclaration des variables globales juste avant le BEGIN principale.

    La fonction cle est farfelue car elle fait des affectations inutiles :
    tu dois simplement utiliser chr() ou char(), ça fait la même chose.
    même problème dans vercle.

    Je crois que les fonctions read() et readln() ne permettent pas de saisir plusieurs variables de types différents.
    Pour une meilleur gestion des erreurs dû à la casse, utilise Upcase() :
    exemple : if vercle(id,upcase(cl))=false then …

    Remarque : je n’ais aucune connaissance sur la procédure textcolor() ;
    le programme comme je l'ai fait fonctionne sur freePascale 2.0.4

    Bonne jounée.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut le code
    Resalut:

    voici le 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
    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
     
    PROGRAM exo62;
    uses crt;
    var Id:integer;
        cl,xx: char;
    function cle ( A: integer): char;
      begin
        cle:= chr((ord('A')-1) + (A mod 26)+1);
      end;
    function vercle (A:integer; cc:char):boolean;
      begin
        vercle:= cle(A) = cc;
      end;
    BEGIN
      clrscr;
    //  textcolor(15);
      writeln ('Si vous voulez calculer une clé tapez A');
      writeln ('Si vous voulez vérifiez une clé tapez Z');
      readln (xx);
      if xx='a' then
        begin
          writeln ( 'Entrez l''indicatif');
          readln (id);
          writeln( 'La clé est:  ', cle (id) );
        end;
      if xx= 'z' then
        begin
          writeln ('Entrez l''indicatif et sa clé');
     
          readln (id);
          readln (cl);
          if vercle(id,cl)=false then
             begin
    //           textcolor(4 + blink);
               writeln('Erreur');
    //           textcolor(15);
               writeln ( cle( id),'  c''est la clé');
             end
          else
            begin
    //          textcolor(10);
              writeln (' votre cle est juste');
            end;
          end;
          readln;
    END.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Citation Envoyé par Ultima
    salut,

    petits conseils:
    tu fais des indentations après un (begin, var, else)
    si tu veux en mettre plus, tu les met après (function, procedure, …) .
    il est préférable de faire la déclaration des variables globales juste avant le BEGIN principale.

    La fonction cle est farfelue car elle fait des affectations inutiles :
    tu dois simplement utiliser chr() ou char(), ça fait la même chose.
    même problème dans vercle.

    Je crois que les fonctions read() et readln() ne permettent pas de saisir plusieurs variables de types différents.
    Pour une meilleur gestion des erreurs dû à la casse, utilise Upcase() :
    exemple : if vercle(id,upcase(cl))=false then …

    Remarque : je n’ais aucune connaissance sur la procédure textcolor() ;
    le programme comme je l'ai fait fonctionne sur freePascale 2.0.4

    Bonne jounée.

  5. #5
    Membre averti
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    salut
    merci beaucoup pour vos conseilles
    mais je dois faire des fonctions ou procédures, parce que j'ai pas le droit pour utiliser sertain des fonction qui sont déja en pascale.
    merci pour tout.


    un autre question:
    dans cet exercice quant on vérifie l'indicatif et sa clé, comme entrée on a chaine de caractéres : ex: 1624M
    comment je peut extraire caractère par caractère et transformer ces caractéres (par exemple le caractère '1' à l'entier 1).

    merci pour vous.

  6. #6
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour,
    Je suis aussi en première année d'info et j'ai débuté avec le pascal cette année.
    Je n'ais donc utilisé que la méthode qu'on m'a appris en classe.
    Pour convertir une chaine en caractère, utilises la procédure val()
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      val('124',n,e); // n= 124, e = 0
    Normalement tu as eu des cour sur la manipulation des chaines : Tu sais donc utiliser length() et copy(), sinon le site des développeurs peut t'aider grâce à la FAQ.

    voci une solution possible pour ce que tu veux faire:
    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
     
    program exo66;
     
    function extract_id(s : STRING) : CARDINAL;
      var
        cls : STRING;    // La chaine contenant le nombre rechercé
        err : INTEGER;   // Code d'érreur de la procedure Val
        res : CARDINAL;  // résultat
      begin
        cls:= copy(s,1,length(s)-1);
        val(cls, res, err);
        extract_id:= res;
      end;
     
    function extract_cl(s : STRING) : CHAR;
      begin
        extract_cl:= s[length(s)];
      end;
     
    var
      test : STRING;
     
    BEGIN
      test:= '1624M';
      writeln(test,', extract_id =',extract_id(test),', extract_cl=',extract_cl(test));
    END.

  7. #7
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour,
    En utilisant une procédure tu peux avoir ceci :
    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
     
    program exo66;
     
    procedure decompose(s : STRING;out i : INTEGER; out c : CHAR);
      var
        cls : STRING;    // La chaine contenant le nombre rechercé
        err : INTEGER;   // Code d'érreur de la procedure Val
        res : CARDINAL;  // résultat
      begin
        cls:= copy(s,1,length(s)-1);  // copie de la première à l'avant dernière caractère (les chiffres) dans cls
                                               // la dernière caractère étant une lettre
        val(cls, res, err);
        i:= res;
        c:= s[length(s)];
      end;
     
    var
      test : STRING;
      id : INTEGER;
      cl : CHAR;
     
    BEGIN
     
      writeln('entrez l''idendentifiant en entier exp: 1624M');
      readln(test);
     
      decompose(test, id, cl);
     
      writeln(test,', id =',id,', cl=',cl);
      // suposons que test= '1624M', alors: id= 1624 et cl='M'
    END.
    Attention si tu utilises Free Pascal car 'out' n'est pas géré :
    au lieu de "fpc exo66 .pas" il faut faire "fpc –Mdelphi exo66.pas"

    Salut!

Discussions similaires

  1. [contrôle] dbDateTimePicker ???
    Par Fizgig dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/11/2002, 15h45
  2. Pouvez vous m'aider a resoudres ces 3 exercices
    Par algorithmique dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 09/08/2002, 17h26
  3. [Kylix] Contrôle DBGrid
    Par KThrax dans le forum EDI
    Réponses: 1
    Dernier message: 10/05/2002, 14h18

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