1.题目介绍
语句解析
题目背景
木有背景……
题目描述
一串长度不超过 \(255\) 的 PASCAL 语言代码,只有 \(a,b,c\) 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:=[变量或一位整数];
。未赋值的变量值为 \(0\) 输出 \(a,b,c\) 的值。
输入格式
一串符合语法的 PASCAL 语言,只有 \(a,b,c\) 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,未赋值的变量值为 \(0\)。
输出格式
输出 \(a,b,c\) 最终的值。
样例 #1
样例输入 #1
a:=3;b:=4;c:=5;
样例输出 #1
3 4 5
提示
输入的 PASCAL 语言长度不超过 \(255\)。
2.题解
2.1 使用c++的字符串函数(会超时,暂时未知原因)
思路
使用了cin.peek函数,检测当前读入指针指向位置值,但并不移动指针,方便检验换行符
使用cin.read,一次从输入流中读取5个字符(一次赋值)到缓冲区中,并进行相关的判断
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int arr[3] = {0};
while (cin.peek() != '\n') {
string str;
char buffer[5]; // 5 characters + null terminator
cin.read(buffer, 5); // Read 5 characters
char ch1 = buffer[0], ch2 = buffer[3];
arr[ch1 - 'a'] = ch2 >= '0' && ch2 <= '9'? ch2 - '0': arr[ch2 - 'a'];
}
cout << arr[0] << ' ' << arr[1] << ' '<< arr[2];
}
2.2 使用C中的函数(参考了题解中一位大佬的做法)
思路
使用scanf按规定格式读入,检测其返回值(成功分配的变量数目)是否位2来决定循环是否继续进行
使用一步三目运算符 + 数组 解决所有情况。
代码
#include<cstdio>
using namespace std;
int a[3];char s1,s2;
int main()
{
while (scanf("%c:=%c;",&s1,&s2)==2)//充分利用c++语言优势
a[s1-'a']=s2>='0' && s2<='9' ? s2-'0' : a[s2-'a']; //赋值语句简洁明了
printf("%d %d %d",a[0],a[1],a[2]);
}
标签:语句,P1597,变量,int,s2,cin,解析,赋值
From: https://www.cnblogs.com/trmbh12/p/17986412