J'aide ma fille avec une affectation de programmation d'introduction à c, et ses devoirs contiennent un menu simple comme celui-ci:
(choice==1)*n + (choice==2)*log(n) + (choice==3)*(n*n)
Maintenant, généralement, il serait assez simple de déterminer ce que le menu le choix est, mais elle n'est pas autorisée à utiliser des opérateurs logiques, des opérateurs relationnels, des opérateurs de bits ou des constructions de sélection. Nous avons essayé d'utiliser le module, mais en vain. Est-ce seulement possible? Elle ne peut essentiellement utiliser que +, -, *, / et%
. Ainsi que des variables simples.
La seule solution que nous ayons trouvée jusqu'à présent est d'utiliser l'égalité:
Please choose an option below: ------------------------------ 1. Linear time 2. Logarithmic time 3. Exponential time
où n code > est la taille de l'ensemble de données à trier, mais ce n'est pas autorisé.
3 Réponses :
n'utilisez que +, -, *, / et%
Hmm - restriction étrange
Au lieu de
(choice == 1) * foo1 + (choice == 2) * foo2 + (choice == 2) * foo3 code>
Utilisez la multiplication, la division pour effectuer le
==
pour sélectionner les valeurs dechoix
1,2,3.(choice-2)*(choice-3)/((1-2)*(1-3)) * foo1 + (choice-1)*(choice-3)/((2-1)*(2-3)) * foo2 + (choice-1)*(choice-2)/((3-1)*(3-2)) * foo3Remarque
(choix-2) * (choix-3) / ((1-2) * (1-3))
vaut 1 quandchoice == 1
sinon 0.
Cette technique est comme La méthode de Lagrange dans l'ajustement de courbe polynomiale.
Utilisez
v = choice[I](n);
où chacun est une fonction de n renvoyant un entier. Appelez via
int (* choice[3])(int n) = { linear, log, exp };
choix [I] (n)
suffit
Si les calculs sont un peu plus compliqués, il peut être difficile de le faire en une seule opération. Ensuite, utilisez des pointeurs de fonction:
double linear(double x) { double result; /* some cacls */ return result; } double logarithmic(double x) { double result; /* some cacls */ return result; } double expotential(double x) { double result; /* some cacls */ return result; } double (*calcfunc[])(double) = {linear, logarithmic, expotential}; double calc(int choice, double x) { return calcfunc[choice](x); }
J'espère que les tableaux sont autorisés :) Exigences très étranges - il n'enseigne rien, sauf les mauvaises pratiques. Les arguments et les types de retour sont des exemples bien sûr.
Logan a posé une question comparable ; cependant, sa solution choisie est exprimée en termes de variables spéciales. Nous cherchons une solution plus générale au problème.
Pouvez-vous utiliser des opérateurs au niveau du bit?
Non, aucun opérateur au niveau du bit n'est autorisé.
Désolé, mec, tu n'as pas de chance. Demandez au conseiller la raison de cela - une telle restriction est très déraisonnable pour moi.
@iBug, nous ne pourrions être plus d'accord. Dans l'industrie, je ne le fais que lorsque vous avez un besoin d'optimisation légitime. Toutes les autres fois, nous devons écrire un code clair et facilement compréhensible.
Appel via un tableau de 3 pointeurs de fonction.
Que doit-il se passer si une valeur en dehors de la plage 1-3 est entrée?
L'instructeur dit que les valeurs ne seront jamais que 1, 2 ou 3.
@ChrisHeady Ce n'est peut-être pas une optimisation, cela dépend. En outre, il est rare d'avoir besoin d'écrire du code sans branche.
@iBug Il est quitté possible a> pour sélectionner les valeurs de
choice
.