Matrice en Pascal

[Fermé]
Signaler
-
 ines -
Bonjour,
Comment faire pour insérer des matrices dans Turbo Pascal, j'suis en pleine galere, aidez moi...
(J'avais penser a un tableau a 2 dimensions mais je ne vois pas comment m'y prendre)

Merci bcp d'avance
A voir également:

2 réponses

Messages postés
579
Date d'inscription
lundi 14 janvier 2002
Statut
Membre
Dernière intervention
17 août 2006
69
Ben si

Exemple de calcul de produit matriciel (et d'autres sur le web)

program produit_mat(input,output);
var m1,m2,m3:array[1..10,1..10]of real;
l,m,n,jl,jm,jn:integer;
begin
writeln('nb lignes 1ère matrice ?');
readln(m);
writeln('nb colonnes 1è matrice ?');
readln(l);
writeln('nb colonnes 2è matrice ?');
readln(n);
(* entrée de m1 *)
writeln('première matrice');
for jm:=1 to m do for jl:=1 to l do
begin
writeln('lig',jm,', col',jl,'?');
readln(m1[jm,jl])
end;
(* entrée de m2 *)
writeln('2ième matrice');
for jl:=1 to l do for jn:=1 to n do
begin
writeln('lig',jl,', col',jn,'?');
readln(m2[jl,jn])
end;
(* calcul du produit *)
for jm:=1 to m do for jn:=1 to n do
begin {calcul composante m,n de m2}
m3[jm,jn]:=0;
for jl:=1 to l do m3[jm,jn]:=
m3[jm,jn]+(m1[jm,jl]*m2[jl,jn]);
end;
(* affichage du résultat *)
writeln('résultat');
for jm:=1 to m do for jn:=1 to n do
writeln('m[',jm,',',jn,']=',
m3[jm,jn])
end.
12
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

uses wincrt? pour traduit les opération d'entré et les opération de sortie(readln,writeln)
Messages postés
6
Date d'inscription
jeudi 7 février 2008
Statut
Membre
Dernière intervention
20 juin 2008
5
Bonjour,
Comment faire pour calculer la transposé d'un matrice, j'suis en pleine galere, aidez moi...
Messages postés
16393
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 septembre 2021
2 876 > KHITER : Z++
Pour info, il y a plus simple pour calculer une factorielle :
function factorielle(i:integer):integer;
begin
if i=0 then result:=1
       else result:=i*factorielle(i-1);
end;
Messages postés
16393
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 septembre 2021
2 876 > خيتر : Z++
Pour info, il y a plus simple pour calculer un pgcd :
function pgcd(a,b:integer):integer;
begin
if b=0 then result:=a
       else result:=pgcd(b,a mod b)
end;
>
Messages postés
16393
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 septembre 2021

yoh KX 'pour plus info' de vous 'il ya plus simple' à vous j'ai donne des programmes pascal complets avec des fonctions developper par des formules mathematique ,c'est pas comme vous qu'avec des fonctions pret ecritent en pascal .
essayer d'écrire votre fonction personnellment c'est pourtant bien !
Messages postés
16393
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 septembre 2021
2 876 > khiter zakaria
Bonjour Khiter.

Les fonctions que je donne ne sont pas issus de Pascal, ce sont des fonctions "faites maison" et bien tirés de formules mathématiques, par exemple pour le pgcd j'ai utilisé (comme toi d'ailleurs) l'algorithme d'Euclide, seulement j'ai utilisé un algorithme récursif alors que toi tu as utilisé un algorithme itératif (plus lourd).
Je n'ai en aucun cas critiqué ton code, qui semble d'ailleurs être correct, je faisait juste une remarque pour montrer qu'il y avait une autre méthode plus simple, et plus efficace que la tienne, et ce parce que le but du forum est de permettre de s'améliorer !
De plus, si je n'ai pas écrit le programme entier c'est parce que tu l'avais déjà fait, et que les deux sont compatibles, le mien donnerait juste (en reprenant ce que tu as fait) :
program plus_grand_comme_un_diviseur;
uses crt;

function pgcd(a,b:integer):integer;
begin
if b=0 then result:=a
       else result:=pgcd(b,a mod b)
end;

var x,y:integer;
begin clrscr;
write('donner un nombre entier:');
readln(x);
write('donner un nombre entier:');
readln(y);
writeln('____________________________');
write('le PGCD de ',x,' et de ',y,' est: ',pgcd(x,y));
readln;
end.
Comme tu le vois seule l'écriture de la fonction pgcd change, c'est parce que c'est la seule chose que j'avais besoin de modifier par rapport au reste de ton travail...
C'est bien sûr pareil pour la fonction factorielle des post 7 et 9, ton programme principal est bien et si ta fonction fact marche (en itératif) la mienne est plus efficace car elle est écrite en récursif...

Te souhaitant bonne continuation...

salut djellat voici un programme pascal qui effectue l'inversion d'une matrice

PROGRAM INV_MAT_Z++;

USES Crt;

TYPE Matrice=ARRAY[1..10,1..10] OF REAL;

VAR MatA,MatB,MatC:Matrice;
N:BYTE;
OK:BOOLEAN;

