Programmation en Turbo Pascal

Résolu
cheick-ha Messages postés 5 Statut Membre -  
cheick-ha Messages postés 5 Statut Membre -
Bonjour,
je suis un débutant dans la programmation et j'ai un exercice en turbo Pascal que je n'arrive pas a resoudre convenablement.
il sagit d'un programme qui resoud une équation du sécond dégré de la forme ( ax²+bx+c) et qui affiche les solutions X1 et X2 si possible a l'aide d'un MENU. si non afficher un message d'erreur.
l'utilisateur devrat entrer au clavier les valeurs de 'a' 'b' et 'c'
si dessou le programme que j'ai écris mais qui ne foctionne pas correctement.

program second_d;
uses crt;
var a,b,c,d: integer;
X1, X2: real;
rep1: char;

procedure saisie;
var rep: char;
begin
repeat
repeat
writeln(' entrez a:');
readln (a);
writeln(' entrez b:');
readln(b);
writeln(' entrez c:');
readln(c);
until (a <> 0);
writeln('confirmez-vous?');
readln (rep);
until rep in [ 'O', 'o'];
end;

procedure resultat;
begin
d:= b*b - (4*a*c);
if d<0 then
writeln(' pas de solution') ;
else
X1:= (-b - sqrt(d)) / 2*a;
X2:= (-b + sqrt(d)) / 2*a;
writeln ('X1=',X1,' et X2=',X2);
end;

begin
clrscr;
repeat
writeln('entrez votre choix SVP');
writeln(' S : saisir');
writeln(' R : resultat');
writeln(' F : fin');
readln (rep1);
case rep1 of
'S','s': saisie ;
'R','r': resultat ;
'F','f': writeln(' fin au revoir');
else
writeln('cette instruction n''est pas prise en compte');
end;
until rep1 in ['f','F']

end.

je prie quiconque capable de m'aider de bien vouloir me donner des conseils et astuce pour resoudre mon problème.
Configuration: Windows XP
Internet Explorer 6.0

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Dans tous le code, il est plus clair de mettre write('entrez ...'); readln(...); sur la même ligne
    De plus tu n'utilises que des variables globales alors que des locales suffiraient

    ligne 2 : uses crt; ne sert que pour clrscr, c'est à dire à rien (l'écran est systématiquement effacé au démarrage)
    ligne 3 : tu prends a,b,c,d integer, ça marche très bien avec des real (de toute façon ton résultat est real)

    ligne 18 : until (a<>0); soit tu fais les procédures de résolution au degré 1 et 0 soit tu expliques pourquoi tu boucles : writeln('/!\ a=0'); et à la limite tu place ton until a<>0 juste sur le a
    ligne 19 : précises que c'est un O que tu veux pour confirmer de plus ton programme est court, ce n'est pas la peine de s'embeter avec une vérification
    ligne 28 : utilise plutôt sqr(b) que b*b quand tu peux
    ligne 30 : writeln('pas de racines réelles'), on pourrait faire le calcul en complexe
    ligne 30 : pas de point virgule avant else
    ligne 32 à 34 : il faut encadrer tes instructions par begin end
    ligne 32, 33 : n'oublie pas les parenthèses : / (2*a);
    ligne 40 : pour l'affichage des réels il vaudrait mieux préciser le nombre de chiffres significatifs : writeln(X:0:5);

    En ce qui concerne ton programme principal (ormi l'utilisation des variables globales à revoir), étant donné que ton programme est court il n'est pas nécessaire de faire ce genre de boucle (très lourde), de plus si tu dis au revoir, peut-être faudrait-il dire bonjour...
    Ensuite tu pourrais aérer la console pour l'utilisateur avec quelques writeln ici ou là
    program second_d;
    
    var a,b,c,d:integer;
        X1,X2: real;
        rep1: char;
    
    procedure saisie;
    var rep: char;
    begin
         repeat
               repeat    
               writeln;
               write('Entrez a : '); readln(a);
               if a=0 then writeln('/!\ a=0');
               until (a<>0);
         write('Entrez b : '); readln(b);
         write('Entrez c : '); readln(c);
         writeln;
         write('Confirmez-vous ? (O/N) '); readln (rep);
         until rep in ['O','o'];
    end;
    
    procedure resultat;
    begin
    d:= sqr(b)-(4*a*c);
    if d<0 then writeln('Il n''y a pas de racines reelles')
           else begin
                X1:= (-b-sqrt(d))/(2*a);
                X2:= (-b+sqrt(d))/(2*a);
                writeln;
                writeln('X1=',X1:0:5,' et X2=',X2:0:5);
                end;
    end;
    
    begin
    writeln('Bonjour, calculons les racines de aX^2+bX+c=0');
         repeat
         saisie;
         resultat;
         writeln;
         writeln('Voulez-vous continuer ? (O/N)'); readln (rep1);
         until rep1 in ['N','n'];
    write('Au revoir'); readln; 
    
    end.
    Enfin, pour bien comprendre mes remarques sur les variables globales voici ce qu'on pourrait faire :
    program second_d;
    
    procedure saisie(var a,b,c:integer);
    begin
         repeat
         writeln;
         write('Entrez a : '); readln(a);
         if a=0 then writeln('/!\ a=0');
         until (a<>0);
    write('Entrez b : '); readln(b);
    write('Entrez c : '); readln(c);
    writeln;
    end;
    
    procedure resultat(a,b,c:integer);
    var d:integer;
    begin
    d:=sqr(b)-(4*a*c);
    if d<0 then writeln('Il n''y a pas de racines reelles')
           else begin
                writeln;
                writeln('X1 = ',(-b-sqrt(d))/(2*a):0:5,
                    ' et X2 = ',(-b+sqrt(d))/(2*a):0:5);
                end;
    end;
    
    var a,b,c:integer;
    begin
    writeln('Bonjour, calculons les racines de aX^2+bX+c=0');
    while true do
         begin
         saisie(a,b,c);  // l'intéret c'est que les a,b,c ont la même valeur dans
         resultat(a,b,c);// les procédures mais sans pour autant porté le même nom
         writeln;
         end;
    
    end.
    Utiliser des fonctions et procédures avec des paramètres permet de mieux les réutiliser ultérieurement...
    1
    1. cheick-ha Messages postés 5 Statut Membre
       
      merci bien d'avoir prèté attention a mes préocupations et aussi merci pour l'aide que vous m' aportez.
      je m'éforcerai de faire attention et de suivre les conseils que vous m'avez donner.
      0