您的位置:首页 > 数据库

数据库课程设计

2013-06-27 20:52 211 查看
这学期的大作业,数据库课程设计,SQL语句解析,主要是实现SQL中select语句的功能,还包括where限制语句和order by语句。

虽然写的有点挫,但还是第一次写这么长的代码,纪念一下吧。

/*************************************************************************
> File Name: sql.cpp
> Author: Chierush
> Mail: qinxiaojie1@gmail.com
> Created Time: 2013年06月21日 星期五 10时48分42秒
************************************************************************/

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <set>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <fstream>

#define LL long long
#define LLU unsigned long long

using namespace std;

template <class T>
int cmp(T x,T y)//比较函数模板
{
if (x<y) return 1;
else if (x==y) return 0;
return -1;
}

vector<int>Order,Select;//排序指标,SELECT的项

class Student
{
public:
LL Sno,Sage;//学号
string Sname,Ssex,Sdept;//姓名,性别,学院

void print() const;//输出记录
bool operator<(const Student &c) const;//重载<运算符
bool operator==(const Student &c);//重载==运算符
};

struct node
{
int id,place;
bool operator<(const node &c) const
{
return place<c.place;
}
};

map<string,int>ID;//项的编号
map<int,string>str;//编号对应的项

vector<Student> S;//学生集合S

bool DESC[5],DISTINCT,where,order;//降序标识,取不同标识,where语句标识,order语句标识
bool Between,NotBetween;//beween语句标识,not between语句标识
bool In,NotIn;//in语句,not in语句标识
bool Like,NotLike;//like,not like语句标识
bool Null,NotNull;//is null,is not null语句标识
bool And,Or,Single;//and,or单语句限制标识

string BetweenLowerString,BetweenUpperString;//string类型between上下界
LL BetweenLowerLL,BetweenUpperLL;//long long类型的between上下界
set<LL>InSetLL;//in语句long long类型内容集合
set<string>InSetString;//in语句string类型集合
string LikeValue;//like对象
string SingleValueString;//where语句中限制条件string类型的值
LL SingleValueLL;//where语句中限制条件long long类型的值
LL CompareQueueValueLL[10];//where语句中and或or语句拆分后每个限制单元的long long类型比较值
string CompareQueueValueString[10];//where语句中and或or语句拆分后每个限制单元的string类型比较值
int CompareQueueOperator[10];//where语句中and或or语句拆分后每个限制单元的比较符号的编号
int CompareQueueObject[10];//where语句中and或or语句拆分后每个限制单元的被比较的项的编号
int CountUnit;//and或or连接的限制语句中的限制单元个数

int BetweenObject;//受between语句限制的项的编号
int InObject;//受in语句限制的项的编号
int LikeObject;//受like语句限制的项的编号
int NullObject;//受is null语句限制的项的编号
int SingleObject;//where语句中受单限制的项的编号
int SingleOperator;//where语句中单语句运算符的代号

template <class T>
bool UnitCompare(T x,T y,int ope)//大小限制条件下的比较函数模板
{
if (ope==1)
return x>=y;
else if (ope==2)
return x<=y;
else if (ope==3)
return x!=y;
else if (ope==4)
return x==y;
else if (ope==5)
return x<y;
else
return x>y;
}

void init();//初始化

void welcome();//欢迎窗口

void error();//错误提示

void help();//帮助文档

void command();//等待输入命令

void analyse(string);//分析输入的命令

void output();//输出函数

void quit();//结束

bool check(Student);//判断某记录是否符合where限制条件

bool SetFind(Student);//查找集合中有没有指定的对象

bool CheckIn(Student);//查看该学生是否满足in语句限制

bool CheckBetween(Student);//查看该学生是否满足between语句限制

bool CheckLike(Student);//查看该学生是否满足like语句限制

bool CheckNull(Student);//查看该学生是否满足is null语句限制

bool CheckSingle(Student);//查看该学生是否满足单条件语句限制

bool CheckAnd(Student);//查看该学生是否满足and语句连接的多条件语句限制

