用結構體數組編寫電話通訊錄,必須得知道結構體的形式,那先把結構體定義回顧一下:
一般形式爲:(1)struct 結構體名稱
{成員表列} 數組名 [數組長度]
如:struct Person leader[3]
(2)對結構體數組初始化的形式是在定義定義數組的後面:={初值列表};
如struct Person leader [3]={"li",0,"zhang",0,"sun",0};
結構體指針:
比如:struct Student *pt;//pt 可以指向struct Student 類型的變量或數組元素
在結構體中,可以用typedef聲明新類型名,如:
typedef struct per{
int a:
char b;
}PER;
此時PER就是per的新名稱
通訊錄必須的有聯繫人的信息:姓名,年齡,性別, 電話,地址
然後分別用添加函數,刪除函數,查找函數,修改函數,顯示函數,清空函數來實現通訊錄
void add(Pcon pcon);//添加函數
void del(Pcon pcon);//刪除函數
void search(Pcon pcon);//查找函數
void modify(Pcon pcon);//修改函數
void show(Pcon pcon);//顯示函數
void clear(Pcon pcon);//清空函數
最後用contact.h contact.c 分別編寫存儲函數
contact.h
<span style="font-size:18px;">#ifndef _CONTACT_H_//宏定義通訊錄
#define _CONTACT_H_ //宏定義通訊錄
#define NAME_LEN 30//全局變量
#define SEX_LEN 5//全局變量
#define TELP_LEN 12//全局變量
#define GRO_LEN 15//全局變量
#define MAX_PER 1000//全局變量
typedef struct per{
char name[NAME_LEN];
char sex[SEX_LEN];
int age;
char telp[TELP_LEN];
char gro[GRO_LEN];
}PER,*PPER;
typedef struct Contact{
PER dhb[MAX_PER];
int count;
}PCON,*Pcon;
void add(Pcon pcon);//添加函數
void del(Pcon pcon);//刪除函數
void search(Pcon pcon);//查找函數
void modify(Pcon pcon);//修改函數
void show(Pcon pcon);//顯示函數
void clear(Pcon pcon);//清空函數
#endif</span>
contact.c
<span style="font-size:18px;">#include <stdio.h>
#include "contact.h"
#include <string.h>
int find(char *p,Pcon pcon)//在這封裝一個find函數,在以後的函數裏直接調用
{
int i=0;
for(i=0;i<pcon->count;i++)
{
if(strcmp(p,pcon->dhb[i].name)==0)//strcmp爲字符串比較函數
{
return i;
}
}
return -1;
}
void add(Pcon pcon)
{
if(pcon->count<MAX_PER)
{
printf("請輸入聯繫人名字:");
scanf("%s",(pcon->dhb[pcon->count]).name);//結構體中變量間接訪問成員
printf("請輸入年齡:");
scanf("%d",&(pcon->dhb[pcon->count].age));
printf("請輸入性別:");
scanf("%s",pcon->dhb[pcon->count].sex);
printf("請輸入電話:");
scanf("%s",pcon->dhb[pcon->count].telp);
printf("請輸入地址:");
scanf("%s",pcon->dhb[pcon->count].gro);
pcon->count++;
printf("ok!添加成功!\n");
}
else
{
printf("電話本已滿!退出\n");
return ;
}
}
void del(Pcon pcon)
{
char name[NAME_LEN];
int k=0;
int ret=0;
printf("請輸入你要刪除的人的名字:");
scanf("%s",name);
ret=find(name,pcon);//調用find函數
if(ret==-1)
{
printf("no exit\n");
}
else
{
for(k=ret;k<pcon->count-1;k++)
{
pcon->dhb[k-1]=pcon->dhb[k];
}
}
pcon->count --;//刪除一個成員後,計數器自減1
printf("刪除成功");
}
void search(Pcon pcon)
{
char name[NAME_LEN];
int ret = 0;
if(ret == -1)
{
printf("no exit\n");
}
else
{
printf("請輸入要查找的聯繫人的名字:");
scanf("%s",name);
ret = find(name,pcon);
printf("%12s",(pcon->dhb[ret]).name);
printf("%12d",(pcon->dhb[ret]).age);
printf("%12s",pcon->dhb[ret].sex);
printf("%12s",pcon->dhb[ret].telp);
printf("%12s\n",pcon->dhb[ret].gro);
}
}
void modify(Pcon pcon)
{
char name[NAME_LEN];
int ret=0;
printf("請輸入你要修改人的名字:");
scanf("%s",name);
ret=find(name,pcon);
if(ret=-1)
{
printf("no exit\n");
}
else
{
printf("請輸入修改的聯繫人的姓名:\n");
scanf("%s",pcon->dhb[ret].name);
printf("請輸入修改的聯繫人的性別:\n");
scanf("%s",pcon->dhb[ret].sex);
printf("請輸入修改的聯繫人的年齡:\n");
scanf("%d",&pcon->dhb[ret].age);
printf("請輸入修改的聯繫人的電話:\n");
scanf("%s",pcon->dhb[ret].telp);
printf("請輸入修改的聯繫人的住址:\n");
scanf("%s",pcon->dhb[ret].gro);
printf("修改成功\n");
}
}
void show(Pcon pcon)
{
int j;
for(j=0;j<pcon->count;j++)
{
printf("%s\n",pcon->dhb[j].name);
printf("%s\n",pcon->dhb[j].sex);
printf("%d\n",pcon->dhb[j].age);
printf("%s\n",pcon->dhb[j].telp);
printf("%s\n",pcon->dhb[j].gro);
}
}
void clear(Pcon pcon)
{
pcon->count=0;//只要設定的電話本里的計數器count歸零就達到了清空的作用
}
void menu()//菜單選擇函數
{
printf("*****************************\n");
printf("*** 1>add ***\n");
printf("*** 2>del ***\n");
printf("*** 3>search ***\n");
printf("*** 4>modify ***\n");
printf("*** 5>show ***\n");
printf("*** 6>clear ***\n");
printf("*****************************\n");
}
int main()//主函數中定義選擇語句
{
PCON con;//此時PCON爲類型
int input = 1;
con.count = 0;//對count初始化爲0,說明此時電話本爲空
while(input)
{
menu();
printf("請輸入你的選擇>:");
scanf("%d",&input);
switch(input)
{
case 1:
add(&con);
break;
case 2:
del(&con);
break;
case 3:
search(&con);
break;
case 4:
modify(&con);
break;
case 5:
show(&con);
break;
case 6:
clear(&con);
break;
default:
break;
}
}
return 0;
}
</span>
運行結果:
在我們學了文件的讀寫後,那自然可以給這個電話本添加一個新的功能:保存
在此,我們會用到fread,fwrite函數
它們用來讀寫一個數據塊。
1一般調用的方式:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
2 說明:
(1buffer:是一個指針,對fread來說,它是讀入數據的存放地址。對fwrite來說,是要輸出數據的地址。
(2)size:要讀寫的字節數;
(3)count:要進行讀寫多少個size字節的數據項;
(4)fp:文件型指針。
注意:1 完成次寫操(fwrite())作後必須關閉流(fclose());
2 完成一次讀操作(fread())後,如果沒有關閉流(fclose()),則指針(FILE * fp)自動向後移動前一次讀寫的長度,不關閉流繼續下一次讀操作則接着上次的輸出繼續輸出;
下面是部分代碼:
<span style="font-size:18px;">void init(Pcon pcon)
{
int i;
FILE *fp=fopen("contact.txt","w");
if(fp==NULL)
{
perror("contact.txt:");
exit(EXIT_FAILURE);
}
while(fread(&(pcon->dhb[i]),sizeof(PER),1,fp)==1)
{
i++;
}
pcon->count=i;
fclose(fp);
}
void save(Pcon pcon)
{
int j;
FILE *fpwrite;
fpwrite=fopen("contact.txt","w");
if (fpwrite==NULL)
{
perror("contact.txt:");
exit(EXIT_FAILURE);
}
for(j= 0;j<pcon->count;j++)
{
fwrite(&(pcon->dhb[j]),sizeof(PER),1,fpwrite);
}
fclose(fpwrite);
}</span>
只要在頭文件里加上這兩個函數的一些聲明就可執行