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

Free Pascal Discussion :

Produit de trois nombres positifs ou négatifs


Sujet :

Free Pascal

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut Produit de trois nombres positifs ou négatifs
    Bonjour,

    j'ai ce programme que je veux exécuter mais il retourne presque toujours le résultat "negatif".
    Quelle est la solution ?

    Regardez la photo.

    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 multiplication;
     
     
    var a,b,d,t,r :real;
     
       function mult (a:real; b:real):real;
       var c:real;
       begin
       c:=a*b;
       writeln('     ',a:0:0,'*',b:0:0,'=',c:0:0);
       end;
       begin
     
       write('donner une valeur: ');
       readln(a);
        write('donner une autre valeur: ');
       readln(b);
     
     
     
     
     
    begin
     
     
    readln(t);
     
    begin
    if(( mult(a,b)=0) and ( t= 0 )) then
     
     begin
     write ('null' );
     end
    else
     
    if(( mult(a,b)>0) and( t>0))  or (mult(a,b)<0) and( t<0)  then
     
     
    begin
    write ('le produit de a et b et t  est positif');
    end   else write ('negatif');
     
     end;
     
     end;
     
       end.
    Nom : negative.JPG
Affichages : 623
Taille : 91,9 Ko

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 15
    Points : 47
    Points
    47
    Par défaut
    de la ligne 36 efface ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    or (mult(a,b)<0) and( t<0)
    sinon je pense le code est lourd pour un simple test de produit de 3 nombres

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut
    Je n'ai pas compris "le code est lourd"

    Même chose il écrit negative regarde la photo

    Nom : meme chose negatif.JPG
Affichages : 534
Taille : 43,6 Ko

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Citation Envoyé par lkhalid Voir le message
    sinon je pense le code est lourd pour un simple test de produit de 3 nombres
    C'est le moins que l'on puisse dire...

    Est-ce que la "méthode" employée est liée à une contrainte de l'énoncé du problème ?
    Comment ferais-tu en mathématiques ? Dans le cas présent c'est quasiment la même chose.

    Il suffit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (a*b*t) >= 0 then
      WriteLn('Produit positif')
    else
      WriteLn('Produit négatif');
    C'est quand même pas sorcier, non ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut
    Mon prof m'a dit la solution avec une fonction.

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Ok, mais une fonction avec combien de paramètres: 2 ou 3 ?

    Cdlt

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut
    Trois.

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Dans ce cas, c'est pas vraiment difficile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function Produit3Positif(a,b,t: Real): Boolean;
    begin
      Produit3Negatif := (a*b*t) >= 0;
    End;
    Cela ne suffit-il pas ?

    cdlt

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut
    Nom : fonction produit 3.JPG
