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 :

Tables de multiplications


Sujet :

Pascal

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut Tables de multiplications
    Salut à tous !

    j'ai un énoncé qui me demande d'écrire un programme Pascal permettant de saisir 2 entiers X et Y (0<X<=9 et 0<Y<=9) et d'afficher la table de multiplication selon le modele suivant :

    Exemple : pour X=4 et Y=5 le programme affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
                                      1    2    3    4    5
                                 1    1    2    3    4    5
                                 2    2    4    6    8   10
                                 3    3    6    9   12   15
    J'ai essayé de le 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    program traitement;
    uses wincrt;
    var
        x,y:integer;
         procedure saisir1(var x:integer);
         begin
             repeat
                  writeln('donner un entier x:');
             until x in [0..9];
         end;
     
         procedure saisir2(var y:integer);
         begin
             repeat
                  writeln ('donner un entier y:');
             until y in [0..9];
         end;
     
         procedure multiplier(var i:integer ; var j:integer);
            var
               x,y:integer;
            begin
                    for i:=1 to x do
     
                        begin
                            write(i:5);
                            write(' ');
     
                            for j:=1 to y do
                                begin
                                    write(i * j:4);
     
                                end;
                            write('  ');
                        end;
     
            end;
     
     
    begin
     
         saisir1(x);
         saisir2(y);
         multiplier(i,j);
     
    end.
    mais mon problème c'est que je n'ai pas pu faire le décalage entre la 1ere ligne horizontale et la première colonne verticale, c.a.d j'ai comme affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                                 1    1    2    3    4    5
                                 2    2    4    6    8   10
                                 3    3    6    9   12   15
                                 4    4    8   12   16   20
    Je voudrais que quelqu'un m'aide, merci infiniment

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    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 938
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue !

    Tu as dû mal copier/coller ton code, ça ne compile pas du tout et il manque des instructions.

    Tout d'abord, dans les procédures saisir1 et saisir2, il manque le ReadLn. Mais restons sur ces deux procédures : elles font exactement la même chose, hormis que le message à l'écran est différent : "x" pour saisir1 et "y" pour saisir2. Une des facilités permises, justement, par l'écriture de sous-routines est d'éviter d'écrire plusieurs fois la même chose. Je pense donc que tu pourrais écrire une seule procédure de saisie, à laquelle tu passerais l'information "x" ou "y" à afficher comme paramètre.

    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure saisir (invite : Char; var x : integer);
    Begin
      repeat
        write('donner un entier ',invite,' : ');
        ReadLn(x);
      until x in [0..9];
    End;
    Et dans le programme principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      saisir('x',x);
      saisir('y',y);
    Attention, l'en-tête de la procédure multiplier est erroné. i et j sont des variables locales à la procédure, et non des paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Procedure multiplier;
    Var i, j : integer;
    Begin
    De plus, la procédure multiplier utilise directement les variables globales x et y. C'est une mauvaise idée, une habitude à ne surtout pas prendre ! Une procédure doit être vue comme un tout hermétique qui doit recevoir tout ce dont elle a besoin sous forme de paramètres. L'en-tête de la procédure devrait donc être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Procedure multiplier (x, y : integer);
    Var i, j : integer;
    Begin
    A présent, pour ton problème de décalage à l'écran : tu pourrais y remédier en commençant par afficher les indices de 1 à x dans une boucle séparée. N'oublie pas les WriteLn pour passer à la ligne. Cela pourrait donner quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      write('     ');
      for i := 1 to x do
        write(i:5);
      WriteLn;
      for i := 1 to x do
        begin
          write(i:5);
          for j := 1 to y do
            begin
              write(i * j:5);
            end;
          WriteLn;
        end;
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    merci pour votre reponse assez rapide
    voila la correction
    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 traitement;
    uses wincrt;
    var
        x,y:integer;
         procedure saisir1(var x:integer);
         begin
             repeat
                  writeln('donner un entier x:');
                  readln(x);
             until x in [0..9];
         end;
     
         procedure saisir2(var y:integer);
         begin
             repeat
                  writeln ('donner un entier y:');
                  readln(y);
             until y in [0..9];
         end;
     
         procedure multiplier( x:integer;  y:integer);
            var
               i,j:integer;
            begin
                     write('  ');
                    for i:=1 to x do
     
                        begin
                            write(i:5);
     
                        end;
                    writeln;
                    for i:=1to x do
                        begin
                            write(i:5);
                            for j:=1 to y do
                                begin
                                    write(i * j:4);
     
                                end;
                            writeLn;
                        end;
     
            end;
     
     
    begin
     
         saisir1(x);
         saisir2(y);
         multiplier(x,y);
     
     
    end.
    mais j'ai un petit soucis lorsque je fais l'execution pour l'exemple x=4 et y=5 n'affiche pas dans la 1ere ligne 5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                                       1    2    3    4    
                                 1    1    2    3    4    5
                                 2    2    4    6    8   10
                                 3    3    6    9   12   15
                                 4    4    8   12   16   20
    meci d'avance

  4. #4
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Ça, c'est un simple problème de sortie de boucle.
    Réfléchis, fais des essais & tu trouveras tout seul.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

Discussions similaires

  1. [ADO.NET] remplaire datagrid "depuis table relation multiple"
    Par hoda dans le forum Accès aux données
    Réponses: 3
    Dernier message: 05/12/2006, 08h49
  2. Réponses: 1
    Dernier message: 29/09/2006, 10h43
  3. table de multiplication
    Par spacergirly dans le forum Excel
    Réponses: 3
    Dernier message: 21/09/2006, 17h24
  4. [T-SQL] exécuter un ALTER TABLE/COLUM multiple
    Par elderion dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/10/2005, 16h06

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