大家都知道想从华南理工大学的本科毕业并不是一件简单的事情,作为一名大四即将毕业的学生,优酱正在为她的毕业论文愁眉不展,为什么呢?并不是毕业设计的课题太难了,而是毕业论文有着非常奇怪的格式要求,其中最令人头痛的就是如何正确地引用参考文献。
而众所周知,某工是一个制度非常严格而且变化速度非常快的学校。因此发生在毕业论文的Deadline当晚突然宣布参考文献的格式要求产生了变化以致于必须通宵改论文这样的紧急事态并不是什么稀奇的事情。因此为了防止自己毕不了业,优酱决定开发一款可以自动生成符合国际通用的常见参考文献格式(IEEE、Nature、APA、Harvard)的参考文献列表的软件,这样就算是学校突然改变主意,优酱也可以放心睡觉。
你可能很奇怪,这样的软件不是有一大把吗?什么Beginote啊,Womendeley啊,Onetero啊,Readtrihedron啊,然而乃要知道在大天朝,这些软件依赖的某不存在的学术搜索引擎因为某些不可描述的原因是无法访问的啊,所以这些成熟的软件并不能使用。而且更严重的问题是,由于优酱现在正在某黑心研究所实习,每天的个人时间都被压榨殆尽了,所以实在是没办法去开发这款对她来说很重要的软件了,没有办法她只能跑来找你帮忙。你能帮优酱顺利毕业吗?
…….以下省略9页(我特么,10页的题你们是怎么出出来的?!)
https://www.nowcoder.com/acm/contest/94/C
题目在上面↑
大模拟,不涉及任何算法,就是烦,就是长,就是抓细节。
public class Main {
static PrintWriter out = new PrintWriter(System.out);
static InputReader reader = new InputReader();
static Paper[] papers = new Paper[8];
static String[] monList = { "", "Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.",
"Dec." };//注意了!may后面没有点!!!因为他不是缩写!!!!!
public static void main(String[] args) throws IOException {
// Scanner reader = new Scanner(System.in);
for (int i = 0; i < 8; i++) {
Paper p = new Paper();
reader.nextLine();
p.title = reader.nextLine();
p.jTitle = reader.nextLine();
p.jTAbb = reader.nextLine();
p.year = reader.nextInt();
p.month = reader.nextInt();
p.day = reader.nextInt();
p.volume = reader.nextLine();
p.issue = reader.nextLine();
p.pages = reader.nextLine();
p.doi = reader.nextLine();
p.makeList(reader.nextInt());
for (int j = 0; j < p.autNum; j++) {
p.autList[j] = reader.nextLine();
}
papers[i] = p;
reader.nextLine();//吃空行
}
StringBuilder com = new StringBuilder(reader.next());
while (!com.toString().equals("END")) {
String type = reader.next();
int n = reader.nextInt();
switch (type) {
case "IEEE":
IEEE(n);
break;
case "Nature":
Nature(n);
break;
case "APA":
APA(n);
break;
case "Harvard":
Harvard(n);
break;
default:
break;
}
out.flush();
com.delete(0, com.length());
com.append(reader.next());
}
out.close();
}
public static void IEEE(int n) {
for (int i = 1; i <= n; i++) {
out.print("[" + i + "] ");
int get = reader.nextInt() - 1;
Paper p = papers[get];
if (p.autNum > 6) {
String[] name = p.autList[0].split(",");
out.print(fistNameIEEE(name[1].substring(1, name[1].length())));
out.print(name[0]);
out.print(" et al., ");
} else if (p.autNum >= 3) {
for (int j = 0; j < p.autNum - 1; j++) {
String[] name = p.autList[j].split(",");
out.print(fistNameIEEE(name[1].substring(1, name[1].length())));
out.print(name[0] + ", ");
}
String[] name = p.autList[p.autNum - 1].split(",");
out.print("and ");
out.print(fistNameIEEE(name[1].substring(1, name[1].length())));
out.print(name[0] + ", ");
} else if (p.autNum > 1) {
String[] name = p.autList[0].split(",");
String[] name2 = p.autList[1].split(",");
out.print(fistNameIEEE(name[1].substring(1, name[1].length())));
out.print(name[0]);
out.print(" and ");
out.print(fistNameIEEE(name2[1].substring(1, name2[1].length())));
out.print(name2[0] + ", ");
} else {
String[] name = p.autList[0].split(",");
out.print(fistNameIEEE(name[1].substring(1, name[1].length())));
out.print(name[0] + ", ");
}
out.print("\"" + p.title + ",\" ");
out.print(p.jTAbb + ", ");
out.print("vol. " + p.volume + ", ");
out.print("no. " + p.issue + ", ");
out.print("pp. " + p.pages + ", ");
if (p.month > 0) {
out.print(monList[p.month] + " ");
}
out.println(p.year + ".");
}
}
public static void Nature(int n) {
for (int i = 1; i <= n; i++) {
out.print(i + ". ");
int get = reader.nextInt() - 1;
Paper p = papers[get];
if (p.autNum > 5) {
String[] name = p.autList[0].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
out.print(" et al.");
} else if (p.autNum >= 3) {
for (int j = 0; j < p.autNum - 1; j++) {
String[] name = p.autList[j].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
if (j < p.autNum - 2) {
out.print(", ");
}
}
out.print(" ");
String[] name = p.autList[p.autNum - 1].split(",");
out.print("& ");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
} else if (p.autNum == 2) {
String[] name = p.autList[0].split(",");
String[] name2 = p.autList[1].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
out.print(" & ");
out.print(name2[0] + ", ");
out.print(fistNameNature(name2[1].substring(1, name2[1].length())));
} else {
String[] name = p.autList[0].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
}
out.print(" ");
out.print(p.title + ". ");
out.print(p.jTAbb + " ");
out.print(p.volume + ", ");
out.print(p.pages + " ");
out.print("(" + p.year + ")");
out.println(".");
}
}
public static void APA(int n) {
for (int i = 1; i <= n; i++) {
int get = reader.nextInt() - 1;
Paper p = papers[get];
if (p.autNum < 2) {
String[] name = p.autList[0].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
} else if (p.autNum == 2) {
String[] name = p.autList[0].split(",");
String[] name2 = p.autList[1].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
out.print(", & ");
out.print(name2[0] + ", ");
out.print(fistNameNature(name2[1].substring(1, name2[1].length())));
} else if (p.autNum > 2 && p.autNum < 8) {
for (int j = 0; j < p.autNum - 1; j++) {
String[] name = p.autList[j].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
out.print(", ");
}
String[] name = p.autList[p.autNum - 1].split(",");
out.print("& ");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
} else {
for (int j = 0; j < 6; j++) {
String[] name = p.autList[j].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
out.print(", ");
}
out.print("... ");
String[] name = p.autList[p.autNum - 1].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
}
out.print(" ");
out.print("(" + p.year + "). ");
out.print(p.title + ". ");
out.print(p.jTitle + ", ");
out.print(p.volume + "(" + p.issue + "), ");
out.print(p.pages + ". ");
out.println("https://doi.org/" + p.doi);
}
}
public static void Harvard(int n) {
for (int i = 1; i <= n; i++) {
int get = reader.nextInt() - 1;
Paper p = papers[get];
if (p.autNum < 2) {
String[] name = p.autList[0].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
} else if (p.autNum == 2) {
String[] name = p.autList[0].split(",");
String[] name2 = p.autList[1].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
out.print(" and ");
out.print(name2[0] + ", ");
out.print(fistNameNature(name2[1].substring(1, name2[1].length())));
} else if (p.autNum > 2 && p.autNum < 4) {
for (int j = 0; j < p.autNum - 1; j++) {
String[] name = p.autList[j].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
if (j < p.autNum - 2) {
out.print(", ");
}
}
String[] name = p.autList[p.autNum - 1].split(",");
out.print(" and ");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
} else {
String[] name = p.autList[0].split(",");
out.print(name[0] + ", ");
out.print(fistNameNature(name[1].substring(1, name[1].length())));
out.print(" et al.");
}
out.print(" (" + p.year + ") ");
out.print("\'" + p.title + "\', ");
out.print(p.jTitle + ", ");
out.print(p.volume + "(" + p.issue + "), ");
out.print("pp. " + p.pages + ". ");
out.println("doi: " + p.doi + ".");
}
}
public static String fistNameIEEE(String name) {
String[] names = name.split(" ");
StringBuilder res = new StringBuilder();
for (int i = 0; i < names.length; i++) {
res.append(names[i].substring(0, 1).toUpperCase() + ". ");
}
return res.toString();
}
public static String fistNameNature(String name) {
String[] names = name.split(" ");
StringBuilder res = new StringBuilder();
for (int i = 0; i < names.length; i++) {
res.append(names[i].substring(0, 1).toUpperCase() + ".");
if (i < names.length - 1) {
res.append(" ");
}
}
return res.toString();
}
}
class Paper {
String title;
String jTitle;
String jTAbb;
int year;
int month;
int day;
String volume;
String issue;
String pages;
String doi;
int autNum;
String[] autList;
public void makeList(int num) {
this.autNum = num;
autList = new String[num];
}
}
class InputReader {
//输入挂,略
}