bool CheckOr(Student);//查看该学生是否满足or语句连接的多条件语句限制

bool CheckUnit(Student,int);//查看该学生是否满足多条件语句限制下的某单一语句限制

void ReadFile();//读文件函数

void MakeOrder(string);//处理排序条件

void MakeSelect(string);//处理选择的项

void MakeWhere(string);//处理where中的限制条件

void MakeBetween(string);//处理between语句限制

void MakeIn(string);//处理in语句限制

void MakeLike(string);//处理like语句限制

void MakeNull(string);//处理null语句限制

void MakeSingle(string);//处理where语句中单条件限制

void MakeAnd(string);//处理where语句中AND关联词连接的限制

void MakeOr(string);//处理where语句中OR关联词连接的限制

void MakeUnit(string,int);//出来where语句多条件限制下的单个限制

void PrintChar(char,int);//输出指定数量的字符

LL StringToLL(string);//把指定的串转化成long long

string StringToString(string);//提取制定的串

int main()
{
init();
string cmd;
welcome();
while (getline(cin,cmd))
{
if (cmd=="quit") return 0;
else if (cmd=="help")
{
help();
break;
}
else if (cmd=="enter")
break;
else
error();
}
command();
while (getline(cin,cmd))
{
if (cmd=="quit") return 0;
analyse(cmd);
command();
}
return 0;
}

bool Student::operator<(const Student &c) const
{
int flag;
for (int i=0;i<Order.size();++i)
{
if (Order[i]==0)
flag=cmp(Sno,c.Sno);
else if (Order[i]==1)
flag=cmp(Sage,c.Sage);
else if (Order[i]==2)
flag=cmp(Sname,c.Sname);
else if (Order[i]==3)
flag=cmp(Ssex,c.Ssex);
else
flag=cmp(Sdept,c.Sdept);
if (flag==1)
return (DESC[Order[i]])?false:true;
else if (flag==-1)
return (DESC[Order[i]])?true:false;
}
return true;
}

bool Student::operator==(const Student &c)
{
for (int i=0;i<Select.size();++i)
if (Select[i]==0 && Sno!=c.Sno)
return false;
else if (Select[i]==1 && Sage!=c.Sage)
return false;
else if (Select[i]==2 && Sname!=c.Sname)
return false;
else if (Select[i]==3 && Ssex!=c.Ssex)
return false;
else if (Select[i]==4 && Sdept!=c.Sdept)
return false;
return true;
}

void Student::print() const
{
cout<<"|";
for (int i=0;i<Select.size();++i)
if (Select[i]==0)
{
if (Sno!=-1)
cout<<"  "<<setiosflags(ios::left)<<setw(15)<<Sno<<'|';
else
cout<<"  "<<setiosflags(ios::left)<<setw(15)<<"NULL"<<'|';
}
else if (Select[i]==1)
{
if (Sage!=-1)
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<Sage<<'|';
else
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<"NULL"<<'|';
}
else if (Select[i]==2)
{
if (Sname!="NULL")
{
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<Sname;
for (int j=0;j<Sname.length()/3;++j)
cout<<' ';
}
else
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<"NULL";
cout<<'|';
}
else if (Select[i]==3)
{
if (Ssex!="NULL")
{
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<Ssex;
for (int j=0;j<Ssex.length()/3;++j)
cout<<' ';
}
else
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<"NULL";
cout<<'|';
}
else
{
if (Sdept!="NULL")
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<Sdept<<'|';
else
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<"NULL"<<'|';
}
cout<<resetiosflags(ios::left)<<endl;
}

void init()
{
ID.clear();
str.clear();
ID["Sno"]=0,ID["Sage"]=1,ID["Sname"]=2,ID["Ssex"]=3,ID["Sdept"]=4;
str[0]="Sno",str[1]="Sage",str[2]="Sname",str[3]="Ssex",str[4]="Sdept";
}

void error()
{
puts("");
puts("=====================================================================================================================");
puts("");
puts("Input Error! Please try again : ");
puts("");
}

