一、題目描述
一開始看到對象關系映射,其實我是拒絕的。這三個詞湊一塊,能是給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;}}}