2017-09-26 4 views
2

Je suis en train de construire mon premier truc sur Smalltalk et j'ai rencontré un problème. Je dois traiter un nombre entré par l'utilisateur, et je dois le diviser par 2 et être toujours un nombre entier. Si un utilisateur entre 10, je vais travailler avec 5, s'ils entrent 11, je dois travailler avec 6, mais j'obtiendrai évidemment 5,5. Si je pouvais obtenir le mod d'un nombre, je pourrais simplement m'assurer que mod = 0 sinon ajouter 0.5 et cela ferait aussi bien, mais je ne trouve pas comment faire une opération mod dans SmallTalk, tous mes Les recherches se terminent par des trucs sans rapport avec la petite conversation sociale, ce qui est extrêmement frustrant. Donc, si vous pouviez me dire comment obtenir le mod d'un nombre ce serait génial, si vous pouviez me dire comment arrondir avec une fonction séparée, encore mieux. Merci pour votre aide et votre temps à l'avance.Ronde vers Integer dans Smalltalk

MISE À JOUR: Après quelques recherches, j'ai essayé de le faire de cette façon:

mod := par rem: 2. 
mod = 0 ifFalse: [ par := par + 0.5 ]. 

où que "mod" est mod de la variable "par", et si ce n'est pas 0, devrait ajouter 0,5 au pair.

Mon problème maintenant est que d'essayer d'utiliser par dans un timesRepeat fait apparaître une erreur "BoxedFloat64 n'a pas compris #timesRepeat". Donc, je suis toujours dans le même problème, ou juste besoin d'un moyen de faire un flottant dans un nombre entier.

+1

Pourriez-vous préciser quel dialecte utilisez-vous? par exemple. pharo, squeak, vw, ...? –

+0

Pharo, même si mon problème a déjà été corrigé, merci. Cependant, si vous savez comment convertir un float (qui n'a pas de partie décimale) en entier, ce serait vraiment utile pour de futures références. – Markski

+0

Vous pouvez toujours parcourir les méthodes de BoxedFloat64 et ses superclasses (Squeak a une fonction "parcourir le protocole" qui vous permet de les parcourir tous en même temps, mais je ne sais pas si elle est encore disponible dans Pharo et comment elle s'appelle Là). Number a une méthode 'asInteger' qui tronque le flottant (ce qui n'est pas exactement ce que vous voulez, mais il pourrait vous guider vers d'autres méthodes). Il y a aussi 'roundUpTo:', 'roundTo:' et 'rounded'. Le message binaire pour la division entière est '//' et son compagnon modulo est double-antislash. – JayK

Répondre

5

Il y a beaucoup de façons. Par exemple

Ajouter 1 au numéro entré avant div par 2 si le nombre entré est impair

temp := enteredNumber. 
temp odd ifTrue: [temp := temp + 1 ]. 
^temp/2 

En utilisant la méthode de plafond

^(enteredNumber/2) ceiling 
4

En Smalltalk, nous avons un opérateur pour la division entière (et même deux opérateurs):

11/2 

répondraient à un Fraction, pas un tout Integer
Mais:

11 // 2 

répondraient au quotient de la division, arrondi vers l'infini négatif
Et le reste correspondant sera:

11 \\ 2 

Le deuxième opérateur quo: pour quotient et rem: pour le reste
La différence est seulement avec le récepteur/opérande négatif: les derniers tronquent le quotient vers zéro.

-11 // 4 = -3. "floored toward negative infinity" 
-11 \\ 4 = 1. 
(-11 quo: 4) = -2. "truncated toward zero" 
(-11 rem: 4) = -3. 

Si vous voulez arrondir le quotient supérieur (vers l'infini), alors vous pouvez écrire:

(anInteger + 1) // 2. 

Ou même sans parenthèses si vous êtes assez confiant dans l'opérateur binaire priorité:

anInteger + 1 // 2.