1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 20
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2016
    Messages : 7
    Points : 6
    Points
    6

    Par défaut Programme produit scalaire

    Bonjour , je ne comprend pas pourquoi mon programme ne marche pas. Je souhaiterais calculer le produit scalaire de deux vecteurs dans R10. A l'execution il ne me donne la possibilté de lire que cinq coordonnées et ecrit deux fois "entrez les coordonnées" . Enfin malgré un readln, il se ferme automatiquement.
    Merci de votre aide .

    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
    program scalaire;
     
     
    const
    vmax =2;
    cmax=10 ;
     
    type
    coordonee=array[1..cmax,1..vmax] of integer;
     
    var
    tab:coordonee;
    i,j: integer;
    prodscalaire:real;
    multiplication: real;
     
    begin
     
    for i:=1 to cmax do
     begin
        for j:=1 to vmax do
        writeln('entrez les coordonnees');
        readln(tab[i,j]);
        write(tab[i,j]);
     end;
     writeLn  ;
    end;
     
    prodscalaire :=0;
     
    for i:=1 to cmax do
     begin
         multiplication:=1;
        for j:=1 to vmax do
        multiplication:=multiplication*tab[i,j];
        writeln('multiplication vaut', multiplication);
     end;
     
    prodscalaire:=prodscalaire +multiplication ;
    writeln('le produit scalaire est : ',prodscalaire);
    readln;
     
    end.

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    juin 2002
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : juin 2002
    Messages : 231
    Points : 623
    Points
    623

    Par défaut

    Bonjour.

    Ce programme contient plusieurs erreurs.

    En Pascal, un begin est toujours associé à un end.
    Ici, le end de la ligne 25 correspond au begin de la ligne 20.
    Et le end de la ligne 27 correspond au begin de la ligne 17.

    Comme ce dernier marque le début du corps du programme, le end de la ligne 27 marque la fin du programme.
    C'est pourquoi ce programme s'arrête aussi rapidement.
    La présence d'un readln à la ligne 41 n'a aucune importance puisque le programme ne va pas jusque là ...

    Normalement, ce programme ne passe pas la compilation avec TP ou FP, car un programme Pascal se termine avec begin. et non avec begin;

    D'autre part, il y a une erreur dans les lignes 21 à 24.
    La boucle déclarée en ligne 21 n'exécute qu'une instruction, celle de la ligne 22, puisqu'il n'y a pas de begin qui suit le do.
    Les instructions des lignes 23 et 24 sont donc exécutées avec j = 2, valeur de j à la sortie de la boucle.
    Ce n'est certainement pas ce qui était voulu au départ ...

    Il y a encore des erreurs au niveau du produit scalaire, mais il vaut mieux commencer par corriger les erreurs signalées ci-dessus.
    On y verra plus clair ensuite.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 20
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2016
    Messages : 7
    Points : 6
    Points
    6

    Par défaut

    VECTEURS.pas
    Je vous remercie de votre réponse. Ci dessus et en pièces jointes, mon programme corrigé avec vos remarques.
    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
    const
    vmax =2;
    cmax=10 ;
     
    type
    coordonee=array[1..cmax,1..vmax] of integer;
     
    var
    tab:coordonee;
    i,j: integer;
    prodscalaire:real;
    multiplication: real;
     
    begin
     
    for i:=1 to cmax do
     begin
        for j:=1 to vmax do
            Begin
             writeln('entrez les coordonnees du vecteur');
             readln(tab[i,j]);
             write(tab[i,j]);
            end;
       writeLn  ;
     end;
     
    prodscalaire :=0;
     
    for i:=1 to cmax do
     begin
        multiplication:=1;
        for j:=1 to vmax do
         begin
          multiplication:=multiplication*tab[i,j];
          writeln('multiplication vaut', multiplication);
         end;
     
       prodscalaire:=prodscalaire +multiplication ;
     end;
     
    writeln('le produit scalaire est : ',prodscalaire);
    readln;
     
    end.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    juin 2002
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : juin 2002
    Messages : 231
    Points : 623
    Points
    623

    Par défaut

    Bonjour.

    Effectivement, les deux erreurs que j'avais expliquées ont été corrigées.
    Quant à l'erreur dans le calcul du produit scalaire, erreur que j'avais seulement évoquée, elle a aussi été corrigée !

    En effet, l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prodscalaire:=prodscalaire +multiplication ;
    qui figurait à la ligne 39 du premier listing, était en dehors de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i:=1 to cmax do
     begin
         multiplication:=1;
        for j:=1 to vmax do
        multiplication:=multiplication*tab[i,j];
        writeln('multiplication vaut', multiplication);
     end;
    Dans le deuxième listing, elle est bien à sa place comme dernière instruction de la boucle.

    En résumé, votre programme actuel est correct.

    Par contre, on peut l'améliorer en le simplifiant et en rendant l'interface utilisateur plus conviviale.

    Remarquons que le produit scalaire n'a de sens que pour deux vecteurs.
    La constante vmax sera donc toujours égale à 2, alors que la constante cmax est arbitaire.
    Je propose donc de remplacer le tableau tab à deux indices par deux vecteurs à un seul indice.
    Ce sera plus clair pour tout le monde.

    Les coordonnées étant entières, j'ai opté pour un produit scalaire entier aussi.
    Cela simplifie l'affichage du résultat.
    Si vous avez vraiment besoin de réels, il suffira de modifier le type vecteur et le type de prodscalaire.

    J'ai ensuite modifié l'entrée des coordonnées pour la rendre plus conviviale.
    Pour finir, j'ai supprimé l'affichage des multiplications intermédiaires : c'est utile pour faire des vérifications dans la phase d'écriture du programme, mais sans intérêt quand le programme est validé.

    Je vous propose donc cette version :

    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
    Program produit_scalaire;
     
    const
      cmax = 10;
     
    type
      vecteur = array[1..cmax] of integer;
     
    var
      u,v : vecteur;
      i,j : integer;
      prodscalaire : integer;
     
    begin
     
    for i := 1 to cmax do
      begin
        write('entrez u[',i,'] : ');
        readln(u[i]);
        write('entrez v[',i,'] : ');
        readln(v[i]);
        writeln  ;
      end;
     
    prodscalaire := 0;
    for i := 1 to cmax do
      prodscalaire := prodscalaire + u[i]*v[i];
     
    writeln('Le produit scalaire de u et v est : ',prodscalaire);
    readln;
     
    end.

Discussions similaires

  1. produit scalaire de 2 string
    Par nypahe dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 09h49
  2. calcul de produit scalaire sous PHP
    Par abegault dans le forum Débuter
    Réponses: 5
    Dernier message: 21/05/2008, 14h41
  3. produit scalaire de 2 vecteurs
    Par aroua dans le forum Débuter
    Réponses: 2
    Dernier message: 07/04/2008, 13h06
  4. Produit scalaire en méta-prog, problème :p
    Par Bakura dans le forum C++
    Réponses: 5
    Dernier message: 12/06/2007, 16h03
  5. Angle entre deux droites quelconques par produit scalaire
    Par cyber_N dans le forum Mathématiques
    Réponses: 6
    Dernier message: 22/05/2005, 20h46

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