国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

通訊錄的實現(xiàn)(靜態(tài)版本,動態(tài)版本,文件版本)(后附完整源代碼)

這篇具有很好參考價值的文章主要介紹了通訊錄的實現(xiàn)(靜態(tài)版本,動態(tài)版本,文件版本)(后附完整源代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

一.靜態(tài)版本

1.所需要的功能

對于通訊錄來說,我們需要它實現(xiàn)以下幾個功能。

1.人的信息:姓名+年齡+性別+電話+地址。
2.可以存放100個人的信息。
功能:
1>增加聯(lián)系人。
2>刪除聯(lián)系人。
3>查找指定聯(lián)系人信息。
4>修改指定聯(lián)系人信息。
5>顯示所有聯(lián)系人信息。
6>按名字排序。

接下來分為三個模塊,test.c->用來測試通訊錄;contact.c->通訊錄主體部分;contact.h->用于函數(shù)的聲明。

2.大致菜單

#include"contact.h"


void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.刪除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      6.排序 ******\n");
	printf("*******0.退出             ******\n");
	printf("********************************\n");

}
int main()
{
	int input = 0;
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
		    break;	
		case 0:
			printf("退出通訊錄。\n");
			break;
		default:
			printf("輸入無效,請重新輸入。\n");
			break;
		}
	} while (input);
	return 0;
}

這一塊很簡單,就不再多說。菜單是屬于測試部分,所以我將它放入test.c文件里。

3.創(chuàng)建通訊錄

對于一個人,肯定有多方面的因數(shù),所以將其封裝在一個結構體內。這里使用到typedef,如果不太熟悉可以看看這篇博客typedef的使用

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

接下來,再封裝一個結構體里面存放100個人的信息和當前人的個數(shù)。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

接著在主函數(shù)里使用該結構體創(chuàng)建通訊錄。然后進行初始化。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

初始化函數(shù)在contact.h里聲明。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里實現(xiàn),需要使用到memset,如果不太明白可以看看這篇博客memset如何使用

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

4.增加聯(lián)系人

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.h里聲明。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里面實現(xiàn)。
小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

5.顯示聯(lián)系人

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.h里聲明。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里實現(xiàn)。這里使用到\t,向后隔開8個字節(jié),用于分隔。同時例如%-20s是右邊隔開20個字節(jié),也就是進行左對齊。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

6.查找聯(lián)系人

我們發(fā)現(xiàn)無論是查找,刪除還是修改都需要先找到這個人。所以我們干脆將尋找封裝成一個函數(shù)來使用。我們通過名字來查找(需要使用strcmp,如果不熟悉可以看看這篇博客strcmp的使用)

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

完成后正式進行查找。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

老規(guī)矩,現(xiàn)在contact.h里進行聲明。ps:前面的find不用聲明是因為find只在contact.c里使用。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里實現(xiàn)。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

7.刪除聯(lián)系人

這里采用一種最簡單的方法,就是從后往前依次覆蓋。首先找到該名字的位置,然后依次將后面的往前挪。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.h里聲明。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里實現(xiàn)。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

8.修改聯(lián)系人

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

老規(guī)矩在contact.h里進行聲明。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里實現(xiàn)。修改其實就是重新錄入,找到位置,重新寫一遍就好了。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

9.按名字排序

下面排序需要使用到qsort函數(shù)。如果不太熟悉可以看看這篇博客qsort函數(shù)

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

老規(guī)矩在contact.h里聲明。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里實現(xiàn)。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

好了,以上就是通訊錄靜態(tài)版本的實現(xiàn)功能啦,下面是源代碼。

10.源代碼

test.c

