UVa 396 Top Dog
题目描述你是TOP-DOG\texttt{TOP-DOG}TOP-DOG最新军事情报程序项目的一名绝密政府软件工程师。TOP-DOG\texttt{TOP-DOG}TOP-DOG处理从绘制敌方领土和位置到解析总司令的高度加密消息等一切事务。你需要编写一段软件从Orcaattle\texttt{Orcaattle}Orcaattle数据库中获取所需信息并将其存储到“平面”文件中随后发送到磁盘。输入格式输入包含一个或多个描述两个连续描述之间有一个空行。每个描述以一行包含描述编号开始然后是三个用空行分隔的伪文件集合。第一组要导出的表名列表每行一个第二组数据库架构信息包含每个表的列名、类型和大小如果是VARCHAR每个表以表名开始后续行包含列名、数据类型和大小VARCHAR特有#表示该表没有更多列数据类型VARCHAR、INT、DATE、LONGINT第三组Dispatcher\texttt{Dispatcher}Dispatcher处理后的实际数据每行包含表名然后是每行的数据NULL表示空字段输出格式第一组输出在描述编号后对于每个要导出的表如果存在于架构中输出SELECT (类型) 列名, ... FROM 表名;类型映射VARCHAR和DATE→CHARINT和LONGINT→NUM如果表不存在输出TABLE NOT FOUND第二组输出空行后对于每个表输出表名(列数)(行数)然后每行列名和数据列名 数据若VARCHAR大小 64在列名后加(大小)样例输入1 INTELSYS GROUPSPI SYSTEMEL DEPLOYREG GROUPSPI GRCODE INT GRSUBNET VARCHAR 20 GREGION VARCHAR 25 GRACTION VARCHAR 100 GRREF VARCHAR 100 # INTELSYS ISDATE DATE ISNUM INT ISGEN LONGINT ISSUBGEN VARCHAR 25 # SYSTEMEL ... ... [数据部分]样例输出1 SELECT (CHAR) ISDATE, (NUM) ISNUM, (NUM) ISGEN, (CHAR) ISSUBGEN FROM INTELSYS; SELECT (NUM) GRCODE, (CHAR) GRSUBNET, (CHAR) GREGION, (CHAR) GRACTION, (CHAR) GRREF FROM GROUPSPI; TABLE NOT FOUND TABLE NOT FOUND INTELSYS(4)(4) ISDATE 122922T DEC 94 ISNUM 1 ISGEN 2 ISSUBGEN ISDATE 1111112 DEC 01 ISNUM 3 ... GROUPSPI(5)(0) SYSTEMEL(6)(1) SITRANS 342 ...题目分析问题的本质这是一个数据导出与格式转换问题。需要解析数据库架构信息第二组输入生成SQL\texttt{SQL}SQL查询语句第一组输出解析实际数据第三组输入按特定格式导出第二组输出关键点表名、列名区分大小写数据类型映射VARCHAR/DATE→CHARINT/LONGINT→NUMVARCHAR大小64 6464时需要在列名后标注数据行数与架构列数对应NULL表示空字符串参考代码// Top Dog// UVa ID: 396// Verdict: Accepted// Submission Date: 2016-07-08// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;vectorstringnames;// 要导出的表名mapstring,vectorvectorstringtables;// 表名 - 列信息intmain(intargc,char*argv[]){ios::sync_with_stdio(false);string line;while(getline(cin,line)){intnstoi(line);coutnendl;names.clear();tables.clear();// 读取第一组要导出的表名while(getline(cin,line),line.length()0)names.push_back(line);// 读取第二组数据库架构列信息while(getline(cin,line),line.length()0){string nameline;vectorvectorstringfields;while(getline(cin,line),line!#){istringstreamiss(line);vectorstringproperty;string block;while(issblock)property.push_back(block);fields.push_back(property);}tables[name]fields;}// 输出第一组生成 SELECT 语句for(autoname:names){if(tables.find(name)tables.end())coutTABLE NOT FOUNDendl;else{coutSELECT ;boolfirst_fieldtrue;for(autofield:tables[name]){if(first_field)first_fieldfalse;elsecout, ;// 类型映射INT/LONGINT - NUM其他 - CHARif(field[1]INT||field[1]LONGINT)cout(NUM) ;elsecout(CHAR) ;coutfield[0];}cout FROM name;endl;}}coutendl;// 两组输出之间空行// 读取第三组实际数据并输出第二组while(getline(cin,line),line.length()0){string nameline;vectorvectorstringrecords;vectorstringrecord;// 读取该表的所有行while(getline(cin,line),line!#){if(lineNULL)record.push_back();elserecord.push_back(line);if(record.size()tables[name].size()){records.push_back(record);record.clear();}}// 输出表头表名(列数)(行数)coutname(tables[name].size())(records.size())endl;// 输出每行数据for(inti0;irecords.size();i){for(intj0;jrecords[i].size();j){// 列名couttables[name][j].front();// VARCHAR 且大小 64 时标注大小if(tables[name][j][1]VARCHARstoi(tables[name][j][2])64)cout(tables[name][j][2]);cout ;// 数据cout\records[i][j]\;coutendl;}}}}return0;}