Déterminer si un nombre est un multiple de dix ou au sein d'un ensemble de plages
J'ai un peu de boucles que j'ai besoin dans mon programme. Je peux écrire le pseudo-code, mais je ne suis pas entièrement sûr de savoir comment les écrire logiquement.
J'ai besoin d' -
if (num is a multiple of 10) { do this }
if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) { do this }
else { do this } //this part is for 1-10, 21-30, 41-50, 61-70, 81-90
C'est un des serpents et des échelles jeu de plateau, si elle fait plus de sens pour ma question.
J'imagine que la première instruction si je vais avoir besoin d'utiliser le module, serait if (num == 100%10)
correct?
La deuxième, je n'ai aucune idée. Je peux l'écrire comme if (num > 10 && num is < 21 || etc)
mais il y a quelque chose de plus intelligent que cela.
- Généralement, la longueur de code de qualité est proportionnelle à la longueur de l'anglais décrivant ce qu'il fait. Ainsi, lorsque votre "cahier des charges", explique 11-20, 31-40, 51-60, 71-80, 91-100, vous pouvez vous attendre de votre code de mention de ces numéros. Si ces chiffres proviennent de quelque part ou ont été générés par une raison quelconque, voir si vous pouvez vous le code de la raison plutôt que par le nombre.
- Merci pour cela, je n'ai pas entendu de cette philosophie avant. J'ai à plusieurs reprises tombé dans le processus de pensée de "l'Homme, je pourrais faire beaucoup plus efficace et beaucoup plus petit." et je suppose que mon code est mauvais. Peut-être que je suis actualisation façon importante la lisibilité de l'est. Je pense qu'il y a un équilibre que je vais avoir à travailler.
- Le compilateur ne se soucie pas un peu le degré de lisibilité de votre code; de compiler en une fraction de seconde. Mais pour les humains lecture de votre code, les choix que vous faites peut l'amener à être compris dans les secondes, les minutes, les heures, ou jamais. Cela impose un coût; les gens sont payés pour lire et comprendre le code, alors assurez-il facile pour eux. Toujours écrire le code de production pour maximiser la lisibilité, et n'oubliez pas que la concision n'est pas nécessairement de rendre le code plus performant.
- Les titres sur vos deux autres questions sont vraiment bons titres; ils décrivent précisément ce que la question est à propos techniquement. J'ai édité parce que c'est vague, et plus sur vous que le codage problème.
- Je ne vois pas pourquoi, dans un jeu de serpents et échelles, il ne serait jamais nécessaire pour découvrir cette information. Pourriez-vous élaborer sur la façon dont ce code est susceptible d'être utilisé? Je demanderai seulement parce qu'il ne me frappe pas comme une conception orientée objet et il pourrait y avoir une meilleure façon.
- votre point est extrêmement valable. Moi aussi, je vois des gens écrire "intelligent" de code, inconscient du fait que la seule personne qui pourrait se soucient de leur intelligence (la prochaine personne qui lit le code) vont détester pour ça, et avec pas visible avantage de performance. Vous fait pleurer.
- Dans ces situations, j'ai parfois laisser l'original, de l'onu-code optimisé, mais en commentaire. Je pense qu'il aide le lecteur à comprendre ce qui se passe.
- J'ai TRÈS RAREMENT fait de même, mais seulement pour la performance des sections critiques. Le plus serré de la boucle qui est appelé 100M fois qualifie - si l'instruction dans un jeu de serpents et échelles de ne pas. Où tracer la ligne de démarcation entre eux, c'est un choix personnel.
- Je déteste dire ça, mais en avoir fait assez, entreprise de travail, avec des débutants de l'écriture de code réel, je dois vous recommandons de brute forcer. Parce qu'alors, le nouveau gars vont comprendre et ne pas le casser. triste mais vrai - dans certains cas, il est intelligent pour être muet.
- C'est un décent question, et je ne veux pas prendre quelque chose loin de l'affiche, mais cela ne mérite pas plus de 500 points. C'est de cette façon nous nous retrouvons avec quelques le non-sens que nous faisons avec les personnes avec des milliers de points figurant à être responsables. (N'hésitez pas à déplacer ce commentaire si elle appartient d'ailleurs.)
- et où le tracé de la ligne de Serpents et Échelles est de la plus haute importance >;-)
- Il vous indique la direction à la place suivante. 1-10 aller de gauche à droite le long du bas de la carte. 11 est au-dessus de 10 et de 11 à 20 aller de droite à gauche le long de la deuxième ligne, et ainsi de suite. Si l'OP est d'essayer de déterminer s'il faut déplacer le compteur vers le haut (si n est un multiple de 10), à droite (si n est dans 1-9, 21-29, etc) ou à gauche (si n est dans 11-19, 31-39, etc).
Vous devez vous connecter pour publier un commentaire.
Pour la première, pour vérifier si un nombre est un multiple d'utilisation:
Pour la seconde:
Mais c'est plutôt dense, vous pourriez être mieux de ne faire qu'une liste des options explicitement.
Maintenant que vous avez donné une meilleure idée de ce que vous faites, j'écrirais le second:
Ses la même logique, mais par l'aide de la fonction nous avoir une idée plus claire de ce que cela signifie.
if((num - 1) / 10) % 2 == 1 && num < 100)
- Je pleurerais si je voyais que.num <= 100
à 100 (ou cependant il serait écrit en c++).num >= 11
que (1) que la limite inférieure est proscrit, et (2)%
sur un nombre négatif renvoie un nombre négatif ainsi. (Je dois admettre à l'aide de& 1
ici est "plus sûr", mais suppose aussi des connaissances supplémentaires.)x % 10 == 0
œuvres. Personne n'a ressenti le besoin de couvrir ce détail mineur.getRow(num) % 2 == 0
dans une fonction aussi bien pour le rendre limpide ce que l'intention est.bool inEvenRow(int num){ return getRow(num) % 2 ==0;}
-, /, %
tous ensemble rend mon cerveau bloque si je ne peux pas donner un sens à tout de suite, mais peut-être que c'est juste moi.x & 1
au lieu dex % 2 == 1
?(num % 20) <= 20
? Cela est vrai pour toutes les valeurs denum
. Que vous vouliez écrirenum % 20 == 0 || num % 20 >= 11
, mais à mon avis, une bonne alternative est(num - 1) % 20 >= 10
% 2 == 1
est devenu% 2 == 0
après la réécriture; vous pouvez le fixer. 🙂bool oddRow(int num) { return 1 & getRow(num); }
if (num est un multiple de 10) { faire }
if (num est à l'intérieur 11-20, 31-40, 51-60, 71-80, 91-100) { cela }
L'astuce ici est de regarder pour une sorte de point commun entre les plages. Bien sûr, vous pouvez toujours utiliser la "force brute" de la méthode:
Mais vous remarquerez peut-être que, si vous soustrayez
1
denum
, vous aurez les plages:En d'autres termes, tous les nombres de 2 chiffres dont le premier chiffre est impair. Ensuite, vous avez besoin de trouver une formule qui l'exprime. Vous pouvez obtenir le premier chiffre en divisant par 10, et vous pouvez vérifier que c'est bizarre en vérifiant un reste de 1 lorsque vous divisez par 2. Ensemble:
Donné le trade-off entre plus de mais code maintenable et plus court "intelligent" de code, je prendrais plus de temps et plus clair à chaque fois. À tout le moins, si vous essayez d'être intelligent, s'il vous plaît, veuillez inclure un commentaire qui explique exactement ce que vous essayez d'accomplir.
Il aide à prendre la prochaine développeur pour travailler sur le code est armé et sait où vous habitez. 🙂
&& isTensDigitOdd(num)
, peut-être avec un commentaire avant la définition de la fonction d'expliquer ce qu'il fait. Si un tel modèle existe, un commentaire expliquant le raisonnement pour le motif est éclairante pour la maintenabilité de l'omi.Si vous utilisez GCC ou un compilateur qui prend en charge Cas Des Plages vous pouvez faire cela, mais votre code de ne pas être portable
C'est pour les futurs visiteurs, plus qu'un débutant. Pour un cadre plus général de l'algorithme comme solution, vous pouvez prendre une liste de début et de fin, de valeurs et de vérifier si une valeur passée est à l'intérieur de l'un d'entre eux:
Pour des raisons de simplicité, j'ai utilisé un polymorphe lambda (C++14) au lieu d'une explicite
pair
argument. Cela devrait aussi probablement s'en tenir à l'aide de<
et==
pour être cohérent avec les algorithmes standards, mais il fonctionne comme ceci aussi longtemps queElem
a<=
définis. De toute façon, il peut être utilisé comme ceci:Il y a un exemple vivant ici.
Premier est facile, il vous suffit d'appliquer le modulo à votre num de la valeur:
Depuis le c++ est l'évaluation de chaque numéro qui n'est pas 0 comme vrai, vous pourriez également écrire:
Pour le deuxième je pense que c'est un nettoyant pour le comprendre:
Le schéma se répète tous les de 20, de sorte que vous pouvez calculer modulo 20.
Tous les éléments que vous voulez être dans une rangée à l'exception de ceux qui sont divisibles par 20.
Pour obtenir ces trop, il suffit d'utiliser num-1 ou mieux num+19 pour éviter de traiter avec des nombres négatifs.
C'est en supposant que le schéma se répète à l'infini, alors pour 111-120 elle s'appliquerait à nouveau, et ainsi de suite. Sinon, il faut en réduire le nombre à 100:
Avec un couple de bons commentaires dans le code, il peut être écrit assez concise et lisible.
num % 10 == 0
est la même chose quenum
est un multiple de 10.if (num % 10 == 0)
signifie la même chose que// Check if it's a multiple of 10
ne devrait pas être le maintien de la votre code. C'est bien connu, les anti-modèle.%
est un anti-pattern; évidemment, il ne l'est pas. Vraiment, en supposant que la plupart des lecteurs de ce post seront les débutants, en leur enseignant ce style d'écriture des commentaires est de faire une contribution négative à leur développement en tant que programmeurs.Vous explique essentiellement la réponse vous-même, mais voici le code au cas où.
x < 41 x > 50
et de mettre entre parenthèses.operator&&
a une priorité plus élevée queoperator||
, il est donc très bien, mais je suis sûr que GCC met en garde contre elle de toute façon.10 < x < 21
comme10 < x && x < 21
plutôt quex > 10 && x < 21
. Il est plus facile de lire l'inégalité quand il est dans le même ordre que vous voulez écrire mathématiquement.Vous pourriez avoir à y penser cela.
La première ligne
if (x % 10)
fonctionne parce que (un) une valeur qui est un multiple de 10 calcule comme '0', d'autres numéros de résultat dans leur reste a été, (b) une valeur de 0 dans unif
est considéré commefalse
, toute autre valeur esttrue
.Edit:
À bascule dos-et-vient dans la vingtaine, utiliser la même astuce. Cette fois, le pivot nombre est
10
:x/10
renvoie n'importe quel nombre de 0 à 90
, de 10 à 191
et ainsi de suite. Essai sur pair ou impair -- le& 1
-- vous dit si c'est pair ou impair. Depuis vos gammes, sont, en fait, "de 11 à 20", soustraire 1 avant le test.Un plaidoyer pour des raisons de lisibilité
Alors que vous avez déjà quelques bonnes réponses, je tiens à recommander une technique de programmation qui permet de rendre votre code plus lisible pour le futur lecteur, et que peut être vous dans six mois, un collègue a demandé à effectuer une revue de code, votre successeur, ...
C'est pour envelopper un "sage" des instructions dans une fonction qui montre exactement (avec son nom) ce qu'il fait. Bien qu'il y est un minuscule impact sur la performance (à partir de la fonction "appel-dessus de la tête) c'est vraiment négligeable dans un jeu de ce genre de situation.
Le long de la façon dont vous pouvez désinfecter vos contributions par exemple, test pour "illégale" des valeurs. Ainsi, vous pourriez vous retrouver avec ce code - voir comment beaucoup plus lisible c'est? Les "fonctions auxiliaires" peut-être caché quelque part (le n'avez pas besoin d'être dans le module principal: il est clair à partir de leur nom de ce qu'ils font):
YES
etNO
?TRUE
,True
, outrue
? Et ce qui, le cas échéant, les fichiers d'en-tête j'ai besoin d'inclure dans C ordinaire? Donc j'ai roulé ma propre. Me demande si c'est ce que s'est un downvote...Pour le premier:
s'applique:
Pour la seconde:
s'appliquent pour:
Nous avons d'abord faire
x-1
pour obtenir:Ensuite, nous divisons par
10
pour obtenir:Nous avons donc vérifier si ce résultat est impair.
Vous pouvez essayer ce qui suit:
Comme d'autres l'ont souligné, rendant les conditions les plus concis de ne pas accélérer la compilation ou à l'exécution, et il n'est pas nécessairement aide à la lisibilité soit.
Où il peut contribuer à votre programme plus souple, dans le cas où vous décidez plus tard que vous voulez un enfant en bas âge de la version du jeu sur un 6 x 6 conseil d'administration, ou une version avancée (que vous pouvez jouer tout au long de la nuit) sur une 40 x 50 conseil.
Donc, je voudrais le code comme suit:
Oui, c'est verbeux, mais il fait clair exactement ce qui se passe sur le plateau de jeu.
Si j'étais le développement de ce jeu pour l'affichage sur un téléphone ou une tablette, je voudrais faire des LIGNES et des COLONNES des variables au lieu de constantes, de sorte qu'ils peuvent être définis de manière dynamique (au début du jeu) pour correspondre à la taille de l'écran et de l'orientation.
Je voudrais aussi permettre l'orientation de l'écran pour être modifiés à tout moment, en milieu de partie - tout ce que vous devez faire est de basculer les valeurs de LIGNES et de COLONNES, tout en laissant tout le reste (l'actuel square numéro de chaque joueur est sur, et le début/la fin des carrés de tous les serpents et les échelles) inchangée.
Ensuite, vous avez "juste" à dessiner le conseil joliment, et l'écriture de code pour vos animations (je suppose que c'était le but de votre
if
consolidés) ...#define
#define
instructions, de mettre des parenthèses autour de l'argumentation, où ils apparaissent dans l'expansion. Ainsi, au lieu de#define finished(num) (num == lastSquare)
vous devriez écrire#define finished(num) ((num) == lastSquare)
. La raison en est que si vous utilisez une instruction avec une expression contenant un opérateur avec une assez faible priorité, vous n'aurez pas la réponse que vous attendez. Dans ce cas, si vous n'utilisez pas le supplément de parenthèses, puisfinished(a & b)
se développe dans(a & b == lastSquare)
qui est presque certainement pas ce que vous voulez.Je sais que cette question a donc beaucoup de réponses, mais je vais jeté la mienne, de toute façon...
Prises de Steve McConnell Code Complet de la 2e Édition:
Escalier D'Accès Tables:
Pourtant, un autre type d'accès à la table est l'escalier de la méthode. Cette méthode d'accès n'est pas aussi
direct comme une structure d'index, mais il ne gaspille pas d'autant d'espace de données.
L'idée générale de l'escalier structures, illustré dans la Figure 18-5, est que les entrées dans un
le tableau sont valables pour des plages de données plutôt que pour les points de données distinctes.
Figure 18-5 L'escalier approche catégorise chaque entrée par déterminer le niveau
qui il rencontre un “escalier.” Le “pas”, il frappe détermine sa catégorie.
Par exemple, si vous écrivez un programme de terrassement, le “B” entrée de gamme peut-être à partir de 75,
à 90 pour cent. Voici toute une gamme de nuances que vous pourriez avoir à programmer un jour:
À utiliser l'escalier étape, la méthode, vous placez l'extrémité supérieure de chaque plage dans une table et
puis écrire une boucle pour vérifier un score contre l'extrémité supérieure de chaque plage. Lorsque vous trouvez
le point où le score le premier dépasse le haut de gamme, vous savez ce que le grade
est. Avec l'escalier technique, vous devez faire attention à gérer les points de terminaison de l'
les plages correctement. Voici le code en Visual Basic qui attribue des notes à un groupe de stu-
bosses basé sur cet exemple:
Bien que c'est un exemple simple, vous pouvez facilement généraliser à gérer plusieurs étudiants, plusieurs de classement des régimes (par exemple, les différents grades différents pour différents niveaux de points sur différentes missions) et les changements dans les critères de notation."
Code Complet de la 2e Édition des pages de 426 428 (Chapitre 18).
Espérons que cela aide et désolé de ne pas convertir le code en c++, mais vous savez que le vieux dicton Chinois : "Ne pas donner du poisson à un mendiant, lui donner une canne à pêche!" 🙂