admin管理员组文章数量:1599533
在某宝上接到如下题
四、查询类任务
实现数据记录查询选择函数select, 该函数根据表达查询条件的字符串,对加载的数据进行查询。其结果包含两部分,一是符合条件的记录总数,以函数值的形式返回;二是符合条件的所有记录编号,存入通过形参传递而来的数组中。关于查询条件字符串,它类似编程语言的逻辑表达式的结构,其构成可包含:
1)表示关系运算的字符: “<”, “<=”, “>”, “>=”, “==”, “!=”;
2)表示逻辑运算的关键字:“AND”, “OR”, “NOT”;
3)可改变运算优先级别的小括号 " ()",若没有括号两类运算符的优先次序与C/C++中相应的保持一致;
4)字段名,表示对当前记录行指定字段值的引用,如 “Open >= 9.15” 表达的条件就是开盘价大于等于9.15;
5)为了简化,约定字段名在关系运算符的左边,标准格式下运算符前后各一个空格。
通过以上内容,可以灵活写出简单或复合的查询条件。比如 “Open >= 9.15 AND Date == 2017-1-3” 表达了查找2017年1月3日开盘价大于等于9.15的股票交易记录。其中,表达日期时,采取“年-月-日”短横线连接的固定格式。
提示:你需再设计一个解析查询条件字符串的方案,以判断一条记录是否符合需要。
函数的原型:int* Select(const char *condition, int& n); 其中:
1)condition 为查询的条件表达式,具体规则如上所述;
2)n为结果的数量,这里是以引用的形式传入。
3)返回值为整数类型的指针存放数据编号的数组,应考虑将它创建为一个动态数组空间,因为查询结果的具体数目事先不可预知。
给出了如下解决方式,非专修C/C++, 欢迎大佬们批评指正
之所以分享一下, 是因为客户对string类一无所知, 并且一定要用某种递归树去解决,让我改一下, 正巧我忙活半天在外放松休闲, 不想整。 我说,最终解布尔表达式的时候可以递归, 把“true” “false” 设为出口, 循环变递归不就好了吗。
我觉得这个解法真的易懂有木有<<<
看见这题我的第一反应是,后缀表达式, 好像还有个高级的名字
Share with you, Happy Day。
/**
--此处仅将 or and not 设为操作符 输出成 || && ! 正如not优先级较高
--将每个判断例: A>=1 用具体的那条记录过滤,即是判断该记录中的那个字段是否附合这个最小条件 输出 成一个true 或者 false
--即该表达式转为 一个关于true和false的布尔表达式
求解布尔表达式 判断该条记录是否符合
下面仅select函数为主要, 其他为测试数据
**/
#include<stdlib.h>
#include<iostream>
#include <sstream>
using namespace std;
class Record
{
// 为了避免字符串与double float long型 或者时间相关的转换,
// 所有字段全部用字串 比较时直接比较字典序 strcmp
// 此处若自行优化,建议保留字串和日期的字典序比较
public:
string Date;
string Open;
string High;
string Low;
string Close;
string Adj_Close;
string Volume;
string Code;
string Change;
string Pct_change;
string getValueByFieldName(string fieldName) {
if ("Date" == fieldName) {
return Date;
} else if ("Open" == fieldName) {
return Open;
} else if ("High" == fieldName) {
return High;
} else if ("Low" == fieldName) {
return Low;
} else if ("Close" == fieldName) {
return Close;
} else if ("Adj_Close" == fieldName) {
return Adj_Close;
} else if ("Volume" == fieldName) {
return Volume;
} else if ("Code" == fieldName) {
return Code;
} else if ("Chang
版权声明:本文标题:SQL Select Condition条件查询模拟解析Select函数 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728323002a1154070.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论