用結構體編寫電話通訊錄

用結構體數組編寫電話通訊錄,必須得知道結構體的形式,那先把結構體定義回顧一下:

一般形式爲:(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>

只要在頭文件里加上這兩個函數的一些聲明就可執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章