我正在尝试编写图灵机的基本功能。 到目前为止,该程序接受用户输入并将其存储到List中,如下所示:
public String cmdLoop()
{
Scanner getReq = new Scanner( System.in );
for( ; ; )
{
say( "current read/write head position: " + currHeadPos );
say( "" );
SecondMenu();
say( "Type commands here:");
ArrayList<String>inputs = new ArrayList<String>();
String userInput = getReq.nextLine();
do{
userInput = getReq.nextLine();
inputs.add(userInput);
RunCmd(userInput);
}
while(!userInput.equals("Done"));
}
}
SecondMenu如下
public void SecondMenu()
{
say( "\t?\tprint current cell" );
say( "\t=\tassign new symbol to current cell" );
say( "\tE\terase current cell" );
say( "\tL\tmove head to left" );
say( "\tR\tmove head to right" );
say( "\tB\trewind to beginning of tape" );
say( "\tD\tdump contents of tape" );
say( "\tT\tset Transition commands" );
}
public void say( String s )
{
System.out.println( s );
}
每个输入都是一个命令。换句话说,程序的运行方式取决于用户键入的内容,运行这些命令的方法称为RunCmd。这些命令的一些示例如下。
void RunCmd(String userInput)
{ char command = userInput.charAt(0);
say("");
if(command == '?')
{
dumpTape(currHeadPos, currHeadPos + 1);
}
else
if(command == '=')
{
tapeContents[currHeadPos] = userInput.charAt(1);
if( endOfTape == 0 )
{
endOfTape++;
}
}
else
if( command == 'E' )
{
//use a space to signal 'empty' so that cells will print out ok
tapeContents[ currHeadPos ] = ' ';
}
else
if( command == 'L' )
{
if( currHeadPos == 0 )
{
say( "" );
say( "Tape rewound, unable to move LEFT" );
}
else
{
currHeadPos--;
}
}
else
if( command == 'R' )
{
currHeadPos++;
endOfTape++;
}
如何让程序迭代循环并立即运行所有输入命令? 例如:
用户输入= 1,R,= 0,R
程序会使标题下的单元格= 1,向右移动,= 0,再次向右移动,一次运行。
*我不希望程序在每次输入后询问命令,并输入“完成”。将结束投入。我不希望程序在程序启动之外的任何时间显示SecondMenu。
*我想能够在程序运行后输入100个输入,将它们存储在List中,让程序遍历数组并在一次运行中运行所有100个命令(基于用户输入)。 我尝试过使用for循环,while循环和迭代器(虽然我不知道如何使用它并且可能做错了)
编辑澄清。
答案 0 :(得分:0)
“过早优化是所有邪恶的根源”
您的问题让我感到困惑,但我希望这可以提供帮助:
public static void main(String[] args)
{
Scanner getReq = new Scanner( System.in );
List<String> commands = new ArrayList<String>();
String command;
while (!(command = getReq.nextLine().trim()).equalsIgnoreCase("end"))
{
commands.add(command);
}
runCmds(commands);
}
private static void runCmds(List<String> userInputs)
{
for (String userInput : userInputs)
{
//your insanity here :)
}
}