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

Ada Discussion :

[Débutant] Petit problème pour calcul de somme


Sujet :

Ada

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut [Débutant] Petit problème pour calcul de somme
    bonjour, tout le monde, voila, je me lance dans l'apprentissage d'Ada cette année, et je bute sur un petit problème...

    J'essaye de calculer une somme de ce style:
    voici 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
    23
    24
     
    use Ada.Text_Io, Ada.Float_Text_IO, Ada.Integer_Text_Io;
     
    procedure somme is
     
       N : Integer;
       H : Float;
     
     
       begin
     
    H := 0.0;
          Put_Line("Donne un chiffre");
          get(N);
     
          for I in 1..N loop
             H:=H+(1/I);
     
     
          end loop;
     
             Put(H);
     
    end Somme;
    seulement cela ne marche pas... Ada n'arrive pas a faire une opération entre un float et un integer, et si j'essaye de mettre H en integer, le résultat est toujours 1...


    merci d'avance, et à bientôt!

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Oui ADA est assez rigide sur les types, du coup il faut avoir recours à du transtypage comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for I in 1..N loop
         H:=H+(float(1)/float(I));
    end loop;
    Tu peux aussi arrondir un réel en entier avec "integer(ton_reel)".

    Enfin pense à mettre un "skip_line;" après ton "get(n)" pour signaler l'attente d'un "retour chariot" à ADA.

    Bon courage d'un autre débutant en ADA

    EDIT: j'avais oublié le float(1), merci jc-miranda. Tu peux aussi écrire 1.0 pour alléger le code.

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par kriskikout
    j'essaye de mettre H en integer, le résultat est toujours 1...
    Ceci est normal, dans ton cas.
    La division entiere 1/N avec N>1 donne toujours 0.

    Pour que ton calcul se passe bien, il faut que tu convertisses les operandes de la division en float.
    Ada rale car le typage de ton expression n'est pas homogene :
    float + (entier/entier)

    Si tu ecris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    H := H + Float(1)/Float(I);
    Ca devrait mieux se passer.

    A+

    Juan

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    merci bien pour vos réponses!

    mon problème est résolu

    ps: pour skip_line, je ne l'utilise pas, car personne n'a su m'expliquer clairement son "boulot"... ça reste assez flou pour moi! si vous avez une bonne explication ou un lien vers une bonne explication: je suis preneur!

  5. #5
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Je pense qu'il est assez difficile de comprendre le fonctionnement de Skip_Line si on sait pas ce qu'est un buffer et les entrée/sortie standard.

    En fait, une fois le programme lancé, absolument tout ce que tu tape au clavier dans ton terminal va être enregistré quelque part dans la mémoire (dans le buffer d'entrée standard) en attendant d'être lu par ton programme (à coup de get ou get_line).

    La procedure Skip_Line va simplement enlever tous les caractères du buffer d'entrée standard jusqu'au prochain retour à la ligne enregistré. Un peu à la façon d'un get_line dont on ignorerais la valeur lue.



    Ça c'est pour le principe de base. Maintenant, selon la configuration du terminal, celui-ci peut ne pas envoyer directement dans le buffer d'entrée standard chaque caractère tapé. Au contraire il peut les mettre dans un buffer intermédiaire et n'envoyer les données qu'à la pression de la touche "entrée".
    Le fait d'avoir un buffer intermédiaire géré par le terminal te permet notemment de revenir en arrière et corriger les éventuelles fautes.


    Placer un Skip_Line après chaque lecture est une bonne pratique car elle permet de dire explicitement que l'on attend un retour à la ligne après les données lues.


    Si c'est encore flou essaye ces deux bouts de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Get(N);
    Get(N);
    Get(N);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Get(N); Skip_Line;
    Get(N); Skip_Line;
    Get(N); Skip_Line;
    Avec en entrée "1 2 3". Tu verras la différence.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/09/2013, 17h22
  2. [Doctrine] requête pour calculer une somme
    Par flora806 dans le forum ORM
    Réponses: 26
    Dernier message: 23/03/2011, 11h38
  3. Réponses: 11
    Dernier message: 19/09/2010, 14h37
  4. [AC-2003] Bloqué pour calculer la somme d'un champ entre 2 date
    Par bastien3117 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/08/2009, 13h08

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