标题:如何用c或c++编写
只看楼主
假小子
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-11-6
结帖率:100%
 问题点数:0 回复次数:7 
如何用c或c++编写
某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。

    例如,我们可以对小车输入如下的指令:

    15L10R5LRR10R20

    则,小车先直行15厘米,左转,再走10厘米,再右转,...

    不难看出,对于此指令串,小车又回到了出发地。

    你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。

【输入、输出格式要求】

    用户先输入一个整数n(n<100),表示接下来将有n条指令。

    接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)

    每条指令的长度不超过256个字符。

    程序则输出n行结果。

    每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。
搜索更多相关主题的帖子: 编写程序 机器人 出发地 少年宫 如何 
2013-11-06 13:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
你是来求作业的呀,我不好意思贴代码,免得被斑竹批评
如果不是求作业的,起码自己会思考一下,告诉别人哪里不会。

对于这道题目,毫无难点,连字符串分割都不要
设当前方向为 +Y (一共有四个方向 +Y +X -Y -X )
设在改变方向后已经运动的厘米数 step = 0;
读入一个字符,若是数字,则在当前方向上 退step,再前进 10*step+当前数字 步,设step=step*10+当前数字
              若是L,改变方向,并设step=0
              若是R,改变方向,并设step=0
2013-11-06 15:08
shiner凡
Rank: 5Rank: 5
来 自:梦境
等 级:职业侠客
帖 子:92
专家分:355
注 册:2013-10-27
得分:0 
2楼是好版主

多多看书,多多学习。C++神马的,将来我也要很厉害。亲爱的自己,加油加油!!!!!
2013-11-06 16:45
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
我从没批评过给代码的人,即使是作业。这个不像是作业,或者现在老师拿ACM题目当作业了?

题目很简单,但这个论坛里我猜能写出这个代码的恐怕也到不了一半。能在十分钟内写出代码的,能不能有十个人呢?

要不要我再悬赏一次?

重剑无锋,大巧不工
2013-11-06 18:06
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
得分:0 
以下是引用beyondyf在2013-11-6 18:06:45的发言:

我从没批评过给代码的人,即使是作业。这个不像是作业,或者现在老师拿ACM题目当作业了?
 
题目很简单,但这个论坛里我猜能写出这个代码的恐怕也到不了一半。能在十分钟内写出代码的,能不能有十个人呢?
 
要不要我再悬赏一次?
建议悬赏

埋头做牛,抬头做人,低头做狗
2013-11-06 18:31
假小子
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-11-6
得分:0 
不明白的是,如何存储左转和右转之间的数据
2013-11-07 11:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用假小子在2013-11-7 11:10:17的发言:

不明白的是,如何存储左转和右转之间的数据
听不懂你问的是什么。我把昨天在2楼说的代码贴给你参考一下
程序代码:
#include <math.h>

double foo( const char* cmd )
{
    int x=0, y=0;

    unsigned direction = 0; // 方向
    int step = 0;

    for( ; *cmd; ++cmd )
    {
        switch( *cmd )
        {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            {
                int v = *cmd - '0';
                switch( direction )
                {
                case 0: y += 9*step + v; break;
                case 1: x += 9*step + v; break;
                case 2: y -= 9*step + v; break;
                case 3: x -= 9*step + v; break;
                }
                step = step*10 + v;
            }
            break;
        case 'L':
            direction = (direction+3)%4;
            step = 0;
            break;
        case 'R':
            direction = (direction+1)%4;
            step = 0;
            break;
        }
    }

    return sqrt( 0.0 + x*x + y*y );
}

或者这样
程序代码:
#include <math.h>

double foo( const char* cmd )
{
    int x=0, y=0;

    unsigned direction = 0; // 方向 { 0前 1右 2后 3左 }
    int step = 0; // 厘米数

    for( ; ; ++cmd )
    {
        switch( *cmd )
        {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            step = step*10 + (*cmd -'0');
            break;
        case 'L':
        case 'R':
        case '\0':
            switch( direction )
            {
            case 0: y += step; break;
            case 1: x += step; break;
            case 2: y -= step; break;
            case 3: x -= step; break;
            }
            step = 0;
            switch( *cmd )
            {
            case 'L': direction = (direction+3)%4; break;
            case 'R': direction = (direction+1)%4; break;
            case '\0': return sqrt( 0.0 + x*x + y*y );
            }
        }
    }

    return 0;
}

嗯,再给你个测试代码
程序代码:
#include <stdio.h>

int main()
{
    printf( "%.2f\n", foo("15L10R5LRR10R20") ); // 0.00
    printf( "%.2f\n", foo("L100R50R10") );      // 102.96
    printf( "%.2f\n", foo("3LLL5RR4L12") );     // 9.06
    printf( "%.2f\n", foo("LL") );              // 0.00
    printf( "%.2f\n", foo("100R") );            // 100.00
    printf( "%.2f\n", foo("5L5L5L5") );         // 0.00

    return 0;
}

2013-11-07 13:22
我的世界123
Rank: 1
等 级:新手上路
帖 子:43
专家分:1
注 册:2013-10-14
得分:0 
回复 2楼 rjsp
1、  最初状态:K1/K2/K3/K4均断开。

2、  后面板复位开关1和2,以及总电源开关均需实时检测是否按下,短按(小于2s),长按(大于3s)。

3、  当服务器+5V为0时,且此时K1为断开,此时按下机器总开关(短按,长按),执行如下操作:K1一直接通,K4接通1s,然后断开。

当服务器+5V为0时,且此时K1为接通,此时按下机器总开关(短按),执行如下操作:K1仍接通,K4接通1s,然后断开。

当服务器+5V为0时,且此时K1为接通,此时按下机器总开关(长按),执行如下操作:K1断开,K4无动作。

当服务器+5V为1时,且此时K1为断开,此时按下机器总开关(短按),执行如下操作:K1接通,K4无动作。

当服务器+5V为1时,且此时K1为断开,此时按下机器总开关(长按),执行如下操作:K1无动作,K4接通4s后,断开。

当服务器+5V为1时,且此时K1为接通,此时按下机器总开关(短按),执行如下操作:K1无动作,K4无动作。

当服务器+5V为1时,且此时K1为接通,此时按下机器总开关(长按),执行如下操作:K1等待3S后断开,K4接通4S后,断开。

当+5v为1时,或K1接通时,K5接通。当+5v为0时,且K1断开时,K5断开。

4、  当K1接通时,后面板复位开关1短按时,K1断掉1S后,接通;长按时,K2接通3S后,断开。

5、  当+5V为1时,后面板复位开关2短按时,K3接通1S后,断开;长按时,K3接通1S后,断开。



机器总开关对应的控制口是P0.0;

后面板复位开关2(服务器)对应的控制口是P0.1;

后面板复位开关1(路由器)对应的控制口是P0.2;

服务器电源+5V对应的控制口是P0.3;

总电源指示(k5)对应的控制口是P2.0;

服务器power(k4)对应的控制口是P2.1;

服务器reset(k3)对应的控制口是P2.2;

无线上网行为管理路由器reset(k2)对应的控制口是P2.3;

无线上网行为管理路由器(k1)对应的控制口是P2.4;

P0.4反馈k1(继电器开关的闭合状态),低电平时继电器闭合,高电平时继电器断开。

《芯片为AT89C51》

这个程序不知从何下手,望您给个答案,不胜感激!先谢谢啦!为什么我编的程序只执行前面的,还有就是短按,长按不会写

2013-11-07 13:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-423131-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.080739 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved