//开始 50 次循环
FOR 50
xxxxxxx代码
//开始 60 次循环
FOR 60
xxxxxxx代码
//结束循环
ENDFOR
//结束循环
ENDFOR
//开始 50 次循环
FOR 50
xxxxxxx代码
//开始 60 次循环
FOR 60
xxxxxxx代码
FOR 60
xxxxxxx代码
//结束循环
ENDFOR //结束循环
ENDFOR
//结束循环
ENDFOR里面的循环是根据用户写的来写成代码!
我的朋友他写出来了!
我想知道有别的方法来看!算法好的大哥帮说下!
FOR 50
xxxxxxx代码
//开始 60 次循环
FOR 60
xxxxxxx代码
//结束循环
ENDFOR
//结束循环
ENDFOR
//开始 50 次循环
FOR 50
xxxxxxx代码
//开始 60 次循环
FOR 60
xxxxxxx代码
FOR 60
xxxxxxx代码
//结束循环
ENDFOR //结束循环
ENDFOR
//结束循环
ENDFOR里面的循环是根据用户写的来写成代码!
我的朋友他写出来了!
我想知道有别的方法来看!算法好的大哥帮说下!
可是我是想在软件里现实!
现在只能单循环!
比如
for 50
for 60
for 70
endfor
endfor
endfor
上面的写成代码应该是
for(int i=0;i<50;i++)
{
for(int j=0;j<60;i++)
{
for(int z=0;z<70;i++)
{
}
}
}
如果用户又写成这样就应该这样!
for 50
for 60
endfor
endforfor(int i=0;i<50;i++)
{
for(int j=0;j<60;i++)
{
}
}
//这是我朋友的代码大概如下
void CUserItem::LoadActionList(void)
{
if(FilePath.IsEmpty())
return;
ActionList.ClearAll();
CStdioFile cf(FilePath , CFile::modeRead);
CString line;
while(cf.ReadString(line))
{
line = line.Trim();
if(line.Find(L"KEYPRESS ") == 0)
{
CString key;
CString time;
UINT ukey = 0;
float utime = 0; line = line.Mid(9);
int index = line.Find(L" ");
if(index != -1)
{
key = line.Mid(0 ,index);
time = line.Mid(index + 1);
}
else
{
key = line;
time = L"0";
}
swscanf(key , L"%u" , &ukey);
swscanf(time , L"%f" , &utime);
if(ukey != 0)
{
CUserAction * ua = new CUserAction(ukey , utime);
ActionList.push_back(ua);
}
}
else if(line.Find(L"DELAY ") == 0)
{
line = line.Mid(6);
float time = 1.0;
swscanf(line , L"%f" , &time);
CUserAction * ua = new CUserAction(time);
ActionList.push_back(ua);
}
else if(line.Find(L"FOR ") == 0)
{
line = line.Mid(4);
UINT count = 1;
swscanf(line , L"%u" , &count);
CUserAction * ua = new CUserAction(count);
ActionList.push_back(ua);
}
else if(line.Find(L"ENDFOR") == 0)//我就是这里有点不明白
{
CUserAction * ua = new CUserAction();
ActionList.push_back(ua);
}
}
cf.Close();
}//这是FOR 判断
else if(line.Find(L"FOR ") == 0)
{
line = line.Mid(4);
UINT count = 1;
swscanf(line , L"%u" , &count);
CUserAction * ua = new CUserAction(count);
ActionList.push_back(ua);
}
else if(line.Find(L"ENDFOR") == 0)
{
CUserAction * ua = new CUserAction();
ActionList.push_back(ua);
}
//这是方法UINT CUserItem::RunActionThread(LPVOID param)
{
CUserItem * ui = (CUserItem *)param;
int i = ui->RunCount;
while(i == -1 || i-- > 0)
{
stack<ForStackItem> forstack;
for(UINT i = 0 ; i < ui->ActionList.size() ; i++)
{
if(ui->Stopped)
return 0;
CUserAction * ua = ui->ActionList[i];
switch(ua->Type)
{
case CUserAction::Delay :
if(ua->FloatParam >= 0.1)
Sleep(ua->FloatParam * 1000);
break;
case CUserAction::KeyPress:
if(ua->FloatParam < 0.1)
{
::PostMessage(ui->Hwnd , WM_KEYDOWN , ua->UIntParam , 0);
::PostMessage(ui->Hwnd , WM_KEYUP , ua->UIntParam , 0);
}
else
{
::PostMessage(ui->Hwnd , WM_KEYDOWN , ua->UIntParam , 0);
::Sleep(ua->FloatParam * 1000);
::PostMessage(ui->Hwnd , WM_KEYUP , ua->UIntParam , 0);
}
break;
case CUserAction::For :
{
ForStackItem si(i , ua->UIntParam);
forstack.push(si);
}
break;
case CUserAction::EndFor :
if(forstack.size() > 0)
{
forstack.top().ForCountLeft--;
if(forstack.top().ForCountLeft > 0)
{
i = forstack.top().IndexInList;
}
else
{
forstack.pop();
}
}
break;
}
}
}
ui->Stopped = true;
return 0;
}
这个当然知道!
那应该怎么写?
怎么判断这个ENDFOR对应的FOR?
现在就是不明他这里是怎么判断这个ENDFOR他是一行一行的读的 else if(line.Find(L"ENDFOR") == 0)//我就是这里有点不明白
{
CUserAction * ua = new CUserAction();
ActionList.push_back(ua);
}
else if(line.Find(L"FOR ") == 0)
{
line = line.Mid(4);
UINT count = 1;
swscanf(line , L"%u" , &count);
CUserAction * ua = new CUserAction(count); ActionList.push_back(ua);
}
else if(line.Find(L"ENDFOR") == 0)
{
CUserAction * ua = new CUserAction(); ActionList.push_back(ua);
}
遇到for放入要count,需到endfor不放count,
这样出栈的时候就知道了