Aide!!!!!! (Turbo Pascal 1.5) SVP

Bonjour,
Je suiis nouveau dans le domaine de programmation avec Turbo Pascal.
Je veux un algrithme traduisé en Pascal qui sert à solver des équations du duxième degré et de troisième degré ,aussi un autre qui sert à trouver le P.G.C.D et le P.P.C.M.

Et merci,
Configuration: Windows XP
Netscape 8.1.3

5 réponses

  1. Modérateur
    Pour trouver une solution réelle d'une équation du 3è degré (x^3+ax^2+bx+c=0)
    function pgcd(a,b:integer):integer;
    begin
    if b=0 then result:=a
           else result:=pgcd(b,a mod b);
    end;
    
    function puiss(x:real;a,b:integer):real; // calcul de x^(a/b)
    var p:integer; ra,rb:real;
    begin
    if a=0 then exit(1.0);
    if b=0 then begin
                write('Calcul de puissance impossible. Appuyer sur Entree pour abandonner');
                readln; halt;
                end;
    if x=0 then exit(0.0);
    p:=pgcd(a,b);
    ra:=real(a div p);
    rb:=real(b div p);
    if a div 2=0
       then result:=exp(ra/rb*ln(abs(x)))
       else if b div 2=0
               then begin
               write('Calcul de puissance impossible. Appuyer sur Entree pour abandonner');
               readln; halt;
               end
               else begin
                    if x>0 then result:=exp(ra/rb*ln(x))
                           else result:=-exp(ra/rb*ln(x));
                    end;
    end;
    
    function RechercheSolution(a,b,c:real):real; // équation de la forme x^3+ax^2+bx+c=0
    var p,q,r,x1,x2,X:real;
    begin
    p:=b-puiss(a,2,3);
    q:=a/27.0*(2.0*puiss(a,2,1)-9.0*b)+c;
    r:=0.5*puiss(4.0*puiss(p,3,1)/27.0+puiss(q,2,1),1,2);
    x1:=puiss(-q/2.0+r,1,3);
    x2:=puiss(-q/2.0-r,1,3);
    X:=x1+x2;
    result:=X-a/3.0;
    end;
    PS. je n'ai fait que traduire en Pascal les résultats théoriques que j'ai trouvé ici
    0
    1. Modérateur
      Pour le pgcd, en utilisant (en récursif) l'algorithme d'Euclide, on a :
      function pgcd(a,b:integer):integer;
      begin
      if b=0 then result:=a
             else result:=pgcd(b,a mod b);
      end;
      Pour le ppcm, en utilisant la propriété a*b=pgcd(a,b)*ppcm(a,b), on a :
      function ppcm(a,b:integer):integer;
      begin
      result:=a*b div pgcd(a,b);
      end;
      -1
      1. Merci bcp mais il y a une erreur lors de la compilation.
        0
      2. Modérateur
        @ghost1Désolé, mais je n'ai pas Turbo Pascal 1.5, j'ai Dev-Pascal 1.9.2, il serait trop long de connaître toutes les interfaces (et versions) différentes du langage pascal... Chez moi j'ai testé le code et il marche très bien...
        Dans ppcm, essaye de mettre a*b entre parenthèse au cas où, mais sinon je ne vois pas de raison pour que ça plante...
        0
      3. @KXJ'ai essayé aussi avec Dev-Pascal 1.9.2 mais le même problème
        0
      4. Modérateur
        @ghost1Sans rien changé aux fonctions précédentes, voici un programme qui marche très bien sous Dev-Pascal :
        program Untitled1;
        
        function pgcd(a,b:integer):integer;
        begin
        if b=0 then result:=a
               else result:=pgcd(b,a mod b);
        end;
        
        function ppcm(a,b:integer):integer;
        begin
        result:=a*b div pgcd(a,b);
        end;
        
        var a,b:integer;
        begin
        write('a='); readln(a);
        write('b='); readln(b);
        writeln('pgcd=',pgcd(a,b));
        writeln('ppcm=',ppcm(a,b));
        readln;
        end.
        Si il ne marche pas chez toi, c'est un problème avec le logiciel, mais certainement pas avec le code.
        0
      5. @KXça marche, merci pour ton aide.
        0
    2. avez des connaissance en récursivité? si oui je donnerez la solution.
      -1
      1. pour le deuxieme degre:soiit trois variable a,b,c,d,x1,x2 de type reel:
        if(a+b+c=0) then
        begin
        x1:=1;
        x2:=a div c;
        end;
        else
        begin
        if(a-b+c=0)then
        begin
        x1:=-1;
        x2:=(-a) div c;
        end;
        else
        begin
        d:=(b*b)-(4*a*c);
        if(d>0) then
        begin
        ici placer la valeur pour delata superieur a zero avec delat=d
        end;
        else
        begin
        if(d<0)then
        begin
        ici placer les valeurs de x1 et x2 pour delta negatif avec delat=d
        end;
        else
        begin
        traitement pour d =0
        end;
        end;
        end;
        end;
        ici afficher les valeur de x1 et x2;
        end.
        j'ai fait de mon mieux car j'ai pas un compilateur TP et je code le plus de temps en vc++! désoler pour l'equation du troisieme degre et si t'as un pb avec ma solution j suis toujours la!
        0
        1. Merci beaucoup pour ton aide
          0
        2. Modérateur
          Je formalise en Pascal
          procedure SolutionSecondDegre(a,b,c:real;var x1,x2:real);
          var delta:real;
          begin
          writeln(a:0:3,'.x^2+',b:0:3,'.x+',c:0:3,'=0');
          x1:=0; x2:=0;
          if a=0 then if b=0 then if c=0 then writeln('R tout entier est solution')
                                         else writeln('Il n''y a pas de solution')
                             else begin
                                  x1:=-c/b; x2:=x1;
                                  writeln('Une solution (simple) : ',x1:0:5);
                                  end
                 else begin
                      delta:=b*b-4*a*c;
                      if delta<0 then writeln('Il n''y a pas de solution reelle');
                      if delta=0 then begin
                                      x1:=-b/(2*a); x2:=x1;
                                      writeln('Une solution (double) : ',x1:0:5);
                                      end;
                      if delta>0 then begin
                                      delta:=sqrt(delta);
                                      if a>0 then begin
                                                  x1:=(-b-delta)/(2*a); x2:=(-b+delta)/(2*a);
                                                  end
                                             else begin
                                                  x1:=(-b+delta)/(2*a); x2:=(-b-delta)/(2*a);
                                                  end;
                                      writeln('Il y a deux solutions reelles :',x1:0:5,' et ',x2:0:5);
                                      end;
                      end;
          end;
          0
      2. Bah pourquoi tu ne le fait pas alors ?
        -1