Точный вопрос будет звучать так: «Это уравнение, которое вы хотите использовать, x = f (Xo)». Это уже находится в операторе if, поэтому, если оно истинно, продолжайте, если нет, то предложите пользователю ввести другую функцию.
С Maple, как я могу предложить пользователю ответить на логическое выражение?
Ответы (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
будет назначен как побочный эффект.