【2012 百度之星资格赛 E:C++ 与Java】

E:C++ 与Java

时间限制: 
2000ms
 
内存限制: 
65536kB
描述

在百度之星的贴吧里面,Java的爱好者和C++的爱好者总是能为这两种语言哪个更好争论上几个小时。Java的爱好者会说他们的程序更加整洁且不易出错。C++的爱好者则会嘲笑Java程序很慢而且代码很长。
另一个Java和C++爱好者不能达成一致的争论点就是命名问题。在Java中一个多个单词构成的变量名应该按照如下格式命名:第一个单词的开头用小写字母,其余单词都以大写字母开头,单词与单词之间不加分隔符,除单词的首字母之外的字母一律使用小写。例如:javaIdentifier, longAndMnemonicIdentifier, name, bAIDU.
与Java不同C++的命名全都使用小写字母,在单词和单词之间使用“_”来作为分隔符。例如:c_identifier, long_and_mnemonic_identifier, name (当名字中只有一个单词的时候,Java与C++的命名是相同的), b_a_i_d_u.
你的任务就是写一个程序能让C++和Java程序相互转化。当然转换完成的程序中的变量名也要符合其语言的命名规则,否则的话是不会有人喜欢你的转换器的。
首先你要做的就是写一个变量名转换器。给出一个变量名,你要先检测是Java的还是C++的,然后把它转化为另一种命名格式。如果两种都不是,那么你的程序就要报错。转换过程必须保持原有的单词顺序,只能改变字母的大小写和增加或删除下划线。


输入
输入有且仅有一行,是一个变量名,其中包含字母和下划线,长度不超过100。
输出
如果输入的是Java变量名那么输出它对应的C++形式。如果是C++的则输出对应的Java的形式。如果两种都不是就输出“Error!”。
样例输入
输入样例1:
long_and_mnemonic_identifier
输入样例2:
anotherExample
输入样例3:
i
输入样例4:
bad_Style
样例输出
输出样例1:
longAndMnemonicIdentifier
输出样例2:
another_example
输出样例3:
i
输出样例4:
Error!


  1 #include <iostream>
  2 using namespace std;
  3 
  4 ///////////////////////////////////////////////////////////
  5 bool isLegal(string s)
  6 {
  7     bool hasSlash = false;
  8     bool hasABC   = false;
  9     
 10     bool yes;
 11 
 12     int top = 0;
 13     while (s[top] != '\0')
 14     {
 15         top++;
 16     }
 17     top--;
 18     
 19     for (int i = 0; i <= top; i++)
 20     {
 21         if (s[i] == '_')
 22         {
 23             hasSlash = true;
 24         }
 25         
 26         if (s[i] >= 'A' && s[i] <= 'Z')
 27         {
 28             hasABC   = true;
 29         }
 30         
 31     }
 32     
 33     if ( hasSlash && hasABC )
 34     {
 35         yes = false;
 36     }
 37     else
 38     {
 39         yes = true;
 40     }
 41 
 42     if (s[0] == '_')
 43     {
 44         yes = false;
 45     }
 46     if (s[top] == '_')
 47     {
 48         yes = false;
 49     }
 50 
 51     bool found = false;
 52     // judge for __
 53     for (int i = 0; i < top; i++)
 54     {
 55         if (s[i] == '_' && s[i+1] == '_')
 56         {
 57             found = true;
 58         }
 59     }
 60 
 61     if (found)
 62     {
 63         yes = false;
 64     }
 65 
 66     if (hasABC)
 67     {
 68         if (s[0] >= 'A' && s[0] <='Z')
 69         {
 70             yes = false;
 71         }
 72     }
 73     return yes;
 74     
 75 }
 76 ///////////////////////////////////////////////////////////
 77 bool isSingleString(string s)
 78 {
 79     
 80     int top = 0;
 81     while (s[top] != '\0')
 82     {
 83         top++;
 84     }
 85     top--;
 86     
 87     bool hasABC   = false;
 88     bool hasSlash = false;
 89 
 90     for (int i = 0; i <= top; i++)
 91     {
 92         if (s[i] == '_')
 93         {
 94             hasSlash = true;
 95         }
 96 
 97         if (s[i] >= 'A' && s[i] <= 'Z')
 98         {
 99             hasABC = true;
100         }
101     }
102 
103     if ( hasABC == false && hasSlash == false )
104     {
105         return true;
106     }
107     else
108     {
109         return false;
110     }
111     
112 }
113 
114 ///////////////////////////////////////////////////////////
115 bool isCppCode(string s)
116 {
117     int top = 0;
118     while (s[top] != '\0')
119     {
120         top++;
121     }
122     top--;
123 
124     bool hasSlash = false;
125     for (int i = 0; i <= top; i++)
126     {
127         if (s[i] == '_')
128         {
129             hasSlash = true;
130         }
131     }
132 
133     return hasSlash;
134 }
135 
136 ///////////////////////////////////////////////////////////
137 bool isJavacode(string s)
138 {
139     int top = 0;
140     while (s[top] != '\0')
141     {
142         top++;
143     }
144     top--;
145 
146     bool hasABC = false;
147 
148     for (int i = 0; i <= top; i++)
149     {
150         if (s[i] >= 'A' && s[i] <= 'Z')
151         {
152             hasABC = true;
153         }
154     }
155 
156     return hasABC;
157     
158 
159 }
160 ///////////////////////////////////////////////////////////
161 void CJavaToCpp(string s)
162 {
163     int top = 0;
164     while (s[top] != '\0')
165     {
166         top++;
167     }
168     top--;
169 
170     for (int i = 0; i <= top; i++)
171     {
172         if (s[i] >= 'A' && s[i] <= 'Z')
173         {
174             cout << "_" ;
175             s[i] += 32;
176         }
177         cout << s[i];
178     }
179     cout << endl;
180 }
181 
182 ///////////////////////////////////////////////////////////
183 void CCppToJava(string s)
184 {
185     int top = 0;
186     while (s[top] != '\0')
187     {
188         top++;
189     }
190     top--;
191 
192     bool preIsSlash = false;
193     for (int i = 0; i <= top; i++)
194     {
195         if (s[i] == '_')
196         {
197             preIsSlash = true;
198         }
199         else
200         {
201             if (preIsSlash)
202             {
203                 s[i] -= 32;
204                 cout << s[i];
205             }
206             else
207             {
208                 cout << s[i];
209             }
210 
211             preIsSlash = false;
212 
213         }
214     }
215 
216 }
217 ///////////////////////////////////////////////////////////
218 // int main() 
219 /* start program from here */
220 int main()
221 {
222     string s;
223     
224     cin >> s;
225 
226     if(!isLegal(s))
227     {
228         cout << "Error!" << endl;
229     }
230     else if (isSingleString(s))
231     {
232         cout << s << endl;
233     }
234     else if (isJavacode(s))
235     {
236         CJavaToCpp(s);
237     }
238     else if (isCppCode(s))
239     {
240         CCppToJava(s);
241     }
242     else 
243     {
244         cout << "Error!" << endl;
245     }
246     return 0;
247 }
248 
249 // end 
250 // ism 
原文地址:https://www.cnblogs.com/ismdeep/p/2529103.html