Affichages : 535
Taille : 70,1 Ko

  10. #10
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Petite bêtise de ma part, mais tu aurais pu corriger par toi-même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Produit3Positif(a,b,t: Real): Boolean;
    begin
      Produit3Positif := (a*b*t) >= 0;
    End;

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut
    Regarde ça, est-ce que c'est bien ?
    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
    program produit33333;
     
     
     
    function Produit3Positif(a,b,t: Real): Boolean;
     
    begin
      Produit3Positif := (a*b*t) >= 0;
    End;
    function Produit3negatif(a,b,t: Real): Boolean;
     
    begin
      Produit3negatif := (a*b*t) <= 0;
    End;
    var a,b,j,h,y,t:real;
    begin
     
      write('donner une valeur: ');
       readln(j);
        write('donner une autre valeur: ');
       readln(h);
     
    writeln('produit');
    readln(y);
    Produit3Positif(j,h,y);
    readln;
    end.

  12. #12
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Deux choses que tu dois retenir
    - place ton code dans des balises code (bouton # de l'éditeur)
    - indente 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
    program produit33333;
     
    function Produit3Positif(a,b,t: Real): Boolean;
    begin
      Produit3Positif := (a*b*t) >= 0;
    End;
     
    function Produit3negatif(a,b,t: Real): Boolean;
    begin
      Produit3negatif := (a*b*t) <= 0;
    End;
     
    var
      a,b,j,h,y,t:real;
    begin
      write('donner une valeur: ');
      readln(j);
      write('donner une autre valeur: ');
      readln(h);
     
      writeln('produit');
      readln(y);
      Produit3Positif(j,h,y);
      readln;
    end.
    Remarque bien que tes deux fonctions ont le même résultat si l'un des paramètres est nul. Les variables a,b et t ne servent à rien.
    La variable y est un terme du produit, pas le produit lui-même. Si tel était le cas, le produit obtenu serait toujours positif ou nul (cherche pourquoi).

    @+

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut
    Je n'ai pas trouvé de grand solution j'ai pas le temps j'ai interrogation.
    Après peut-être.

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    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
    
    program multiplication;
    var a,b,d,t,r :real;
    function mult (a:real; b:real):real;
      var c:real;
    begin
      c:=a*b;
      writeln('     ',a:0:0,'*',b:0:0,'=',c:0:0);
    end;
    
    begin
       write('donner une valeur: ');
       readln(a);
       write('donner une autre valeur: ');
       readln(b);
    //  begin
       readln(t);
    // begin
      if(  (a=0) or (b=0) or (t= 0 )) then
      begin
         write ('null' );
      end
      else
      if(( mult(a,b)>0) and( t>0))  or ( (mult(a,b)<0) and( t<0) )  then
      begin
         write ('le produit de a et b et t  est positif');
      end   
      else 
        write ('negatif');
    //end;
    // end;
     
    end.
    pour faire simple ta condition etait toujours fausse du fait que ton or ne contenais pas la condition and t<0

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par anapurna Voir le message
    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
    
    program multiplication;
    var a,b,d,t,r :real;
    function mult (a:real; b:real):real;
      var c:real;
    begin
      c:=a*b;
      writeln('     ',a:0:0,'*',b:0:0,'=',c:0:0);
    end;
    
    begin
       write('donner une valeur: ');
       readln(a);
       write('donner une autre valeur: ');
       readln(b);
    //  begin
       readln(t);
    // begin
      if(  (a=0) or (b=0) or (t= 0 )) then
      begin
         write ('null' );
      end
      else
      if(( mult(a,b)>0) and( t>0))  or ( (mult(a,b)<0) and( t<0) )  then
      begin
         write ('le produit de a et b et t  est positif');
      end   
      else 
        write ('negatif');
    //end;
    // end;
     
    end.
    pour faire simple ta condition etait toujours fausse du fait que ton or ne contenais pas la condition and t<0


    j'ai pas compris t<0 j'ai ecrit (mult(a,b)<0) and( t<0)

  16. #16
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    Prenons un exemple avec a=-2 ; b=-5 et t=+1
    Test avec ton code initial :
    if(( mult(a,b)>0) and( t>0)) or mult(a,b)<0) and( t<0) then
    begin
    write ('le produit de a et b et t est positif');
    end
    (mult(a,b)>0)and(t>0)) => true (car mult(a,b)=+10>0 et t=+1>0)
    ( mult(a,b)>0) and( t>0)) or (mult(a,b)<0) => true (car mult(a,b) and (t>0)=true)
    Donc ( mult(a,b)>0) and( t>0)) or (mult(a,b)<0) and( t<0) => false car t=+1>0

    Le résultat impliquerait donc que a*b*t est negatif alors que (-2)*(-5)*(+1)=+10.

    Test avec les parentheses rajoutées par Anapurna :
    if(( mult(a,b)>0) and( t>0)) or ( (mult(a,b)<0) and( t<0) ) then
    begin
    write ('le produit de a et b et t est positif');
    end
    On a mult(a,b)>0) and( t>0) = true car mult(a,b)=+10>0 et t=+1>0.
    mult(a,b)<0) and( t<0) = false car mult(a,b)=+10>0
    Donc ( mult(a,b)>0) and( t>0)) or ( (mult(a,b)<0) and( t<0))= true

    Sinon, d'autre part, il y a autre chose qui ne va pas dans la fonction mult :
    function mult (a:real; b:real):real;
    var c:real;
    begin
    c:=a*b;
    writeln(' ',a:0:0,'*',b:0:0,'=',c:0:0);
    end;
    Elle ne retournera rien... Le résultat d'une function doit etre renvoyé soit par l'instruction 'result' soit par le nom de la function 'mult' (et non par une autre variable avec laquelle l'ordinateur ne comprendra pas que c'est celle-ci). Regarde dans les manuels pour en savoir davantage.

    A bientôt et bon noël.

  17. #17
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Ce qu'a écrit Anapurna est pourtant clair, il te manque des parenthèses, relis attentivement...

    Sinon, je te propose une alternative:
    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
     
    function SignOf(const Value: Real): Real;
    begin
      if (Value = 0) then //  attention: la comparaison d'un réel à 0 est toujours un peu risquée
        Result := 0
      else if (Value<0) then
        Result := -1
      else
        Result := +1;
    End;
     
    var
       res: Double;
    begin
      res := SignOf(mult (a,b)) * SignOf(t);
      if (res = 0) then
        WriteLn('Produit nul')
      else if (res>0) then
        WriteLn('Produit positif')
      else
        WriteLn('Produit négatif');
    End;
    // code non testé.
    C'est un peu lourd mais on n'est plus à ça près. La comparaison directe du produit à trois valeurs comme je l'ai déjà écrit dans une précédente réponse est largement suffisante.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    A part le fait que le source est très lourd, l'erreur réside dans la fonction mult qui ne renvoie aucun résultat.
    Il faut bien sûr ajouter mult:=a*b dans la fonction pour qu'elle renvoie le résultat souhaité.

Discussions similaires

  1. [Turbo Pascal] Tri de nombres positifs et négatifs
    Par khmamed dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/03/2011, 17h40
  2. [Affichage] nombres +positifs/-négatifs
    Par Commodore dans le forum Excel
    Réponses: 2
    Dernier message: 18/01/2008, 16h21
  3. nombre aléatoire positif et négatif
    Par isatis28 dans le forum C
    Réponses: 18
    Dernier message: 22/11/2006, 11h53
  4. Réponses: 7
    Dernier message: 22/04/2005, 14h27
  5. Algorithme pour trier trois nombres
    Par legosam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 17/01/2005, 21h47

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