用C++写P1597语句解析

题目背景

木有背景……

题目描述

一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:=[变量或一位整数];。未赋值的变量值为 0输出 a、b、c 的值。

输入格式

一串(<255)PASCAL语言,只有a,b,c 3个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,未赋值的变量值为0。

输出格式

输出a,b,c 最终的值。

输入输出样例

输入 #1复制

a:=3;b:=4;c:=5;

输出 #1复制

3 4 5

第一次题解:(洛谷编译时间超时,但是我的编译器正常使用,于是感觉不能嵌套太多判断语句,否则洛谷不能给过)

#include <iostream>
using namespace std;
int main(){
	char s;char a,b,c;
	
	while((s=getchar())!='\n'){
		
		if(s=='a'){
			cin >> s;
			if(s==':'){
				cin >> s;
				if(s=='='){
					cin >> a;
					if(a== ';')a='0';
					if(!isdigit(a)){
						if(a=='b')a=b;
						if(a=='c')a=c;
					}
					//cout << a << endl;
				}
			}
		}
		
		if(s=='b'){
			cin >> s;
			if(s==':'){
				cin >> s;
				if(s=='='){
					cin >> b;
					if(b== ';')b='0';
					if(!isdigit(b)){
						if(b=='a')b=a;
						if(b=='c')b=c;
					}
					//cout << b << endl;
				}
			}
		}
		
		if(s=='c'){
			cin >> s;
			if(s==':'){
				cin >> s;
				if(s=='='){
					cin >> c;
					if(c==';')c='0';
					if(!isdigit(c)){
						if(c=='b')c=b;
						if(c=='a')c=a;
					}
					//cout << c << endl;
				}
			}
		}
	}
	
	cout << a-'0' << " " << b-'0' << " " << c-'0';

	return 0; 
}

第二次题解:(简洁明了了很多,但是还是判断语句很多,时长超时,比第一次题解通过的还少。但是看题解这个方法在几年前是给过的)

#include <iostream>
using namespace std;
int main() 
{
	
	char f,d,e,g,z;
	int a=0,b=0,c=0;
	
	while((f=getchar()) != '\n'){
		
		cin>>g>>d>>z>>e;
		
		if(z>='0'&&z<='9'){
			z=z-'0';
			if(f=='a')a=z;
			if(f=='b')b=z;
			if(f=='c')c=z;
		}else if(z=='a'){
			if(f=='a')a=a;
			if(f=='b')b=a;
			if(f=='c')c=a;			
		}else if(z=='b'){
			if(f=='a')a=b;
			if(f=='b')b=b;
			if(f=='c')c=b;			
		}else if(z=='c'){
			if(f=='a')a=c;
			if(f=='b')b=b;
			if(f=='c')c=c;	
		}
			
	}
	
	cout<<a<<" "<<b<<" "<<c;
	return 0;
}

第三次AC题解:

#include<iostream>
using namespace std;
int main(){
	int a[3];
	char s1,s2;
	
    while(scanf("%c:=%c;",&s1,&s2)==2){
    	//scanf("%d%d", &a, &b);
		//如果a和b都被成功读入,那么scanf的返回值就是2
		//如果只有a被成功读入,返回值为1
		//如果a和b都未被成功读入,返回值为0
		//如果遇到错误或遇到end of file,返回值为EOF。
		
    	a[s1-'a'] = (s2>='0' && s2<='9') ? s2-'0' : a[s2-'a'];
    	//a?b:c 代表:
		//如果a成立就执行b否则就为c。
		//相当于else if 
	}
	
    printf("%d %d %d",a[0],a[1],a[2]);
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值