一、题目描述
一开始看到对象关系映射,其实我是拒绝的。这三个词凑一块,能是给C++初学者的题吗?
再仔细读需求,才发现在课设项目已经用过这功能。Object Relational Mapping(ORM)就是面向对象(OO)侧的模型类、对象、属性与数据库(DB)的表(关系)、记录(行)、列对应,由ORM框架完成两侧的相互转换。
语言侧标识符区分大小写,使用驼峰表示法。而数据库的标识符不区分大小写,要用下划线分隔单词。例如:
- 语言中的属性
studentId
,对应数据库的student_id
。就是大写字母要改成小写,并且如果不是首个字母,还要在前面追加一个下划线。 - 语言侧的类名
StudentHonor
,对应数据库的表名student_honor
,对应。与属性不同,类名首字母要大写。
这种标识符映射在做课设项目特别是Repository
类里惹了不少乱子。为了彻底弄清这个知识点,亲自实现标识符映射功能是个好办法。
先导题:标识符。
输入规格
- 每行一组数据,读取到EOF为止。
- 每组数据有类型、标识符两个字符串,间隔若干空白符。
- 类型:
class field table column
四种之一。 - 标识符:待转换的字符串。
- 类型:
- 本题不考察算法的时空复杂度。
输出规格
- 每行输出一组转换结果。
样例输入
class StudentHonor
field studentId
table course
column pre_course_id
样例输出
table student_honor
column student_id
class Course
field preCourseId
样例解释
- 第1组:
class
对应table
,字母全改成小写,中间的大写字母前要插入下划线分割。 - 第2组:
field
对应column
,同上。 - 第3组:
table
对应class
,首字母大写,去掉下划线,下划线后续字母也大写。 - 第4组:
column
对应field
,去掉下划线,下划线后续字母改大写。
二、注意事项
str一次只能拼接一个变量值,否则会出现乱码
str+='_';
str+=c;
三、完整C++代码实现
#include<iostream>
using namespace std;
#include<string>
string t_x(string s){
string str="";
for(int i=0;i<s.size();i++){
char c=s[i];
if(c>='A'&&c<='Z'){
c+=32;
if(i!=0){
str+='_';
str+=c;
}else{
str+=c;
}
}else{
str+=c;
}
}
return str;
}
string x_t(string type,string s){
string str="";
for(int i=0;i<s.size();i++){
char c=s[i];
if(i==0&&type=="table"){
c-=32;
}
if(c=='_'){
i++;
c=s[i]-32;
str+=c;
}else{
str+=c;
}
}
return str;
}
string x_t_2(string s){
}
int main(){
string type,id;
while(cin>>type>>id){
if(type=="class"){
cout<<"table"<<" "<<t_x(id)<<endl;
}else if(type=="field"){
cout<<"column"<<" "<<t_x(id)<<endl;
} if(type=="table"){
cout<<"class"<<" "<<x_t(type,id)<<endl;
} if(type=="column"){
cout<<"field"<<" "<<x_t(type,id)<<endl;
}
}
}