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 :

program addition fortran


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut program addition fortran
    Bonjour svp j'aimerais que vous m'aidiez a completer ce programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    program addition
    real :: a ,b ,somme
    write (*,*) entrer deux nombre 
    read (*,*) a ,b
    somme = 0
    somme =a + b
    write (*,*) "la somme est ",somme
    end programm addition
    en effet le probleme qui ce pose c'est que je compile le prrogramme il ne calcule que la somme des nombres entiers et pas des nombres reels. pour 2.3+3 il affiche 5 au lieu de 5.3

    je souhaiterais aussi specifier la condition sur les nombres reels de tel sortes que si nous entrons des lettres (d ,p) ilaffiche "error"
    j'ai ajouté ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    program addition
    real :: a ,b ,somme
    write (*,*) entrer deux nombre 
    read (*,*) a ,b
    somme = 0
    if a ,b real then
    somme =a + b
    write (*,*) "la somme est ",somme
    else if write (*,*) "error"
    end if
    end programm addition
    Mais ce programme ne se compile pas (ne marche pas)

    BIENVOULOIR M'AIDER

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    1. Votre premier programme comporte 2 erreurs de syntaxe qui empêche sa compilation :
    - l3 : les guillemets délimitant le message à afficher sont absents
    - l8 : le mot réservé PROGRAM est mal orthographié (il comporte un m de trop)

    La version corrigée ci-dessous se compile sans erreur. Le programme fonctionne aussi bien avec des entiers que des réels :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    program addition
     
    implicit none
    real :: a ,b ,somme
     
    write (*,*) "entrer deux nombre" 
    read (*,*) a ,b
    somme =a + b
    write (*,*) "la somme est ",somme
    end program addition
    J'ai rajouté la clause IMPLICIT NONE afin d'interdire le typage implicite, ce qui est recommandé. J'ai supprimé l'initialisation à zéro de la variable somme qui n'apporte rien ici.

    2. Dans la deuxième version de votre programme, vous souhaitez gérer les erreurs d'entrée/sortie de manière à afficher un message d'erreur personnalisé si l'utilisateur saisit au moins une donnée non réelle. Une façon de faire consiste à utiliser l'argument optionnel IOSTAT de la primitive READ qui retourne une valeur entière non nulle si une erreur de lecture se produit. Le code ci-dessous implante cette approche :

    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
     
    program addition
     
    implicit none
    real	:: a ,b ,somme
    integer :: err
     
    write (*,*) "entrer deux nombre"
    read (*,*,iostat = err) a ,b
     
     
    if (err == 0) then
    	somme = a + b
    	write (*,*) "la somme est ",somme
    else
    	write (*,*) "error"
    end if
     
    end program addition
    Il est à noter que, même si le test n'avait pas été implanté, la saisie d'une donnée non réelle aurait provoquer une erreur d'éxécution, l'arrêt du programme et l'affichage d'un message d'erreur.

    Cordialement.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Merci bien.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    apres avoir ecris le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    program somme
    implicit none
    real ::  a ,b ,sommme
    integer :: err
    write (*,*) "entrer deux nombre" 
    read (*,* ,IOSTAT= err) a , b
    if (err =0) then
        sommme=a+b
     write (*,*) "la somme est " , sommme
    else
     write (*,*) "error"
     end if
    end program somme
    les erreurs suivant sont survenues

    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
    if (err =0) then
            1
    Error: Syntax error in IF-expression at (1)
    D:\joel\son.f90:10.4:
     
    else
        1
    Error: Unexpected ELSE statement at (1)
    D:\joel\son.f90:12.4:
     
     end if
        1
    Error: Expecting END PROGRAM statement at (1)
    Error(E42): Last command making (build\son.o) returned a bad status
    Error(E02): Make execution terminated
     
    * Complete *
    bienvouloir m'aider

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Dans une instruction conditionnelle IF...THEH..ELSE..., le mot clé réservé IF doit être suivi d'une expression booléenne. Ici, on cherche à comparer la valeur de la variable err à zéro afin de déterminer si une erreur s'est produite (valeurs non nulles) ou pas (valeur nulle). En Fortran 90, cette comparaison peut se faire à l'aide de l'expression conditionnelle suivante (cf mon message précédent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF (err == 0) THEN
    ...
    Cette expression conditionnelle (opérateur ==, 2 signes égale consécutifs) compare la valeur de 2 variables sans les modifier et retourne TRUE ou FALSE selon le résultat de la comparaison. Elle ne doit pas être confondu avec une instruction d'affectation (err = 0, 1 seul signe égale), qui elle modifie la valeur de la variable err. C'est une erreur fréquente et qui est à l'origine de l'erreur de compilation que vous avez obtenue.

    En Fortran, il est possible d'exprimer d'une manière équivalente le test d'égalité de deux variables en utilisant l'opérateur .NE., ce qui évite tout risque de confusion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF (err.NE.0) THEN
    ...

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Points : 65
    Points
    65
    Par défaut errata
    Dans mon dernier message, toutes les occurrences de l'opérateur .NE. (Not Equal) doivent être remplacées par l'opérateur .EQ. (Equal).

    Ce qui donne pour le dernier paragraphe :
    En Fortran, il est possible d'exprimer d'une manière équivalente le test d'égalité de deux variables en utilisant l'opérateur .NE. .EQ. , ce qui évite tout risque de confusion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <s>IF (err.NE.0) THEN</s>
    IF (err.EQ.0) THEN
    ...
    Désolé pour cette erreur.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Le programme marche parfaitement.
    Merci bien.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    svp je souhaiterais faire de meme (specifier la condition sur les nombres reels de tel sortes que si nous entrons aux moins une lettres (ex: d) le programme affiche "error"; ceci en utilisant l'argument optionnel iostat=err) pour ce programme. Mais ca ne marche pas.
    Svp j'aimerais que vous m'aidiez a détecté l'erreur.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    program somme_produit_soustraction_division
     
    implicit none
     
    real ::  X , Y , SOM, PROD, SOUS, DIV
     
    integer :: err
     
    write (*,*) "bonjour"
     
    write (*,*) "nous effectuerons simultanement le calcul de la somme du produit et de la division des nombre entiers"
     
    write (*,*) "entrer un nombre" ; read (*,*) X
     
    write (*,*'iostat=err) "entrer le second nombre" ; read (*,*) Y
     
    if (err == 0) then
     
        SOM = X + Y
     
        PROD = X * Y
     
        SOUS = X - Y
     
        DIV = X/Y
     
    write (*,*) "la somme est " , SOM  
     
    write (*,*) "le produit est " , PROD 
     
    write (*,*) "la soustraction est " , SOUS 
     
    write (*,*) "la division est " , DIV 
     
    elseif write (*,*) "error"
     
    write (*,*) "merci"
     
    end program somme_produit_soustraction_division

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    1. Tout d'abord, comme vous avez du vous en rendre compte, votre programme comporte 3 erreurs de syntaxe qui empêchent sa compilation :

    - ligne 15 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write (*,*'iostat=err) "entrer le second nombre" ; read (*,*) Y
    L'apostrophe figurant avant IOSTAT doit être remplacé par une virgule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write (*,*,iostat=err) "entrer le second nombre" ; read (*,*) Y
    - ligne 35 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif write (*,*) "error"
    Une clause ELSE IF n'est pas justifiée ici car vous ne faites pas de test supplémentaire. De plus la syntaxe est fausse (absence de test). Une simple branche ELSE suffit. Le bloc d'instruction à exécuter dans cette branche (ici, l' instruction WRITE(*,*) "error") ne doit pas débuter sur la même ligne que le mot clé ELSE. Enfin, la fin de l'instruction IF...THEN...ELSE... doit être explicitement mentionnée par le mot clé END IF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (err == 0) then
    ....
    else
     write(*,*) "error"
    end if
    2. Une fois ces erreurs de syntaxe corrigées, vous pourrez constater que votre programme se compile et s'exécute correctement lorsque vous fournissez 2 nombres en entrées. En revanche la gestion des erreurs de saisie (entrée non numérique) ne fonctionne pas car il y a une erreur de conception.

    En effet, vous récupérez la sortie d'erreur d'une instruction d'écriture :
    ligne 15 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write (*,*,iostat=err) "entrer le second nombre" ; read (*,*) Y
    Or, vous souhaitez contrôler les erreurs de saisie, qui sont détectables au moment de la lecture (instruction READ) et non de l'écriture (instruction WRITE). De plus, comme il y a deux saisies il faut récupérer la sortie d'erreur des deux instructions read.

    Le code suivant implante une solution qui affiche un message d'erreurs dès qu'une erreur de lecture se produit (on suppose ici que seule les saisies non numériques sont susceptibles de produire une erreur de lecture).

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    program somme_produit_soustraction_division
     
    implicit none
     
    real ::  X , Y , SOM, PROD, SOUS, DIV
     
    integer :: err
     
    write (*,*) "bonjour"
     
    write (*,*) "nous effectuerons simultanement le calcul de la somme du produit et de la division des nombre entiers"
     
    write (*,*) "entrer un nombre (X) :" ; read (*,*,iostat = err) X
    if (err /= 0) then					! une erreur IO s'est produite
    	write(*,*) "Error : not a number"	! Affiche un message d'erreur
    	stop;						! Interrompt l'exécution
    end if
     
    ! Si le programme parvient à ce stade, la première entrée est numérique
     
    write (*,*,iostat=err) "entrer le second nombre (Y) : " ; read (*,*, iostat = err) Y
    if (err /= 0) then						! Ce bloc (l22:l25) est identique au précédent (l14:l17)
    	write(*,*) "Error : not a number"
    	stop;
    end if
     
    ! Si le programme parvient à ce stade, la seconde entrée est numérique
    ! Toutes les conditions sont vérifiées pour exécuter le traitement
    SOM  = X + Y
    PROD = X * Y
    SOUS = X - Y
    DIV  = X/Y
     
    write (*,*) "X + Y = " , SOM  
    write (*,*) "X * Y = " , PROD 
    write (*,*) "X - Y = " , SOUS 
    write (*,*) "X / Y = " , DIV 
    write (*,*) "Merci"
     
    end program somme_produit_soustraction_division
    3. Enfin, une dernière remarque : si l'on utilise la notation scientifique, les lettres e,E,d et D peuvent figurer dans l'écriture d'un réel. Ainsi, vous pouvez vérifier que le programme précédent accepte l'entrée "3.d1" (qui représente le réel 30).

    Bonne continuation.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Merci bien
    svp LittleOwl j'ai du mal a interpreté l'expression "3.d1"

Discussions similaires

  1. problème en program Fortran
    Par djwyyoucef dans le forum Fortran
    Réponses: 6
    Dernier message: 02/03/2013, 12h07
  2. [VB6] Problème d'addition de dates et de nombres
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/11/2002, 21h12
  3. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22

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