首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请高手编写这样一道非常难的题!解决方法

2012-02-13 
请高手编写这样一道非常难的题!! 编写类LOGO语言。LOGO语言又称作海龟语言,由操作者通过一行命令来控制一个

请高手编写这样一道非常难的题!!

编写类LOGO语言。
LOGO语言又称作海龟语言,由操作者通过一行命令来控制一个三角形的海龟移动,海龟的移动轨迹可以形成各种图案。
一行的命令可以包括多个子命令,按照从左到右的顺序执行,相关的命令有:

命令格式命令范例范例含义
前进   <长度> 前进   100海龟前进100个点
后退   <长度> 后退   100海龟后退100个点
左转   <角度> 左转   90左转90度
右转   <角度> 右转   90右转90度
抬起抬起海龟抬起画笔,不显示移动轨迹
放下放下海龟放下画笔,显示移动轨迹
隐藏隐藏隐藏海龟三角形
显示显示显示海龟三角形
重复   次数   (…)重复   4   (前进   10   左转   90)海龟画一个边长为10的正方形
清屏清屏海龟回到坐标原点,清除所有轨迹

提示,如果到达屏幕边缘继续前进,海龟将自动跳到屏幕的另一端。

试编写一个可以执行上述命令和命令组合的Win32程序,要求使用Visual   C++完成,without   MFC,并提供源代码。
用一行语句操纵海龟完成下边显示的图形。最外围一个实心圆,圆里面有一个实心正五角星,五角星的最里面有一个虚线圆,图形的大小和位置随意。一行命令完成。

  关于图片,粘贴不了,抱歉!

[解决办法]
//$$---- Form CPP ---- 作者 FreeFice
// 2007.5 本代码释放于公用域,任何人可以使用但不可以声明为私有。
//---------------------------------------

#include <vcl.h>
#include <math.h>
#include <vector.h>
#include <iostream>
#pragma hdrstop

#include "LogoF.h "
//---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm "
TLogoForm *LogoForm;
//---------------------------------------
__fastcall TLogoForm::TLogoForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------
const static double A0 = M_PI/180.0;

inline void Logo::Go(int n)
{
double ang = A0*a;
int dx = n*cos(ang), dy = n*sin(ang);
if(Draw)
ca-> LineTo(x+dx,y+dy);
else
ca-> MoveTo(x+dx,y+dy);
Move(dx,dy);
}

bool Logo::Redo0(int n,Command *cmd,int num)
{
if(n <=0||cmd==0)return false;
Fun p;
for(int i=0;i <n;++i)
for(int j=0;j <num;j++){
p = cmd[j].proc;
if(!(p)(*this,cmd[j].var,cmd[j].num))
return false;}
return true;
}

bool Logo::ReadCmd(TStrings &s)
{
int num = s.Count;
if(Cmd)delete []Cmd;
int pp[10]={0};
int k=0,m,j;
Cmd = new Logo::Command[num];
MaxCmd = num;
AnsiString str;

for(int i=j=0;i <num;i++){
str = s.Strings[i].LowerCase();
if(str== "{ "){
if(k> =10||k <0||j <=0)return false;
pp[k++]=j++;}
else if(str== "} "){
if(k <=0)return false;
m = pp[--k];pp[k]=0;
Cmd[m].num = j-m-1;}
else if(str== "up "){
Cmd[j++].proc = Up;}
else if(str== "down "){
Cmd[j++].proc = Down;}
else if(str== "show "){
Cmd[j++].proc = Show;}
else if(str== "hide "){
Cmd[j++].proc = Hide;}
else if(str== "clear "){
Cmd[j++].proc = Clear;}
else if(str== "forward "){
Cmd[j].proc = Forward;i++;
Cmd[j++].var = s.Strings[i].ToInt();}
else if(str== "back "){
Cmd[j].proc = Back; i++;
Cmd[j++].var = s.Strings[i].ToInt();}
else if(str== "left "){
Cmd[j].proc = Left; i++;
Cmd[j++].var = s.Strings[i].ToInt();}
else if(str== "right "){
Cmd[j].proc = Right; i++;
Cmd[j++].var = s.Strings[i].ToInt();}
else if(str== "redo "){
Cmd[j].proc = Redo; i++;
Cmd[j].var = s.Strings[i].ToInt();}
}
CmdCount = j;
return true;
};



void Logo::Run()
{
if(Cmd==0)
return;

Clear();
Fun p;
for(int i=Pos=0;i <CmdCount;i++){
p = Cmd[i].proc;
if(p==Redo){
Pos = i;
p(*this,Cmd[i].var,Cmd[i].num);
i += Cmd[i].num;}
else
p(*this,Cmd[i].var,Cmd[i].num);
}
}

bool TLogoForm::Init()
{
Cmd = 0;
DrawPanel-> Caption= " ";
DrawPaint-> Align = alClient;
TextREdit-> Align = alClient;
IsRun = false;
DrawPaint-> Hide();
MarkImg-> Hide();
TextREdit-> Text = "down forward 20 left 90 forward 20 ";
return true;
}
void __fastcall TLogoForm::FormCreate(TObject *Sender)
{
Init();
}
//---------------------------------------
void __fastcall TLogoForm::FormClose(TObject *Sender, TCloseAction &Action)
{
if(Cmd)
delete Cmd;
}
//---------------------------------------
void __fastcall TLogoForm::TextREditDblClick(TObject *Sender)
{
TRichEdit *re = static_cast <TRichEdit*> (Sender);
if(re-> Text.Trim().IsEmpty())
return;
DrawPaint-> Canvas-> Pen-> Color = clRed;
if(Cmd==0)
Cmd = new Logo(DrawPaint-> Canvas,DrawPanel,0);//MarkImg);

TStrings *s = new TStringList();
AnsiString st;
for(int i=0,n=re-> Lines-> Count;i <n;i++){
st = re-> Lines-> Strings[i].Trim();
while(int at = st.Pos( " ")){
s-> Add(st.SubString(1,at-1));
st.Delete(1,at);
st = st.Trim();
}
s-> Add(st);}

Cmd-> ReadCmd(*s);
delete s;
IsRun = true;
re-> Hide();
DrawPaint-> Show();
}
//---------------------------------------
void __fastcall TLogoForm::DrawPanelResize(TObject *Sender)
{
TPanel *pl = static_cast <TPanel*> (Sender);
if(Cmd)
Cmd-> Resize(pl-> ClientWidth,pl-> ClientHeight);
DrawPaint-> Repaint();
}
//---------------------------------------
void __fastcall TLogoForm::DrawPaintPaint(TObject *Sender)
{
if(Cmd==0||!IsRun)
return;
Cmd-> Run();
}
//---------------------------------------
void __fastcall TLogoForm::DrawPaintDblClick(TObject *Sender)
{
TPaintBox *pb = static_cast <TPaintBox*> (Sender);
pb-> Hide();
TextREdit-> Show();
}
//---------------------------------------

热点排行