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 :

Pourquoi la boucle doit commencer à i:=0 ?


Sujet :

Langage Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Pourquoi la boucle doit commencer à i:=0 ?
    Bonjour, j'ai fait ce programme simple pour chiffrer son nom à l'aide d'une vesion du 'code de césar' qui consiste à remplacer chaque caractère du nom à crypter par le caractère qui le suis selon l'ordre ASCII :
    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
    program Chiffr;
    uses wincrt;
    var ch,ch1:string;r,i:integer;
    begin
    writeln('Entrez votre nom : ');
    readln(ch);
    for i:=1 to length(ch) do
    begin
    r:=ord(ch[i])+1;
    if r=256 then r:=0;
    ch1[i]:=chr(r)
    end;
    writeln('Le cryptage de votre nom donne : ');
    writeln(ch1);
    end.
    Ce programme ne fonctionne pas tel qu'il est, plus précisement il n'affiche pas le nom chiffré, pour le faire fonctionner je doit remplacer dans la boucle par .

    Alors pourquoi ma boucle doit-elle commencer par i:=0 ?
    Le premier caractère de la chaine 'ch' étant 'ch[1]' et non 'ch[0]'.

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Le problème vient de ch1. Tu affectes ch1[i] à chaque tour de boucle, mais la taille de la chaine ch1 est pas modifiée en laissant ta boucle commencer à i=1.

    Ainsi, ch1[0] vaut 0, et comme tu affectes ch1[1] à ch1[n] sans modifier ch1[0], le compilateur ne vaut pas ta chaine entière car ch1[0] reste à 0. En faisant commencer ta boucle à i=0, tu modifies ch1[0], mais ce n'est pas bon non plus puisque tu affectes ch1[0] := ch[0] + 1, alors que les chaines ont la même taille. Donc deux possibilités:
    - Soit tu modifies ch1[0] pour qu'il soit égal à ch[0], mais c'est sale, car on est pas censé manipuler les chaines de caractères de cette façon, car tu bypasses les mécanismes d'allocation de mémoire du compilateur.
    - Soit tu ajoutes les caractères un à un à la suite de la chaine ch1. ch1:=ch1+ord(r).
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 85
    Points
    85
    Par défaut
    salut,
    tu peux aussi utiliser la fonction prédéfini succ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i:=1 to length(ch) do
      ch[i] := succ(ch[i]) ;
    si tu veux coder uniquement les caractères alphabétiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if upcase(ch[i]) in ['A'..'Z'] then

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci à tous d'avoir répondu, vos réponses ont été satisfaisantes même si je ne comprend pas comment je "...tu bypasses les mécanismes d'allocation de mémoire du compilateur." dans la réponse de "wormful_sickfoot"

    Toujours dans la réponse de "wormful_sickfoot" à la fin je pense que c'est plutôt : ch1:=ch1+chr(r)

    joli clin d'œil pour la fonction "succ" de la part de "paskal++", j'y avait pas pensé.
    Merci encore

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    En fait "bypasser les mécanismes d'allocation de mémoire", c'est pas tout à fait vrai, puisque une chaîne de caractères si on précise rien fait 256 octets en mémoire en pascal, lorsqu'elle est allouée en mémoire, donc même si ta chaine fait 1 caractère de long, elle prendra 256 octets quand même. Ce que je voulais dire, c'est que tu bypasses le mécanisme qui modifie la longueur de la chaîne automatiquement, qui est correctement utilisé dans le cas où tu fais des ajouts successifs de caractères à la suite.

    Et du coup, c'est bien ch1:=ch1+chr(r)... et non pas ord.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pourquoi ma boucle mets trop de temps à terminer une tache ?
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/05/2011, 22h13
  2. pourquoi ma boucle fait planté mon appli ?
    Par zerros dans le forum Windows Forms
    Réponses: 5
    Dernier message: 02/05/2009, 16h21
  3. Pourquoi une boucle For i = 1 to. . . commence-t-elle à 2 ?
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/03/2008, 10h41
  4. boucle for: commencer par le plus ancien ?
    Par byloute dans le forum Administration système
    Réponses: 1
    Dernier message: 03/03/2008, 10h28
  5. Pourquoi le scanf doit être interdit
    Par gnto dans le forum C
    Réponses: 4
    Dernier message: 14/06/2006, 14h54

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