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 sur les tableaux


Sujet :

Pascal

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Exercice sur les tableaux
    Bonjour,

    J'ai un petit problème avec les tableaux, ou plutôt les boucles on dirait.
    Je m'arrache les cheveux () à comprendre ce qui ne va pas dans ce programme : le début du programme en fait n'affiche pas les writeln('...') que j'ai écrit, et au moment d'entrer des char, je ne peux en entrer qu'un et après le command shell ne répond plus...
    Si vous avez des remarques, ça serait sympa.
    Merci d'avance.
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    program crypto;
    uses crt;
    const fin=26;
          maxlettre='Z';
    type  tabori=array[1..fin] of char;
          tabin=array[1..fin] of char;
          tabres=array[1..fin] of char;
          tabcomb=array[1..fin] of char;
          tabcode=array[1..fin] of string;
    var a:tabori;
        b:tabin;
        c:tabres;
        p:tabcomb;
        nomcode:tabcode;
        lettre,reponse:char;
        i,j:integer;
     
     
    BEGIN
     
            for lettre:='A' to maxlettre do
            begin
            	i:=1;
                    a[i]:=lettre;
                    inc(i,1);
            end;
            writeln('Tableau alphabetique initial');
            for i:=1 to fin do
            begin
            	writeln(a[i]);
    	end;
     
            for i:=1 to fin do
            begin
            	IF odd(i) THEN b[i]:='I'
                    ELSE b[i]:='O';
            end;
            for i:=1 to fin do
            begin
            writeln(b[i]);
            end;
     
            for i:=1 to fin do
            begin
            	IF odd(i) THEN c[i]:=a[i+1]
                    ELSE c[i]:=a[i];
            end;
     
            for i:=1 to fin do
            begin
            writeln(c[i]);
            end;
     
            writeln('Codons le mot que vous souhaitez');
            writeln('Entrez lettre par lettre le mot en question:');
            for j:=1 to fin do
            begin
            	writeln('Entrez la',j,'-ieme lettre du mot:');
                    readln(reponse);
                    p[j]:=reponse;
                    begin
                              a[1]:='A'; a[fin]:='Z';
            		while (p[j]<>a[1] )AND (p[j]<>a[fin]) do
                            	IF p[j]>a[j] THEN
                                    REPEAT
                                    	a[j-1]:=a[j]
                                    UNTIL p[j]=a[j]	
    				ELSE
                            	REPEAT
                             		a[j+1]:=a[j];
                            	UNTIL p[j]=a[j];
                            IF p[j]=a[1] THEN a[j]:='A'
                                      ELSE a[j]:='Z';
                    end;
            end;
     
            for j:=1 to fin do
            writeln(p[j]);
            writeln;
     
            for j:=1 to fin do
            writeln('Ainsi, au rang',j,'les tableaux p et a correspondent');
            writeln;
            for j:=1 to fin do
                    begin
                    	IF odd(j) THEN nomcode[j]:=c[j]
                            ELSE nomcode[j]:='sym';
                    end;
                    writeln;
                    for j:=1 to fin do
                    writeln('Voici le mot apres chiffrage:');
                    writeln('<');
                    write(nomcode[j]);
                    writeln('>');
                    readln;
     
     
    END.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


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

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue !

    Les writeln du début s'effectuent bien mais disparaissent à cause du défilement de l'écran. Pour t'en convaincre, remplace les writeln par des write.

    Je pense qu'en indentant mieux ton code, tu aurais trouvé quelques erreurs.
    Il y a en effet des begin et end mal placés, à toi de les trouver. D'autres sont superflus et alourdissent inutilement le code.

    Soit dit en passant, tu pourrais remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    readln(reponse);
    p[j]:=reponse;
    par
    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
    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
    May,

    Pourquoi avoir défini tous ces types
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type  tabori=array[1..fin] of char;
          tabin=array[1..fin] of char;
          tabres=array[1..fin] of char;
          tabcomb=array[1..fin] of char;
    A moins d'avoir envisagé une évolution du programme pour que ces différents types correspondent finalement à des tailles différentes (auquel cas, il faudrait éviter d'utiliser la même constante pour définir les limites), tu obtiens des tableaux de même taille pour un même type, mais que Pascal va considérer comme différents, ce qui te posera problème.

    Avoir défini un maxlettre, c'est bien mais il faut poursuivre la démarche, et définir minlettre.

    Il faut utiliser des noms de variables explicites et clairs. À la lecture, je ne sais pas ce que représentent a,b...

    Pour la mise en forme, il faut soigner la présentation. Voici un exemple avec ton 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    program crypto;
     
    uses crt;
     
    const 
      fin = 26;
      maxlettre = 'Z';
    type  
      tabori = array[1..fin] of char;
      tabin = array[1..fin] of char;
      tabres = array[1..fin] of char;
      tabcomb = array[1..fin] of char;
      tabcode = array[1..fin] of string;
     
    var 
      a : tabori;
      b : tabin;
      c : tabres;
      p : tabcomb;
      nomcode : tabcode;
      lettre, reponse : char;
      i, j : integer;
     
    begin
     
      for lettre := 'A' to maxlettre do
      begin
        i := 1;
        a[i] := lettre;
        Inc(i, 1);
      end;
      Writeln('Tableau alphabetique initial');
      for i := 1 to fin do
      begin
        Writeln(a[i]);
      end;
     
      for i := 1 to fin do
      begin
        if Odd(i) then 
          b[i] := 'I'
        else 
          b[i] := 'O';
      end;
      for i := 1 to fin do
      begin
        Writeln(b[i]);
      end;
     
      for i := 1 to fin do
      begin
        if Odd(i) then 
          c[i] := a[i + 1]
        else 
          c[i] := a[i];
      end;
     
      for i := 1 to fin do
      begin
        Writeln(c[i]);
      end;
     
      Writeln('Codons le mot que vous souhaitez');
      Writeln('Entrez lettre par lettre le mot en question:');
      for j := 1 to fin do
      begin
        Writeln('Entrez la', j, '-ieme lettre du mot:');
        Readln(reponse);
        p[j] := reponse;
        begin
          a[1] := 'A'; 
          a[fin] := 'Z';
          while (p[j] <> a[1]) and (p[j] <> a[fin]) do
            if p[j] > a[j] then
              repeat
                a[j - 1] := a[j]
              until p[j] = a[j]  
            else
              repeat
                a[j + 1] := a[j];
              until p[j] = a[j];
          if p[j] = a[1] then 
            a[j] := 'A'
          else 
            a[j] := 'Z';
        end;
      end;
     
      for j := 1 to fin do
        Writeln(p[j]);
      Writeln;
     
      for j := 1 to fin do
        Writeln('Ainsi, au rang', j, 'les tableaux p et a correspondent');
      Writeln;
      for j := 1 to fin do
      begin
        if Odd(j) then 
          nomcode[j] := c[j]
        else 
          nomcode[j] := 'sym';
      end;
      Writeln;
      for j := 1 to fin do
        Writeln('Voici le mot apres chiffrage:');
      Writeln('<');
      Write(nomcode[j]);
      Writeln('>');
      Readln;
    end.
    À quoi il faut ajouter des commentaires.

    Et bien entendu, découper tout ça en procédures/fonctions...
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour vos réponses.
    Le but du miniprogramme était de coder un mot entré par l'utilisateur.

    Il s'agissait de trois tableaux à 1 dimension, accolés: le tableau a ,alphabétique, puis le tableau b, attribuant un 'I' à tout indice pair, un 'O' à tout indice impair, et le tableau c: si en face de l'indice i commun aux trois tableaux b[i]='I' alors on recopie a[i+1] dans b[i], sinon on recopie a[i] dans b[i].

    Illustration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    i  a[i]  b[i]  c[i]
    1   A     I     B
    2   B     O     B
    3   C     I     D
    4   D     O     D
    5   E     I     F 
    6   .     .     F
    .   .     .     .
    .   .     .     .
    .               .
    26  Z     O     Z
    A chaque lettre entrée, si la lettre du tableau a correspondante est parallèle à un 'I', alors la lettre codée devient la lettre du tableau c parallèle.
    Sinon la lettre devient 'sym'(car alors on a 'lettre O lettre').
    ex: Utilisateur tape A ==> A devient B.
    B==> B devient 'sym'.

    Le problème que j'ai rencontré était de faire en sorte que le programme identifie la lettre entrée et la compare à la lettre correspondante du tableau a, après quoi le codage se fait facilement.

    Comment faire en sorte que la lettre rentrée à l'indice j dans le tableau p se substitue à la même lettre dans le tableau a, indépendamment de l'indice j. Est-ce possible ou faut-il utiliser un tableau auxilliaire de type boolean qui se remplirait de la lettre entrée à l'indice j dans toutes ses 26 cases, et testerait l'égalité de la lettre avec la lettre correspondante du tableau a?

  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
    Hoe,

    Pour l'instant, ton problème n'en est pas un, car il en existe un beaucoup plus grave : une fois crypté, tu ne pourras pas retrouver le mot d'origine.

    Par exemple :
    - rentrons 'AB'.
    - codé ==> 'BB'

    et on ne peut pas savoir si les 'B' dans le mot codé étaient présents dans le mot d'origine, ou s'ils viennent du codage d'un 'A'.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    C'est vrai, Droggo, comme tel le codage ne mène à rien; je vais réfléchir, autant que faire se peut, pour trouver un codage plus raisonnable, après quoi je réécrirai un message pour avoir vos remarques.


    A bientôt.

Discussions similaires

  1. Exercice sur les tableaux
    Par sayari7 dans le forum Pascal
    Réponses: 2
    Dernier message: 06/12/2008, 15h23
  2. aide pour un exercice sur les tableaux
    Par mimiif dans le forum Caml
    Réponses: 9
    Dernier message: 30/05/2008, 15h49
  3. Réponses: 11
    Dernier message: 04/02/2008, 20h37
  4. Exercice sur les tableaux
    Par IDE dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 06/11/2006, 19h33

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