這是本學期末要求設計的通訊錄管理系統,完全自己構思和編碼,未參照任何網路上的其它程式。程式實現比較簡單,沒有應用鏈表。
/********************************************************************
* 通訊錄管理系統 *
* 作者:zzr *
* http://blog.csdn.net/ZhengZhiRen/ *
*該程式實現功能:1.介面 *
* 2.添加記錄(鍵盤輸入或從檔案匯入) *
* 3.尋找記錄 *
* 4.刪除記錄 *
* 5.使用檔案(db.dat)儲存資料 *
* *
*程式在WindowsXP.SP2 + VC6.0 下調試通過 *
*程式還存在多處Bug *
********************************************************************/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define back() show_menu()
struct record
{
char name[20]; /*姓名*/
char sex; /*性別*/
long birthday; /*生日*/
char email[20]; /*E-mail*/
char tel[15]; /*電話****注意:使用字元數組儲存****/
};
void table_head()
/*該函數繪製記錄表頭部*/
{
printf("==============================BEGIN==================================/n");
printf("%-20s %-4s %-8s %-20s %-15s/n","姓名","性別","生日","E-mail","電話");
}
void table_end()
/*該函數繪製記錄表尾部*/
{
printf("===============================END===================================/n");
}
int readtoarray(char filename[],struct record rec[])
/*該函數將filename中的記錄讀入數組,返回讀入的記錄數*/
{
struct record *p;
int count=0;
FILE *fp;
p=rec;
fp=fopen(filename,"r");
while(!feof(fp))
{
fscanf(fp,"%s%1s%ld%s%s",p->name,&p->sex,&p->birthday,p->email,p->tel);
p++;
count++;
}
fclose(fp);
return (count);
}
int add()
/*添加記錄,成功返回1*/
{
struct record new_record;
struct record *p;
char c;
FILE *fp;
p=&new_record;
printf("請輸入“姓名 性別(男m,女f) 生日 E-mail 電話”,用空格間隔:/n");
scanf("%s%1s%ld%s%s",p->name,&p->sex,&p->birthday,p->email,p->tel);/*注意p->sex的輸入*/
c=getchar();/*接收斷行符號符*/
/*將記錄添加到db.dat*/
fp=fopen("db.dat","a");
fprintf(fp,"%s %c %ld %s %s/n",p->name,p->sex,p->birthday,p->email,p->tel);
fclose(fp);
table_head();
printf("%-20s %-4c %-8ld %-20s %-15s/n",p->name,p->sex,p->birthday,p->email,p->tel);
table_end();
printf("記錄添加成功/n");
return (1);
}
int add_fromfile()
/*從檔案添加記錄,成功返回1*/
{
char filename[30];/*檔案名稱*/
struct record new_record[100];/*存放添加的記錄*/
struct record *p;
int i;
int n;
FILE *fp;
printf("請輸入檔案名稱:/n");
gets(filename);
/*從檔案讀入記錄*/
n=readtoarray(filename,new_record);
/*將記錄添加到db.dat*/
p=new_record;
fp=fopen("db.dat","a");
for(i=0;i<n;i++,p++)
fprintf(fp,"%s %c %ld %s %s/n",p->name,p->sex,p->birthday,p->email,p->tel);
fclose(fp);
/*顯示輸出*/
p=new_record;
table_head();
for(i=0;i<n;i++,p++)
printf("%-20s %-4c %-8ld %-20s %-15s/n",p->name,p->sex,p->birthday,p->email,p->tel);
table_end();
printf("%d條記錄已添加/n",n);
return (1);
}
void listall()
/*列出檔案db.dat中的所有記錄*/
{
struct record rec;
int count=0;
FILE *fp;
table_head();
fp=fopen("db.dat","r");
while(!feof(fp))
{
fscanf(fp,"%s%1s%ld%s%s/n",rec.name,&rec.sex,&rec.birthday,rec.email,rec.tel);
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec.name,rec.sex,rec.birthday,rec.email,rec.tel);
count++;
}
fclose(fp);
table_end();
printf("共%d條記錄/n",count);
}
void find_record(char s[20],char c)
/*該函數在db.dat中尋找匹配的記錄,參數s為尋找的內容,參數c為尋找方式*/
{
struct record rec[200];
int n;/*記錄數*/
int i;
int count=0;
/*將檔案db.dat中的記錄讀入數組*/
n=readtoarray("db.dat",rec);
/*尋找匹配的記錄並顯示*/
table_head();
switch(c)
{
case 'n':/*按姓名尋找*/
for(i=0;i<n;i++)
if(strcmp(rec[i].name,s)==0)
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 's':/*按性別尋找*/
for(i=0;i<n;i++)
if(rec[i].sex==s[0])
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 'b':/*按生日尋找*/
for(i=0;i<n;i++)
if(rec[i].birthday==atol(s))
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 'e':/*按E-mail尋找*/
for(i=0;i<n;i++)
if(strcmp(rec[i].email,s)==0)
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 't':/*按電話尋找*/
for(i=0;i<n;i++)
if(strcmp(rec[i].tel,s)==0)
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
}
table_end();
printf("共%d條匹配的記錄/n",count);
}
void show_menu()
/*該函數顯示第一級菜單*/
{
void menu_add();
void menu_find();
void menu_delete();
char c[2];
printf("請選擇:/n1 添加記錄/n2 尋找記錄/n3 刪除記錄/n4 列出所有記錄/n5 退出/n");
gets(c);
switch(c[0])
{
case '1':
menu_add();
break;
case '2':
menu_find();
break;
case '3':
menu_delete();
break;
case '4':
listall();
break;
case '5':
exit(0);/*退出程式*/
break;
}
back();/*返回主菜單*/
}
void menu_add()
/*該函數顯示“添加記錄”菜單*/
{
char c[2];
printf("請選擇:/n1 輸入/n2 從檔案添加/n3 返回/n");
gets(c);
switch(c[0])
{
case '1':
add();
break;
case '2':
add_fromfile();
break;
case '3':
break;
}
}
void menu_find()
/*該函數顯示“尋找記錄”菜單*/
{
char c[2];
char s[25];
printf("請選擇:/n1 按姓名尋找/n2 按性別尋找/n3 按生日尋找/n4 按E-mail尋找/n5 按電話尋找/n6 返回/n");
gets(c);
switch(c[0])
{
case '1':
printf("請輸入姓名:/n");
gets(s);
find_record(s,'n');
break;
case '2':
printf("請輸入性別:/n");
gets(s);
find_record(s,'s');
break;
case '3':
printf("請輸入生日:/n");
gets(s);
find_record(s,'b');
break;
case '4':
printf("請輸入E-mail:/n");
gets(s);
find_record(s,'e');
break;
case '5':
printf("請輸入電話:/n");
gets(s);
find_record(s,'t');
break;
case '6':
break;
}
}
void menu_delete()
/*該函數顯示“刪除記錄”菜單*/
{
struct record rec;
struct record records[200];
int i;
int n;
int flag=0;
FILE *fp;
printf("請輸入“姓名 性別(男m,女f) 生日 E-mail 電話”,用空格間隔:/n");
scanf("%s%1s%ld%s%s%*c",rec.name,&rec.sex,&rec.birthday,rec.email,rec.tel);
/*將記錄讀入數組*/
n=readtoarray("db.dat",records);
n--;/*注意減1,readtoarray將檔案末的'/n'讀入作為最後一條記錄,有待改進*/
/*刪除匹配的記錄*/
fp=fopen("db.dat","w");
for(i=0;i<n;i++)
{
if(strcmp(records[i].name,rec.name)==0 &&
records[i].sex==rec.sex &&
records[i].birthday==rec.birthday &&
strcmp(records[i].email,rec.email)==0 &&
strcmp(records[i].tel,rec.tel)==0
)
{
flag++;
continue;/*跳過匹配的記錄*/
}
fprintf(fp,"%s %c %ld %s %s/n",
records[i].name,records[i].sex,records[i].birthday,records[i].email,records[i].tel);
}
fclose(fp);
printf("%d條記錄已刪除/n",flag);
}
void main()
{
FILE *fp;
/*如果沒有檔案db.dat,則建立*/
fp=fopen("db.dat","a");
fclose(fp);
/*顯示菜單*/
show_menu();
}