IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

[Débutant] Les tableaux en Fortran


Sujet :

Fortran

  1. #1
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut [Débutant] Les tableaux en Fortran
    Bonjour,
    je suis un débutant en Fortran, j'essaye d'écrire un programme pour créer un tableau A tel que A(i)= i+2. Je suis sûr qu'on doit mettre une boucle de type do enddo mais je n'ai pas su quoi mettre dans cette boucle. Pouvez-vous me compléter mon programme ci-dessous ? Merci pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    program tableau 
    implicit none
    integer I
     
    print* ,'entrer le nombre n:'
    read*,n
    REAL:: A(n) 
    integer n
     
     
          do i=1,n
     
          enddo 
     
    end

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    TOUJOURS LES DECLARATIONS EN PREMIER (rien avant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    program test 
    implicit none
     
    integer :: n,i
    real,dimension(:),allocatable :: A
     
    write(*,*) 'entrer le nombre n:'
    read(*,*) n
     
    allocate(A(n))
     
    do i=1,n
    A(i)=i+2.
    end do 
     
    end program test

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    c'est dimension( : )

  4. #4
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par cyrius24
    TOUJOURS LES DECLARATIONS EN PREMIER (rien avant)

    program test
    implicit none

    integer :: n,i
    real,dimension(,allocatable :: A

    write(*,*) 'entrer le nombre n:'
    read(*,*) n

    allocate(A(n))

    do i=1,n
    A(i)=i+2.
    end do

    end program test
    Merci pour votre reponse, j ai esseye' le programme , mais il m a donne' que le nombre n, je veux faire apparaitre le tableau A, alors comment faire?

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Pour afficher le tableau A:
    Ça affiche le tableau sur une ligne. Mais ce n'est pas très lisible, surtout si n est grand. Il est préférable d'afficher aussi les indices :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write(*,*) (i, A(i), i=1, n)
    Ça s'affiche toujours sur une ligne, mais avec des indices. Il serait cependant préférable d'afficher un élément par ligne. Par ce faire, le plus simple est d'afficher un élément à la fois, soit 1 élément par write :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do i = 1, n
      write(*,*) i, A(i)
    enddo

  6. #6
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Sylvain Bergeron
    Pour afficher le tableau A:
    Ça affiche le tableau sur une ligne. Mais ce n'est pas très lisible, surtout si n est grand. Il est préférable d'afficher aussi les indices :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write(*,*) (i, A(i), i=1, n)
    Ça s'affiche toujours sur une ligne, mais avec des indices. Il serait cependant préférable d'afficher un élément par ligne. Par ce faire, le plus simple est d'afficher un élément à la fois, soit 1 élément par write :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do i = 1, n
      write(*,*) i, A(i)
    enddo
    Donc comment ca devient le program en totale si j utilise ton dernier code?

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Tu dois afficher le tableau après lui avoir assigné des valeurs.

  8. #8
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    C'est-à-dire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    program test 
    implicit none
     
    integer :: n,i
    real,dimension(:),allocatable :: A
     
    write(*,*) 'entrer le nombre n:'
    read(*,*) n
     
    allocate(A(n))
     
    do i=1,n
    A(i)=i+2.
    enddo 
    do i = 1, n
      write(*,*) i, A(i)
    enddo
    end
    ?
    A quoi ça sert alors allocatable :: A? et est-ce qu'il y a une commande équivalente ?
    Merci de nouveau

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par feynman
    C est a dire comme ca :
    ...
    do i=1,n
    A(i)=i+2.
    enddo
    do i = 1, n
    write(*,*) i, A(i)
    enddo
    ...
    Tout à fait. Remarque que tu pourrais combiner les boucles comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    do i = 1, n
      A(i)=i+2.
      write(*,*) i, A(i)
    enddo
    ...
    mais en pratique, dans un programme plus imposant, il faut presque toujours séparer les tâches de calculs et les tâches d'impression. La première forme est donc « meilleure ».

    Citation Envoyé par feynman
    A quoi ca sert alors allocatable :: A? et est ce qu il y a une commande equivalente?
    Ça sert à déclarer un tableau dont les dimensions ne seront déterminées qu'à l'exécution. Il n'y a pas vraiment de commande équivalente.

    En F77, il n'y avait pas d'allocatable. On devait déclarer les tableaux assez grand pour supporter les plus gros cas prévus et valider si la situation était prévue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    program test77
    implicit none
     
    integer n,i,DimMaxA
    parameter (DimMaxA=1000)
    real A(DimMaxA)
     
    write(*,*) 'entrer le nombre n:'
    read(*,*) n
    if (n .gt. DimMaxA) then
      write(*,*) 'n est trop grand'
      stop
    endif
     
    do i=1,n
    A(i)=i+2.
    enddo
    do i = 1, n
    write(*,*) i, A(i)
    enddo
    end

  10. #10
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Ca marche pour les tableaux à une dimension, mais maintenant j'essaye de faire le tableau de 3 lignes et trois colonnes (matrice) tel que a(i,j)=i*j.
    J'ai essayé mais ça n'a pas marché, pouvez-vous m'aider et dire où est mon erreur ?
    Merci
    Voilà mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    program test 
    implicit none
     
    integer :: n,i,j
    real,dimension(:,:),allocatable :: A
     
    write(*,*) 'entrer le nombre n:'
    read(*,*) n
     
    allocate(A(n,n))
     
    do i=1,n
      do j=1,n
    A(i,j)=i*j
    enddo
    enddo 
    do i = 1,n
      do j=1,n
      write(*,*) i,j, A(i,j)
    enddo
    enddo
    end

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Je ne vois pas d'erreur. J'ai compilé et ça fonctionne.

    Quelle erreur as-tu ?

  12. #12
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    non plus je vois pas d'erreurs

    une petite note supplémentaire: pour afficher ta matrice sous forme d'un tableau (que ce soit à l'écran ou dans un fichier) tu demande à WRITE de t'afficher la liste des valeur de la première ligne (FORTRAN stocke Toujours les donnée en collone):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do i=1,n
      write(*,*)(A(i,j),j=1,n)
    enddo
    de plus je te suggère si tu as des matrices bien plus grande de trouvé un cours sur les FORMAT en fortran permettant d'afficher que les chiffres significatifs par exemple et surtout dans l'exemple que je t'es donné d'afficher tous les nombres de la même manière et donc de parfaitement alligner les colones....
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  13. #13
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Merci beaucoup pour votre reponse j'ai essaye aujourd'hui avec do i=1,n
    write(*,*)(A(i,j),j=1,n)
    enddo
    et ca marche correctement mais est-ce que je peux mettre ma matrice entre colonne, point d'exclamation (comme scilab)?
    merci de nouveau

  14. #14
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    que veux-tu dire par là.... la syntaxe que je t'es donné te l'écris en tableau donc trois ligne de trois colones, qu'appele-tu affichage en colonne?
    dans le style:
    1 1 5.2266
    1 2 7.336
    ...

    ???
    parce que dans ce cas, ta première syntaxe est la bonne
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  15. #15
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    en effet je veux ma matrice sous cette forme(avec les points d'exlamation !) par exemple
    !1 2 3!
    !9 2 4!
    !3 1 2!

  16. #16
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    dans ce cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do i=1,n
    write(*,*)'!',(A(i,j),j=1,n),'!'
    enddo
    après, je te dis, au lieu du "(*,*)" tu peux mettre un indicateur de format à la place de la second étoile, pour le cas avec les point d'exclamation:

    seulement celui-là ne marche que pour une matrice de trois colonnes avec des entiers à un chiffre....
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  17. #17
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Bizare , votre premier code ne marche pas, ca me donne erreur apres la compilation

  18. #18
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    maintenant ca marche merci beaucoup

  19. #19
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Autre question sur les tableaux,
    Je vient de voire sur un cite(http://www.u-cergy.fr/sir/data/cours.../wilkinson.f90) cette expression en fortran :vect(2:n*n:n+1) = 1
    j arrive pas a la comprendre. Est ce quelqu un pourrai me l expliquer?
    merci de nouveau

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    L'expression
    correspond à une boucle implicite sur les indices du vecteur 'vect', partant de l'indice 'i', allant jusqu'à l'indice 'j', par pas de 'k'.

    L'instruction
    correspond donc à la boucle suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do ind=2,n*n,n+1
      vect(ind)=1
    enddo

Discussions similaires

  1. Petit problème de débutant avec les tableaux
    Par crazy_zakaria dans le forum Débuter
    Réponses: 10
    Dernier message: 20/11/2009, 10h25
  2. [Débutant] manipulations sur les tableaux
    Par nahr_Elk dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 13/09/2008, 23h40
  3. Problème de débutant dans les tableaux
    Par mat1450 dans le forum C++
    Réponses: 8
    Dernier message: 17/08/2007, 19h09
  4. [Débutant] Les fonctions mathématiques en Fortran
    Par feynman dans le forum Fortran
    Réponses: 1
    Dernier message: 17/07/2007, 10h21
  5. [Débutant] Problèmes avec les tableaux.
    Par Lwq dans le forum C++
    Réponses: 6
    Dernier message: 01/11/2005, 12h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo