Fortran90 et matrices
Répondre à la discussion
Affichage des résultats 1 à 26 sur 26

Fortran90 et matrices



  1. #1
    aminastro

    Fortran90 et matrices


    ------

    Bonjour à tous,

    Je voudrais savoir si mon programme pour répondre à la question suivante est juste ...

    "Faire un programme fotran qui permet de lire la matrice A, calculer la somme des éléments négatifs de A, le nombre des éléments nuls de la matrice A"

    Code:
    Program Exo
    Implicit none
    Integer:: A(15,15), i, j, n, m
    read(*,*) n,m
    Do i=1,n,1 
       Do j=1,m,1 
    read(*,*) A(15,15)
    enddo
    enddo
    
    Do i=1,n,1 
       Do j=1,m,1 
    write(*,*) A(15,15)
    enddo
    enddo
    
    S = 0 
    If (A(i,j)<0) then 
    Do i=1,n,1 
       Do j=1,m,1 
    S=S+A(i,j)
    enddo
    enddo
    endif
    
    End program

    PS: je n'ai pas pu répondre à la question du nombre des éléments nuls de la matrice A ...

    Je vous remercie !

    -----
    Dernière modification par JPL ; 11/06/2016 à 17h38. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    CM63

    Re : Fortran90 et matrices

    Bonjour,

    Dans la première double boucle sur i et j, tu lis toujours la même variable A(15,15) au lieu de lire A(i,j)
    Même chose dans la deuxième double boucle, où tu écris la matrice (chose qu'on ne te demande pas, mais bon), tu écris toujours A(15,15) au lieu d'écrire A(i,j)
    Dans la troisième boucle, où tu tentes de faire la somme des éléments négatif, le test et le endif sont mal placés : tu teste A(i,j) alors que i et j ne vont être définis que plus tard.

    PS: je n'ai pas pu répondre à la question du nombre des éléments nuls de la matrice A ...
    Et pourquoi? C'est presque pareil que pour la somme des éléments négatifs, sauf que :
    - au lieu de tester A(i,j)<0 on teste A(i,j)=0 (j'ai fait une faute de syntaxe, à toi de la découvrir),
    - au lieu d'ajouter A(i,j) on ajoute 1 .

    Il faudrait aussi, à la fin, imprimer les résultats.

    Bon courage.
    Dernière modification par CM63 ; 11/06/2016 à 17h09.

  3. #3
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Bonjour,

    Dans la première double boucle sur i et j, tu lis toujours la même variable A(15,15) au lieu de lire A(i,j)
    Même chose dans la deuxième double boucle, où tu écris la matrice (chose qu'on ne te demande pas, mais bon), tu écris toujours A(15,15) au lieu d'écrire A(i,j)
    Dans la troisième boucle, où tu tentes de faire la somme des éléments négatif, le test et le endif sont mal placés : tu teste A(i,j) alors que i et j ne vont être définis que plus tard.



    Et pourquoi? C'est presque pareil que pour la somme des éléments négatifs, sauf que :
    - au lieu de tester A(i,j)<0 on teste A(i,j)=0 (j'ai fait une faute de syntaxe, à toi de la découvrir),
    - au lieu d'ajouter A(i,j) on ajoute 1 .

    Il faudrait aussi, à la fin, imprimer les résultats.

    Bon courage.
    Bonjour à vous,

    En fait j'écris A(15,15) au lieu d'écrire A(i,j) pour créer un espace suffisant (15 c'est largement suffisant) je devrais donc obligatoirement écrire A(i,j)?

    Je me suis donc trompé sur la 3e boucle, je devrais écrire ça:

    S = 0

    Do i=1,n,1
    Do j=1,m,1
    If (A(i,j)<0) then
    S=S+A(i,j)
    endif
    enddo
    enddo

    C'est bien ça? ou bien je devrais ajouter 1? J'ai mal compris ce que vous m'avez dit !

    Et pour les éléments nuls, Il s'agit là de trouver le nombre de ces éléments, et non pas faire la somme ...

    PS: Quand on nous demande de lire une matrice, ce n'est pas nécessaire de l'afficher? (et donc la deuxième boucle est caduque?)

    Je vous remercie

  4. #4
    CM63

    Re : Fortran90 et matrices

    Bonjour,

    Citation Envoyé par aminastro Voir le message
    Bonjour à vous,

    En fait j'écris A(15,15) au lieu d'écrire A(i,j) pour créer un espace suffisant (15 c'est largement suffisant) je devrais donc obligatoirement écrire A(i,j)?
    La valeur suffisante de 15, ça c'est au début, lorsque tu dimensionnes la matrice:

    Code:
    Integer:: A(15,15)
    Mais après, lorsque le logiciel lit les valeurs au clavier, il ne doit pas toujours utiliser la variable A(15,15), mais passer en revue A(i,j), donc :

    Code:
    Do i=1,n,1 
    Do j=1,m,1 
    read(*,*) A(i,j)
    enddo
    enddo
    Pour le calcul des valeurs négative, oui, c'est bon:

    Code:
    S = 0 
    Do i=1,n,1 
    Do j=1,m,1 
    If (A(i,j)<0) then 
    S=S+A(i,j)
    endif
    enddo
    enddo
    Citation Envoyé par aminastro Voir le message
    Et pour les éléments nuls, Il s'agit là de trouver le nombre de ces éléments, et non pas faire la somme ...
    Ben oui, d'accord, mais là je te laisse réfléchir : pour compter des bidules, comment on fait? On ajoute 1 à un compteur chaque fois qu'on rencontre un bidule .

    Citation Envoyé par aminastro Voir le message
    PS: Quand on nous demande de lire une matrice, ce n'est pas nécessaire de l'afficher? (et donc la deuxième boucle est caduque?)
    Ben là, c'est comme tu veux, on ne te demandait pas de réimprimer la valeurs entrées, mais tu peux toujours le faire, pour vérification.

    A plus.

  5. A voir en vidéo sur Futura
  6. #5
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Bonjour,



    La valeur suffisante de 15, ça c'est au début, lorsque tu dimensionnes la matrice:

    Code:
    Integer:: A(15,15)
    Mais après, lorsque le logiciel lit les valeurs au clavier, il ne doit pas toujours utiliser la variable A(15,15), mais passer en revue A(i,j), donc :

    Code:
    Do i=1,n,1 
    Do j=1,m,1 
    read(*,*) A(i,j)
    enddo
    enddo
    Pour le calcul des valeurs négative, oui, c'est bon:

    Code:
    S = 0 
    Do i=1,n,1 
    Do j=1,m,1 
    If (A(i,j)<0) then 
    S=S+A(i,j)
    endif
    enddo
    enddo


    Ben oui, d'accord, mais là je te laisse réfléchir : pour compter des bidules, comment on fait? On ajoute 1 à un compteur chaque fois qu'on rencontre un bidule .



    Ben là, c'est comme tu veux, on ne te demandait pas de réimprimer la valeurs entrées, mais tu peux toujours le faire, pour vérification.

    A plus.
    Bonjour à vous!
    Tout d'abord je vous remercie pour votre réponse, les choses semblent plus claires à présent !

    Pour le nombre des éléments nuls, je propose ça: (Si je déclare Nb comme la variable correspondante)

    Code:
    Do i=1,n,1 
        Do j=1,m,1
    if (A(i,j)==0) then
    Nb= nb+1
    endif
    enddo
    enddo
    J'espère ne pas m'être trompé?

    Il nous est demandé aussi de former un vecteur V1 à partir des éléments de la diagonale de A

    Code:
    Do  i= 1,n,1
       Do j=1,m,1
    If (i.eq.j) then 
    read(*,*) V1(i)
    endif
    enddo
    enddo
    Je me trompe?

    Je vous remercie
    Dernière modification par JPL ; 12/06/2016 à 12h43. Motif: Ajout de la balise Code (#) pour garder l'indentation

  7. #6
    CM63

    Re : Fortran90 et matrices

    Bonjour,

    Citation Envoyé par aminastro Voir le message
    Pour le nombre des éléments nuls, je propose ça: (Si je déclare Nb comme la variable correspondante)

    Do i=1,n,1
    Do j=1,m,1
    if (A(i,j)==0) then
    Nb= nb+1
    endif
    enddo
    enddo
    Oui, c'est ça, à condition d'initialiser Nb à 0 (attention aussi aux majuscules et minuscules, dans certains langages cela a une importance, prendre les bonnes habitudes).

    Citation Envoyé par aminastro Voir le message

    Il nous est demandé aussi de former un vecteur V1 à partir des éléments de la diagonale de A

    Do i= 1,n,1
    Do j=1,m,1
    If (i.eq.j) then
    read(*,*) V1(i)
    endif
    enddo
    enddo
    - Inutile de lire à nouveau les valeurs au clavier, elles sont déjà dans le tableau A, donc pas de read,
    - il faut dimensionner un tableau V1 à 15 valeurs et y mettre les coefficients diagonaux de A,
    - une boucle simple suffit, inutile de faire deux boucles imbriquées.

    A plus.

  8. #7
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Bonjour,



    Oui, c'est ça, à condition d'initialiser Nb à 0 (attention aussi aux majuscules et minuscules, dans certains langages cela a une importance, prendre les bonnes habitudes).



    - Inutile de lire à nouveau les valeurs au clavier, elles sont déjà dans le tableau A, donc pas de read,
    - il faut dimensionner un tableau V1 à 15 valeurs et y mettre les coefficients diagonaux de A,
    - une boucle simple suffit, inutile de faire deux boucles imbriquées.

    A plus.
    Bonjour,

    Pourquoi est-il inutile de faire deux boucles imbriquées? On doit justement préciser que i = j pour parler de la diagonale n'est-ce pas?

    Du coup je ne sais pas exactement que faire ...

  9. #8
    CM63

    Re : Fortran90 et matrices

    Citation Envoyé par aminastro Voir le message
    Bonjour,

    Pourquoi est-il inutile de faire deux boucles imbriquées? On doit justement préciser que i = j pour parler de la diagonale n'est-ce pas?

    Du coup je ne sais pas exactement que faire ...
    Oui, bien sur, mais pour passer en revue les éléments diagonaux de A il suffit de spécifier A(i,i) et non plus A(i,j), et du coup il n'y a qu'une boucle : sur i .

  10. #9
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Oui, bien sur, mais pour passer en revue les éléments diagonaux de A il suffit de spécifier A(i,i) et non plus A(i,j), et du coup il n'y a qu'une boucle : sur i .
    Donc si j'ai bien compris, ça devrait être ça:

    Do i = 1,n,1
    V1(i)= A(i,i)
    Enddo

    Je me trompe?

  11. #10
    CM63

    Re : Fortran90 et matrices

    Ok, c'est bon, avec au dessus :

    Code:
    Integer V1(15)
    Bonne journée.

  12. #11
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Ok, c'est bon, avec au dessus :

    Code:
    Integer V1(15)
    Bonne journée.
    Je vous remercie ! J'ai une autre question si vous le permettez bien sûr, c'est concernant le min d'une matrice ...

    Le max je sais le faire (enfin j'espère)

    max=a(1,1)
    Do i=1,n,1
    Do j=1,m,1
    If(max<a(i,j)) then
    max=a(i,j)
    endif
    enddo
    enddo

    Le min c'est la même chose mais en remplaçant if(max<a(i,j)) par if(min>a(i,j))?
    Dernière modification par JPL ; 12/06/2016 à 12h43. Motif: Ajout de la balise Code (#)

  13. #12
    JPL
    Responsable des forums

    Re : Fortran90 et matrices

    aminastro tu es prié d'utiliser la balise Code comme spécifié ici : http://forums.futura-sciences.com/pr...ves-forum.html.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  14. #13
    CM63

    Re : Fortran90 et matrices

    Citation Envoyé par aminastro Voir le message
    Je vous remercie ! J'ai une autre question si vous le permettez bien sûr, c'est concernant le min d'une matrice ...

    Le max je sais le faire (enfin j'espère)

    Code:
    max=a(1,1)
    Do i=1,n,1 
    Do j=1,m,1 
    If(max<a(i,j)) then
    max=a(i,j)
    endif
    enddo
    enddo
    Le min c'est la même chose mais en remplaçant if(max<a(i,j)) par if(min>a(i,j))?
    Oui bien sur, mais, attention, tu fais ici une chose à éviter, qu'on signale au début de tous les cours de langage informatique. Dans le meilleur des cas, le compilateur fortran va t'imprimer un "warning" : "faire attention à ce genre de chose... etc", mais ton programme va peut-être compilé quand même, et il marchera. Mais dans d'autre langages cela aboutirait à des plantages de d'autres partie du logiciel, et ceci sans message d'erreur préalable. Je te laisse deviner, ou rechercher dans tes cours, de quoi je parle.

  15. #14
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par JPL Voir le message
    aminastro tu es prié d'utiliser la balise Code comme spécifié ici : http://forums.futura-sciences.com/pr...ves-forum.html.
    Je m'excuse je n'étais pas au courant

  16. #15
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Oui bien sur, mais, attention, tu fais ici une chose à éviter, qu'on signale au début de tous les cours de langage informatique. Dans le meilleur des cas, le compilateur fortran va t'imprimer un "warning" : "faire attention à ce genre de chose... etc", mais ton programme va peut-être compilé quand même, et il marchera. Mais dans d'autre langages cela aboutirait à des plantages de d'autres partie du logiciel, et ceci sans message d'erreur préalable. Je te laisse deviner, ou rechercher dans tes cours, de quoi je parle.

    D'accord je vous remercie !

    Après avoir fait le produit entre la matrice A et le vecteur V1 (ça je sais le faire), On nous demande de faire le tri du vecteur résultant .. de quoi s'agit-il?

  17. #16
    CM63

    Re : Fortran90 et matrices

    Mais c'est quoi l'erreur à ne pas faire dont je te parle? C'est assez important, en fait.

  18. #17
    CM63

    Re : Fortran90 et matrices

    Citation Envoyé par aminastro Voir le message
    On nous demande de faire le tri du vecteur résultant .. de quoi s'agit-il?
    Ah ça, je ne sais pas, c'est assez vague, on peut en faire des tris! Il faut demander des précisions. Je suppose qu'il s'agit du vecteur "résultat" et non pas du vecteur "résultant"?

  19. #18
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Ah ça, je ne sais pas, c'est assez vague, on peut en faire des tris! Il faut demander des précisions. Je suppose qu'il s'agit du vecteur "résultat" et non pas du vecteur "résultant"?
    Plutôt vecteur résultant du produit ...

    PS: pour l'erreur dont vous me parlez je n'en sais rien, je n'ai pas une grande maîtrise du sujet malheureusement

  20. #19
    CM63

    Re : Fortran90 et matrices

    Citation Envoyé par aminastro Voir le message
    pour l'erreur dont vous me parlez je n'en sais rien, je n'ai pas une grande maîtrise du sujet malheureusement
    Alors je te le dis : tu utilises "min" et "max" comme noms de variables, or ce sont des mots clef du langage, ce sont des fonctions. Cela est fortement déconseillé.
    Ce qui vient à l'esprit serait d'utiliser par exemple Amin et Amax, mais, malheureusement ce sont encore des noms de fonctions du Fortran (cela veut dire : je veux le max, mais je veux le résultat en nombre réel). C'est historique. Donc il vaudrait mieux utiliser par exemple Valmax et valmin .

  21. #20
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Alors je te le dis : tu utilises "min" et "max" comme noms de variables, or ce sont des mots clef du langage, ce sont des fonctions. Cela est fortement déconseillé.
    Ce qui vient à l'esprit serait d'utiliser par exemple Amin et Amax, mais, malheureusement ce sont encore des noms de fonctions du Fortran (cela veut dire : je veux le max, mais je veux le résultat en nombre réel). C'est historique. Donc il vaudrait mieux utiliser par exemple Valmax et valmin .
    Ah maintenant que vous me le dites cela me semble évident, j'aurais dû faire attention.

    Même chose avec le factoriel et la fonction fact?

  22. #21
    CM63

    Re : Fortran90 et matrices

    Citation Envoyé par aminastro Voir le message
    Même chose avec le factoriel et la fonction fact?
    Non, je ne pense pas qu'il existe une fonction fact en Fortran. Mais en revanche, ne pas utiliser sin, cos, exp, tan, et j'en passe.

  23. #22
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Non, je ne pense pas qu'il existe une fonction fact en Fortran. Mais en revanche, ne pas utiliser sin, cos, exp, tan, et j'en passe.
    D'accord je prendrais ça en considération.

    Pour construire un vecteur V1 constitué d'éléments pairs de A, j'ai utilisé ce programme mais j'en suis pas sûr:

    Code:
    Do i=1,n,1
    if (A(i,j)Mod2 == 0) then
    V1(i) = A(i,j) 
    endif
    enddo
    Ai-je fait une erreur?

  24. #23
    CM63

    Re : Fortran90 et matrices

    Je vois au moins 3 erreurs:
    - j n'est pas initialisé,
    - si toutes les valeurs de A sont paires (15*15 valeurs = 255 valeurs) ça ne va passer dans V1 qui ne comporte que 15 cases,
    - A(i,j)=0 modulo 2 ne s'écrit pas comme tu l'as écrit : il faut utiliser la fonction mod(x,y) qui renvoie le reste de la division de x par y

  25. #24
    aminastro

    Re : Fortran90 et matrices

    Citation Envoyé par CM63 Voir le message
    Je vois au moins 3 erreurs:
    - j n'est pas initialisé,
    - si toutes les valeurs de A sont paires (15*15 valeurs = 255 valeurs) ça ne va passer dans V1 qui ne comporte que 15 cases,
    - A(i,j)=0 modulo 2 ne s'écrit pas comme tu l'as écrit : il faut utiliser la fonction mod(x,y) qui renvoie le reste de la division de x par y
    Oui je viens de me rendre compte que je n'ai pas initialisé le j.

    Oublions la fonction mod(x,y), si On nous demande de former un vecteur V1 à partir des éléments positifs de la matrice A par exemple, on devrait faire quoi si notre vecteur ne peut contenir que 15 éléments, et que par contre la matrice peut avoir jusqu'à 255 valeurs positives?

  26. #25
    aminastro

    Re : Fortran90 et matrices

    Je devrais donc, si j'ai bien compris, déclarer une matrice M(4,4) par exemple et un vecteur V(20) !

  27. #26
    CM63

    Re : Fortran90 et matrices

    Si la matrice A est dimensionnée A(15,15), il faut que le vecteur V1 puisse recevoir 15*15=225 valeurs, pour le cas où tous les coefficients de A seraient positifs.
    Sinon, si tu ne veux récupérer que les 30 premières valeurs, par exemple, effectivement tu peux dimensionner V1 à 30, mais alors il faut mettre un test dans la boucle pour s'arrêter lorsqu'on a trouvé 30 valeurs positives.

Discussions similaires

  1. Code en fortran90
    Par tpscience dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 17/06/2011, 11h56
  2. Fortran90
    Par tpscience dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 13/05/2011, 12h34
  3. Boucle if avec goto sous fortran90
    Par VauRDeC dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 28/09/2010, 16h53
  4. Hyperplan de l'espace des matrices carrées et matrices inversibles
    Par Seirios dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 03/04/2010, 16h41
  5. Fortran90, read avant print ?
    Par Romain-des-Bois dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 13/09/2008, 10h33