Как сделать логический выбор, используя вычисления в c? - PullRequest
0 голосов
/ 03 февраля 2019

Я помогаю своей дочери с вводным заданием по программированию, и ее домашняя работа содержит простое меню, подобное этому:

Please choose an option below:
------------------------------
1. Linear time
2. Logarithmic time
3. Exponential time

Теперь, как правило, было бы довольно просто определить, какой выбор меню, но ей запрещено использовать логические операторы, реляционные операторы, побитовые операторы или конструкции выбора.Мы пытались использовать модуль, но безрезультатно.Это вообще возможно?По сути, она может использовать только +, -, *, /, and %.Как и простые переменные.

Единственное решение, которое мы до сих пор придумали, это использование равенства:

(choice==1)*n + (choice==2)*log(n) + (choice==3)*(n*n)

, где n - размер набора данных для сортировки, ноэто не разрешено.

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Используйте

int (* choice[3])(int n) = { linear, log, exp };

, где каждый является функцией n, возвращающего int.Звоните через

 v = choice[I](n);
0 голосов
/ 03 февраля 2019

Если вычисления немного сложнее, может быть сложно сделать это за одну операцию.Затем используйте указатели на функции:

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);
}

Я надеюсь, что массивы разрешены :) Очень странные требования - это ничему не учит, кроме плохих практик.Аргументы и возвращаемые типы являются примером, конечно.

0 голосов
/ 03 февраля 2019

используйте только +, -, *, / и%

Хмм - странное ограничение


Вместо (choice==1)*foo1 + (choice==2)*foo2 + (choice==2)*foo3

Используйте умножение, деление, чтобы применить == для выбора значений choice 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)) * foo3

Обратите внимание (choice-2)*(choice-3)/((1-2)*(1-3)) равно 1, когда choice==1 в противном случае 0.


Этот метод похож на Метод Лагранжа в полиномиальной аппроксимации кривой.

...