『壹』 如何用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等)。