void welcome()
{
puts("                =====================================================");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                |               Welcome to MySQL                    |");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                |        Please press                               |");
puts("                |                                                   |");
puts("                |         \'help\'              for help              |");
puts("                |         \'quit\'              to quit               |");
puts("                |         \'enter\'             to enter              |");
puts("                |                                                   |");
puts("                |                                                   |");
puts("                =====================================================");
puts("");
puts("");
puts("                                              Made by Qinxiaojie,All rights reserved");
puts("");
printf("Please input your choose : ");
}

void help()
{
puts("");
puts("                                                       HELP");
puts("");
puts("=====================================================================================================================");
puts("Please follow the following format:");
puts("");
puts("    SELECT [ALL|*|DISTINCT] <属性表达式1>[,<属性表达式2>…] ");
puts("    FROM <表名1>[,<表名2>…] ");
puts("    [WHERE <条件表达式>] ");
puts("    [ORDER BY <属性组> [ASC|DESC];");
puts("    注意:<属性表达式>中无聚集函数;<条件表达式>中无嵌套查询。");
puts("");
puts("If there are any question else to you,please read the book《数据库系统概论》or send e-mail to qinxiaojie1@gmail.com");
puts("");
puts("Good Luck!");
puts("");
puts("=====================================================================================================================");
puts("");
puts("Please any key to return");
puts("");
string cmd;
getline(cin,cmd);
}

void command()
{
puts("");
puts("=====================================================================================================================");
puts("");
puts("Please Enter Your Command : ");
puts("Don\'t forget to enter \'run\' to run your command after input");
puts("");
}

void analyse(string cmd)
{
Order.clear();
Select.clear();
S.clear();
DISTINCT=where=order=false;
do
{
if (cmd=="run" || cmd=="RUN")
{
ReadFile();
if (order)
sort(S.begin(),S.end());
output();
return;
}
else if (cmd.find("SELECT")!=string::npos || cmd.find("select")!=string::npos)
{
MakeSelect(cmd);
if (!Select.size())
error();
}
else if (cmd.find("FROM")!=string::npos || cmd.find("from")!=string::npos)
{
if (cmd.find("Student")!=string::npos || cmd.find("STUDENT")!=string::npos || cmd.find("student")!=string::npos)
continue;
else
error();
}
else if (cmd.find("WHERE")!=string::npos || cmd.find("where")!=string::npos)
{
where=true;
MakeWhere(cmd);
}
else if (cmd.find("ORDER BY")!=string::npos || cmd.find("order by")!=string::npos)
{
MakeOrder(cmd);
if (Order.size())
order=true;
else
error();
}
else if (cmd=="quit")
quit();
else
error();
}while (getline(cin,cmd));
}

void quit()
{
exit(0);
}

void output()
{
puts("");
if (!Select.size() || !S.size())
{
puts("");
puts("                                                  Student");
puts("");
printf("===========================================================================================================");
puts("==========");
puts("");
puts("                                                   NULL");
puts("");
return;
}
int width=Select.size()+1;
for (int i=0;i<Select.size();++i)
if (Select[i]==0)
width+=17;
else
width+=14;
for (int i=(width/2-4>=0)?width/2-4:0;i>=0;--i)
cout<<' ';
cout<<"Student"<<endl<<endl;
PrintChar('=',width);
cout<<'|';
for (int i=0;i<Select.size();++i)
if (Select[i])
cout<<"  "<<setiosflags(ios::left)<<setw(12)<<str[Select[i]]<<'|';
else
cout<<"  "<<setiosflags(ios::left)<<setw(15)<<str[Select[i]]<<'|';
cout<<endl;
PrintChar('-',width);
for (int i=0;i<S.size();++i)
{
S[i].print();
PrintChar('-',width);
}
puts("");
}

void PrintChar(char c,int n)
{
for (int i=0;i<n;++i)
cout<<c;
cout<<endl;
}