#include"contact.h"
void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.刪除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      6.排序 ******\n");
	printf("*******0.退出             ******\n");
	printf("********************************\n");

}
int main()
{
	int input = 0;
	//創(chuàng)建通訊錄
	Contact con;//該結構體包含100個人的信息和已填充人的個數(shù)
	//初始化通訊錄
	InitContact(&con);//結構體傳參
	do
	{
		menu();
		printf("請選擇:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			Dlete(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
			break;
		case 5:
			ShowContact(&con);
			break;
		case 6:
			Order(&con);
			break;
		case 0:
			printf("退出通訊錄。\n");
			break;
		default:
			printf("輸入無效,請重新輸入。\n");
			break;
		}
	} while (input);
	return 0;
}

contact.h

#include<stdio.h>
#include<string.h>
#include<assert.h>


//人的信息
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char tele[12];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[100];//存放人的信息
	int sz;//當前已經(jīng)放的信息個數(shù)
}Contact;//同理,這里也進行了重命名


//聲明初始化函數(shù)
void InitContact(Contact* pc);

//聲明增加聯(lián)系人函數(shù)
void AddContact(Contact*pc);

//聲明顯示聯(lián)系人函數(shù)
void ShowContact(const Contact*pc);

//聲明查找函數(shù)
void Search(const Contact*pc);//查找依然不會改變,所以加上const

//聲明刪除函數(shù)
void Dlete(Contact*pc);

//聲明修改函數(shù)
void Modify(Contact*pc);

//聲明排序函數(shù)
void Order(Contact*pc);

contact.c

#include"contact.h"



//初始化函數(shù)的實現(xiàn)
void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}


//增加聯(lián)系人
void AddContact(Contact* pc)
{
	assert(pc);//一個好的習慣判斷是否為空指針(當然不加也沒影響)
	if (pc->sz == 100)
	{
		printf("通訊錄已滿,無法添加。\n");
		return;
	}
	//開始添加信息
	printf("請輸入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;//別忘了添加完一個人后向后走一步

}


//顯示聯(lián)系人
void ShowContact(const Contact* pc)//因為顯示不會改變元素,所以最好加上const
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年齡", "性別", "地址", "電話");//提示
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
													pc->data[i].age,
													pc->data[i].sex,
													pc->data[i].addr,
													pc->data[i].tele);
	}
}


//找到特定聯(lián)系人的位置
int FindByName(const Contact* pc, char name[])//兩個參數(shù),一個是通訊錄里存的名字,一個是你要查找的名字
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到返回下標
		}
	}
	return -1;//沒找到,返回-1
}


//查找
void Search(const Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要查找的名字:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("查無此人。\n");
		return;
	}
	//找到了,打印信息
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
												pc->data[pos].age,
												pc->data[pos].sex,
												pc->data[pos].addr,
												pc->data[pos].tele);
}



//刪除
void Dlete(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要刪除的名字:");
	scanf("%s", name);
	int dle = FindByName(pc, name);//找到位置
	if (dle == -1)
	{
		printf("查無此人。\n");
		return;
	}
	for (int i = dle; i < pc->sz-1; i++)//從后往前覆蓋,同時-1避免越界
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;//刪除完成后別忘了個數(shù)-1
	printf("刪除成功\n");
}



//修改
void Modify(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要修改的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("查無此人\n");
		return;
	}
	printf("請輸入名字:");
	scanf("%s", pc->data[ret].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[ret].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[ret].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[ret].tele);

	printf("修改成功\n");
}

//排序
int cmp(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Order(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp);
	printf("排序成功\n");
}

二.動態(tài)版本

動態(tài)版本主要在靜態(tài)版本的基礎上加入擴容功能,如果通訊錄已存滿,那么會自動擴大通訊錄,下面設置初始容量為三個人,如果不滿足每次擴容兩個人。需要的前置知識是動態(tài)內存,如果不太了解,可以看看這篇博客動態(tài)內存

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

1.修改data數(shù)組

上面的靜態(tài)版本是直接開辟了一個100人的數(shù)組,很明顯已經(jīng)固定。所以應當將這100個人改為動態(tài)的。

靜態(tài)版本
小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

動態(tài)版本

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

2.修改初始化

