题目简介
题目思路
首题目给的条件是:
- 关键字:main if else for while int
- 自定义标识符:除关键字外的标识符
- 整数:无符号整数
- 界符:{ } ( ) , ;
- 运算符:= + - * / < <= > >= == !=
当出现这些符号时,需要进行判断,来获取输出,输出的格式如以下所示:
- 关键字:用keyword表示
- 自定义标识符:用identifier表示
- 整数:用integer表示
- 界符:用boundary表示
- 运算符:用operator表示
主程序中用一个temp字符串来存储非运算符、界符之外的字符。
以样例为例:
当跑main时,他会把main储存到temp字符串数组中,当跑到(时,他会判断temp中的字符,来判断其是不是关键字,如果是的话,进行输出,不是的话,输出其为自定义标识符。其他的也同理,最后判断输出temp。
注意注意
- 第一个错的地方,容易出现在判断 <= 这类,忘记i++
- 第二个错误的地方,容易出现在输出上面,经常性的会漏掉输出中个某个逗号或者其他的
代码
/* author:苦酒 QQ:1793929520 blog:huangliangshuai.com */ #include <iostream> #include <string> using namespace std; string kind[5] = {"keyword","identifier","integer","boundary","operator"}; string keyword[6] = {"main","if","else","for","while","int"}; void decide(string s) { if(s[0] >= '0' && s[0] <= '9')//如果当前判断的第一个字符为数字的话,直接输出 { cout<<"("<<kind[2]<<","<<s<<")"<<endl; } else { int f = 0;//此处作为标记 for(int i = 0; i < 6; i++) { if(s == keyword[i])//如果当前temp存储的字符串与关键字里面的字符串相等,则改变标记的数值,并且输出关键字,终止循环,节省时间 { f = 1; cout<<"("<<kind[0]<<","<<s<<")"<<endl; break; } } if(f == 0)//如果找不到关键字的话,则认为这是一个自定义标识符,进行输出 { cout<<"("<<kind[1]<<","<<s<<")"<<endl; } } } int main() { string s; while(cin>>s) { string temp; temp = ""; int len = s.length(); for(int i = 0; i < len; i++) { if(s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!')//判断输入的是不是运算符 { if(temp.length()) { decide(temp); } temp = ""; if(i + 1 < len && s[i + 1] == '=')//判断输入的是不是<= >= == ,是的话就进行输出、 { cout<<"("<<kind[4]<<","<<s[i]<<s[i+1]<<")"<<endl; i++; } else { cout<<"("<<kind[4]<<","<<s[i]<<")"<<endl;//反之就输出单字符的运算符 } } else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';')//判断当前是不是界符 { if(temp.length()) { decide(temp); } temp = ""; cout<<"("<<kind[3]<<","<<s[i]<<")"<<endl; } else { temp = temp + s[i];//将全部不是的存储到temp里面 } } if(temp.length()) { decide(temp); } } return 0; } /*************************************************** User name: jk170631黄良帅 Result: Accepted Take time: 0ms Take Memory: 196KB Submit time: 2019-11-18 21:33:32 ****************************************************/