PROCEDURE Intro(VAR N:BYTE;VAR Mat:Matrice);
VAR i,j:BYTE;
BEGIN
CLRSCR;
TEXTCOLOR(YELLOW);
WRITE('Nombre de lignes:');READLN(N);
FOR i:=1 TO N DO
FOR j:=1 TO N DO
BEGIN
{GOTOXY(3,4);CLREOL;
WRITE('Introduisez A(',i,',',j,'): ');
READLN(Mat[i,j]);}
Mat[i,j]:=RANDOM(100);{Pour tester}
END;
END;

PROCEDURE Attente;
VAR St:STRING;
BEGIN
TEXTCOLOR(LIGHTRED);
St:='Une touche pour continuer.';
GOTOXY(40-LENGTH(St) DIV 2,25);WRITE(St);READKEY;
END;

PROCEDURE Affiche(S:STRING;N:BYTE;Mat:Matrice);
VAR i,j:BYTE;
BEGIN
CLRSCR;
TEXTCOLOR(LIGHTGREEN);
WRITELN(S);
FOR i:=1 TO N DO
BEGIN
FOR j:=1 TO N DO
WRITE(Mat[i,j]:9:4);
WRITELN;
END;
END;

PROCEDURE Somme(N:BYTE;MatA,MatB:Matrice;VAR MatC:Matrice);
VAR i,j:BYTE;
BEGIN
FOR i:=1 TO N DO
FOR j:=1 TO N DO
MatC[i,j]:=MatA[i,j]+MatB[i,j];
END;

PROCEDURE Difference(N:BYTE;MatA,MatB:Matrice;VAR MatC:Matrice);
VAR i,j:BYTE;
BEGIN
FOR i:=1 TO N DO
FOR j:=1 TO N DO
MatC[i,j]:=MatA[i,j]-MatB[i,j];
END;

PROCEDURE Produit(N:BYTE;MatA,MatB:Matrice;VAR MatC:Matrice);
VAR i,j,k:BYTE;
BEGIN
FOR i:=1 TO N DO
FOR j:=1 TO N DO
BEGIN
MatC[i,j]:=0;
FOR k:=1 TO N DO
MatC[i,j]:=MatC[i,j]+MatA[i,k]*MatB[k,j];
END;
END;

PROCEDURE Inverse(N:BYTE;A:Matrice;VAR X:Matrice;VAR OK:BOOLEAN);
VAR Id,E,B:Matrice;
Old,New:REAL;
Cpt:BYTE;

FUNCTION Norme_Ligne(N:BYTE;B:Matrice):REAL;
VAR Tmp,Tmp2:REAL;
i,j:BYTE;
BEGIN
Tmp:=0;
FOR i:=1 TO N DO
BEGIN
Tmp2:=0;
FOR j:=1 TO N DO
Tmp2:=Tmp2+ABS(B[i,j]);
IF Tmp2>Tmp THEN Tmp:=Tmp2;
END;
Norme_Ligne:=Tmp
END;

FUNCTION Norme_Colonne(N:BYTE;B:Matrice):REAL;
VAR Tmp,Tmp2:REAL;
i,j:BYTE;
BEGIN
Tmp:=0;
FOR i:=1 TO N DO
BEGIN
Tmp2:=0;
FOR j:=1 TO N DO
Tmp2:=Tmp2+ABS(B[j,i]);
IF Tmp2>Tmp THEN Tmp:=Tmp2;
END;
Norme_Colonne:=Tmp
END;

PROCEDURE Init(N:BYTE;A:Matrice;VAR B:Matrice;VAR OK:BOOLEAN);
VAR i,j:BYTE;
T:REAL;
BEGIN
FILLCHAR(Id,SizeOf(Id),0);
T:=Norme_Ligne(N,A)*Norme_Colonne(N,A);
IF ABS(T)>1E-10 THEN BEGIN
OK:=TRUE;
FOR i:=1 TO N DO
BEGIN
Id[i,i]:=1;
B[i,i]:=A[i,i]/T;
FOR j:=i+1 TO N DO
BEGIN
B[i,j]:=A[j,i]/T;
B[j,i]:=A[i,j]/T;
END;
END;
END
ELSE OK:=FALSE;
END;

PROCEDURE Calcule_E;
VAR C:Matrice;
BEGIN
Produit(N,B,A,C);
Difference(N,Id,C,E);
END;

PROCEDURE Calcule_B;
VAR C,D:Matrice;
BEGIN
Somme(N,Id,E,D);
Produit(N,D,B,C);
B:=C
END;

BEGIN
Init(N,A,B,OK);
IF NOT OK THEN WRITELN('Matrice nulle!')
ELSE BEGIN
Calcule_E;
Old:=Norme_Ligne(N,E);
New:=Old;
Cpt:=0;
WHILE NOT ((New<1E-6) OR ((New>Old) AND (Cpt>5))) DO
BEGIN
Old:=New;
Calcule_B;
Calcule_E;
New:=Norme_Ligne(N,E);
INC(Cpt);
END;
OK:=TRUE;
IF New<1E-6 THEN X:=B
ELSE OK:=FALSE
END;
END;

BEGIN
Intro(N,MatA);
Affiche('A=',N,MatA);
Attente;
Inverse(N,MatA,MatB,OK);
IF OK THEN BEGIN
Affiche('Inverse de A=',N,MatB);
Attente;
Produit(N,MatA,MatB,MatC);
Affiche('Produit des matrices inverses=',N,MatC);
Attente;
END
ELSE BEGIN
CLRSCR;
WRITELN('Pas d''inverse!');
END;
END.

khiter zkaria par Z++/2008