在靜態(tài)版本的初始化里直接使用的memset指定具體的字節(jié)數(shù)來初始化。在動態(tài)版本里不知道具體的大小,很明顯不能這么暴力。下面使用calloc對data進行開辟空間的同時完成初始化。

靜態(tài)版本

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

動態(tài)版本

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

3.修改增加函數(shù)

在靜態(tài)版本中,如果一直增加聯(lián)系人到通訊錄滿后直接給提升:通訊錄已滿,不能再加入。在動態(tài)版本里需要修改,當放滿通訊錄后自動擴容。

靜態(tài)版本

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

動態(tài)版本

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

4.完善通訊錄

上面的修改大致功能沒有問題了,但還有個缺陷是在開辟空間時我們在堆區(qū)上開辟的,所以在程序結束時應當主動free,避免內存泄漏。

在test.c里

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法
在contact.h里

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

在contact.c里

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

演示

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

5.源代碼

test.c

#include"contact.h"
void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.刪除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      6.排序 ******\n");
	printf("*******0.退出             ******\n");
	printf("********************************\n");

}
int main()
{
	int input = 0;
	//創(chuàng)建通訊錄
	Contact con;//該結構體包含100個人的信息和已填充人的個數(shù)
	//初始化通訊錄
	InitContact(&con);//結構體傳參
	do
	{
		menu();
		printf("請選擇:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			Dlete(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
			break;
		case 5:
			ShowContact(&con);
			break;
		case 6:
			Order(&con);
			break;
		case 0:
			Destroy(&con);
			printf("退出通訊錄。\n");
			break;
		default:
			printf("輸入無效,請重新輸入。\n");
			break;
		}
	} while (input);
	return 0;
}

contact.h

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>



#define DEFAULT_SZ 3 //初始大小
#define INC_SZ 2 //每次擴容

//人的信息
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char tele[12];
}PeoInfo;


//動態(tài)版本
typedef struct Contact
{
	PeoInfo *data;//指向存放人信息的空間
	int sz;//當前已經(jīng)放的信息個數(shù)
	int capacity;//當前通訊錄的最大容量
}Contact;


//聲明初始化函數(shù)
void InitContact(Contact* pc);

//聲明銷毀函數(shù)
void Destroy(Contact* pc);

//聲明增加聯(lián)系人函數(shù)
void AddContact(Contact*pc);

//聲明顯示聯(lián)系人函數(shù)
void ShowContact(const Contact*pc);

//聲明查找函數(shù)
void Search(const Contact*pc);//查找依然不會改變,所以加上const

//聲明刪除函數(shù)
void Dlete(Contact*pc);

//聲明修改函數(shù)
void Modify(Contact*pc);

//聲明排序函數(shù)
void Order(Contact*pc);

contact.c

#include"contact.h"



//初始化函數(shù)的實現(xiàn),動態(tài)版本
void InitContact(Contact* pc)
{
	pc->sz = 0;
	PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));//開辟初始空間
	if (ptr == NULL)
	{
		printf("%s", strerror(errno));
		return;
	}//判斷是否空間開辟成功
	pc->data = ptr;
	pc->capacity = DEFAULT_SZ;//初始容量為3
}


//銷毀
void Destroy(Contact* pc)
{
	free(pc->data);//由于整個data都是在堆區(qū)上開辟的,所以直接free
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}



void check_capacity(Contact* pc)
{
	if (pc->sz == pc->capacity)//如果容量已滿
	{
		//增加容量
		PeoInfo* ptr =(PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));//調整空間大小
		if (ptr == NULL)
		{
			printf("%s", strerror(errno));
		}
		pc->data = ptr;//把新空間的起始位置傳給data
		pc->capacity += INC_SZ;//最大容量加INC_SZ
		printf("增容成功\n");
	}
}
//增加聯(lián)系人
void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);//檢查容量,判斷是否需要增容
	
	//開始添加信息
	printf("請輸入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;//別忘了添加完一個人后向后走一步

}



