Programmation en Turbo Pascal

Résolu/Fermé
cheick-ha Messages postés 5 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 26 décembre 2008 - 7 déc. 2008 à 20:20
cheick-ha Messages postés 5 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 26 décembre 2008 - 11 déc. 2008 à 19:32
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.
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 déc. 2008 à 12:42
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
cheick-ha Messages postés 5 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 26 décembre 2008
11 déc. 2008 à 19:32
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