共计 1309 个字符,预计需要 4 分钟阅读。
题面
题目描述
Java和C++两种语言的辩手都可以相互争论数小时去证明他们的编程语言是最好的。用Java的人将告诉人们,他们的程序更加清楚且不容易犯错,而用C++的人会嘲笑他们没有能举出有代表性的实例来证明他们的观点,或者告诉他们Java的程序运行速度慢而且源代码太长。
另一个问题是,用Java和C++的人永远无法在标识符的命名上取得共识。在Java中,由多个单词组成的标识符的命名规则如下:第一个单词是以小写字母开头,接下来的每一个单词以大写字母开头,分隔符是不允许使用的。其他所有的字母都是小写的。下面举出一些例子:javaIdentifier,longAndMnemonicIdentifier,name,nEERC。
而在C++中,人们只用小写字母来命名标识符。他们运用下划线“_”来分隔单词。下面举出一些例子:c_identifier,long_and_mnemonic_identifier,name(当只有1个单词时,用Java和C++的人是统一的),n_e_e_r_c。
你需要写一个程序来相互翻译Java和C++的程序。当然了,翻译后的标识符必须符合它的命名规则,否则人们不会认同你的翻译。
给你一个标识符,它可能会是Java或者C++标识符中的一种,而你需要将其翻译成另一种。如果这个标识符既不是Java标识符也不是C++标识符,你的程序需要报告错误。翻译必须符合规范,所以就需要改变字母大小写或者添加、删除下划线。
输入
输入文件1行,包含一个标识符。标识符由大小写字母和下划线组成,长度不会超过100。
输出
如果输入的是Java标识符,输出应该为C++标识符;反之亦然。如果输入既不是Java标识符,也不是C++标识符,则输出“Error!”。
思路
先用scanf
读入整行字符串,逐位判断字符串是否为大写或下划线,一旦发现,按照题面要求修改即可。
注意单个字符情况需要特判,字符串使用gets
读入会WA
最终代码
#include<bits/stdc++.h>
using namespace std;
char s[1000];
bool f[3];
int l,i,j,k;
int main()
{
cin>>s;
l = strlen(s);
for (i = 0; i < l; i++)
{
if (s[0] >= 65 && s[0] < 97)
{
f[1] = true; f[2] = true;
break;
}
if (s[0] == '_')
{
f[1] = true; f[2] = true;
break;
}
if (s[i] >= 65 && s[i] < 97 && s[i] != 95)
{
l++;
f[2] = true;
for (j = l; j > i; j--) s[j] = s[j - 1];
s[i + 1] = s[i] + 32;
s[i] = '_';
i++;
}
if (s[i] == '_')
{
f[1] = true;
if (s[i + 1] >= 97)
{
for (j = i; j < l - 1; j++) s[j] = s[j + 1];
s[i] = s[i] - 32;
l--;
}
else
{
f[2] = true;
break;
}
}
}
if (f[1] && f[2]) printf("Error!");
else for (i = 0; i < l; i++) printf("%c", s[i]);
return 0;
}
正文完