//顯示聯(lián)系人
void ShowContact(const Contact* pc)//因為顯示不會改變元素,所以最好加上const
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年齡", "性別", "地址", "電話");//提示
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
													pc->data[i].age,
													pc->data[i].sex,
													pc->data[i].addr,
													pc->data[i].tele);
	}
}


//找到特定聯(lián)系人的位置
int FindByName(const Contact* pc, char name[])//兩個參數(shù),一個是通訊錄里存的名字,一個是你要查找的名字
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到返回下標
		}
	}
	return -1;//沒找到,返回-1
}


//查找
void Search(const Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要查找的名字:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("查無此人。\n");
		return;
	}
	//找到了,打印信息
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
												pc->data[pos].age,
												pc->data[pos].sex,
												pc->data[pos].addr,
												pc->data[pos].tele);
}



//刪除
void Dlete(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要刪除的名字:");
	scanf("%s", name);
	int dle = FindByName(pc, name);//找到位置
	if (dle == -1)
	{
		printf("查無此人。\n");
		return;
	}
	for (int i = dle; i < pc->sz-1; i++)//從后往前覆蓋,同時-1避免越界
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;//刪除完成后別忘了個數(shù)-1
	printf("刪除成功\n");
}



//修改
void Modify(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要修改的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("查無此人\n");
		return;
	}
	printf("請輸入名字:");
	scanf("%s", pc->data[ret].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[ret].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[ret].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[ret].tele);

	printf("修改成功\n");
}



//排序
int cmp(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Order(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp);
	printf("排序成功\n");
}

三.文件版本

我們可以發(fā)現(xiàn)前面兩個版本在運行結束后通訊錄里的信息就自動刪除了,很明顯是不符合我們的預期的。這是因為上面的數(shù)據(jù)都儲存在內存中,而內存在一次程序運行結束后會重置,所以我們需要將其寫在硬盤上(文件里),才能保證信息的存儲。(需要的前置知識是文件操作,如果不太熟悉可以看看這篇博客文件操作)

1.退出前保存

test.c里
小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法
contact.h里

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法
contact.c里

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

注意文件可以建在任意位置,但如果不是在當前路徑下,在fopen時記得將該文件的絕對路徑寫上(也就是幾盤,第幾文件夾…)

2.進入后讀取

原來初始化通訊錄時是直接初始化為0,現(xiàn)在初始化時將文件里的信息加載到通訊錄里。

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法
小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法
小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法

3.源代碼

test.c

#include"contact.h"
void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.刪除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      6.排序 ******\n");
	printf("*******0.退出             ******\n");
	printf("********************************\n");

}
int main()
{
	int input = 0;
	//創(chuàng)建通訊錄
	Contact con;//該結構體包含100個人的信息和已填充人的個數(shù)
	//初始化通訊錄
	InitContact(&con);//結構體傳參
	do
	{
		menu();
		printf("請選擇:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			Dlete(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
			break;
		case 5:
			ShowContact(&con);
			break;
		case 6:
			Order(&con);
			break;
		case 0:
			SaveContact(&con);
			Destroy(&con);
			printf("退出通訊錄。\n");
			break;
		default:
			printf("輸入無效,請重新輸入。\n");
			break;
		}
	} while (input);
	return 0;
}

contact.h

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>



#define DEFAULT_SZ 3 //初始大小
#define INC_SZ 2 //每次擴容

//人的信息
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char tele[12];
}PeoInfo;


//動態(tài)版本
typedef struct Contact
{
	PeoInfo *data;//指向存放人信息的空間
	int sz;//當前已經(jīng)放的信息個數(shù)
	int capacity;//當前通訊錄的最大容量
}Contact;


//聲明初始化函數(shù)
void InitContact(Contact* pc);

//聲明銷毀函數(shù)
void Destroy(Contact* pc);

//聲明增加聯(lián)系人函數(shù)
void AddContact(Contact*pc);