void ReadFile()
{
Student p;
ifstream inData("input.txt");
S.clear();
while (!inData.eof())
{
inData>>p.Sno>>p.Sage>>p.Sname>>p.Ssex>>p.Sdept;
if (inData.eof())
break;
if (!where || (where && check(p)))
{
if (DISTINCT && !SetFind(p))
S.push_back(p);
else if (!DISTINCT)
S.push_back(p);
}
}
inData.close();
}

void MakeOrder(string cmd)
{
memset(DESC,false,sizeof(DESC));
Order.clear();
string now;
node p[5];
for (int i=0;i<5;++i)
p[i].id=i,p[i].place=cmd.find(str[i]);
sort(p,p+5);
for (int i=0;i<5;++i)
if (p[i].place!=string::npos)
Order.push_back(p[i].id);
for (int i=0;i<Order.size();++i)
if (cmd.substr(cmd.find(str[Order[i]]),str[Order[i]].size()+6).find("DESC")!=string::npos)
DESC[Order[i]]=true;
else if (cmd.substr(cmd.find(str[Order[i]]),str[Order[i]].size()+6).find("desc")!=string::npos)
DESC[Order[i]]=true;
}

void MakeSelect(string cmd)
{
Select.clear();
for (map<string,int>::iterator it=ID.begin();it!=ID.end();it++)
if (cmd.find(it->first)!=string::npos)
Select.push_back(it->second);
if (cmd.find("*")!=string::npos || cmd.find("ALL")!=string::npos || cmd.find("all")!=string::npos)
{
for (int i=0;i<5;++i)
Select.push_back(i);
}
else if (cmd.find("DISTINCT")!=string::npos || cmd.find("distinct")!=string::npos)
DISTINCT=true;
sort(Select.begin(),Select.end());
}

void MakeWhere(string cmd)
{
bool flag=false;
for (int i=0;i<5;++i)
if (cmd.find(str[i])!=string::npos)
{
flag=true;
break;
}
if (!flag)
{
error();
return;
}
In=NotIn=Between=NotBetween=Like=NotLike=Null=NotNull=And=Or=Single=false;
if (cmd.find("BETWEEN")!=string::npos || cmd.find("between")!=string::npos)
{
if (cmd.find("NOT BETWEEN")!=string::npos || cmd.find("not between")!=string::npos)
NotBetween=true;
else
Between=true;
MakeBetween(cmd);
}
else if (cmd.find("IN")!=string::npos || cmd.find("in")!=string::npos)
{
if (cmd.find("NOT IN")!=string::npos || cmd.find("not in")!=string::npos)
NotIn=true;
else
In=true;
MakeIn(cmd);
}
else if (cmd.find("LIKE")!=string::npos || cmd.find("like")!=string::npos)
{
if (cmd.find("NOT LIKE")!=string::npos || cmd.find("not like")!=string::npos)
NotLike=true;
else
Like=true;
MakeLike(cmd);
}
else if (cmd.find("NULL")!=string::npos || cmd.find("null")!=string::npos)
{
if (cmd.find("NOT NULL")!=string::npos || cmd.find("not null")!=string::npos)
NotNull=true;
else
Null=true;
MakeNull(cmd);
}
else if (cmd.find("AND")!=string::npos || cmd.find("and")!=string::npos)
{
And=true;
MakeAnd(cmd);
}
else if (cmd.find("OR")!=string::npos || cmd.find("or")!=string::npos)
{
Or=true;
MakeOr(cmd);
}
else
{
Single=true;
MakeSingle(cmd);
}
}

bool check(Student p)
{
if (In)
{
if (CheckIn(p))
return true;
else
return false;
}
else if (NotIn)
{
if (!CheckIn(p))
return true;
else
return false;
}
else if (Between)
{
if (CheckBetween(p))
return true;
else
return false;
}
else if (NotBetween)
{
if (!CheckBetween(p))
return true;
else
return false;
}
else if (Like)
{
if (CheckLike(p))
return true;
else
return false;
}
else if (NotLike)
{
if (!CheckLike(p))
return true;
else
return false;
}
else if (Null)
{
if (CheckNull(p))
return true;
else
return false;
}
else if (NotNull)
{
if (!CheckNull(p))
return true;
else
return false;
}
else if (And)
{
if (CheckAnd(p))
return true;
else
return false;
}
else if (Or)
{
if (CheckOr(p))
return true;
else
return false;
}
else
{
if (CheckSingle(p))
return true;
else
return false;
}
}

