Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Система компьютерной алгебры GAP - ввод данных пользователем


Добрый день!

Один из распространных вопросов о системе GAP - можно ли ввести данные с клавиатуры в процессе вычислений ?

Действительно, система задумана в первую очередь для ввода данных в качестве аргументов функций пользователя, например:

gap> Factorial(20);
2432902008176640000
gap> G:=Group((1,2),(1,2,3));
Group([ (1,2), (1,2,3) ])


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

Для этого можно использовать следующий прием:

1) Создать поток (stream) с помощью функции InputTextUser :

gap> s := InputTextUser();
InputTextFile(*stdin*)

2) Прочитать строку из этого потока:

gap> Print( "Prompt: \c" ); w := ReadLine( s );;
Prompt:

Здесь  Prompt - любая информация, которую Вы хотите отобразить на экране. Символ "\c" нужен, чтобы перейти к вводу данных в той же строке, не ожидая команды перехода на следующую строку. Итак, после появления приглашения Вы вводите данные и нажимаете "Enter", например:

Prompt: 123

после чего Вы получаете введенные данные в виде строки символов:

gap> w;
"123\n"

3) Теперь эту строку можно преобразовать в объект с помощью функции EvalString :

gap> a := EvalString( w{[ 1 .. Length(w)-1 ]});
123

Другой пример преобразования в данные строки, содержащей несколько элементов ввода, разделенных пробелами, с помощью функций SplitString и Int :

gap> Print( "Prompt: \c" ); w := ReadLine( s );;
Prompt: 1 2 3 4 5 6
gap> w;
"1 2 3 4 5 6\n"
gap>SplitString( w, " \n" );                  
[ "1", "2", "3", "4", "5", "6" ]
gap> SplitString( l, " \n" );
[ "1", "2", "3", "4", "5", "6" ]
gap> List( last, Int );
[ 1, 2, 3, 4, 5, 6 ]
gap>

 

С уважением,

Коновалов А.Б. 


В избранное