2 shunfurh shunfurh 于 2017.01.14 22:38 提问

Apologists of Java and C++

Description

Apologists of Java and C++ can argue for hours proving each other that their programming language is the best one. Java people will tell that their programs are clearer and less prone to errors, while C++ people will laugh at their inability to instantiate an array of generics or tell them that their programs are slow and have long source code.

Another issue that Java and C++ people could never agree on is identifier naming. In Java a multiword identifier is constructed in the following manner: the first word is written starting from the small letter, and the following ones are written starting from the capital letter, no separators are used. All other letters are small. Examples of a Java identifier are javaIdentifier, longAndMnemonicIdentifier, name, nEERC.

Unlike them, C++ people use only small letters in their identifiers. To separate words they use underscore character ‘_’. Examples of C++ identifiers are c_identifier, long_and_mnemonic_identifier, name (you see that when there is just one word Java and C++ people agree), n_e_e_r_c.

You are writing a translator that is intended to translate C++ programs to Java and vice versa. Of course, identifiers in the translated program must be formatted due to its language rules — otherwise people will never like your translator.

The first thing you would like to write is an identifier translation routine. Given an identifier, it would detect whether it is Java identifier or C++ identifier and translate it to another dialect. If it is neither, then your routine should report an error. Translation must preserve the order of words and must only change the case of letters and/or add/remove underscores.

Input

The input file consists of one line that contains an identifier. It consists of letters of the English alphabet and underscores. Its length does not exceed 100.

Output

If the input identifier is Java identifier, output its C++ version. If it is C++ identifier, output its Java version. If it is none, output “Error! instead.

Sample Input

sample input #1
long_and_mnemonic_identifier

sample input #2
anotherExample

sample input #3
i

sample input #4
bad_Style
Sample Output

sample output #1
longAndMnemonicIdentifier

sample output #2
another_example

sample output #3
i

sample output #4
Error!

2个回答

caozhy
caozhy   Ds   Rxr 2017.01.22 00:44
已采纳
justin_bkdrong
justin_bkdrong   2017.01.18 14:42

convert java var to c++ var

import java.io.*;

public class ConvertJavaCplusplus {
public static void main(String[] argv) {
if (argv.length > 1) {
ConvertJavaCplusplus tmp = new ConvertJavaCplusplus();
try {
tmp.ConvertFile(argv[0],argv[1]);
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("over");
}

String _strInputFileName;
String _strOutputFileName;
File _inputFile = null;
FileWriter _outputFile = null;
BufferedReader _reader = null;

public boolean openFile(String fileName) {
    _inputFile = new File(fileName);
    try {
        _reader = new BufferedReader(new FileReader(_inputFile));
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

public void OpenWriteFile(String fileName) throws IOException {
    _outputFile = new FileWriter(fileName);
}

public void WriteLineToFile(String varName) throws IOException {
    varName+="\r\n";
    _outputFile.write(varName);
}

public void CloseOutputFile() throws IOException {
    _outputFile.close();
}

public void ConvertFile(String fileName,String outputFile) throws IOException {
    OpenWriteFile(outputFile);
    if (openFile(fileName)) {
        while (true) {
            String tempString = _reader.readLine();
            if (tempString != null) {
                String outString = Convert(tempString);
                WriteLineToFile(outString);
            } else {
                _reader.close();
                break;
            }

        }
    }
    CloseOutputFile();
}

public String Convert(String strVarName) {
    String retString = new String("Error!");
    if (strVarName.length() == 0) {
        return retString;
    }
    if (strVarName.length() > 100) {
        return retString;
    }

    if (isAllSmallLetters(strVarName)) {
        retString = strVarName;
    } else if (isJavaVarName(strVarName)) {
        retString = ConvertJavaToCpp(strVarName);
    } else if (isCplusplusVarName(strVarName)) {
        retString = ConvertCppToJava(strVarName);
    } else {
        retString = "Error!";
    }
    return retString;
}

boolean isLowerChar(char c) {
    return c >= 'a' && c <= 'z';
}

boolean isUpperChar(char c) {
    return c >= 'A' && c <= 'Z';
}

boolean isAllSmallLetters(String name) {
    int i = 0;
    while (i < name.length()) {
        char c = name.charAt(i);
        if (!isLowerChar(c)) {
            return false;
        }
        ++i;
    }
    return true;
}

public String ConvertCppToJava(String name) {
    int i = 0;
    String outString = new String();
    while (i < name.length()) {
        char c = name.charAt(i);
        if (c == '_') {
            i++;
            c = name.charAt(i);
            outString += (char) (c - 'a' + 'A');
        } else {
            outString += c;
        }
        ++i;
    }
    return outString;
}

public String ConvertJavaToCpp(String name) {
    int i = 0;
    String outString = new String();
    while (i < name.length()) {
        char c = name.charAt(i);
        if (isUpperChar(c)) {
            outString += '_';
            outString += (char) (c - 'A' + 'a');
        } else {
            outString += c;
        }
        ++i;
    }
    return outString;
}

public boolean isCplusplusVarName(String name) {
    int i = 0;
    int state = 0;
    if (name.length() == 0) return false;

    if (!isLowerChar(name.charAt(0))) {
        return false;
    }
    while (true) {
        if (i >= name.length()) {
            if (state == 2) {
                return false;
            }
            break;
        }
        char c = name.charAt(i);
        switch (state) {
            case 0: {
                if (isLowerChar(c)) {
                    state = 1;
                }
                break;
            }
            case 1: {
                if (isUpperChar(c)) {
                    return false;
                } else if (c == '_') {
                    state = 2;
                }
                break;
            }
            case 2: {
                if (isUpperChar(c) || c == '_') {
                    return false;
                } else {
                    state = 0;
                }
                break;
            }

        }
        ++i;
    }
    return true;
}

//
public boolean isJavaVarName(String name) {
    int i = 0;
    int state = 0;
    if (name.length() == 0) return false;

    if (!isLowerChar(name.charAt(0))) {
        return false;
    }
    while (true) {
        if (i >= name.length()) {
            break;
        }
        char c = name.charAt(i);
        switch (state) {
            case 0: {
                if (isLowerChar(c)) {
                    state = 1;
                }
                break;
            }
            case 1: {
                if (isUpperChar(c)) {
                    state = 2;
                } else if (c == '_') {
                    return false;
                }
                break;
            }
            case 2: {
                if (isUpperChar(c)) {
                    System.out.println("连续大写");
                    return false;
                } else {
                    state = 0;
                }
                break;
            }

        }
        ++i;
    }
    return true;
}

}


Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!