bool SetFind(Student c)
{
for (int i=0;i<S.size();++i)
if (S[i]==c)
return true;
return false;
}

void MakeBetween(string cmd)
{
for (int i=0;i<5;++i)
if (cmd.find(str[i])!=string::npos)
{
BetweenObject=i;
break;
}
int posBetween=cmd.find("BETWEEN");
if (posBetween==string::npos)
posBetween=cmd.find("between");
int posAnd=cmd.find("AND");
if (posAnd==string::npos)
posAnd=cmd.find("and");
if (BetweenObject<2)
{
BetweenLowerLL=StringToLL(cmd.substr(posBetween+8,posAnd-posBetween-9));
BetweenUpperLL=StringToLL(cmd.substr(posAnd+4,cmd.length()-posAnd-4));
}
else
{
BetweenLowerString=StringToString(cmd.substr(posBetween+8,posAnd-posBetween-9));
BetweenUpperString=StringToString(cmd.substr(posAnd+4,cmd.length()-posAnd-4));
}
}

void MakeIn(string cmd)
{
InSetLL.clear();
InSetString.clear();
for (int i=0;i<5;++i)
if (cmd.find(str[i])!=string::npos)
{
InObject=i;
break;
}
if (InObject<2)
{
int i=cmd.find("(")+1;
int pre=i;
while (i<cmd.length())
{
if (cmd[i]==')' || cmd[i]==';')
break;
for (;i<cmd.length() && cmd[i]!=',' && cmd[i]!=')';++i);
InSetLL.insert(StringToLL(cmd.substr(pre,i-pre)));
pre=++i;
}
}
else
{
int i=cmd.find("(")+2;
int pre=i;
while (i<cmd.length())
{
if (cmd[i]==';' || cmd[i]==')')
break;
for (;i<cmd.length() && cmd[i]!='\'' && cmd[i]!='\"' && cmd[i]!=',' && cmd[i]!=')';++i);
InSetString.insert(StringToString(cmd.substr(pre,i-pre)));
i+=3;
pre=i;
}
}
}

void MakeLike(string cmd)
{
for (int i=0;i<5;++i)
if (cmd.find(str[i])!=string::npos)
{
LikeObject=i;
break;
}
int pos,last;
for (pos=0;pos<cmd.length();++pos)
if (cmd[pos]=='\"' || cmd[pos]=='\'')
break;
++pos;
for (last=cmd.length()-1;cmd[last]!='\'' && cmd[last]!='\"';--last);
LikeValue=cmd.substr(pos,last-pos);
}

void MakeNull(string cmd)
{
for (int i=0;i<5;++i)
if (cmd.find(str[i])!=string::npos)
{
NullObject=i;
break;
}
}

void MakeSingle(string cmd)
{
for (int i=0;i<5;++i)
if (cmd.find(str[i])!=string::npos)
{
SingleObject=i;
break;
}
if (cmd.find(">=")!=string::npos || cmd.find("!<")!=string::npos)
SingleOperator=1;
else if (cmd.find("<=")!=string::npos ||cmd.find("!>")!=string::npos)
SingleOperator=2;
else if (cmd.find("<>")!=string::npos || cmd.find("!=")!=string::npos)
SingleOperator=3;
else if (cmd.find("=")!=string::npos)
SingleOperator=4;
else if (cmd.find("<")!=string::npos)
SingleOperator=5;
else
SingleOperator=6;
int pos;
for (pos=cmd.length()-1;pos>=0;--pos)
if (cmd[pos]=='<' || cmd[pos]=='>' || cmd[pos]=='=')
break;
if (SingleObject<2)
SingleValueLL=StringToLL(cmd.substr(pos+1,cmd.length()-pos-1));
else
SingleValueString=StringToString(cmd.substr(pos+2,cmd.length()-pos-3));
}

