С Maple, как я могу предложить пользователю ответить на логическое выражение?

Точный вопрос будет звучать так: «Это уравнение, которое вы хотите использовать, x = f (Xo)». Это уже находится в операторе if, поэтому, если оно истинно, продолжайте, если нет, то предложите пользователю ввести другую функцию.


person bluerubez    schedule 02.02.2014    source источник
comment
возможный дубликат вычисления логического выражения от пользователя   -  person Ghost    schedule 04.02.2014


Ответы (1)


Ваша часть о том, что он уже находится внутри if statement, не очень работоспособна, потому что это не позволяет присвоить альтернативное значение чему-либо в случае, если первоначальный ответ отрицательный.

Вы должны уметь работать с чем-то вроде этого. Вызовите p() и присвойте его результат, скажем, ans, а затем поработайте с этим значением (и/или проверьте его для некоторых свойств).

restart:

p := proc()
local answer, oldprompt, res1, res2;
  oldprompt := interface(':-prompt'=``);
  try
    printf("Is the equation you want to use x=f(Xo)?  (y/n)\n");
    res1 := readline(-1);
    if member(res1,{"y;","y","yes;","yes"}) then
      answer := x=f(Xo);
    elif member(res1,{"n;","n","no;","no"}) then
      printf("Enter your equation.\n");
      res2 := readline(-1);
      answer := parse(res2);
    else
      printf("Response not recognized\n");
    end if;
  catch:
  finally
    interface(':-prompt'=oldprompt);
  end try;
  if answer='answer' then NULL else answer end if;
end proc:

ans := p();

[отредактировано ниже]

Можно немного приблизить его к оригиналу. С процедурой p, как показано ниже, возвращаемый результат будет одним из true/false/FAIL и может использоваться в условном выражении. В случае если возвращаемые значения ложны (из-за ответа на первоначальный запрос), то делается второй запрос о выборе другого выражения.

Эта версия p принимает два аргумента, первый из которых представляет собой предлагаемое начальное уравнение. Второе — это имя, которому можно присвоить любую альтернативу.

restart:

p := proc(candidate, resultvar)
local result, oldprompt, res1, res2;
  oldprompt := interface(':-prompt'=``);
  try
    printf(sprintf("Is the equation you want to use %a?  (y/n)\n",
                   candidate));
    res1 := readline(-1);
    if member(res1,{"y;","y","yes;","yes"}) then
      result := true;
      assign(resultvar,candidate);
    elif member(res1,{"n;","n","no;","no"}) then
      result := false;
      printf("Enter your equation.\n");
      res2 := readline(-1);
      assign(resultvar,parse(res2));
    else
      printf("Response not recognized\n");
      result := FAIL;
    end if;
  catch:
  finally
    interface(':-prompt'=oldprompt);
  end try;
  return result;
end proc:

Теперь мы можем проверить это.

p(x=f(X0), 'ans');

ans;

Мы также могли бы использовать вызов p внутри оператора if. Например,

if p(x=f(X0), 'ans') then
   "accepted";
else
   "new choice made";
end if;

ans;

Здесь ответ «n» на первый запрос приведет к тому, что условный тест увидит значение false, но именованный аргумент ans будет назначен как побочный эффект.

person acer    schedule 03.02.2014