Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Smalltalk
Smalltalk Forum d'entraide sur la programmation en Smalltalk
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/03/2011, 15h21   #1
Invité de passage
 
Inscription : mars 2011
Messages : 1
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 1
Points : 0
Points : 0
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
youchlure13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 10h30   #2
Nouveau Membre du Club
 
Inscription : août 2009
Messages : 35
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 35
Points : 34
Points : 34
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 :
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
vicnet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/03/2011, 18h46   #3
Membre éclairé
 
Avatar de maske
 
Homme
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 204
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mai 2008
Messages : 204
Points : 398
Points : 398
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).
__________________
[|]
maske est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 10h20   #4
Invité régulier
 
Inscription : septembre 2009
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 56
Points : 7
Points : 7
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
youchlure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 12h47   #5
Membre éclairé
 
Avatar de maske
 
Homme
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 204
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mai 2008
Messages : 204
Points : 398
Points : 398
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"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".
__________________
[|]
maske est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 13h17   #6
Invité régulier
 
Inscription : septembre 2009
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 56
Points : 7
Points : 7
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
youchlure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 13h42   #7
Membre éclairé
 
Avatar de maske
 
Homme
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 204
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mai 2008
Messages : 204
Points : 398
Points : 398
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 :
valeur := (aReadStream upTo: Character cr) asNumber.
par :

Code :
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.
__________________
[|]
maske est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/03/2011, 13h36   #8
Membre éclairé
 
Avatar de maske
 
Homme
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 204
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mai 2008
Messages : 204
Points : 398
Points : 398
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 :
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
__________________
[|]
maske est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h31.


 
 
 
 
Partenaires

Hébergement Web