请问对一个学生系统里面的姓名,学号,电话或email添加模糊查询功能,应该如何实现?我理解的是,如果这个关键字是学号里面的关键字,那电话,email有相同数字也不输出这个学生的信息。这种的如何实现呢?感谢!即这个search函数怎么修改?
#include
#include
#include
#include
struct Student
{
char id[14];
char name[10];
int age;
char sex[4];
char date[16];
char address[20];
char phone[12];
char email[20];
};
struct Student stu[50],ss;
int menu();
//功能:在stu的count个元素,查找ss
//返回值:查找成功,返回ss在stu中的位置号;否则,返回 -1
int searchID(Student stu[] , int count , char key);
int searchNAME(Student stu[] , int count , Student ss);
//正常插入,返回学生数;否则,返回-1
int add(Student stu[] , int count ,Student ss);
//若输入的学号存在,正常修改,返回学生数,否则,修改失败,返回 -1
int modify(Student stu[],int count,Student ss);
//若输入的学号存在,删除,返回学生数,否则,删除失败,返回 -1
int Delete(Student stu[],int count,Student ss);
void writeFile(Student stu[] , int count );
int readFile(Student stu[]);
int main()
{
char key;
int count = 0, i;
int select, tag = 1 ;
count = readFile(stu);
while(tag)
{
//菜单
menu();
scanf("%d",&select);
switch(select)
{
case 1://增加
printf("请输入待录入的学生\n学号 姓名 年龄 性别 出生年月 地址 电话 E-mail\n");
scanf("%s %s %d %s %s %s %s %s", ss.id , ss.name ,&ss.age, ss.sex ,ss.date,ss.address,ss.phone,ss.email);
i = add(stu,count,ss);
//如果本来不存在这个学生信息
if(i != -1)
{
printf("录入成功\n");
count = i;
}
else
printf("录入失败\n");
break;
case 2://按学号查找
printf("请输入关键字:");
scanf("%s", key);
i = searchID(stu , count ,key);
if(i != -1 )
printf("%s %s %d %s %s %s %s %s\n",stu[i].id , stu[i].name , stu[i].age,stu[i].sex,stu[i].date,stu[i].address,stu[i].phone,stu[i].email);
else
printf("%s 不存在!\n",ss.id);
break;
case 3://按姓名查找
printf("请输入姓名:");
scanf("%s", ss.name);
i = searchNAME(stu , count ,ss);
if(i != -1 )
printf("%s %s %d %s %s %s %s %s\n",stu[i].id , stu[i].name , stu[i].age,stu[i].sex,stu[i].date,stu[i].address,stu[i].phone,stu[i].email);
else
printf("%s 不存在!\n",ss.name);
break;
case 4://修改
printf("请输入待修改的学生\n学号 姓名 年龄 性别 出生年月 地址 电话 E-mail\n");
scanf("%s %s %d %s %s %s %s %s", ss.id , ss.name ,&ss.age, ss.sex ,ss.date,ss.address,ss.phone,ss.email);
i = modify(stu , count ,ss);
if(i == -1)
printf("%s 不存在,修改失败!\n",ss.id);
else
printf("修改成功\n");
break;
case 5://删除
printf("请输入待删除的学生学号:");
scanf("%s", ss.id);
i = Delete(stu , count ,ss);
if(i != -1 )
{
printf("删除成功\n");
count = i;
}
else
printf("%s 不存在,删除失败\n",ss.id);
break;
case 6://显示
printf("学号 姓名 年龄 性别 出生年月 地址 电话 E-mail\n");
for(i = 0 ; i < count ; i++ )
printf("%s %s %d %s %s %s %s %s\n",stu[i].id , stu[i].name , stu[i].age,stu[i].sex,stu[i].date,stu[i].address,stu[i].phone,stu[i].email);
break;
case 0:
system("cls") ;
printf("欢迎再次使用学生信息管理系统......\n");
tag = 0 ;
writeFile(stu ,count );
break;
default:
printf("选择错误,只能选择(0-6)");
}
printf("按任意键继续......\n");
getch();
system("cls");
}
getch();
return 0;
}
int menu()
{
printf(" *学生信息管理系统* \n");
printf("1、插入学生信息\n");
printf("2、查找学生信息(按学号)\n");
printf("3、查找学生信息(按姓名)\n");
printf("4、修改学生信息\n");
printf("5、删除学生信息\n");
printf("6、显示学生信息\n");
printf("0、退出系统\n");
printf("__________________________\n");
printf("请选择(0-6):");
}
//功能:在stu的count个元素,查找ss
//返回值:查找成功,返回ss在stu中的位置号;否则,返回 -1
int searchID(Student stu[] , int count , char key)
{
int i,j ;
for(i = 0 ; i < count ; i++)
for(j=0;j<14;j++){
//i是所查找的学生在数组中的下标
if() return i };
return -1;
}
int searchNAME(Student stu[] , int count , Student ss)
{
int i ;
for(i = 0 ; i < count ; i++)
if(strcmp(stu[i].name , ss.name) == 0) return i ;
return -1;
}
int add(Student stu[] , int count ,Student ss)
{
int pos ;
//先判断添加的信息是否原本已有这个学生
pos = searchID(stu , count ,ss);
//如果本来不存在,就添加
if(pos == -1)
{
stu[count] = ss;
return count + 1;
}
return -1;
}
//若输入的学号存在,正常修改,返回学生数,否则,修改失败,返回 -1
int modify(Student stu[],int count,Student ss)
{
int pos ;
pos = searchID(stu , count ,ss);
if(pos == -1)
return -1;
else
{
stu[pos] =ss;
return count;
}
}
//若输入的学号存在,删除,返回学生数,否则,删除失败,返回 -1
int Delete(Student stu[],int count,Student ss)
{
int pos , i;
pos = searchID(stu , count ,ss);
if(pos == -1)
return -1;
else
{
for(i = pos + 1 ; i < count ; i++ )
stu[i - 1 ] = stu[i] ;
return count - 1;
}
}
void writeFile(Student stu[],int count )
{
FILE *fp ;
int i;
//"w"是写文件
fp = fopen ("student.dat" , "w");
for(i = 0 ; i < count ;i++)
//fprinf()是把文件内容输出到屏幕
fprintf(fp,"%s %s %d %s %s %s %s %s\n",stu[i].id , stu[i].name , stu[i].age,stu[i].sex,stu[i].date,stu[i].address,stu[i].phone,stu[i].email);
fclose(fp);
}
//只读文件
int readFile(Student stu[])
{
FILE *fp ;
int i;
fp = fopen ("student.dat" , "r");
//如果文件不存在,返回0
if(fp == NULL)
return 0;
//foef()判断文件是否结束,结束返回1,未结束返回0,用!feof()作为循环条件
//fscanf()将文件中的数据读入数组变量id,name...中
for(i = 0 ;; i++)
if (fscanf(fp , "%s %s %d %s %s %s %s %s" ,stu[i].id , stu[i].name , &stu[i].age,stu[i].sex,stu[i].date,stu[i].address,stu[i].phone,stu[i].email)!=8) break;
fclose(fp);
return i;
}
写一个int searchKey(Student stu[], int count, char* key) 按关键字查找函数,这个关键字是按 学号 姓名 电话 email 字段顺序查找,修改如下,供参考:
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <string.h>
struct Student
{
char id[14];
char name[10];
int age;
char sex[4];
char date[16];
char address[20];
char phone[12];
char email[20];
};
struct Student stu[50], ss;
void menu(); //int menu(); 修改
int searchKey(Student stu[], int count, char* key); //int searchID(Student stu[], int count, char key); 修改
//功能:在stu的count个元素,查找ss
//返回值:查找成功,返回ss在stu中的位置号;否则,返回 -1
int searchID(Student stu[], int count, Student ss);
int searchNAME(Student stu[], int count, Student ss);
//正常插入,返回学生数;否则,返回-1
int add(Student stu[], int count, Student ss);
//若输入的学号存在,正常修改,返回学生数,否则,修改失败,返回 -1
int modify(Student stu[], int count, Student ss);
//若输入的学号存在,删除,返回学生数,否则,删除失败,返回 -1
int Delete(Student stu[], int count, Student ss);
void writeFile(Student stu[], int count);
int readFile(Student stu[]);
int main()
{
char key[20]; //修改
int count = 0, i;
int select, tag = 1;
count = readFile(stu);
while (tag)
{
//菜单
menu();
scanf("%d", &select);
switch (select)
{
case 1://增加
printf("请输入待录入的学生\n学号 姓名 年龄 性别 出生年月 地址 电话 E-mail\n");
scanf("%s %s %d %s %s %s %s %s", ss.id, ss.name, &ss.age, ss.sex, ss.date, ss.address, ss.phone, ss.email);
i = add(stu, count, ss);
//如果本来不存在这个学生信息
if (i != -1)
{
printf("录入成功\n");
count = i;
}
else
printf("录入失败\n");
break;
case 2://按学号查找 修改: 按关键字查找
printf("请输入关键字:");
scanf("%s", key);
i = searchKey(stu, count, key); //i = searchID(stu, count, key); 修改
if (i != -1)
printf("%s %s %d %s %s %s %s %s\n", stu[i].id, stu[i].name, stu[i].age, stu[i].sex, stu[i].date, stu[i].address, stu[i].phone, stu[i].email);
else
printf("%s 不存在!\n", ss.id);
break;
case 3://按姓名查找
printf("请输入姓名:");
scanf("%s", ss.name);
i = searchNAME(stu, count, ss);
if (i != -1)
printf("%s %s %d %s %s %s %s %s\n", stu[i].id, stu[i].name, stu[i].age, stu[i].sex, stu[i].date, stu[i].address, stu[i].phone, stu[i].email);
else
printf("%s 不存在!\n", ss.name);
break;
case 4://修改
printf("请输入待修改的学生\n学号 姓名 年龄 性别 出生年月 地址 电话 E-mail\n");
scanf("%s %s %d %s %s %s %s %s", ss.id, ss.name, &ss.age, ss.sex, ss.date, ss.address, ss.phone, ss.email);
i = modify(stu, count, ss);
if (i == -1)
printf("%s 不存在,修改失败!\n", ss.id);
else
printf("修改成功\n");
break;
case 5://删除
printf("请输入待删除的学生学号:");
scanf("%s", ss.id);
i = Delete(stu, count, ss);
if (i != -1)
{
printf("删除成功\n");
count = i;
}
else
printf("%s 不存在,删除失败\n", ss.id);
break;
case 6://显示
printf("学号 姓名 年龄 性别 出生年月 地址 电话 E-mail\n");
for (i = 0; i < count; i++)
printf("%s %s %d %s %s %s %s %s\n", stu[i].id, stu[i].name, stu[i].age, stu[i].sex, stu[i].date, stu[i].address, stu[i].phone, stu[i].email);
break;
case 0:
system("cls");
printf("欢迎再次使用学生信息管理系统......\n");
tag = 0;
writeFile(stu, count);
break;
default:
printf("选择错误,只能选择(0-6)");
}
printf("按任意键继续......\n");
getch();
system("cls");
}
getch();
return 0;
}
void menu() //int menu() 修改
{
printf(" *学生信息管理系统* \n");
printf("1、插入学生信息\n");
printf("2、查找学生信息(按关键字)\n"); //(按学号) 修改
printf("3、查找学生信息(按姓名)\n");
printf("4、修改学生信息\n");
printf("5、删除学生信息\n");
printf("6、显示学生信息\n");
printf("0、退出系统\n");
printf("__________________________\n");
printf("请选择(0-6):");
}
int searchKey(Student stu[], int count, char* key) //int searchID(Student stu[], int count, char key) 修改
{
int i;
char* p = NULL;
for (i = 0; i < count; i++) //先排查 学号
{
p = strstr(stu[i].id, key);
if (p) return i;
}
for (i = 0; i < count; i++) //其次 姓名
{
p = strstr(stu[i].name, key);
if (p) return i;
}
for (i = 0; i < count; i++) //再次 电话
{
p = strstr(stu[i].phone, key);
if (p) return i;
}
for (i = 0; i < count; i++) //四次 email
{
p = strstr(stu[i].email, key);
if (p) return i;
}
return -1;
}
//功能:在stu的count个元素,查找ss
//返回值:查找成功,返回ss在stu中的位置号;否则,返回 -1
int searchID(Student stu[], int count, Student ss)
{
int i;
for (i = 0; i < count; i++)
if (strcmp(stu[i].name, ss.id) == 0) return i;
return -1;
}
int searchNAME(Student stu[], int count, Student ss)
{
int i;
for (i = 0; i < count; i++)
if (strcmp(stu[i].name, ss.name) == 0) return i;
return -1;
}
int add(Student stu[], int count, Student ss)
{
int pos;
//先判断添加的信息是否原本已有这个学生
pos = searchID(stu, count, ss);
//如果本来不存在,就添加
if (pos == -1)
{
stu[count] = ss;
return count + 1;
}
return -1;
}
//若输入的学号存在,正常修改,返回学生数,否则,修改失败,返回 -1
int modify(Student stu[], int count, Student ss)
{
int pos;
pos = searchID(stu, count, ss);
if (pos == -1)
return -1;
else
{
stu[pos] = ss;
return count;
}
}
//若输入的学号存在,删除,返回学生数,否则,删除失败,返回 -1
int Delete(Student stu[], int count, Student ss)
{
int pos, i;
pos = searchID(stu, count, ss);
if (pos == -1)
return -1;
else
{
for (i = pos + 1; i < count; i++)
stu[i - 1] = stu[i];
return count - 1;
}
}
void writeFile(Student stu[], int count)
{
FILE* fp;
int i;
//"w"是写文件
fp = fopen("student.dat", "w");
for (i = 0; i < count; i++)
//fprinf()是把文件内容输出到屏幕
fprintf(fp, "%s %s %d %s %s %s %s %s\n", stu[i].id, stu[i].name, stu[i].age, stu[i].sex, stu[i].date, stu[i].address, stu[i].phone, stu[i].email);
fclose(fp);
}
//只读文件
int readFile(Student stu[])
{
FILE* fp;
int i;
fp = fopen("student.dat", "r");
//如果文件不存在,返回0
if (fp == NULL)
return 0;
//foef()判断文件是否结束,结束返回1,未结束返回0,用!feof()作为循环条件
//fscanf()将文件中的数据读入数组变量id,name...中
for (i = 0;; i++)
if (fscanf(fp, "%s %s %d %s %s %s %s %s", stu[i].id, stu[i].name, &stu[i].age, stu[i].sex, stu[i].date, stu[i].address, stu[i].phone, stu[i].email) != 8) break;
fclose(fp);
return i;
}
要实现对姓名、学号、电话、邮箱的模糊查询,可以在查询的时候将输入的关键字与学生信息中的姓名、学号、电话、邮箱进行比较,如果包含关键字就输出这个学生的信息。可以使用strstr函数来实现这个比较。例如,在searchID函数中,可以更改为如下:
int searchID(Student stu[] , int count , char key[])
{
int i;
for(i = 0; i < count; i++)
{
if(strstr(stu[i].id, key) || strstr(stu[i].name, key) || strstr(stu[i].phone, key) || strstr(stu[i].email, key))
{
return i;
}
}
return -1;
}
这样就可以实现对姓名、学号、电话、邮箱的模糊查询了。
不知道你这个问题是否已经解决, 如果还没有解决的话: