目錄
通訊錄大家都知道吧,簡單的說就是記錄一些人的姓名、性別、年齡、地址等信息。
今天我們來用C語言來簡單的實現一下通訊錄,在這期間運用了指針、函數、等動態開辟空間的庫函數等等知識。
1、通訊錄的目錄
我們要寫一個函數來打印一下通訊錄的目錄,方便用戶實現對應功能!
代碼如下:
void menu()
{
printf("**********************************************\n");
printf("******* 1.add 2.del *******\n");
printf("******* 3.find 4.modify *******\n");
printf("******* 5.print 0.exit *******\n");
printf("**********************************************\n");
}
只要在進入通訊錄的程序前將此函數進行調用,就可以實現此代碼。
2、通訊錄的基本外部框架
通過我們的目錄可以看出,用戶可以選擇1 2 3 4 等等來實現對應的功能,所以讓我們不難想到用來實現此功能。
代碼如下:
switch (input)
{
case 1:
break;
case 2:
break;
case 3 :
break;
case 4:
break;
case 5:
break;
case 0:
break;
default :
printf("輸入錯誤,請重新輸入!\n");
break;
}
但是這里有一點不合理,當我們實現了某個功能之后,這個通訊錄就會退出,那么就不能繼續實現其他功能,因此我們需要一個循環來實現可以多次進入通訊錄,而且當輸入0時不進入循環!
代碼如下:
do{
switch (input)
{
case 1:
break;
case 2:
break;
case 3 :
break;
case 4:
break;
case 5:
break;
case 0:
break;
default :
printf("輸入錯誤,請重新輸入!\n");
break;
}
}while(input);
3、定義聯系人的信息
我們用結構體來定義一下聯系人的信息,代碼如下:
typedef struct student
{
char name[10];
int age;
char sex[5];
char num[11];
char adress[20];
}PeoInfo;
并且用 來將 重新命名為 。
4、定義數組存放聯系人并定義變量來存放當前容量等
代碼如下:
typedef struct Contact
{
PeoInfo* data;
int sz;
int capacity;
}Contact;
data為 * 類型的指針變量,里面的每個元素存放的各個聯系人的各種信息,sz為當前的有效個數,為容量。
5、初始化4定義出來的各種變量
void InitContact(Contact* pc)
{
pc->data = (PeoInfo*)malloc(3 * sizeof(PeoInfo));
pc->capacity = 3;
pc->sz = 0;
}
6、增加聯系人
因為我們要實現的是一個可以動態增長的通訊錄,因此我們起初不用開辟很大的空間,當我們需要空間的時候可以臨時增加!并且當我們的容量等于當前有效的聯系人個數的時候我們就需要增加聯系人!
代碼如下:
void AddContact(Contact* pc)
{
//增容
if (pc->sz == pc->capacity)
{
PeoInfo* tmp = realloc(pc->data, (pc->capacity * 2) * sizeof(PeoInfo));
if (tmp != NULL)
{
pc ->data= tmp;
pc->capacity *= 2;
printf("增容成功!\n");
}
}
printf("請輸入名字:>\n");
scanf("%s", pc->data[pc->sz].name);
printf("請輸入年齡:>\n");
scanf("%d", &(pc->data[pc->sz]).age);//由于年齡不是數組 所以加上&符號
printf("請輸入性別:>\n");
scanf("%s", pc->data[pc->sz].sex);
printf("請輸入電話號:>\n");
scanf("%s", pc->data[pc->sz].num);
printf("請輸入地址:>\n");
scanf("%s", pc->data[pc->sz].adress);
pc->sz++;
}
7、刪除聯系人
此函數實現刪除聯系人,當我們要刪除一個聯系人的時候c語言簡單通訊錄,首先要在通訊錄里面查找需要刪除的聯系人,然后再將其刪除!
void DelContact(Contact* pc)
{
if (pc->sz == 0)
{
printf("通訊錄為空\n");
return;
}
else
{
printf("請輸入你刪除聯系人的名字:>\n");
char NAME[100] = { 0 };
scanf("%s", NAME);
int pos = FindByContact(pc, NAME);
if (pos == -1)
{
printf("沒有找到該聯系人!\n");
}
else
{
for (int i = pos; i < pc->sz; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功!\n");
}
}
}
不難發現里面有一個查找函數,并且可以將查找到的聯系人的下標進行返回!
查找函數代碼如下:
int FindByContact(Contact* pc, char* NAME)
{
for (int i = 0; i < pc->sz; i++)
{
if (strcmp(NAME, pc->data[i].name) == 0)
{
return i;
}
}
return -1;
}
8、查找聯系人
此查找非彼查找,此函數需要將查找到的聯系人的信息進行打印一下!
代碼如下:
void FindContact(Contact* pc)
{
printf("請輸入你刪除聯系人的名字:>\n");
char NAME[100] = { 0 };
scanf("%s", NAME);
int pos = FindByContact(pc, NAME);
if (pos == -1)
{
printf("查無此人!\n");
}
else
{
PrintContact(pc);
}
}
9、修改聯系人
同上邊的刪除聯系人一樣,當我們需要刪除某個聯系人的時候我們需要首先查找到該聯系人!
代碼如下:
void ModifyContact(Contact* pc)
{
printf("請輸入你要修改聯系人的名字:>\n");
char NAME[100] = { 0 };
scanf("%s", NAME);
int pos = FindByContact(pc, NAME);
if (pos == -1)
{
printf("通訊錄中沒有該聯系人!");
}
else
{
printf("請輸入新的名字:>\n");
scanf("%s", pc->data[pos].name);
printf("請輸入新的年齡:>\n");
scanf("%d", &(pc->data[pos]).age);//由于年齡不是數組 所以加上&符號
printf("請輸入新的性別:>\n");
scanf("%s", pc->data[pos].sex);
printf("請輸入新的電話號:>\n");
scanf("%s", pc->data[pos].num);
printf("請輸入新的地址:>\n");
scanf("%s", pc->data[pos].adress);
printf("修改成功!");
}
}
10、打印聯系人
此函數實現的功能是將我們通訊錄里面所存儲的聯系人的信息給逐個打印出來!
代碼如下:
void PrintContact(Contact* pc)
{
int i = 0;
printf("s\t%5s\ts\ts\ts\n\n",
"name", "age", "sex", "telephone", "adress");
for (i = 0; i < pc->sz; i++)
{
printf("s\t%5d\ts\ts\ts\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].num,
pc->data[i].adress);
}
}
11、銷毀通訊錄并退出
因為我們是動態實現的通訊錄,所以當我們用完之后要將其正確的銷毀。
代碼如下:
void DestroyContact(Contact* pc)
{
pc->data = NULL;
free(pc->data);
pc->sz = 0;
pc->capacity = 3;
}
12、完整代碼
Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void InitContact(Contact* pc)
{
pc->data = (PeoInfo*)malloc(3 * sizeof(PeoInfo));
pc->capacity = 3;
pc->sz = 0;
}
void AddContact(Contact* pc)
{
//增容
if (pc->sz == pc->capacity)
{
PeoInfo* tmp = realloc(pc->data, (pc->capacity * 2) * sizeof(PeoInfo));
if (tmp != NULL)
{
pc ->data= tmp;
pc->capacity *= 2;
printf("增容成功!\n");
}
}
printf("請輸入名字:>\n");
scanf("%s", pc->data[pc->sz].name);
printf("請輸入年齡:>\n");
scanf("%d", &(pc->data[pc->sz]).age);//由于年齡不是數組 所以加上&符號
printf("請輸入性別:>\n");
scanf("%s", pc->data[pc->sz].sex);
printf("請輸入電話號:>\n");
scanf("%s", pc->data[pc->sz].num);
printf("請輸入地址:>\n");
scanf("%s", pc->data[pc->sz].adress);
pc->sz++;
}
void DelContact(Contact* pc)
{
if (pc->sz == 0)
{
printf("通訊錄為空\n");
return;
}
else
{
printf("請輸入你刪除聯系人的名字:>\n");
char NAME[100] = { 0 };
scanf("%s", NAME);
int pos = FindByContact(pc, NAME);
if (pos == -1)
{
printf("沒有找到該聯系人!\n");
}
else
{
for (int i = pos; i < pc->sz; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功!\n");
}
}
}
int FindByContact(Contact* pc, char* NAME)
{
/*char NAME[] = { 0 };*/
//printf("請輸入你要查找聯系人的姓名:>\n");
/*scanf("%d", NAME);*/
for (int i = 0; i < pc->sz; i++)
{
if (strcmp(NAME, pc->data[i].name) == 0)
{
return i;
}
}
return -1;
}
void FindContact(Contact* pc)
{
printf("請輸入你刪除聯系人的名字:>\n");
char NAME[100] = { 0 };
scanf("%s", NAME);
int pos = FindByContact(pc, NAME);
if (pos == -1)
{
printf("查無此人!\n");
}
else
{
PrintContact(pc);
}
}
void ModifyContact(Contact* pc)
{
printf("請輸入你要修改聯系人的名字:>\n");
char NAME[100] = { 0 };
scanf("%s", NAME);
int pos = FindByContact(pc, NAME);
if (pos == -1)
{
printf("通訊錄中沒有該聯系人!");
}
else
{
printf("請輸入新的名字:>\n");
scanf("%s", pc->data[pos].name);
printf("請輸入新的年齡:>\n");
scanf("%d", &(pc->data[pos]).age);//由于年齡不是數組 所以加上&符號
printf("請輸入新的性別:>\n");
scanf("%s", pc->data[pos].sex);
printf("請輸入新的電話號:>\n");
scanf("%s", pc->data[pos].num);
printf("請輸入新的地址:>\n");
scanf("%s", pc->data[pos].adress);
printf("修改成功!");
}
}
void PrintContact(Contact* pc)
{
int i = 0;
printf("s\t%5s\ts\ts\ts\n\n",
"name", "age", "sex", "telephone", "adress");
for (i = 0; i < pc->sz; i++)
{
printf("s\t%5d\ts\ts\ts\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].num,
pc->data[i].adress);
}
}
void DestroyContact(Contact* pc)
{
pc->data = NULL;
free(pc->data);
pc->sz = 0;
pc->capacity = 3;
}
****************************************************************************************
Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
typedef struct student
{
char name[10];
int age;
char sex[5];
char num[11];
char adress[20];
}PeoInfo;
//動態通訊錄
typedef struct Contact
{
PeoInfo* data;
int sz;
int capacity;
}Contact;
//增加聯系人
void AddContact(Contact* pc);
//刪除聯系人
void DelContact(Contact *pc);
//查找聯系人
void FindContact(Contact* pc);
int FindByContact(Contact* pc, char* NAME);
//修改聯系人
void ModifyContact(Contact *pc);
//打印聯系人
void PrintContact(Contact* pc);
//銷毀通訊錄
void DestroyContact(Contact* pc);
***********************************************************************************
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void menu()
{
printf("**********************************************\n");
printf("******* 1.add 2.del *******\n");
printf("******* 3.find 4.modify *******\n");
printf("******* 5.print 0.exit *******\n");
printf("**********************************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("請輸入你要選擇的選項:>\n");
scanf("%d", &input);
//初始化通訊錄
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3 :
FindContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
PrintContact(&con);
break;
case 0:
DestroyContact(&con);
break;
default :
printf("輸入錯誤,請重新輸入!\n");
break;
}
} while (input);
}
結束語
若有錯誤歡迎各位老鐵指出,也感謝您的觀看c語言簡單通訊錄,下期見哈!