//聲明顯示聯(lián)系人函數(shù)
void ShowContact(const Contact*pc);

//聲明查找函數(shù)
void Search(const Contact*pc);//查找依然不會改變,所以加上const

//聲明刪除函數(shù)
void Dlete(Contact*pc);

//聲明修改函數(shù)
void Modify(Contact*pc);

//聲明排序函數(shù)
void Order(Contact*pc);

//聲明保存函數(shù)
void SaveContact(Contact*pc);

//聲明加載通訊錄函數(shù)
void LoadContact(Contact*pc);

contact.c

#include"contact.h"



//初始化函數(shù)的實現(xiàn)
void InitContact(Contact* pc)
{
	pc->sz = 0;
	PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));//開辟初始空間
	if (ptr == NULL)
	{
		printf("%s", strerror(errno));
		return;
	}//判斷是否空間開辟成功
	pc->data = ptr;
	pc->capacity = DEFAULT_SZ;//初始容量為3

	//加載數(shù)據(jù)到通訊錄
	LoadContact(pc);
}


//銷毀
void Destroy(Contact* pc)
{
	free(pc->data);//由于整個data都是在堆區(qū)上開辟的,所以直接free
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}



void check_capacity(Contact* pc)
{
	if (pc->sz == pc->capacity)//如果容量已滿
	{
		//增加容量
		PeoInfo* ptr =(PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));//調整空間大小
		if (ptr == NULL)
		{
			printf("%s", strerror(errno));
		}
		pc->data = ptr;//把新空間的起始位置傳給data
		pc->capacity += INC_SZ;//最大容量加INC_SZ
		printf("增容成功\n");
	}
}
//增加聯(lián)系人
void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);//檢查容量,判斷是否需要增容
	
	//開始添加信息
	printf("請輸入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;//別忘了添加完一個人后向后走一步

}



//顯示聯(lián)系人
void ShowContact(const Contact* pc)//因為顯示不會改變元素,所以最好加上const
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年齡", "性別", "地址", "電話");//提示
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
													pc->data[i].age,
													pc->data[i].sex,
													pc->data[i].addr,
													pc->data[i].tele);
	}
}


//找到特定聯(lián)系人的位置
int FindByName(const Contact* pc, char name[])//兩個參數(shù),一個是通訊錄里存的名字,一個是你要查找的名字
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到返回下標
		}
	}
	return -1;//沒找到,返回-1
}


//查找
void Search(const Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要查找的名字:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("查無此人。\n");
		return;
	}
	//找到了,打印信息
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
												pc->data[pos].age,
												pc->data[pos].sex,
												pc->data[pos].addr,
												pc->data[pos].tele);
}



//刪除
void Dlete(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要刪除的名字:");
	scanf("%s", name);
	int dle = FindByName(pc, name);//找到位置
	if (dle == -1)
	{
		printf("查無此人。\n");
		return;
	}
	for (int i = dle; i < pc->sz-1; i++)//從后往前覆蓋,同時-1避免越界
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;//刪除完成后別忘了個數(shù)-1
	printf("刪除成功\n");
}



//修改
void Modify(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("請輸入要修改的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("查無此人\n");
		return;
	}
	printf("請輸入名字:");
	scanf("%s", pc->data[ret].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[ret].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[ret].sex);
	printf("請輸入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("請輸入電話:");
	scanf("%s", pc->data[ret].tele);

	printf("修改成功\n");
}



//排序
int cmp(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Order(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp);
	printf("排序成功\n");
}



//保存
void SaveContact(Contact* pc)
{
	//第一步打開文件
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen:");
	}
	else
	{
		//寫數(shù)據(jù),一個人一個人的寫
		//data數(shù)組里一個元素就是一個結構體,也就是一個人
		for (int i = 0; i < pc->sz; i++)
		{
			fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
		}
		fclose(pf);
		pf = NULL;
		printf("保存成功\n");
	}
}


