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

Smalltalk Discussion :

Programmer une sonde qui observerait une moyenne de valeurs à une date souhaitée


Sujet :

Smalltalk

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 1
    Par défaut Programmer une sonde qui observerait une moyenne de valeurs à une date souhaitée
    Bonjour,

    Je suis novice dans la manipulation de Smalltalk et je viens demander votre aide.

    J'ai une chronique de chiffre qui s'étend sur 20 000 valeurs environ.

    Mon but est de programmer une sonde qui observerait la moyenne de ces valeurs à une date t souhaitée.
    Par exemple, je fais tourner le programme sur 10 ans donc 3650 step, et il me sort la somme de ces 3650 divisée par 3650.

    Merci de votre aide par avance.

    Cordialement

    Julien

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 35
    Par défaut
    Pour le langage lui même :
    - le livre gratuit Pharo by Exemple (en cours de traduction), sinon son petit frère déjà traduit
    - les tutoriels, en particulier sur ce site
    - le cheat sheet sur la langage avec les commandes principales
    - le code existant pour repiquer des idées

    Pour ton programme, le mieux, sous Smalltalk, enfin Pharo, c'est de commencer par écrire les tests, sous forme de tests unitaires.
    Avant même d'écrire tes classes, tu crées un test qui ca mettre en oeuvre une fonction de ta classe (qui n'existe pas).
    Tu lances le test, ça ne marche pas forcement et là Pharo te propose de créer la classe et les méthodes pas à pas. Reste à remplir le fond.
    Ecrire le code par les tests, ça fixe les idées sur ce que tu veux ou ce dont tu as besoin.

    Dans ton cas, tu imagines que tu as une classe qui contient des valeurs, disons 10 valeurs fixées toutes à 5 et que tu veux récupérer la moyenne de3 valeurs à partir du 6ième élément.
    Ca donne en gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    setup
      donnees := Donnees exemple.
    testDixValeursidentiquesNominal
     self assert: (donnees moyenneSur: 3 aPartirDe: 6) = 5.
    Est-ce que le test correspond à ce que tu attends de ton programme ?
    a+
    Vicnet

  3. #3
    Membre chevronné

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    C'est pour quel Smalltalk exactement ?

    Sinon ce que tu demandes n'est pas super clair...


    C'est quoi une chronique sur 20 000 valeurs ?

    Pourquoi avoir besoin de calculer la moyenne à une date t alors que tu as déjà tes 20 000 valeurs ? (je suis pas bien sûr de comprendre le terme "chronique"...).

    Pour avoir besoin de calculer une moyenne à une date t, il faut que les valeurs arrivent progressivement au cours du temps.

    Au niveau algorithmie (rien à voir avec Smalltalk en fait...), il s'agirait d'obtenir une valeur, de la stocker, et ainsi de suite au cours du temps, puis à un moment choisi t + t1 on demande au programme de calculer la moyenne, ce qu'il ferait en sommant toutes les valeurs récupérées jusqu'ici et en divisant par le nombre de valeurs reçues pendant t1 - t ?

    Est-ce que c'est ça ?

    Une fois que ça sera plus clair on pourra voir pour du Smalltalk (en ce qui me concerne en tous cas).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 103
    Par défaut
    bonjour,

    en fait j'ai une chronique de valeurs c'est a dire que j'ai un fichier qui contient 20000 pas de temps auquel correspond une valeur.

    Ce que je voudrai, c'est lorsque je lance mon programme (visualworks), je puisse obtenir la moyenne de ces valeurs à un temps souhaité.

    Par exemple je decide de le faire tourner sur 365 jours, et j'obtiens la moyenne à cette date...
    Est ce plus clair?

    merci encore

  5. #5
    Membre chevronné

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Je ne comprend pas l'histoire des jours.

    Le jour est l'échelle du pas de temps ?

    Est-ce que ça veut dire que les 20 000 valeurs sont déjà présentes dans le fichier ou bien elles vont y être inscrites progressivement ?

    Si les 20 000 valeurs y sont déjà, et que l'utilisateur doit juste choisir combien de pas il veut lire (à supposer que un pas = un jour), il s'agit de lire le fichier sur N pas, et de faire la moyenne des valeurs.

    Dans Visual Works - dans un workspace ça ferait l'affaire pour tester :

    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
    "Déclaration des variables locales"
    | aReadStream nombreDePas aFilename sommeValeurs moyenne |
    
    "Ouverture du fichier de valeurs dans un flux en lecture"
    aFileName := 'URL/Chemin du fichier entre quotes' asFilename.
    aReadStream := aFileName readStream.
    
    
    "Lecture des valeurs dans le fichier. 
    On suppose que le fichier contient une valeur par ligne - il s'agit donc de lire le fichier
    (ouvert dans un flux) ligne par ligne (séparées par le caractère CR)"
    (1 to: nombreDePas) do: [:i| | valeur |
    
    valeur := (aReadStream upTo: Character cr) asNumber. sommeValeurs := sommeValeurs + valeur. ].
    moyenne := sommeValeurs / nombreDePas. moyenne inspect "Puis il suffit de sélectionner tout le code, de faire un bouton droit puis "doIt""
    Je ne garanti pas que ça marche pour les raisons suivantes :

    - ça fait quelques temps que je n'ai pas touché Visual Works, mais ça doit être à peu près ça (au pire ça s'en rapproche, il suffirait de tester rapidement pour corriger ce que je ne peux pas faire sur ma machine lors de la rédaction de ce post).
    - encore une fois j'ai supposé beaucoup de choses sur ce qui était demandé...

    Après en terme de Smalltalk, je pense que tu as là tout ce qui est nécessaire : lecture d'un fichier, faire une boucle simple, utiliser le workspace...

    Après le mieux est, dans le cas d'un programme plus complexe qu'un simple "script", de s'attaquer à la création de classes, et peut-être faire comme Vicnet le suggère.

    Juste pour info, la doc de Cincom sur Visual Works est juste énorme pour prendre en main Smalltalk et VW. On la trouve en général à la racine de l'installation de VW dans le répertoire "Doc".

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 103
    Par défaut
    merci je vais essayer...

    En fait mon fichier .txt dont se sert le programme est fait comme ceci :


    1 23
    2 25
    3 56
    .. ...
    20000 48


    de 1 à 20000 sont des jours(pas de temps en journalier).

    Ce que je voudrais est le moyenne de la seconde colonne au pas de temps souhaité, par exmeple moyenne à pas de temps 12000...

    en tout cas merci de votre aide, je vous tiendrez informé du résultat

  7. #7
    Membre chevronné

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Ok, donc en fait le code que j'ai écrit est valable, à un détail près.

    Il faut lire la deuxième valeur de la colonne, c'est à dire remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur := (aReadStream upTo: Character cr) asNumber.
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Se déplacer jusqu'à la première valeur, séparée de la deuxième par un espace"
    (aReadStream upTo: Character space).
    "Se déplacer jusqu'à la seconde valeur, qui nous intéresse,
    séparée de la ligne suivante par un caractère "CR""
    valeur := (aReadStream upTo: Character cr) asNumber.
    Cela doit marcher

    Petite erreur cependant, il faut bien évidemment faire, juste après la déclaration de variables (en reprenant l'exemple du post précédent - c'est à dire lire le fichier jusqu'au pas 12000 pour en faire la moyenne):

    Note sur le message upTo: aCharacter :

    Lorsqu'on l'envoie à un stream, il se sert du caractère "aCharacter" pour savoir où s'arrêter dans la lecture du stream. une fois arrivé à ce caractère, il renvoie (sous forme d'une string je crois bien) tout ce qu'il y avait avant.

    Lorsque l'on reprend la lecture, il recommence à lire après ce caractère.

    Si lors du premier parsing, ce caractère n'a pas été trouvé, le contenu du stream est renvoyé du point courant jusqu'à la fin de celui-ci.

  8. #8
    Membre chevronné

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    C'est à cause du "CR" qui est situé hors du commentaire.

    Autre souci, une erreur de typo sur un nom de variable (aFilename au lieu de aFileName) et l'initialisation de la variable de somme.

    Mis à jour - et testé, ça marche.

    Après j'imagine que sur un fichier de plusieurs milliers de lignes ça peut mettre quelques secondes.

    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
    | aReadStream nombreDePas aFileName sommeValeurs moyenne |
    
    "Ouverture du fichier de valeurs dans un flux en lecture"
    aFileName := 'J:\test.txt' asFilename.
    aReadStream := aFileName readStream.
    
    "Initialisation des variables - mettre nombreDePas à la valeur voulue"
    nombreDePas := 3.
    sommeValeurs := 0.
    
    "Lecture des valeurs dans le fichier. 
    On suppose que le fichier contient une valeur par ligne - il s'agit donc de lire le fichier (ouvert dans un flux) ligne par ligne (séparées par le caractère CR)"
    
    (1 to: nombreDePas) do: [:i| | valeur |
    	"Se déplacer jusqu'à la première valeur, séparée de la deuxième par un espace"
    	(aReadStream upTo: Character space). 
    
    	"Se déplacer jusqu'à la seconde valeur, qui nous intéresse,
    	séparée de la ligne suivante par un caractère CR"
    	valeur := (aReadStream upTo: Character cr) asNumber.
    	
    	"Faire la somme des valeurs"
    	sommeValeurs := sommeValeurs + valeur].
    
    
    "Moyenne"
    moyenne := sommeValeurs / nombreDePas.
    aReadStream close.
    
    moyenne inspect

Discussions similaires

  1. [XL-2007] une formule qui calcule la moyenne mensuelle d'un tableau de valeur
    Par skipeemed dans le forum Excel
    Réponses: 6
    Dernier message: 31/05/2011, 10h53
  2. Réponses: 3
    Dernier message: 19/12/2007, 14h50
  3. Réponses: 13
    Dernier message: 05/03/2007, 09h29
  4. Réponses: 10
    Dernier message: 07/01/2007, 12h03
  5. faire une requete qui ne sort que les valeurs d'un champ coché
    Par joseph.breham dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/12/2006, 16h01

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