描述
我们都知道,C++的变量名定义必须遵守以下三个规范:
第一,变量名必须以字母或下划线开头;
第二,变量名只含有字母,下划线和数字;
第三,变量名不能使用C++的保留字。
现在,壮壮起了N个变量名,请你帮判断这些变量名是否合法。为简单起见,
C++的保留字只需要考虑以下十个:
“include”、“using”、 “namespace” 、“return”、“main”、
“int”、 “float”、 “double”、“string”、 “char”。
输入
N+1行,第一行,一个整数N,表示变量名的个数。(1<=N<=20)
第2行到第N+1行,每行一个字符串,表示一个变量名。
每个变量名的长度小于100个字符.
输出
N行,每行对输入的一个变量名做出判断,如果变量名合法,输出“Yes”,否则输出“No”。
输入样例 1
4
doub le
Doub le
double pi=3. 14
3Q
输出样例 1
No
Yes
No
No
来源
2023 广西中小学生程序设计挑战赛进阶组复赛
语言:
C++
遍历字符串进行过滤,看看是否符合要求,代码如下:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int isAlf(char c)
{
if (c >= 'a' && c <= 'z')
return 1;
if (c >= 'A' && c <= 'Z')
return 1;
return 0;
}
int isNumber(char c)
{
if (c >= '0' && c <= '9')
return 1;
return 0;
}
int main()
{
int T;
cin >> T;
getchar();
char blz[][40] = { "include","using","namespace","return","main","int","float","double","string","char" };
for (int i = 0; i < T; i++)
{
string s;
getline(cin, s);
//判断是否一字母或下划线开头
if (isAlf(s.at(0)) || s.at(0) == '_')
{
//判断是否金汉字母,下划线和数字
int j = 0;
for (; j < s.length(); j++)
{
if (isAlf(s.at(j)) || isNumber(s.at(j)) || s.at(j) == '_')
continue;
else
break;
}
if (j == s.length())
{
//判断是否是保留字
int k = 0;
for (; k < 10; k++)
{
if (strcmp(s.c_str(), blz[k]) == 0)
break;
}
if (k == 10)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
else
cout << "No" << endl;
}
else
cout << "No" << endl;
}
return 0;
}
使用循环遍历字符串,然后逐个判断是否规范。
代码如下:
参考链接:
#include <iostream>
#include <ctype.h>
#include <string.h>
using namespace std;
int main(void){
int N;
char varName[101]; // 存储变量名的字符数组
// 10 个保留字字符串
char reservedWords[10][20]={
"include","using","namespace", "return" ,"main",
"int", "float", "double","string", "char"};
cin>>N; // 获取N
cin.get(); // 清除换行
for(int i=0;i<N;i++){
// https://blog.csdn.net/qq_36770641/article/details/88552618
cin.get(varName,100); // 获取变量名
cin.get(); // 清除换行
// cout<<"varName="<<varName<<endl;
// https://blog.csdn.net/snowcatvia/article/details/96862939
if(isalpha(varName[0])==0&&varName[0]!='_'){ // 判断规范一, 如果不是字母并且不是下划线则输出No
cout<<"No"<<endl;
continue;
}
int same=0;
//判断规范三是否满足,判断变量名是否和10个保留字 相同,如果相同则输出No
for(int k=0;k<10;k++){
if(strcmp(varName,reservedWords[k])==0){
cout<<"No"<<endl;
same=1;
break;
}
}
// 如果相同,则判断下一个变量名
if(same==1){
continue;
}
int rule2=1;
// 判断规范二是否满足,遍历变量名字符串,从下标为1的字符开始判断
for(int j=1;j<strlen(varName);j++){
char ch = varName[j];
// 如果当前字符不是数字并且不是字母,以及不是下划线,则输出No
if(isalpha(ch)==0&&isdigit(ch)==0&&ch!='_'){
rule2=0;
cout<<"No"<<endl;
break;
}
}
// 经过前面规范一,规范三的检查,并且这里规范二也满足,则输出Yes
if (rule2==1){
cout<<"Yes"<<endl;
}
}
return 0;
}
【以下回答由 GPT 生成】
解决方案
首先,我们需要定义一个函数来判断一个变量名是否合法。我们可以按照题目要求的三个规范来逐个判断。
bool isValidVariableName(string name) {
// 第一,变量名必须以字母或下划线开头
char firstChar = name[0];
if (!(isalpha(firstChar) || firstChar == '_')) {
return false;
}
// 第二,变量名只能包含字母、下划线和数字
for (int i = 1; i < name.length(); i++) {
char c = name[i];
if (!(isalpha(c) || isdigit(c) || c == '_')) {
return false;
}
}
// 第三,变量名不能使用C++的保留字
set<string> reservedWords = {"include", "using", "namespace", "return", "main", "int", "float", "double", "string", "char"};
if (reservedWords.count(name) > 0) {
return false;
}
return true;
}
然后,我们需要读取输入并逐个判断每个变量名是否合法。最后输出结果。
#include <iostream>
#include <string>
#include <set>
using namespace std;
bool isValidVariableName(string name) {
// 判断变量名是否合法的函数
// ...
}
int main() {
int N;
cin >> N;
for (int i = 0; i < N; i++) {
string name;
cin >> name;
if (isValidVariableName(name)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
以上是使用C++来解决该问题的具体解决方案。根据题目的要求,我们定义了一个isValidVariableName
函数来判断变量名的合法性。然后,我们在主函数中使用该函数来判断每个变量名,并输出相应的结果。注意,在判断保留字时,我们使用了一个set
数据结构来存储保留字,这样方便快速地进行判断。
【相关推荐】