坐标移动

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

 输入:

合法坐标为A(或者D或者W或者S) + 数字(两位以内)

 坐标之间以;分隔。

 非法坐标点需要进行丢弃。如AA10;  A1A;  $%$;  YAD; 等。

 下面是一个简单的例子 如:

A10;S20;W10;D30;X;A1A;B10A11;;A10;

 处理过程:

 起点(0,0)

 +   A10   =  (-10,0)

 +   S20   =  (-10,-20)

 +   W10  =  (-10,-10)

 +   D30  =  (20,-10)

 +   x    =  无效

 +   A1A   =  无效

 +   B10A11   =  无效

 +  一个空 不影响

 +   A10  =  (10,-10)

 结果 (10, -10)

 
题目类别: 字符串 
难度: 中级 
运行时间限制:10Sec
内存限制:128MByte
阶段: 入职前练习 
输入: 

一行字符串

 
输出: 

最终坐标,以,分隔

 
样例输入:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
                   

例输出:

10,-10
                   

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
using namespace std;

int main()
{
	int x=0,y=0;
	int flag = 1;    //状态标识,0表示计算遇到非法字符,2表示正在计算操作数数
	char current;    //保存当前操作:A D W S
	int sum = 0;     //计算移动数大小
	char s[1024] = {0};  //保存输如字符串
	size_t len;
	int i;
	gets(s);
	len = strlen(s);
	//cout<<len<<" ";

	for(i = 0; i < len; i++)  //处理
	{
		if(s[i] == ';' && flag)  //遇到‘;’并且计数过程中没有遇到非法字符 flag!=0
		{
			switch(current)   //执行对应操作
			{
			case 'A':
				x -= sum;
				break;
			case 'D':
				x += sum;
				break;
			case 'W':
				y += sum;
				break;
			case 'S':
				y -= sum;
				break;
			default:
				break;
			}
			flag = 1;
			sum = 0;
			current = ' ';
			continue;
		}

		//遇到操作符,判断该操作符是否合法
		if(s[i] == 'A' || s[i] == 'S' || s[i] == 'W' || s[i] == 'D')  
		{
			if(flag != 2)  //确定不是在计算操作数时遇到的字符,如果是则不处理
			{
				if(i >= 1)
				{
					if(s[i-1]== ';')  //前一个字符确定为‘;’,
					{
						current = s[i];
						continue;
					}
				}
				else            //如果是第一个字符,则直接保存
				{
					current = s[i];
					continue;
				}
			}
		}

		//当前保存的为操作符,则计算操作数
		if(current == 'A' || current == 'S' ||current == 'W'|| current == 'D')  
		{
			if(!isdigit(s[i]))  //遇到非数字,则初始化,继续下一循环
			{
				flag = 0;      
				sum = 0;
				current = ' ';
				continue;
			}
			else            //否则计算操作数
			{
				flag = 2;   //正在计算操作数标记
				sum = sum *10 + s[i] - '0';
				//cout<<sum<<" ";
			}
		}
	}

	cout<<x<<','<<y;

	return 0;
}



上面的代码是早些时候写的,其实现在想想应该可以以';'为分解符,取出每一个字符串再进行判断处理会更加方便!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值