Probleme turbo pascal
melissav2004
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
je n'arrive pas a différencier l'équation impossible et l'équation indéterminée.
est ce que qqun sait m'aider ds mon programme merci.
program systeme;
uses wincrt;
{Résolution de systèmes linéaires par la
méthode du pivot partie de Gauss;
on forme une matrice triangulaire supérieure }
type
matrice = array[1..3,1..3] of real;
vecteur = array[1..3] of real;
var
X,Y : vecteur;
A : matrice;
x1,x2:real;
procedure afficheSyst(A : matrice; Y : vecteur);
var
i,j : integer;
begin
for i:=1 to 3 do
begin
write(A[i,1]:0:0,' x',1);
for j:=2 to 3 do write(' + ',A[i,j]:0:0,' x',j);
writeln(' = ',Y[i]:0:0);
end;
end; { afficheSys }
procedure afficheSol(X : vecteur);
var
i : integer;
begin
for i:=1 to 3 do writeln('x',i,' = ', x[i]:0:3);
end; { afficheSol }
procedure lireVecteur(var V : vecteur);
var
i : integer;
begin
for i:=1 to 3 do
begin
write('Coordonnée ',i,' : ');
readln(V[i]);
end;
end; { lireVecteur }
procedure lireMatrice(var M : matrice);
var
i,j : integer;
begin
for i:=1 to 3 do
begin
writeln('Ligne ',i,' :');
for j:=1 to 3 do readln(M[i,j]);
end;
end; { lireMatrice }
procedure resTriangleSup(A: matrice; Y : vecteur; var X : vecteur);
var
i,j : integer;
begin
for i:=3 downto 1 do
begin
for j:=i+1 to 3 do
begin
Y[i]:=Y[i]-A[i,j]*X[j];
end;
X[i]:=Y[i]/A[i,i];
end;
end; { resTriangleSup }
procedure gaussPartiel(A : matrice; Y : vecteur; var X : vecteur);
const
presqueZero = 1e-8;
var
i,j,k,imax : integer;
max,temp, t1, t2, t3 : real;
SI : boolean;
begin
SI := false;
for i := 1 to 2 do
begin
for j := i+1 to 3 do
begin
t1 := A[i,1]/A[j,1];
t2 := A[i,2]/A[j,2];
t3 := A[i,3]/A[j,3];
if (t1 = t2) and (t2= t3) then
begin
if (Y[i] <> Y[j]*t1) then
begin
writeln ('Système impossible');
SI := true;
end;
end;
end;
end;
if (SI = false) then
begin
for k:=1 to 3 do
begin
{recherche du pivot dans la colonne k}
imax:=k; max:=abs(A[k,k]);
for i:=k+1 to 3 do
if abs(A[i,k])>max then
begin
imax:=i;
max:=abs(A[i,k]);
end;
if max<presquezero then
begin
writeln('équation indéterminée.');
halt(1);
end;
{échange de la ligne k et de la ligne imax}
for j:=k to 3 do
begin
temp:=A[k,j];
A[k,j]:=A[imax,j];
A[imax,j]:=temp;
end;
{ne pas oublier le second membre}
temp:=Y[k];
Y[k]:=Y[imax];
Y[imax]:=temp;
{élimination dans la colonne k des termes sous la ligne k}
for i:=k+1 to 3 do
begin
temp:=A[i,k]/A[k,k];
for j:=k to 3 do A[i,j]:=A[i,j]-A[k,j]*temp;
Y[i]:=Y[i]-Y[k]*temp;
end;
end;
end;
resTriangleSup(A,Y,X);
end; { gausspartiel }
begin
writeln('Entrer la matrice A.');
lireMatrice(A);
writeln;
writeln('Entrer le vecteur Y');
lireVecteur(Y);
writeln;
writeln('Voici le système avec les inconnues x1, x2, x3');
afficheSyst(A,Y);
gausspartiel(A,Y,X);
writeln;
afficheSol(X);
end.
je n'arrive pas a différencier l'équation impossible et l'équation indéterminée.
est ce que qqun sait m'aider ds mon programme merci.
program systeme;
uses wincrt;
{Résolution de systèmes linéaires par la
méthode du pivot partie de Gauss;
on forme une matrice triangulaire supérieure }
type
matrice = array[1..3,1..3] of real;
vecteur = array[1..3] of real;
var
X,Y : vecteur;
A : matrice;
x1,x2:real;
procedure afficheSyst(A : matrice; Y : vecteur);
var
i,j : integer;
begin
for i:=1 to 3 do
begin
write(A[i,1]:0:0,' x',1);
for j:=2 to 3 do write(' + ',A[i,j]:0:0,' x',j);
writeln(' = ',Y[i]:0:0);
end;
end; { afficheSys }
procedure afficheSol(X : vecteur);
var
i : integer;
begin
for i:=1 to 3 do writeln('x',i,' = ', x[i]:0:3);
end; { afficheSol }
procedure lireVecteur(var V : vecteur);
var
i : integer;
begin
for i:=1 to 3 do
begin
write('Coordonnée ',i,' : ');
readln(V[i]);
end;
end; { lireVecteur }
procedure lireMatrice(var M : matrice);
var
i,j : integer;
begin
for i:=1 to 3 do
begin
writeln('Ligne ',i,' :');
for j:=1 to 3 do readln(M[i,j]);
end;
end; { lireMatrice }
procedure resTriangleSup(A: matrice; Y : vecteur; var X : vecteur);
var
i,j : integer;
begin
for i:=3 downto 1 do
begin
for j:=i+1 to 3 do
begin
Y[i]:=Y[i]-A[i,j]*X[j];
end;
X[i]:=Y[i]/A[i,i];
end;
end; { resTriangleSup }
procedure gaussPartiel(A : matrice; Y : vecteur; var X : vecteur);
const
presqueZero = 1e-8;
var
i,j,k,imax : integer;
max,temp, t1, t2, t3 : real;
SI : boolean;
begin
SI := false;
for i := 1 to 2 do
begin
for j := i+1 to 3 do
begin
t1 := A[i,1]/A[j,1];
t2 := A[i,2]/A[j,2];
t3 := A[i,3]/A[j,3];
if (t1 = t2) and (t2= t3) then
begin
if (Y[i] <> Y[j]*t1) then
begin
writeln ('Système impossible');
SI := true;
end;
end;
end;
end;
if (SI = false) then
begin
for k:=1 to 3 do
begin
{recherche du pivot dans la colonne k}
imax:=k; max:=abs(A[k,k]);
for i:=k+1 to 3 do
if abs(A[i,k])>max then
begin
imax:=i;
max:=abs(A[i,k]);
end;
if max<presquezero then
begin
writeln('équation indéterminée.');
halt(1);
end;
{échange de la ligne k et de la ligne imax}
for j:=k to 3 do
begin
temp:=A[k,j];
A[k,j]:=A[imax,j];
A[imax,j]:=temp;
end;
{ne pas oublier le second membre}
temp:=Y[k];
Y[k]:=Y[imax];
Y[imax]:=temp;
{élimination dans la colonne k des termes sous la ligne k}
for i:=k+1 to 3 do
begin
temp:=A[i,k]/A[k,k];
for j:=k to 3 do A[i,j]:=A[i,j]-A[k,j]*temp;
Y[i]:=Y[i]-Y[k]*temp;
end;
end;
end;
resTriangleSup(A,Y,X);
end; { gausspartiel }
begin
writeln('Entrer la matrice A.');
lireMatrice(A);
writeln;
writeln('Entrer le vecteur Y');
lireVecteur(Y);
writeln;
writeln('Voici le système avec les inconnues x1, x2, x3');
afficheSyst(A,Y);
gausspartiel(A,Y,X);
writeln;
afficheSol(X);
end.
A voir également:
- Probleme turbo pascal
- Turbo pascal - Télécharger - Édition & Programmation
- My pascal - Télécharger - Édition & Programmation
- Dev pascal - Télécharger - Édition & Programmation
- Turbo sim inconvénient - Forum iPhone
- Turbo meeting - Télécharger - Messagerie
4 réponses
Voici la programmation Pascal de l'algorithme de Gauss Jordan dont je parlais plus haut.
Il permet la résolution de systèmes de n équations à n inconnues :
La confiance n'exclut pas le contrôle
Il permet la résolution de systèmes de n équations à n inconnues :
program GaussJordan; const Nmax=10; type Systeme=record n:integer; a:array[1..Nmax,1..Nmax] of real; b:array[1..Nmax] of real; end; procedure EditerSysteme(var s:Systeme); var i,j:integer; begin write('Dimension de la matrice : n='); readln(s.n); writeln; for i:=1 to s.n do begin writeln('Ligne ',i,' : '); writeln; for j:=1 to s.n do begin write('a[',i,',',j,']='); readln(s.a[i,j]); end; writeln; write('b[',i,']='); readln(s.b[i]); writeln; end; end; procedure Elimination_Gauss_Jordan(var s:Systeme); var i,j,k:integer; c,d:real; begin for i:=1 to s.n do begin c:=s.a[i,i]; if c=0 then begin writeln('Erreur : coefficient nul en ',i,'eme ligne, ',i,'eme colonne'); writeln; exit; end; for j:=1 to s.n do s.a[i,j]:=s.a[i,j]/c; s.b[i]:=s.b[i]/c; for k:=1 to s.n do if k<>i then begin d:=s.a[k,i]; for j:=i to s.n do s.a[k,j]:=s.a[k,j]-d*s.a[i,j]; s.b[k]:=s.b[k]-d*s.b[i]; end; end; end; procedure AffichageSolution(var s:Systeme); var i:integer; begin for i:=1 to s.n do writeln('x[',i,']=',s.b[i]); end; var s:Systeme; begin EditerSysteme(s); Elimination_Gauss_Jordan(s); AffichageSolution(s); writeln; write('Fin du programme. Appuyer sur Entree'); readln; end.--
La confiance n'exclut pas le contrôle
Je n'ai pas étudié ton code, mais il me semble que ton problème relève plus de théorie mathématiques que de programmation pascal.
Pour avoir une équation impossible il faudrait avoir plus d'équations que d'inconnues (ce que ton programme ne permet apparemment pas de faire).
Pour avoir une équation indéterminée il faudrait que plusieurs équations soit équivalentes auquel cas le déterminant de ta matrice (triangulaire donc carré) sera nul.
Finalement seuls deux cas peuvent se présenter :
Tes n équations à n inconnues sont toutes distinctes, auquel cas il existe une unique solution (cf. Cramer) et ton algorithme de Gauss devrait marcher.
Ou alors il existe au moins deux équations proportionnelles et tu auras une infinité de solution.
Mais aucun cas tu pourras avoir de solution vide si tu as autant (ou moins) d'équation que d'inconnue.
Si je m'égare en théorie et que ton problème est effectivement lié à la programmation Pascal, merci de préciser qu'est-ce que tu es censé obtenir pour chaque fonction/procédure que tu écris et expliquer un minimum le fonctionnement recherché, sinon comment savoir où sont les erreurs (ou non) de fonctionnement.
Pour avoir une équation impossible il faudrait avoir plus d'équations que d'inconnues (ce que ton programme ne permet apparemment pas de faire).
Pour avoir une équation indéterminée il faudrait que plusieurs équations soit équivalentes auquel cas le déterminant de ta matrice (triangulaire donc carré) sera nul.
Finalement seuls deux cas peuvent se présenter :
Tes n équations à n inconnues sont toutes distinctes, auquel cas il existe une unique solution (cf. Cramer) et ton algorithme de Gauss devrait marcher.
Ou alors il existe au moins deux équations proportionnelles et tu auras une infinité de solution.
Mais aucun cas tu pourras avoir de solution vide si tu as autant (ou moins) d'équation que d'inconnue.
Si je m'égare en théorie et que ton problème est effectivement lié à la programmation Pascal, merci de préciser qu'est-ce que tu es censé obtenir pour chaque fonction/procédure que tu écris et expliquer un minimum le fonctionnement recherché, sinon comment savoir où sont les erreurs (ou non) de fonctionnement.
Bonjour,
J'ai eu des difficultés sur Turbo PAscal pour la creation de la procedure de resolution de n equation a n inconue en utilisant la methode de pivot.
Pouvez vous me donner la procedure complete de ce dernier avec explication!
Merci d'avance
J'ai eu des difficultés sur Turbo PAscal pour la creation de la procedure de resolution de n equation a n inconue en utilisant la methode de pivot.
Pouvez vous me donner la procedure complete de ce dernier avec explication!
Merci d'avance
ouille, je savais pas que y avait encore des gens qui utilisait, le turbo pascal. vous pouvez me dre quel genre de progrmame on arrive a faire avec?
Le Turbo Pascal est encore fortement utilisé dans les milieux scolaires pour l'initiation à la programmation !
Certes c'est pas très joli, mais après on peut passer à Delphi, où là y a de quoi faire un peu mieux !
Contrairement à ce que tu as l'air de penser, le Pascal est suffisant pour tous ceux qui n'ont pas envie de passer leur vie à programmer, ou qui n'ont pas envie d'apprendre d'autres langages que ceux qu'on leur apprend...
Après bien sûr, on peut critiquer le choix du corps enseignant de se borner à l'apprentissage de l'algorithmique par le Pascal... Mais l'évolution n'est pas pour tout de suite !
Certes c'est pas très joli, mais après on peut passer à Delphi, où là y a de quoi faire un peu mieux !
Contrairement à ce que tu as l'air de penser, le Pascal est suffisant pour tous ceux qui n'ont pas envie de passer leur vie à programmer, ou qui n'ont pas envie d'apprendre d'autres langages que ceux qu'on leur apprend...
Après bien sûr, on peut critiquer le choix du corps enseignant de se borner à l'apprentissage de l'algorithmique par le Pascal... Mais l'évolution n'est pas pour tout de suite !
En Turbo Pascal "pur" on peut avoir un affichage console et/ou graphique.
3D je ne pense pas que ce soit possible à moins de bidouiller le mode graphique.
Avec des IDE comme Delphi ou Lazarus on peut aussi créer des fenêtres Windows avec des boutons des cases à cocher, des menus déroulants... Ce qui donne au langage Pascal un peu plus d'esthétisme...
3D je ne pense pas que ce soit possible à moins de bidouiller le mode graphique.
Avec des IDE comme Delphi ou Lazarus on peut aussi créer des fenêtres Windows avec des boutons des cases à cocher, des menus déroulants... Ce qui donne au langage Pascal un peu plus d'esthétisme...