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

Turbo Pascal Discussion :

Tableau de caractères


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Par défaut Tableau de caractères
    Bonjour,
    On me demande d'écrire un programme pascal qui fait le chargement d'un tableau de caractères et compte le nombre de succession de 'a' et 'b'.
    Voici le code que j'ai utilisé:

    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
     
    Program Exo3 ;
    Var T : array [1..30] of char;
           I, N, Occ : Integer ;
           Possible : Boolean ;
    Begin
       Write ('Entrez le nombre d''element du tableau (<=30)  ') ;
       readln(N) ;
       Possible :=False ;
       For i :=1 To N Do
        Begin
          Write ('Donnez la valeur de l''element  ',i,' du tableau  ') ;
          Readln (T[i]) ;
          If T[i]='a' then Possible :=True;
          If (T[i]='b') and (Possible=True) then begin
                                                    Occ :=Occ+1;
                                                    Possible:=False;
                                                 end
          else If ((T[i]<>'b') and (T[i]<>'a')) and (Possible=True) then 
               Possible:=false;
        end;
       write('Le d''apparition de la succession des deux caracteres ''a'' et 
             ''b''est égal à ',Occ) ;
       readln;
    end.
    Le problème qui se pose est que ce meme code s'execute parfaitement sur ma machine mais sur d'autres il s'arrete au chargement du premier caractère.
    Pouvez vous m'aider SVP.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue !

    Attention : la variable Occ n'est pas initialisée.
    Il faut être prudent(e) et considérer qu'une variable non initialisée a une valeur indéterminée.

    Sinon, ton programme tourne chez moi.

    Il est possible de simplifier les tests :
    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
      Possible := False;
      for i :=1 to N do
        begin
          Write ('Donnez la valeur de l''element  ',i,' du tableau  ') ;
          Readln (T[i]) ;
          if T[i] = 'a'
             then
               Possible := True
             else
               if T[i] = 'b'
                  then
                    begin
                      if Possible
                         then
                           begin
                             Occ := Occ + 1;
                             Possible := false;
                           end;
                    end
                  else
                    Possible := false;
        end;
    En effet, il est inutile de tester si la condition a été remplie auparavant.
    Tu remarqueras au passage que le test d'une variable booléenne peut s'écrire de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Possible then...
    if not Possible then...
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Par défaut Merci Alcatîz
    Merci Alcatîz. ça simplifie vraiment les tests.
    Mais mon vrai problème c'est le chargement des éléments du tableau de caractères. J'ai meme essayé un programme simple qui ne fait que lire les éléments d'un tel tableau mais lors de l'execution il ne charge que le premier élément puis saute les autres tandis que chez moi ça marche trés bien.
    Merci.

  4. #4
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    Dans mes programmes, quand j'ai eu ce genre de cas, c'est en général parce que la cellule du tableau dépassait la valeur qu'il pouvait admettre, entrainant de fait des erreurs dans la variable (exemple, introduire dans un tableau de type word un nombre négatif, et la variable qui sert à le lire risque en effet de s'incrémenter brusquement de 1 à un chiffre variable - et hors incrémentation prévue), etc...

    Pour autant, je me suis usé à lire et relire ton code, à le jouer et je n'ai pas de pbs. J'avoue que j'ai du mal à isoler la raison de ton bug sur une machine et pas une autre.
    Pourrais-tu nous en dire plus ? Dis-nous par exemple quelles sont les machines (processeur), le logiciel d'exploitation, etc...

  5. #5
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    Je te propose d'ajouter un petit quelque chose à ton programme, pour simplifier la vision sur l'écran. La fonction clrscr (clearscreen) permet en effet d'effacer tout ce qui existe en mode non graphique, présentant ainsi une 'page' propre. Elle implique de faire appel à l'unité CRT.

    J'ai aussi initialisé Occ comme le conseille très justement Alcatîz. L'erreur peut venir de là, même s'il faudrait pour cela que Occ s'initialise par hasard au maximum d'integer (qui est à 32767) et que lorsque tu lui demandes de s'incrémenter de 1, et bien elle plante et fait que i se met aussi à prendre une valeur fausse, sortant de ta boucle.

    Je n'ai pas touché à tes tests en revanche.

    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
    Program Exo3 ;
    
    USES crt;
    
    Var T : array [1..30] of char;
           I, N , Occ: Integer ;
           Possible : Boolean ;
    Begin
       clrscr;
       Write ('Entrez le nombre d''éléments du tableau (<=30)  ') ;
       readln(N) ;
       Possible :=False ;
       Occ :=0;
       For i :=1 To N Do
        Begin
          Write ('Donnez la valeur de l''élément ',i,' du tableau  ') ;
          Readln (T[i]) ;
          If T[i]='a' then Possible :=True;
          If (T[i]='b') and (Possible=True) then begin
                                                    Occ :=Occ+1;
                                                    Possible:=False;
                                                 end
          else If ((T[i]<>'b') and (T[i]<>'a')) and (Possible=True) then
               Possible:=false;
        end;
       write('Le taux d''apparition de la succession des 2 caractères ''a'' et ''b'' est égal à ',Occ) ;
       readln;
    end.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/06/2023, 15h51
  2. Convertir une string en tableau de caractères
    Par alainpeniche dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2007, 20h00
  3. vider un tableau de caractères
    Par cybersam dans le forum C
    Réponses: 20
    Dernier message: 23/05/2006, 21h35
  4. Réponses: 8
    Dernier message: 07/04/2006, 11h18
  5. convertir un tableau de caractère en float
    Par zerocoolyoussef dans le forum C
    Réponses: 3
    Dernier message: 20/03/2006, 22h27

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