关于C/C++程序里如何实现模糊查找

    相信学过C/C++的都应该了解如何在数组里面去查找数据,利用for循环便能很容易实现查找的功能,但若数组里的数据是字符串类型,而你又恰好需要实现的是根据关键字进行查找的话,那么按部就班对数组里的字符串进行一个个字符的对比是很难实现的,这时候就要想其他的办法了,C里面有一个函数便可以从侧面实现模糊查找,它就是strstr()函数,该函数搜索一个字符串在另一个字符串里的第一次出现,并返回所搜索到字符串在另一个字符串中的位置,如果没有搜索到,则返回0(NULL)。根据此函数的性质,我们便能利用它来实现模糊查找,即对字符串查找时,当返回为非空时,即打印所进行搜索的字符串,例如 :
if(strstr(str1,str2)!=NULL)//str2 为所要要查找的内容, str1 为查找的区域。
{
cout<
}

下面给大家写个简单的学生管理系统,来看看是如何利用strstr函数实现模糊查找的:

#include
#include
using namespace std;


typedef struct Stu
{
 char name[20];
int num;
 char sex[20];
int birthday;
 char academy[20];
 char major[20];
char grade[20];


}stu;


void exchange(stu &a,stu &b)//对调位置函数
{
stu temp;
temp.num=a.num;  a.num=b.num;  b.num=temp.num;
temp.birthday=a.birthday; a.birthday=b.birthday; b.birthday=temp.birthday;
strcpy(temp.academy,a.academy);strcpy(a.academy,b.academy);strcpy(b.academy,temp.academy);
strcpy(temp.grade,a.grade);strcpy(a.grade,b.grade);strcpy(b.grade,temp.grade);
strcpy(temp.major,a.major);strcpy(a.major,b.major);strcpy(b.major,temp.major);
strcpy(temp.name,a.name);strcpy(a.name,b.name);strcpy(b.name,temp.name);
strcpy(temp.sex,a.sex);strcpy(a.sex,b.sex);strcpy(b.sex,temp.sex);


}


class student
{
public:
student()
{count=0;}
    void creat();
void sort();
    void add();
void delet();
void name_search();
void num_search();
void fuzzy_search();
void data_search();
void print();
private:
stu s[50]; int count;


};


void student::creat() //新建一个学生数据表
{


int i;


for(i=0;i<=50;i++)  
{
cout<<"输入学号"<<"(输入0结束):"<         cin>>s[i].num;
if(s[i].num==0)break;
cout<<"依次输入学生姓名,性别,出生日期,所属学院,专业,年级"<<":"< cin>>s[i].name>>s[i].sex>>s[i].birthday>>s[i].academy>>s[i].major>>s[i].grade;
count++;
}


}


void student::add()
{


cout<<"输入学号"<<":"<         cin>>s[count].num;
cout<<"依次输入学生姓名,性别,出生日期,所属学院,专业,年级"<<":"< cin>>s[count].name>>s[count].sex>>s[count].birthday>>s[count].academy>>s[count].major>>s[count].grade;


count++;cout< sort();
}


void student::delet()
{
cout<<"输入要删除的学生的学号"<<": "< int x,i;cin>>x;char a;
cout<<"确定要删除此学生信息?"<<"(n/y)"<<":";cin>>a;
if(a=='y')
{
for(i=0;i {
if(s[i].num==x)
{
exchange(s[i],s[count-1]);
count--;
}


}
cout<<"删除完成!"< cout<<" "< sort();
}


}


void student::num_search()//二分法查找学生信息
{
int a,high,mid;
int low=0;
high=count-1;
cout<<"输入所要查找学生的学号:";
cin>>a;
while(low<=high)
{
mid=(low+high)/2;
if(a>s[mid].num){low=mid+1;mid=(low+high)/2;}
if(a==s[mid].num)break;
else
{
high=mid-1;
mid=(low+high)/2;
}
}
if(low<=high)
{
cout<<"学号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"出生日期:"< cout<<"所属学院:"< cout<<"专业:"< cout<<"年级:"< }
else
{
cout< cout<<"你要查找的学生不存在!请确认学号是否输入有误!"<

}
}


void student::name_search()
{
cout<<"输入你要查找的学生的姓名:";
char a[20];
cin>>a;char *p=a;
int i,j;
int k=0;
for(i=0;i {
if(strcmp(s[i].name,a)==0)
{
   j=i;
   k++;
}
}
if(k==1)
{
cout<<"学号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"出生日期:"< cout<<"所属学院:"< cout<<"专业:"< cout<<"年级:"< }
else
{
cout<<"你要查找的学生不存在!请确认姓名是否输入有误!"< cout<<"                                     "< }
}


void student::fuzzy_search()
{
char a[20];
cout<<"请输入关键字:";
cin>>a;
cout< int i,j,k=0;


for(i=0;i {
if(strstr(s[i].name,a)!=NULL)
{
j=i;
k++;
}


}
if(k==1)
{
cout<<"学号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"出生日期:"< cout<<"所属学院:"< cout<<"专业:"< cout<<"年级:"< cout<<" "< }
else
{
cout<<"模糊查找失败!请输入其他关键字!"< cout<<" "<

}
}


void student::data_search()
{
int x;
cout<<"                        1:按姓名查找"<cout<<"                        2:按学号查找"<cout<<"                        3:模糊查找"<cout<<"选择查找方式:";
cin>>x;
switch(x)
{
case 1:name_search();break;
case 2:num_search();break;
case 3:fuzzy_search();break;


}


}


void student::print()
{

int i;
for(i=0;i {


cout<<"学号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"出生日期:"< cout<<"所属学院:"< cout<<"专业:"< cout<<"年级:"< cout<<" "<

}


}
void student::sort()
{

int i,j;
for(i=0;i {


for(j=i+1;j{

if(s[i].num>s[j].num)
{
       exchange(s[j],s[i]);
}

}




}
print();
}


int main()
{
int x;
student a;
do{
cout<<"----------------------------    学生信息管理    --------------------------------"< cout<<"                     1:建立学生信息数据表"< cout<<"                     2:按学号进行排序    "< cout<<"                     3:添加学生信息      "< cout<<"                     4:删除学生信息      "< cout<<"                     5:查找学生信息      "< cout<<"                     6:输出学生信息      "< cout<<"                     7:结束              "< cout<<" 请选择序号  "<<":  ";cin>>x;
switch(x)
{
case 1:  a.creat();break;
case 2:  a.sort();break;
case 3:  a.add();break;
case 4:  a.delet();break;
case 5:  a.data_search();break;
case 6:  a.print();break;
}
}while(x>=1&&x<7);


return 0;
}


你可能感兴趣的:(c/c++编程基础)