‘壹’ 如何用c语言实现文件的模糊查找-程序设计 C语言 文件名 模糊查找
一要能够查找文件名,首先,要能够遍历目录;把它写出来
二在1的基础上,把获得的每个文件名与key比较,若文件名包含key则找到输出,并
继续;否则不输出继续,查下一个
文件名包含key判断方面,<string.h>里有个strstr可以使用;具体你翻查看下,不再赘述。
‘贰’ C语言程序设计:通讯录程序设计
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "stdio.h"
#include "dos.h"
FILE *fp;
int i; //i是全局变量 可代替length
struct address
{ char postnum[10];
char a[40]; //家庭地址
};
struct birthday
{ int year;
int month;
int day;
};
struct ffriend
{ int num; //序号
char name[20];
char sex;
char telephone[13];
struct birthday birthday;
struct address address;
}
friends[50];
void Load()
{
int j;
long k;
fp=fopen("friend.txt","a+"); //打开文件friend.txt
if(fp!=NULL)
{
for(i=1;i<50;i++)
{
j=fgetc(fp);
if(j==EOF) //判断是否到了文件尾
return;
k=i-1;
fseek(fp,k*sizeof(struct ffriend),SEEK_SET);
fread(&friends[i],sizeof(struct ffriend),1,fp); //从文件中读取一条记录
}
}
else
{
fp=fopen("friend.txt","w");
i=1;
}
}
void Show(int j)
{
// friends[j].num=i;
printf("\n\n\t编号-Nnumber: %3d",friends[j].num);
printf("\n\t姓名-Name:%-20s",friends[j].name);
printf("\n\t性别-Sex:%c",friends[j].sex);
printf("\n\t联系电话-Telephone:%-13s",friends[j].telephone);
printf("\n\t出生日期-Birthday:%4d-%2d-%3d",friends[j].birthday.year,friends[j].birthday.month,friends[j].birthday.day);
printf("\n\t邮编-Postnum:%-10s",friends[j].address.postnum);
printf("\n\t通信地址-address:%-40s",friends[j].address.a);
}
void Append(int j)
{
fflush(stdin); //区内清除文件缓冲区,文件以写方式打开时将缓冲容写入文件
//stdin是一个标准FILE*(文件型指针)指向通常是用键盘的输入的输入流
friends[j].num=j;
printf("\n\t\t\t序号-Number:%d",j);
printf("\n\t\t\t姓名-Name:");
scanf("%s",friends[j].name);
fflush(stdin); //为什么没有fflush(stdin); 的效果会自动跳过呢?
printf("\t\t\t性别-Sex(m/w):"); //为什么输入汉字男女也会自动跳过联系电话呢
scanf("%c",&friends[j].sex);
printf("\t\t\t联系电话-telephone:");
scanf("%s",friends[j].telephone);
printf("\t出生日期-birthday");
printf("\n\t\t\t年份-year:");
scanf("%d",&friends[j].birthday.year);
printf("\t\t\t月份-month:");
scanf("%d",&friends[j].birthday.month);
printf("\t\t\t日-day:");
scanf("%d",&friends[j].birthday.day);
printf("\t\t\t邮编-Postnumber:");
scanf("%s",friends[j].address.postnum);
printf("\t\t\t通信地址-Address:");
scanf("%s",friends[j].address.a);
getchar();
}
void Delete()
{
int k;
printf("\n\tDelete 序号-Number:");
scanf("%d",&k);
if(k<=i)
{
for(int j=k;j<i+1;j++) /*插入位置后的元素顺序后移*/
{
strcpy(friends[j].name,friends[j+1].name); /*交换元素内容*/
friends[j].sex=friends[j+1].sex;
strcpy(friends[j].telephone,friends[j+1].telephone);
friends[j].birthday.year=friends[j+1].birthday.year;
friends[j].birthday.month=friends[j+1].birthday.month;
friends[j].birthday.day=friends[j+1].birthday.day;
strcpy(friends[j].address.postnum,friends[j+1].address.postnum);
strcpy(friends[j].address.a,friends[j+1].address.a);
}
i--;
}
else
{
printf("输入的序号太大!");
}
}
void Modify(int j)
{
Append(j);
}
void Save()
{
int j;
fp=fopen("friend.txt","w");
for(j=1;j<=i;j++)
{
fwrite(&friends[j],sizeof(struct ffriend),1,fp);
}
fclose(fp);
}
void main()
{
int j;
char grade;
char searchname[10];
Load();
i--;
do
{
printf("\t\t\t\t简易通讯录\n\n");
printf("功能选择(Function choose)\n");
printf("\1A.读取(Read)\n");
printf("\2B.增添(Append)\n");
printf("\6C.插入(Insert)\n");
printf("\5D.删除(Delete)\n");
printf("\5E.查询(Search)\n");
printf("\6F.修改(Modify)\n");
printf("\2G.保存(Save)\n");
printf("\1H.退出(Quit)\n");
printf("请选择(Choice)\n注:输入A~H的大写字母\n");
scanf("%c",&grade);
switch(grade)
//加个大写和小写 都可以啊
{
case 'A': j=1; //显示功能
while(getchar()!=0x1b&&j<=i) //增添按Esc键退出
{
Show(j++);
printf("\n请按回车键继续!");
}
if(j-1<1)
{
printf("\n\t空文档,无任何记录-Empty Note\n");
printf("\n请按回车键继续!");
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'B': //增加功能
while(i<=50) //增加按ESC键退出的功能
{
i++;
Append(i);
printf("\t是否继续增加?y/n");
//修改 加上else if 其他就跳出或强制打印出出错
char a=getchar();
if(a=='n'||a=='N')
break;
}
if(i==51)
printf("\n\t文档已满,无法增加记录-note full");
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'C':
int k;
printf("\n\t输入要插入的位置:");
scanf("%d",&k);
j=i+1;
friends[j].num=j;
for(j;j>k;j--) //插入功能
{
strcpy(friends[j].name,friends[j-1].name); //数据后移
friends[j].sex=friends[j-1].sex;
strcpy(friends[j].telephone,friends[j-1].telephone);
friends[j].birthday.year=friends[j-1].birthday.year;
friends[j].birthday.month=friends[j-1].birthday.month;
friends[j].birthday.day=friends[j-1].birthday.day;
strcpy(friends[j].address.postnum,friends[j-1].address.postnum);
strcpy(friends[j].address.a,friends[j-1].address.a);
}
Append(k);
i++;
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'D': //删除功能 //增添随意删除多条记录的功能
Delete();
if(i<1)
printf("\n没有记录-No records\n");
printf("\n请按回车键继续!");
getchar();
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'E': //查询功能
printf("\n\t请输入要查询记录的相关姓名:"); //增添查询按列号的
scanf("%s",searchname);
for(j=1;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0) //比较字符串
{
Show(j);
break;
}
}
if(i<1)
{
printf("\n 没有您所查询的记录-No records");
printf("\n 请按回车键继续!");
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'F': //修改功能 / /增添按序列号查询
printf("\n\t请输入要修改记录的相关姓名:");
gets(searchname);
scanf("%s",searchname);
for(j=1;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0) //比较字符串
{
Modify(j);
// getchar(); //加个输出确定修改吗
}
}
if(i<1) //修改功能
{ printf("\n 没有您所要修改的记录-No records");
printf("\n 请按回车键继续!");
getchar();
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'G':
Save(); //存盘功能
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'H': //退出功能
char x;
printf("是否保存?yes/no\n");
scanf("%s",&x);
//getchar();
// getchar();
if(x=='y')
{
Save();
exit(0);
}
else
exit(0);
default:
printf("\n\t输入有误,请输入正确的序列号!");
printf("\n请按回车键继续!");
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
}
}while(1);
}
‘叁’ 如何用C语言做通讯录
剽窃代码即可。。
已经按照你的要求做了一个,VC6上运行确认了:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedefstructPersonalInfo
{
charname[50];
charaddress[30];
chartelno[30];
charpostcode[30];
structPersonalInfo*next;
}INFO;
INFO*head;
voidInitiate();
voidMenu();
voidCreate();//的功能是:创建新的通讯录。
voidAdd();//在通讯录的末尾,写入新的信息,并返回选单
voidFind();//查找记录
voidAlter();//修改记录如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单。
voidDelete();//删除某人的信息,如果未找到要删的人,提示通讯录中没有此人的信息,并返回选单。
voidList();//的功能是:显示通讯录中的所有记录。
//初始化
voidInitiate()
{
if((head=(INFO*)malloc(sizeof(INFO)))==NULL)exit(1);
head->next=NULL;
}
//显示菜单
voidMenu()
{
printf("**************欢迎使用通讯录系统**************");
printf(" ");
printf(" ");
printf("1.创建通讯录。 ");
printf("2.插入信息。 ");
printf("3.查询记录 ");
printf("4.修改记录 ");
printf("5.删除记录! ");
printf("6.显示所有记录 ");
printf("0.退出通讯录 ");
printf("请输入0~6 ");
}
//创建通讯录
voidCreate()
{
INFO*p1[100],*p2;
intm,i;
printf("请输入创建个数:");
scanf("%d",&m);
for(i=1;i<=m;i++)
{
p1[i]=(INFO*)malloc(sizeof(INFO));
printf("请输入第%d条信息! ",i);
printf("姓名: ");
scanf("%s",&p1[i]->name);
printf("地址: ");
scanf("%s",&p1[i]->address);
printf("电话: ");
scanf("%s",&p1[i]->telno);
printf("邮编: ");
scanf("%s",&p1[i]->postcode);
p1[i]->next=NULL;
if(head->next==NULL)
head->next=p1[i];
else
{
for(p2=head;p2->next!=NULL;p2=p2->next);//找到结点尾
p2->next=p1[i];
}
}
printf("信息已添加! ");
return;//保存到链表
}
//添加通讯录信息
voidAdd()
{
INFO*p,*q;
if((q=(INFO*)malloc(sizeof(INFO)))==NULL)exit(1);
printf("请输入要添加的信息! ");
printf("姓名: ");//添加信息
scanf("%s",&q->name);
printf("性别: ");
scanf("%s",q->address);
printf("电话: ");
scanf("%s",q->telno);
printf("城市: ");
scanf("%s",q->postcode);
for(p=head;p->next!=NULL;p=p->next);
p->next=q;
q->next=NULL;
printf("此信息已添加!");
return;
}
//查找通讯录信息
voidFind()
{
INFO*p;
charname[50];
if(head->next==NULL)
{
printf("此通讯录为空! ");
return;
}
printf("请输入要查找的姓名: ");
scanf("%s",&name);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{
printf("姓名 地址 邮编 电话 ");
printf("%s %s %s %s ",p->name,p->address,p->postcode,p->telno);
}
elseif(p->next==NULL)
printf("无此信息! ");
}
}
//修改通讯录信息
voidAlter()
{
charname[50];//先查找后删除
INFO*p,*p1;
if(head->next==NULL)
{
printf("此通讯录为空! ");
return;
}
printf("请输入要修改的姓名: ");
scanf("%s",name);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
break;
elseif(p->next==NULL)
{
printf("无此信息! ");
return;
}
}
p1=(INFO*)malloc(sizeof(INFO));
printf("姓名: ");//添加信息
scanf("%s",p1->name);
strcpy(p->name,p1->name);
printf("性别: ");
scanf("%s",p1->address);
strcpy(p->address,p1->address);
printf("电话: ");
scanf("%s",p1->telno);
strcpy(p->telno,p1->telno);
printf("城市: ");
scanf("%s",p1->postcode);
strcpy(p->postcode,p1->postcode);
printf("此信息已修改! ");
//显示修改的信息
printf("姓名 地址 邮编 电话 ");
printf("%s %s %s %s ",p->name,p->address,p->postcode,p->telno);
free(p1);
}
//删除通讯录信息
voidDelete()
{
charname[50];//先查找后删除
INFO*p=head->next,*p1=head->next,*p2;
if(head->next==NULL)
{
printf("此通讯录为空! ");
return;
}
printf("请输入要删除的姓名: ");
scanf("%s",name);
while((strcmp(p->name,name)!=0)&&p->next!=NULL)
{
p1=p;
p=p->next;
}
if(strcmp(name,p->name)==0)//输出删除信息
{
if(p==head->next&&p->next!=NULL)
head->next=p->next;
elseif(p==head->next&&p->next==NULL)
{
head->next=p->next;
printf("信息已删除,先此通讯录为空!! ");
return;
}
else
p1->next=p->next;
}
else
{
printf("此信息不存在!!! ");
return;
}
printf("此信息已删除!");
printf("姓名 地址 邮编 电话 ");
for(p2=head->next;p2!=NULL;p2=p2->next)
printf("%s %s %s %s ",p2->name,p2->address,p2->postcode,p2->telno);
}
//显示所有记录
voidList()
{
INFO*p;
if(head->next==NULL)
{
printf("此通讯录中无记录! ");
return;
}
printf("姓名 地址 邮编 电话 ");
for(p=head->next;p!=NULL;p=p->next)
printf("%s %s %s %s ",p->name,p->address,p->postcode,p->telno);
}
voidmain()
{
intchoice;
charyes_no;
system("colora");
Initiate();
do
{
Menu();
printf("请选择0-6的数字 ");
scanf("%d",&choice);
printf(" ");
switch(choice)
{
case1:Create();
break;
case2:Add();
break;
case3:Find();
break;
case4:Alter();
break;
case5:Delete();
break;
case6:List();
break;
case0:
printf("************感谢您的使用************ ");
exit(0);
break;
default:
printf("输入有误!请重新输入 ");
break;
}
printf("是否继续YorN? ");
do
{
scanf("%c",&yes_no);
}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}while(yes_no=='Y'||yes_no=='y');
}
‘肆’ 急求c语言通讯录
给你一个完整的代码 ,希望你参照一下,自己动动写写程序,希望能对你有些帮助........
#define N 50
#define exit
#include<stdio.h>
#include<string.h>
struct people
{char name[20]; char company[50]; char num[15]; char mail[20];}peop[N];
void printf_face()
{ printf("\n\t姓名\t单位\t电话号码\t邮箱\n"); }
void printf_one(int i)
{ printf("\t%s\t%s\t%s\t%s\n",peop[i].name,peop[i].company,peop[i].num,peop[i].mail); }
void printf_n(int n)
{ int j;
for(j=0;j<n;j++)
{ if((j!=0)&&(j%10==0)) {printf("\n\nPress any key to continue...:"); getchar(); puts("\n\n");}
printf_one(j);
} getchar();
}
int load()
{ FILE *fp;
int i;
if((fp=fopen("file","rb"))==NULL)
{ printf("\nCan not open file\n");
exit (0);
}
for(i=0;!feof(fp);i++)
fread(&peop[i],sizeof(struct people),1,fp);
fclose(fp);
return(i-1);
}
int modify_data(int i,int n)
{ int c,w1; void input(int i); void menu();
do
{ puts("\n修改选项=>\n\n 1).姓名 2).单位 3).电话号码 4).邮箱 5).所有数据 6).取消并返回");
printf("请选择?: [ ]\b\b");
scanf("%d",&c);
if(c>6||c<1) {puts("\nChoose error! Please again!"); getchar();}
}while(c>6||c<1);
do
{ switch(c)
{ case 1: printf("name:"); scanf("%s",peop[i].name); break;
case 2: printf("company:"); scanf("%s",peop[i].company); break;
case 3: printf("number:"); scanf("%s",peop[i].num); break;
case 4: printf("e-mail:"); scanf("%s",peop[i].mail); break;
case 5: input(i); break;
case 6: menu();
}
puts("\nNow:\n");
printf_face(); printf_one(i);
printf("\n确定?\n\n\t1).是 2).不,重新修改 3).返回不保存 [ ]\b\b");
scanf("%d",&w1);
}while(w1==2);
return(w1);
}
void input(int i)
{ printf_face(); printf("\t");
scanf("%s\t%s\t%s\t%s",peop[i].name,peop[i].company,peop[i].num,peop[i].mail); }
void save(int n)
{ FILE *fp; int i;
if((fp=fopen("file","wb"))==NULL)
{ printf("\nCan not open file\n");
exit(0);
}
for(i=0;i<n;i++)
if(peop[i].name[0]!='\0')
if(fwrite(&peop[i],sizeof(struct people),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
void printf_back()
{
int w; void browse(); void menu();
printf("\n\n\t^_^.Successful. ^_^\n\n");
printf("What do you want to do?\n\n\t1).浏览所有\t2).返回: [ ]\b\b");
scanf("%d",&w);
if(w==1) browse();
else menu();
}
void main()
{
void menu();
menu();
}
void menu()
{
int n, w1;
void enter(); void add(); void modify(); void browse(); void deleter(); void search();
do
{
puts("\t************************菜单************************ ");
puts("\t\t*******************1.新建联系人*******************");
puts("\t\t*******************2.添加联系人*******************");
puts("\t\t*******************3.修 改*******************");
puts("\t\t*******************4.删 除*******************");
puts("\t\t*******************5.浏 览*******************");
puts("\t\t*******************6.查 找*******************");
puts("\t\t*******************7.退 出*******************");
puts("\n\n\t********************通讯录********************* ");
printf("请选择服务种类(1-7) : [ ]\b\b");
scanf("%d",&n);
if(n<1||n>7)
{w1=1;getchar();}
else w1=0;
}while(w1==1);
switch(n)
{
case 1: enter(); break;
case 2: add(); break;
case 3: modify(); break;
case 4: deleter(); break;
case 5: browse(); break;
case 6: search(); break;
case 7: exit(0);
}
}
void enter()
{ int i,n;
printf("How many people(0-%d)?:",N-1);
scanf("%d",&n);
printf("请输入数据:\n");
for(i=0;i<n;i++)
{printf("\n输入第 %d个记录.\n",i+1);
input(i);
}
if(i!=0) save(n);
printf_back();
}
void add()
{ int i,n,k,t;
n=load();
printf("How many people do you want to add(0-%d)?:",N-n-1);
scanf("%d",&t); k=n+t;
for(i=n;i<k;i++)
{ printf("\n输入第 %d个记录.\n",i-n+1); input(i);}
save(k); printf_back();
}
void modify()
{ struct people s; int i,n,k,w0=1,w1,w2=0;
n=load();
do
{ k=-1; printf_face(); printf_n(n);
do
{ printf("\n\nEnter name that you want to modify!\nName:");
scanf("%s",s.name);
for(i=0;i<n;i++)
if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];}
if(k==-1) printf("\n\n没有记录请重新输入!");
}while(k==-1);
printf_face(); printf_one(k);
w1=modify_data(k,n);
if(w1==1) {printf("\n\t^_^.Successful ^_^.\n\n是否继续?\n\n\t1).是 2).保存返回\t[ ]\b\b");
scanf("%d",&w0); w2=1;}
else
{w0=0; if(w2==0) peop[k]=s;}
if((w0!=1)&&(w2==1)) save(n);
}while(w0==1); menu();
}
void browse()
{ int n;
n=load();
printf_face(); printf_n(n);
printf("\t共有 %d 记录.\n",n);
printf("\nPress any key to back...");
getchar();
menu();
}
void search()
{ int w0,k,i,n,w1,w2; struct people s; n=load();
do
{printf("请选择查找类别: 1).姓名 2).电话号码 [ ]\b\b");
scanf("%d",&w1); if(w1<1||w1>2) {printf("输入错误!请重新输入!\n"); w2=1;}
}while(w2==1);
if(w1==1)
{do
{ k=-1;
do
{ printf("\n\nEnter name that tou want to search!\nName:");
scanf("%s",s.name);
for(i=0;i<n;i++)
if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];}
if(k==-1) printf("\n\n没有记录请重新输入!");
}while(k==-1);
printf_face(); printf_one(k);
printf("\nWhat do you want to do?\n\t1).继续 2).返回菜单 [ ]\b\b");
scanf("%d",&w0);
}while(w0==1);
menu();
}
else
{ do
{ k=-1;
do
{ printf("\n\nEnter number that tou want to search!\nNum:");
scanf("%s",s.num);
for(i=0;i<n;i++)
if(strcmp(s.num,peop[i].num)==0) {k=i; s=peop[i];}
if(k==-1) printf("\n\n没有记录请重新输入!");
}while(k==-1);
printf_face(); printf_one(k);
printf("\nWhat do you want to do?\n\t1).继续 2).返回菜单 [ ]\b\b");
scanf("%d",&w0);
}while(w0==1);
menu();
}
}
void deleter()
{struct people s; int i,n,k,w0,w1;
n=load();
do
{ k=-1; printf_face(); printf_n(n);
do
{ printf("\n\nEnter name that you want to delete!\nName:");
scanf("%s",s.name);
for(i=0;i<n;i++)
if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];}
if(k==-1) printf("\n\n没有记录请重新输入!");
}while(k==-1);
printf_face(); printf_one(k);
printf("\n确定?\n\t1).是 2).返回 [ ]\b\b");
scanf("%d",&w0);
if(w0==1) {peop[k].name[0]='\0'; save(n);} else break;
printf("\n\t^_^.Successful^_^.\n");
printf("What do you want to do?\n\t1).继续 2).返回 [ ]\b\b");
scanf("%d",&w1);
}while(w1==1);
menu();
}
‘伍’ c语言如何实现模糊查找
1、首先,打开网页-【C语言在线编程工具】。
‘陆’ 通讯录拼音搜索模糊匹配的算法问题
我用java写了个简单的,你可以多测试下:
publicstaticvoidmain(String[]args){
String[]name={"wang","hai","bao"};
String[]tests={"whb","WaHB","wangHB","HB","wh","whbo","whba"};
for(Stringstring:tests){
System.out.println(string+":"+match(name,string));
}
}
publicstaticbooleanmatch(String[]source,Stringinput){
if(source==null||source.length==0||input==null||input.length()==0){
returnfalse;
}
Stringtemp;
//统一转小写
input=input.toLowerCase();
for(inti=0;i<source.length;i++){
temp=source[i].toLowerCase();
if(temp==null||temp.length()==0){
returnfalse;
}
//最后一步特殊处理
if(i==source.length-1){
if(temp.startsWith(input)){
returntrue;
}
}
//输入的字符完全匹配到
if(input.startsWith(temp)){
//匹配到后生成新的字符串
input=input.substring(0,input.indexOf(temp));
//System.out.println("temp:"+temp+" 匹配到后input:"+input);
}
//首字母匹配到
elseif(temp.startsWith(input.substring(0,1))){
input=input.substring(1);
//System.out.println("temp:"+temp+" 匹配到后input:"+input);
}else{
returnfalse;
}
//表示匹配结束
if(input.length()==0){
returntrue;
}
}
returnfalse;
}
‘柒’ 如何用C语言编写通讯录…
;
#include <string>
#include "address.h"
#include "addressList.h"
#include "addressBook.h"
using namespace std;
int main()
{
new AddressBook; //开启通信录
return 0;
}
ostream& operator<<(ostream& os, const RecordList& c_rl)
{
RecordList::const_iterator it;
RecordList::const_iterator it_end =c_rl.end();
for (it=c_rl.begin();it!=it_end; it++)
{
os << (*it)->name << '\n' << (*it)->tel << '\n';
}
return os;
}
istream& operator>> (istream& is, RecordList& rl)
{
Record* rec;
string name;
while (true)
{
//注意这里使用的是全局的getline()函数,而不是istream的成员函
//数.全局的getling()函数将从istream中取出最后一个分隔符,
//而istream的成员函数getline则不会
getline(is,name);
if (name =="")
break;
rec = new Record;
rec->name=name;
getline(is,rec->tel );
rl.push_back(rec);
}
return is;
}
#include<stdlib.h>
#include<fstream>
#include "addressBook.h"
using namespace std;
AddressBook::AddressBook()
{
isModified = false;
start();
}
AddressBook::~AddressBook()
{
}
//功能:显示欢迎画面,并开始进行用户交互处理
void AddressBook::start()
{
cout<<"\n"
<<"\t******************************\n"
<<"\t* 这是一个 *\n"
<<"\t* 简单的通信录程序 *\n"
<<"\t* 可以对通信录进行简单管理 *\n"
<<"\t* 欢迎使用通信录 *\n"
<<"\t******************************\n"
<<"\n";
handleMenu();
}
//功能:显示通信录菜单,返回用户选择的选项
//返回:用户选择的选项,是1-9之间的一个字符
char AddressBook::menuSelect()
{
cout<<"\n"
<<"1.显示记录\n"
<<"2.查询记录\n"
<<"3.增加记录\n"
<<"4.删除记录\n"
<<"5.保存记录\n"
<<"6.读取记录\n"
<<"7.新建记录\n"
<<"8.结束运行\n"
<<"\n左边数字对应功能选择,请选1-8:";
char choice[2];
while(true)
{
cin.getline(choice,2);
if(choice[0]<'1' || choice[0]>'8')
cout<<"\n输入错误,重选1-8:";
else
break;
}
return choice[0];
}
//功能:根据用户选择的项目调用相应的处理函数
void AddressBook::handleMenu()
{
while(true)
{
switch(menuSelect())
{
case '1':
displayRecords();
break;
case '2':
queryRecord();
break;
.......
//功能:打印用于显示记录信息时的表头
void AddressBook::dispTable()
{
}
//功能:显示通信录中的所有记录
void AddressBook::displayRecords()
{
}
//功能:首先检查通信录是否已保存,然后清空当前通信录中所有记录
//注意:该函数覆盖了基类中的函数
void AddressBook::clear()
{
}
//功能:查询指定记录
void AddressBook::queryRecord()
{
//功能:向当前通信录追加新的记录
//注意:该函数重载了基类中的函数
void AddressBook::addRecord()
{
}
/*
//说明:如果使用string 类,效果更好。下面是实现本功能的程序代码:
while(true)
{
//输入新记录
string name;
cout<<"姓名:";
getline(cin,name);
//如果输入的姓名为“0”,则结束添加记录的操作
if(name=="0")
break;
Record* rec=new Record;
rec->name=name;
cout<<"电话:";
getline(cin,rec->tel);
//将新记录加入链表
AddressList::addRecord(rec);
}
//同理,下面的成员函数removeRecord()中的判断,可以使用如下替代方法:
string str;
getline(cin,str);
while(true)
{
if(str[0]!='1' && str[0]!='2')
{
cout<<"输入错误,重选1-2:";
getline(cin,str);
}
else
break;
}
*/
//功能:从当前通信录移除指定的记录
//注意:该函数重载了基类中的函数
void AddressBook::removeRecord()
{
if(empty())
{
cout<<"通信录已空,退出删除操作!"<<endl;
return;
}
//选择获取需要删除的记录的方式
cout<<"可以通过姓名或电话删除记录\n"
<<"1.通过姓名\n"
<<"2.通过电话\n";
char choice[2];
cin.getline(choice,2);
while(true)
{
if(choice[0]!='1' && choice[0]!='2')
{
cout<<"输入错误,重选1-2:";
cin.getline(choice,2);
}
else
break;
}
int type=static_cast<int>(choice[0])-48;
//输入需要匹配的字符串
if(type==1)
cout<<"请输入姓名:"<<flush;
else
cout<<"请输入电话:"<<flush;
char pattern[20];
cin.getline(pattern,20);
int deletedCount=0;
//找到匹配的记录
Iterator it=findRecord(pattern,type,first());
Iterator it_end=pastEnd();
while(it!=it_end)
{
cout<<"找到一条匹配的记录:\n";
dispTable();
cout<<(*it)->name<<"\t\t"<<(*it)->tel<<"\n";
cout<<"确定要删除这条记录吗?[Y/N]";
cin.getline(choice,2);
//删除这条记录
if(choice[0]!='n' && choice[0]!='N')
{
it=AddressList::removeRecord(it);
deletedCount++;
}
//取下一条匹配的记录
if(it!=it_end)
it=findRecord(pattern,type,++it);
}
cout<<"一共删除了"<<deletedCount<<"条记录\n"
<<"现在还有"<<size()<<"条记录"<<endl;
if(deletedCount!=0)
isModified=false;
}
//功能:将通信录保存至指定文件
//注意:该函数重载了基类中的函数
void AddressBook::saveRecords()
{
if(empty())
{
cout<<"没有记录可存!"<<endl;
return;
}
//因为下面的程序中使用string类的成员函数,所以需要进行一次转换
string fname;
char name[16];
cout<<"请输入要存在的文件名(直接回车选择文件sname):";
cin.getline(name,16);
fname=name;
if(fname.empty())
fname="sname";
ofstream of(fname.c_str(),ios_base::out);
if(!of)
{
cout<<"不能存入文件!"<<endl;
return;
}
AddressList::saveRecords(of);
of.close();
cout<<size()<<"条记录已经存入文件,请继续操作。"<<endl;
isModified=false;
}
//功能:从指定文件读取记录追加到当前通信录末尾
//注意:该函数重载了基类中的函数
void AddressBook::loadRecords()
{
}
void AddressBook::quit()
{
}
#ifndef H_ADDRESSBOOK_H_NNN
#define H_ADDRESSBOOK_H_NNN
#include "addressList.h"
//处理通信录操作的面向用户使用的类,包含所有功能的用户界面及用户交互的实现
class AddressBook :public AddressList
{
protected:
bool isModified; //通信录是否已被修改还未保存
public:
AddressBook();
virtual ~AddressBook();
//开始通信录的用户界面操作
virtual void start();
//菜单处理函数
virtual void handleMenu();
//显示记录
virtual void displayRecords();
//查询记录
virtual void queryRecord();
//增加记录
virtual void addRecord();
//删除记录
virtual void removeRecord();
//保存记录
virtual void saveRecords();
//读取记录
virtual void loadRecords();
//结束程序
virtual void quit();
//清空当前通信录
virtual void clear();
protected:
//菜单选择函数
char menuSelect();
//显示表头
void dispTable();
};
#endif //H_ADDRESSBOOK_HZ-NNN
#include "addressList.h"
AddressList::~AddressList()
{
recList.clear();
}
//功能:向通信录中添加新的记录
//参数:rec,指向新记录的指针
void AddressList::addRecord (Record* rec)
{
if (rec !=NULL)
{
recList.push_back(rec);
}
}
//功能:从通讯录中删除一个记录
//参数:it,指向欲删除记录的迭代器
//注意:it,应是可提领的迭代器,可以通过findRecord()获得
AddressList::Iterator AddressList::removeRecord(AddressList::Iterator it)
{
return recList.erase(it);
}
//功能:从通信录中寻找一个记录
//参数:pattern,欲寻找的记录的指定域与pattern相等
// type,为1表示欲寻找记录的名称(name)与pattern相等;
// 为2表示欲寻找记录的电弧(tel)与(pattern)相等。
// from,从from开始寻找匹配的记录。
//返回:若找到了则返回的迭代器指向第一个匹配记录的迭代器,
// 若找不到则返回的迭代器等于pastEnd()的返回值。
//注意:from应是可提领的迭代器。
// 第一次调用可以用first(),之后使用上一次findRecord()的返回值增1,
// 直到返回pastEnd(),便可以获得所有匹配的记录。
AddressList::Iterator AddressList::findRecord(string pattern,int type,AddressList::Iterator from)
{
Iterator it;
Iterator it_end=recList.end();
for (it=from; it!=it_end; it++)
{
if ((type==1 && (*it)->name==pattern)||(type==2 && (*it)->tel==pattern))
break;
}
return it;
}
//功能:将通信录保存到输出流中
//参数:os.指定的输出流
void AddressList::saveRecords(ostream &os)
{
os << recList;
}
//功能:从输入流中读入数据并追加到当前通信录的末尾
//参数:is,指定的输入流
//返回:读入的记录数
int AddressList::loadRecords(istream &is)
{
int ori =size();
is >> recList;
return size()-ori;
}
#ifndef H_ADDRESSLIST_H_AAA
#define H_ADDRESSLIST_H_AAA
#include <iostream>
#include <string>
#include "address.h"
using namespace std;
//处理通信录操作的底层类,包括增加记录、删
//除记录、查询记录以及保存和读取记录的函数,
//该类不涉及任何关于用户界面的操作
class AddressList
{
protected:
RecordList recList;// 使用对象成员作为数据成员
public:
typedef RecordList::iterator Iterator;
//向通信录中添加新的记录
virtual void addRecord(Record* rec);
//从通信录中删除一个记录
virtual Iterator removeRecord(Iterator it);
//从通讯录中寻找一个记录
virtual Iterator findRecord(string pattern,int type,Iterator from);
//将通信录保存到输出流中
virtual void saveRecords(ostream& os);
//从输入流中读入数据并追加到当前通信录的末尾
virtual int loadRecords(istream& is);
virtual ~AddressList();
//获得通信录中存储的记录数
const int size() const
//通信录是否为空
const bool empty() const
//清除通信录
virtual void clear()
//获得通信录的第一条记录
Iterator first()
//获得通信录超过最后一个记录之后的迭代器
Iterator pastEnd()
};
#endif //H_ADDRESSLIST_H_AAA
‘捌’ 求C语言编写的模糊查找代码写法
说一下思路
如果程序中客户信息使用结构体,并用链表形成,可以用链表遍历方式进行逐个查找
while(p!=NULL)
{
if(StrIndex(p->data,inputstring)>0)//如果符合串信息
insertLinkList(p);//插入新链表
p=p->next;//指向后续
}
上面StrIndex为
//串的匹配查询
int
StrIndex(SqString
s,SqString
t)//s为主串,t为模式串
{
int
i=0,j=0;
while(i<s.len&&j<t.len)//是否到末尾
{
if(s.data[i]==t.data[j])//主串与模式串逐一匹配
{
i++;
j++;
}
else
//否则,回溯重新开始下一次匹配
{
i=i-j+1;
//主串从下一个位置开始
j=0;
//模式串从头开始
}
}
if(j>=t.len)
//如果匹配成功
return
(i-t.len);
//返回主串第一个下标
else
return
-1;
//匹配失败,返回-1
}
或者用c自带的strstr(cs,ct)函数查询
如果按姓名(编号)查找成功,插人新建立链表head.
在head中继续查找其它成员。
使用函数封装就行
‘玖’ 如何用c语言编写可以对通讯录进行 类似于筛选的综合查询 的程序
要先根据筛选的选项(职业,地区,和本人关系,等 ), 定义通信录的结构体。
typedefine struct
{
// 用于筛选的成员
PROFESSION pro;
REGION rg;
RELATION;
.......
// 基本数据的成员
CString strName;
CString strMobileNumber;
CString strUnit;
CString strAddress;
........
} CONTACTS;
用于筛选的成员部分要求输入,部分可以从基本数据中提取(如地区可以从手机号码中提取)。
然后和sql数据库连接,定义和结构体CONTACTS对应的数据库记录格式,利用sql的数据库服务(插入,删除,更新,select等)。