void MakeAnd(string cmd)
{
CountUnit=0;
memset(CompareQueueValueLL,-1,sizeof(CompareQueueValueLL));
memset(CompareQueueOperator,-1,sizeof(CompareQueueOperator));
memset(CompareQueueObject,-1,sizeof(CompareQueueObject));
for (int i=0;i<10;++i)
CompareQueueValueString[i]="";
int pre=6;
for (int i=6;i<cmd.length();++i)
if (cmd.substr(i,3)=="AND" || cmd.substr(i,3)=="and")
{
MakeUnit(cmd.substr(pre,i-1-pre),CountUnit++);
pre=i+3;
}
MakeUnit(cmd.substr(pre,cmd.length()-pre),CountUnit++);
}

void MakeOr(string cmd)
{
CountUnit=0;
memset(CompareQueueValueLL,-1,sizeof(CompareQueueValueLL));
memset(CompareQueueOperator,-1,sizeof(CompareQueueOperator));
memset(CompareQueueObject,-1,sizeof(CompareQueueObject));
for (int i=0;i<10;++i)
CompareQueueValueString[i]="";
int pre=6;
for (int i=6;i<cmd.length();++i)
if (cmd.substr(i,2)=="OR" || cmd.substr(i,2)=="or")
{
MakeUnit(cmd.substr(pre,i-1-pre),CountUnit++);
pre=i+2;
}
MakeUnit(cmd.substr(pre,cmd.length()-pre),CountUnit++);
}

void MakeUnit(string cmd,int pos)
{
int &unitobject=CompareQueueObject[pos];
int &unitoperator=CompareQueueOperator[pos];
LL &unitvaluell=CompareQueueValueLL[pos];
string &unitvaluestring=CompareQueueValueString[pos];
for (int i=0;i<5;++i)
if (cmd.find(str[i])!=string::npos)
{
unitobject=i;
break;
}
if (cmd.find(">=")!=string::npos || cmd.find("!<")!=string::npos)
unitoperator=1;
else if (cmd.find("<=")!=string::npos ||cmd.find("!>")!=string::npos)
unitoperator=2;
else if (cmd.find("<>")!=string::npos || cmd.find("!=")!=string::npos)
unitoperator=3;
else if (cmd.find("=")!=string::npos)
unitoperator=4;
else if (cmd.find("<")!=string::npos)
unitoperator=5;
else
unitoperator=6;
for (pos=cmd.length()-1;pos>=0;--pos)
if (cmd[pos]=='<' || cmd[pos]=='>' || cmd[pos]=='=')
break;
if (unitobject<2)
unitvaluell=StringToLL(cmd.substr(pos+1,cmd.length()-pos-1));
else
unitvaluestring=StringToString(cmd.substr(pos+2,cmd.length()-pos-2));
}

LL StringToLL(string str)
{
LL ans=0;
for (int i=0;i<str.length();++i)
if (str[i]>='0' && str[i]<='9')
ans=ans*10+str[i]-'0';
return ans;
}

string StringToString(string str)
{
int l=0,r=str.length()-1;
while (str[l]==' ' || str[l]=='\'' || str[l]=='\"' || str[l]==',')
++l;
while (str[r]==' ' || str[r]=='\'' || str[r]=='\"' || str[r]==';' || str[r]==',')
--r;
string now=str.substr(l,r-l+1);
return now;
}

bool CheckIn(Student p)
{
if (InObject==0)
{
if (InSetLL.count(p.Sno))
return true;
else
return false;
}
else if (InObject==1)
{
if (InSetLL.count(p.Sage))
return true;
else
return false;
}
else if (InObject==2)
{
if (InSetString.count(p.Sname))
return true;
else
return false;
}
else if (InObject==3)
{
if (InSetString.count(p.Ssex))
return true;
else
return false;
}
else
{
if (InSetString.count(p.Sdept))
return true;
else
return false;
}
}