//加載通訊錄
void LoadContact(Contact* pc)
{
	//打開文件
	FILE*pf=fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("LoadCContact:");
	}
	else
	{
		//讀取文件
		PeoInfo tmp = { 0 };
		int i = 0;
		while (fread(&tmp, sizeof(PeoInfo), 1, pf))//一次讀一個人,如果讀取完畢返回0
		{
			//寫數(shù)據(jù)
			//由于在退出時銷毀了通訊錄,所以回到初始大小,如果存儲的數(shù)據(jù)打于初始容量,需要擴容
			check_capacity(pc);//檢查是否需要擴容,如果需要就擴容
			
			pc->data[i] = tmp;
			pc->sz++;
			i++;
		}
		fclose(pf);
		pf = NULL;
	}
}

小型通訊錄源代碼實現(xiàn),# 經(jīng)典小游戲,c++,c語言,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-803232.html

到了這里,關于通訊錄的實現(xiàn)(靜態(tài)版本,動態(tài)版本,文件版本)(后附完整源代碼)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C語言---認識動態(tài)內存管理并實現(xiàn)一個動態(tài)通訊錄:靜態(tài)通訊錄別來沾邊

    C語言---認識動態(tài)內存管理并實現(xiàn)一個動態(tài)通訊錄:靜態(tài)通訊錄別來沾邊

    ??個人主頁:@小沈熬夜禿頭中???? ??小編介紹:歡迎來到我的亂七八糟小星球?? ??專欄:C語言學習 ??本章內容:動態(tài)內存管理 送給各位??:當你的能力還駕馭不了你的目標時那你就應該沉下心來歷練 記得 評論?? +點贊?? +收藏?? +關注??哦~ 提示:以下是本篇

    2024年02月08日
    瀏覽(171)
  • 手機通訊錄的實現(xiàn)——C語言(靜態(tài)版本)

    手機通訊錄的實現(xiàn)——C語言(靜態(tài)版本)

    目錄 一:通訊錄的思想 二:通訊錄的實現(xiàn) 1.創(chuàng)建文件 2.打印菜單 3.創(chuàng)建聯(lián)系人結構體 4.初始化菜單 5.實現(xiàn)菜單的功能 a.增加聯(lián)系人 b.刪除聯(lián)系人 c.查找聯(lián)系人 d.修改聯(lián)系人 e.打印聯(lián)系人 三:總結 我們將每一位聯(lián)系人的姓名,性別,年齡,電話,地址來用一個結構體保存,用

    2024年02月09日
    瀏覽(26)
  • C語言動態(tài)內存練習:【通訊錄(動態(tài)內存版本)實現(xiàn)】

    前面我們寫了一個靜態(tài)數(shù)組版本的通訊錄,再結合剛學習的動態(tài)內存管理的知識,我們現(xiàn)在來實現(xiàn)一個動態(tài)內存版本的通訊錄。 動態(tài)內存版本的通訊錄,主要還是為了解決靜態(tài)數(shù)組版本的通訊錄空間太大導致的內存浪費和空間太小不夠存放的問題。 擴容策略: 為通訊錄設置

    2023年04月13日
    瀏覽(35)
  • 【C語言】實現(xiàn)通訊錄(動態(tài)+文件)

    【C語言】實現(xiàn)通訊錄(動態(tài)+文件)

    在之前三子棋和掃雷的基礎上,本篇文章博主將給大家逐步分析實現(xiàn)通訊錄,介紹通訊錄的每個功能( 動態(tài)增長和文件保存 )。 —————————————————————— test.c - 測試通訊錄 Contact.c - 函數(shù)的實現(xiàn) Contact.h - 函數(shù)和類型的聲明 以多文件的形式分模塊寫的

    2024年02月13日
    瀏覽(78)
  • 動態(tài)內存管理函數(shù)介紹及C語言實現(xiàn)通訊錄管理系統(tǒng)2.0版(動態(tài)增長版本)

    動態(tài)內存管理函數(shù)介紹及C語言實現(xiàn)通訊錄管理系統(tǒng)2.0版(動態(tài)增長版本)

    之前向大家介紹了C語言實現(xiàn)通訊錄管理系統(tǒng)1.0版本,但該版本有明顯的不足之處,比如:一開始就開辟了1000個date數(shù)組,如果聯(lián)系人很少,那么就會造成嚴重的內存浪費,或者聯(lián)系人超過了1000人,那么原數(shù)組就放不下了,所以今天我們考慮使用動態(tài)內存管理的辦法來實現(xiàn)一個

    2023年04月08日
    瀏覽(21)
  • 文件操作介紹及C語言實現(xiàn)通訊錄管理系統(tǒng)3.0最終版(文件操作版本)

    文件操作介紹及C語言實現(xiàn)通訊錄管理系統(tǒng)3.0最終版(文件操作版本)

    上一篇文章我們學習了動態(tài)內存開辟的相關知識點,并用動態(tài)內存函數(shù)優(yōu)化了我們的通訊錄,但通訊錄還有需要改進的地方,比如,正常情況下的通訊錄,應該可以一直保存聯(lián)系人信息,而不是退出就清空了,這就需要我們實實在在的保存下來一個通訊錄。 接下來我會給大家

    2023年04月08日
    瀏覽(22)
  • 【創(chuàng)作贏紅包】循序漸進的全版本通訊錄詳解,可保存信息的動態(tài)通訊錄

    【創(chuàng)作贏紅包】循序漸進的全版本通訊錄詳解,可保存信息的動態(tài)通訊錄

    之前的博客里我們實現(xiàn)了 靜態(tài) 的通訊錄。|??ω?` ) 靜態(tài)通訊錄,適合初學者的手把手一條龍講解_陳大大陳的博客-CSDN博客 這個版本的通訊錄 無法實現(xiàn)容量的動態(tài)增加,也無法保存我們輸入的信息。(??へ??╬) 靜態(tài)通訊錄,是直接開辟100塊空間內存來供使用,但是這樣

    2023年04月17日
    瀏覽(161)
  • 通訊錄的實現(xiàn)(靜態(tài)入手版)

    通訊錄的實現(xiàn)(靜態(tài)入手版)

    ??博客主頁:阿博歷練記 ??文章專欄:c語言(初階與進階) ??代碼倉庫:阿博編程日記 ??歡迎關注:歡迎友友們點贊收藏+關注哦 在生活中,我們可以通過通訊錄快速實現(xiàn)對一位好友的查找,便捷了我們的日常生活,今天阿博就帶領友友們一起探索通訊錄的實現(xiàn)??????

    2024年02月02日
    瀏覽(33)
  • C語言——靜態(tài)通訊錄的實現(xiàn)

    C語言——靜態(tài)通訊錄的實現(xiàn)

    今天我們來實現(xiàn)一下一個靜態(tài)的通訊錄: 我就先展示一下幾個功能: 實現(xiàn)一個通訊錄; 通訊錄可以用來存儲100個人的信息,每個人的信息包括:姓名、性別、年齡、電話、住址 提供方法: 添加聯(lián)系人信息 刪除指定聯(lián)系人信息 查找指定聯(lián)系人信息 修改指定聯(lián)系人信息 顯示

    2024年01月22日
    瀏覽(93)
  • C語言實現(xiàn)通訊錄--靜態(tài)版

    C語言實現(xiàn)通訊錄--靜態(tài)版

    實現(xiàn)一個通訊錄 ,里面存放100個人的信息,完成通訊錄的基本操作功能:增刪查改聯(lián)系人 (1)通訊錄存放100個人的信息? 創(chuàng)建一個數(shù)組作為通訊錄,100個元素,每個元素里面存放每個人的信息,所以數(shù)組里面的每個元素應該是結構體類型。 (2)每個人的信息應該包括哪些

    2024年02月16日
    瀏覽(69)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包