bool CheckBetween(Student p)
{
if (BetweenObject==0)
{
if (p.Sno>=BetweenLowerLL && p.Sno<=BetweenUpperLL)
return true;
else
return false;
}
else if (BetweenObject==1)
{
if (p.Sage>=BetweenLowerLL && p.Sage<=BetweenUpperLL)
return true;
else
return false;
}
else if (BetweenObject==2)
{
if (p.Sname>=BetweenLowerString && p.Sname<=BetweenUpperString)
return true;
else
return false;
}
else if (BetweenObject==3)
{
if (p.Ssex>=BetweenLowerString && p.Ssex<=BetweenUpperString)
return true;
else
return false;
}
else
{
if (p.Sdept>=BetweenLowerString && p.Sdept<=BetweenUpperString)
return true;
else
return false;
}
}

bool CheckLike(Student p)
{
if (LikeObject==0)
{
char str[50];
sprintf(str,"%lld",p.Sno);
string now="";
for (int i=0;i<strlen(str);++i)
now+=str[i];
if (now.find(LikeValue)!=string::npos)
return true;
else
return false;
}
else if (LikeObject==1)
{
char str[50];
sprintf(str,"%lld",p.Sage);
string now="";
for (int i=0;i<strlen(str);++i)
now+=str[i];
if (now.find(LikeValue)!=string::npos)
return true;
else
return false;
}
else if (LikeObject==2)
{
if (p.Sname.find(LikeValue)!=string::npos)
return true;
else
return false;
}
else if (LikeObject==3)
{
if (p.Ssex.find(LikeValue)!=string::npos)
return true;
else
return false;
}
else if (LikeObject==4)
{
if (p.Sdept.find(LikeValue)!=string::npos)
return true;
else
return false;
}
}

bool CheckNull(Student p)
{
if (NullObject==0)
{
if (p.Sno==-1)
return true;
else
return false;
}
else if (NullObject==1)
{
if (p.Sage==-1)
return true;
else
return false;
}
else if (NullObject==2)
{
if (p.Sname=="NULL")
return true;
else
return false;
}
else if (NullObject==3)
{
if (p.Ssex=="NULL")
return true;
else
return false;
}
else
{
if (p.Sdept=="NULL")
return true;
else
return false;
}
}

bool CheckSingle(Student p)
{
if (SingleObject==0)
{
if (UnitCompare(p.Sno,SingleValueLL,SingleOperator))
return true;
else
return false;
}
else if (SingleObject==1)
{
if (UnitCompare(p.Sage,SingleValueLL,SingleOperator))
return true;
else
return false;
}
else if (SingleObject==2)
{
if (UnitCompare(p.Sname,SingleValueString,SingleOperator))
return true;
else
return false;
}
else if (SingleObject==3)
{
if (UnitCompare(p.Ssex,SingleValueString,SingleOperator))
return true;
else
return false;
}
else
{
if (UnitCompare(p.Sdept,SingleValueString,SingleOperator))
return true;
else
return false;
}
}

bool CheckAnd(Student p)
{
bool ans=true;
for (int i=0;i<CountUnit;++i)
ans&=CheckUnit(p,i);
return ans;
}

bool CheckOr(Student p)
{
bool ans=false;
for (int i=0;i<CountUnit;++i)
ans|=CheckUnit(p,i);
return ans;
}

bool CheckUnit(Student p,int pos)
{
LL unitvaluell;
string unitvaluestring;
int unitoperator=CompareQueueOperator[pos];
if (CompareQueueObject[pos]<2)
unitvaluell=CompareQueueValueLL[pos];
else
unitvaluestring=CompareQueueValueString[pos];
if (CompareQueueObject[pos]==0)
return UnitCompare(p.Sno,unitvaluell,unitoperator);
else if (CompareQueueObject[pos]==1)
return UnitCompare(p.Sage,unitvaluell,unitoperator);
else if (CompareQueueObject[pos]==2)
return UnitCompare(p.Sname,unitvaluestring,unitoperator);
else if (CompareQueueObject[pos]==3)
return UnitCompare(p.Ssex,unitvaluestring,unitoperator);
else
return UnitCompare(p.Sdept,unitvaluestring,unitoperator);
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: