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

C語言實現(xiàn)個人通訊錄(功能優(yōu)化)

這篇具有很好參考價值的文章主要介紹了C語言實現(xiàn)個人通訊錄(功能優(yōu)化)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

  • 用C語言實現(xiàn)個人通訊錄,完成個人通訊錄的增加、減少、查找、修改聯(lián)系人,同時實現(xiàn)通訊錄的排序功能和隱藏空間的功能等;
  • 分三個文件實現(xiàn):Test.c 這個文件用于測試代碼,測試功能實現(xiàn),以及最后的主函數(shù),都可以用這個實現(xiàn)。(注意:在寫項目過程中,一定要每實現(xiàn)一個功能就要運行測試,不然,代碼過長調試困難)Contact.h文件,用于聲明各種定義聲明以及內部庫的引用,這樣可以簡化代碼,讓代碼更加可讀(類型定義、庫函數(shù)聲明、函數(shù)定義、宏定義等)Contact.c這就是最關鍵的文件,用于對各項函數(shù)的實現(xiàn);

1.基本思路介紹:

1.1基本思路:

  • 我們的基本思路其實在Test.c文件中最能體現(xiàn):
#include"Contact.h"
int main()
{
	int input;
	//菜單
	mune1();
	//若輸入的是菜單選擇里面的,就執(zhí)行但不跳出循環(huán),處于等待界面
	//若輸入為0,則判斷為FALSE,跳出循環(huán),退出通訊錄

	//創(chuàng)建通訊錄:
	Contact con;
	//初始化函數(shù):傳入指針減少內存占用
	InitContact(&con);

	do {
		//選項的輸入
		printf("請輸入選項>:");
		scanf("%d", &input);
		//若輸入的是菜單選擇里面的,就執(zhí)行但不跳出循環(huán),處于等待界面
		//若輸入為0,則判斷為FALSE,跳出循環(huán),退出通訊錄
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SHOW:
			PrintContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			//保存到文件中
			SaveContact(&con);
			//銷毀通訊錄空間
			DestroyContact(&con);
			printf("退出通訊錄\n");
			break;
		case Hide_Room:
			//將當前寫入文件保存到文件中
			SaveContact(&con);
			//銷毀當前空間
			DestroyContact(&con);
			if (EncryptionContact())
			{
				//初始化原本空間,進入加密空間
				Hide_InitContact(&con);
				ShowHide();
				//加密程序空間功能
				func(&con);
				goto judge;
			}
			else
			{
				goto judge;
			}
		default:
			printf("輸入錯誤,請重新輸入\n");
			break;
		}
	} while (input);

judge:
	return 0;
}

這里的基本思路就是:

  1. 通訊錄的建立:先定義通訊錄,在初始化通訊錄,也就是為通訊錄內部創(chuàng)建空間,以便存放數(shù)據(jù);
  2. 功能的選擇實現(xiàn):創(chuàng)建好通訊錄接下來我們肯定就是調用功能,我們用循環(huán)來實現(xiàn)功能的反復調用,用Switch語句來實現(xiàn)功能的選擇(調用)。這里的基本功能是七項(方便展示可以定義一個菜單)

這就是整體基本思路,在Test.c中一目了然。

2.通訊錄的具體實現(xiàn):

2.1 通訊錄的建立:

1.我們描述一個人是復雜的,不是一個類型元素可以描述,比如姓名是字符串,年齡是整形,所以這里要采用自定義類型(結構體)來定義聯(lián)系人信息:

//人的信息
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char address[ADDR_MAX];
	char phone[PHONE_MAX];
	char class[CLASS_MAX];
}PeoInfo;

這里我們定義了聯(lián)系人的姓名、年齡、性別、地址、電話、以及分組;
2.個人通訊錄相當于一個數(shù)組,元素是PeoInfo類型(聯(lián)系人),這里我們可以采用靜態(tài)數(shù)組,但實際上靜態(tài)數(shù)組在后續(xù)的添加人數(shù)的時候,擴容比較呆板,所以這里我們選擇的是順序表的數(shù)據(jù)結構,這更方便于增添人數(shù)(當然鏈表也可以實現(xiàn),后續(xù)補充)

//以順序表實現(xiàn)
typedef  struct Contact
{
	//創(chuàng)建通訊錄
	PeoInfo* data;
	int sz;//記錄當前通訊錄中的人數(shù)
	int capacity;//記錄當前通訊錄的空間大小
}Contact;

通過這個代碼我們就可以定義一個通訊錄嘍!當然接下來就要初始化通訊錄,創(chuàng)建空間:

void InitContact(Contact* pc)
{
	assert(pc);
	pc->data = (PeoInfo*)malloc(sizeof(PeoInfo) * INIT_MAX);
	//在堆上申請空間
	if (pc->data == NULL)
	{
		//檢驗是否申請成功,方便調試檢驗;
		perror("malloc error");
	}
	pc->sz = 0;//最初空間人數(shù)
	pc->capacity = INIT_MAX;//空間大小
}

這里的代碼表示我們在堆上申請空間,申請了INIT_MAX個人數(shù)空間,OK這里通訊錄的建立就完成咯!

2.2通訊錄功能:

通訊錄具體有什么功能需要實現(xiàn)呢?這里只需要看一眼Test.h就一目了然了:

#pragma once
//類型的定義和聲明放入頭文件
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>
//宏定義:
#define INIT_MAX 4
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 20
#define PHONE_MAX 12
#define CLASS_MAX 20
//選擇菜單
void mune1();
void mune();
//枚舉優(yōu)化選項
enum input
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	Hide_Room = 110,
};
enum way
{
	S_ByName = 1,
	S_ByAge,
	S_BySex,
	S_ByAddr,
	S_ByPhone,
	S_ByClass,
};
//人的信息
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char address[ADDR_MAX];
	char phone[PHONE_MAX];
	char class[CLASS_MAX];
}PeoInfo;

//以順序表實現(xiàn)
typedef  struct Contact
{
	//創(chuàng)建通訊錄
	PeoInfo* data;
	int sz;
	int capacity;
}Contact;

//初始化結構體
void InitContact(Contact* pc);
//擴容函數(shù)
void CapacityContact(Contact* pc);
//增加聯(lián)系人
void AddContact(Contact* pc);
//刪除聯(lián)系人
void DelContact(Contact* pc);
//查找聯(lián)系人
int SearchContact(const Contact* pc);
//查找方法:
// 按名字查找:
	int SearchByName(const Contact* ps);
// 按年齡查找:
	void SearchByAge(const Contact* ps);
// 按性別查找:
	void SearchBySex(const Contact* ps);
// 按地址查找:
	void SearchByAddr(const Contact* ps);
//按分組查找:
	void SearchByClass(const Contact* ps);
// 按電話查找:
	int SearchByPhone(const Contact* ps);
//修改聯(lián)系人
void ModifyContact(Contact* pc);
//打印通訊錄
void PrintContact(const Contact* pc);
//對通訊錄成員進行排序
void SortContact(const Contact* pc);
//銷毀通訊錄內存空間
void DestroyContact(Contact* pc);
//保存通訊錄到磁盤
void SaveContact(const Contact* pc);
//加載通訊錄信息
void LondContact(Contact* pc);
//通訊錄按照名字排序
	void SortContact(const Contact* pc);
//通訊錄成員信息交換
	void Swap(PeoInfo* left, PeoInfo* right);
//雙指針快排
	void DP_QuickSort(PeoInfo* a, int left, int right);
//選擇排序
	void InsertSort(PeoInfo* a, int n);
//隱蔽空間定義
void  Hide_InitContact(Contact* pc);
//隱蔽空間文件調用
	void Hide_LondContact(Contact* pc);
//隱蔽空間密碼登錄
	bool EncryptionContact();
//進入展示
	void ShowHide();
//隱蔽空間文件保存
	void Hide_SaveContact(const Contact* pc);

void func(Contact* pc);

可以看到.h文件里包含了很多內容:頭文件定義,宏定義,自定義類型聲明,函數(shù)聲明等等;
接下來我們就具體實現(xiàn)一下上述功能函數(shù):

3.具體功能函數(shù)的實現(xiàn):

這里就是最重要的地方咯,注意咯?。。?/p>

3.1 增添聯(lián)系人:

增添聯(lián)系人代碼實現(xiàn):

void AddContact(Contact* pc)
{
	assert(pc);
	//自動擴容
	CapacityContact(pc);

	printf("請輸入聯(lián)系人名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("請輸入聯(lián)系人年齡:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請輸入聯(lián)系人性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請輸入聯(lián)系人地址:");
	scanf("%s", pc->data[pc->sz].address);
	printf("請輸入聯(lián)系人電話:");
	scanf("%s", pc->data[pc->sz].phone);
	printf("請設置聯(lián)系人組別:");
	scanf("%s", pc->data[pc->sz].class);
	//這里sz記錄當前通訊錄人數(shù)
	pc->sz++;
	return;
}

運行效果:
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)

增添聯(lián)系人代碼比較簡單,但要注意一個問題,我們不斷添加人數(shù),會達到通訊錄初始化的最大空間容量,所以我們需要考慮通訊錄的擴容問題,如果我們按照最開始的想法用數(shù)組來存儲聯(lián)系人,則不能靈活的更改通訊錄容量,需要手動更改代碼空間比較麻煩,而用順序表就可以很好解決這個問題;

void CapacityContact(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		pc->data = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * INIT_MAX * 2);
		if (pc->data == NULL)
		{
			perror("realloc error");
		}
		pc->capacity = pc->capacity * 2;
		printf("擴容成功\n");
	}
}

當sz(當前通訊錄人數(shù))等于capacity(通訊錄空間大?。?,則可以通過動態(tài)內存管理realloc,對原來的空間擴容,可以自動實現(xiàn)就十分方便;

3.2 刪除聯(lián)系人:

1.刪除聯(lián)系人需要考慮,通訊錄中是否儲存了聯(lián)系人,判斷通訊錄是否為空;
2.實際情況中,我們刪除是根據(jù)人的姓名等信息,所以這里就要具體得到要刪除對象的位置,這里就要用查找功能;
3.刪除的思想:覆蓋+下標索引減小,實現(xiàn)部分空間無法訪問,間接的刪除;

void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄中無對象可操作!請先增加!");
		mune1();
		return;
	}
	int ret = SearchByName(pc);
	if (ret == -1)
	{
		printf("刪除失敗請重新操作!");
		mune1();
		return;
	}
	int i = ret;
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];

	}

	printf("刪除成功!\n");
	//這里并不是完全刪除,把\0發(fā)給int時默認為零,我們sz減減,就相當于訪問不到那片空間
	pc->sz--;
	mune1();
}

運行效果:
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)

3.3 查找聯(lián)系人:

1.這里就用最簡單的方法:遍歷通訊錄對比實現(xiàn)
2.當然這里我提供了六種查找方式,當然最也可以算是五種,因為最后一種分類查找我把它定為分組;

總查找函數(shù):

int SearchContact(const Contact* pc)
{
	assert(pc);
	//多種方式查找:
	mune();
	int input;
	int ret = -1;
	do {
		//選項的輸入
		printf("請輸入選項>:");
		scanf("%d", &input);
		//若輸入的是菜單選擇里面的,就執(zhí)行但不跳出循環(huán),處于等待界面
		//若輸入為0,則判斷為FALSE,跳出循環(huán),
		switch (input)
		{
		case S_ByName:
			ret = SearchByName(pc);
			break;
		case S_ByAge:
			SearchByAge(pc);
			break;
		case S_BySex:
			SearchBySex(pc);
			break;
		case S_ByAddr:
			SearchByAddr(pc);
			break;
		case S_ByPhone:
			ret = SearchByPhone(pc);
			break;
		case S_ByClass:
			SearchByClass(pc);
			break;
		case EXIT:
			printf("查找完成,已經(jīng)返回上一級\n");
			mune1();
			break;
		default:
			printf("該查找方式還待開發(fā)哦,請重新輸入\n");
			break;
		}
	} while (input);
	return ret;
}

這里和test.c中相似,各類查找也差不多相同,這里我就列出一個比較常用的咯!

  • 按照姓名查找:
	int SearchByName(const Contact* ps)
{
	int i = 0;
	char name[NAME_MAX];
	int k = 1;
	printf("請輸入需要的聯(lián)系人名字:");
	scanf("%s", name);
	for (i = 0; i < ps->sz; i++)
	{
		if (strcmp(name, ps->data[i].name) == 0)
		{
			//暫時不考慮重名
			if (k == 1)
			{
				printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
				k--;
			}

			printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].address,
				ps->data[i].phone,
				ps->data[i].class);

			return i;
		}
	}
	printf("無法找到該聯(lián)系人信息\n");
	return -1;
}

運行效果:
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)

(這里存在缺陷:就是重名,因為這里函數(shù)要返回int,所以只能用于不重名查找,當然如果重名,我們多掉用兩次就可以了,還有就是通訊錄里重名應該有其他備注吧哈哈?。?/p>

3.4 修改聯(lián)系人:

這個代碼也比較簡單思路是:找到,并且輸入新信息覆蓋即可;

void ModifyContact(Contact* pc)
{
	int ret = -1;
	int i;
	i = SearchByName(pc);
	if (i != ret)
	{
		printf("請輸入修改的內容(部分):\n");
		printf("請輸入聯(lián)系人名字:");
		scanf("%s", pc->data[i].name);
		printf("請輸入聯(lián)系人年齡:");
		scanf("%d", &(pc->data[i].age));
		printf("請輸入聯(lián)系人性別:");
		scanf("%s", pc->data[i].sex);
		printf("請輸入聯(lián)系人地址:");
		scanf("%s", pc->data[i].address);
		printf("請輸入聯(lián)系人電話:");
		scanf("%s", pc->data[i].phone);
	}
}

運行效果:
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)

3.5 打印通訊錄:

這個功能應該最先完成,因為有了它方便調試每個功能的代碼;
思路很簡單:遍歷打?。ǖ⒁飧袷矫阑?,不然可太挫了)

void PrintContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].address,
			pc->data[i].phone,
			pc->data[i].class);
	}
}

3.6 通訊錄的排序:

這個功能實現(xiàn)就相對于前面的功能來說就有意思多了,來聽我細細道來:

  • 排序算法有八種,各種排序都是很不錯的思路,比如被用于教學的冒泡排序,簡單易懂,思想也貼切排序思想,所以常常用來教學初級;(具體八大排序算法,之后也會寫成博客)
  • 這里我就選用八大排序最舒服的快排,為什么選用快排呢,當然是快咯,哈哈,但快排也在這里有一些缺陷,如果數(shù)據(jù)很少,或者有很多都是順序輸入,快排就有一點點吃虧,沒事兒----會優(yōu)化?。?!
  • 先來介紹一下快排的思路吧,快排最開始是Hoare大佬提出來的思路如圖:
    C語言實現(xiàn)個人通訊錄(功能優(yōu)化)
    這就是最開始Hoare大佬的快排思路:
  • 1.先定一個key值,把比key小的放key的以邊,把比key大的放一邊,這樣key就找到了正確位置,這就是一趟的思路,不斷二分,就可以排序了。
  • 2.不斷二分,可遞歸,可不用遞歸,這里我就只是說一下遞歸方式。
void Swap( int* left,int* right)
{
	int t = *left;
	*left = *right;
	*right = t;
}
void Hoare_QuickSort(int* a, int left, int right)
{
//當二分到key值的一邊只有一個數(shù),或者沒有時,便遞歸結束
	if (left >= right)
		return;
		
	int end = right, begin = left;
	int keyi = left;//這里表示的是key的下標索引
	while (left < right)
	{
		//左邊做key,右邊先走,可以保證相遇位置比key更小
		//right找小找到和找不到:
		//找到:left沒有找到大,直到相遇
		//沒找到:直接和left相遇,直接找到keyi值
		while (left<right&&a[right] >= a[keyi])//right找小停下
			right--;

		while (left<right&&a[left] <= a[keyi])//left找大(保證相遇小于key)
			left++;
		Swap( &a[left],&a [right]);//交換兩者,分配
	}
	//最后相遇位置便是key的位置:
	Swap(&a[left], &a[keyi]);
	keyi = left;
	//key左邊數(shù)組的初末索引:begin,keyi-1
	Hoare_QuickSort(a, begin, keyi - 1);
	//key右邊數(shù)組的初末索引:keyi+1,end
	Hoare_QuickSort(a, keyi + 1, end);
}

當然Hoare大佬提出的版本肯定是存在一定缺陷的,需要優(yōu)化,但是這種思想真的厲害!
這里直接給出時間復雜度:O(NlgN)~O(N*N)

  • 缺陷: 1.當所需要排的數(shù)列是順序或者逆序時,快排時間復雜度是最大N的平方,嚴重影響快排的速度。2.快排在對數(shù)據(jù)少,并且部分具有一定順序的排序并不是很完美。3.Hoare大佬的快排思路難以理解,思路理解困難。

對于上述缺陷我這里就不過度介紹了,但的確有優(yōu)化方式(我會在后續(xù)的八大排序中介紹)在通訊錄排序中用較優(yōu)秀的方式來實現(xiàn)(這里就是和庫里排序函數(shù)實現(xiàn)相近了):

void Swap(PeoInfo* left, PeoInfo* right)
{
	PeoInfo t = *left;
	*left = *right;
	*right = t;
}

int GerMidNumi(PeoInfo* a, int left, int right)
{
	int mid = (right + left) / 2;

	if (strcmp(a[left].name, a[mid].name) > 0)
	{
		if (strcmp(a[mid].name, a[right].name) > 0)
		{
			return mid;
		}
		else if (strcmp(a[left].name, a[right].name) < 0)
		{
			return left;
		}
		else
		{
			return right;
		}
	}
	else
	{
		if (strcmp(a[left].name, a[right].name) > 0)
		{
			return left;
		}
		else if (strcmp(a[mid].name, a[right].name) < 0)
		{
			return mid;
		}
		else
		{
			return right;
		}
	}
}

void  DP_QuickSort(PeoInfo* a, int left, int right)
{
	int end = right, begin = left;
	if (left >= right)
		return;
	//小區(qū)間優(yōu)化:
	if ((right - left + 1) > 10)
	{
		//方案二:優(yōu)化:三數(shù)取中:不是最小,最大的哪一個(優(yōu)化更加明顯)
		int midi = GerMidNumi(a, left, right);
		if (midi != left)
			Swap(&a[left], &a[midi]);

		int prev = left;
		int cur = prev + 1;
		int keyi = left;

		while (cur <= right)
		{
			if (strcmp(a[cur].name, a[keyi].name) < 0 && ++prev != cur)
				Swap(&a[cur], &a[prev]);
			cur++;
		}
		Swap(&a[prev], &a[keyi]);
		keyi = prev;

		DP_QuickSort(a, begin, keyi - 1);
		DP_QuickSort(a, keyi + 1, end);
	}
	else
	{
		InsertSort(a, right - left + 1);
	}
}

void InsertSort(PeoInfo* a, int n)
{
	for (int i = 1; i < n; i++)
	{
		int end = i - 1;
		PeoInfo tmp = a[i];
		// 將tmp插入到[0,end]區(qū)間中,保持有序
		while (end >= 0)
		{
			if (strcmp(tmp.name, a[end].name) < 0)
			{
				a[end + 1] = a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

運行效果:
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)

這里很有趣,但在這個部分就不過度介紹了,在后續(xù)博客會有詳細介紹哈!

3.7 文件導入和導出功能:

我們當前所寫的代碼都是在內存里寫的,一旦關閉數(shù)據(jù)便會清除,所以需要把數(shù)據(jù)導入到本地磁盤中進行保存,這里就需要文件相關知識了。知識掌握了,就十分簡單了!

  • 本地導入內存:
void LondContact(Contact* pc)
{
	FILE* pf = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\contact.txt", "rb");
	if (NULL == pf)
	{
		perror("LondContact error");
	}
	else
	{
		int i = 0;
		PeoInfo tmp = { 0 };
		while (fread(&tmp, sizeof(PeoInfo), 1, pf))
		{
			CapacityContact(pc);
			pc->data[i] = tmp;
			pc->sz++;
			i++;
		}
		fclose(pf);
		pf = NULL;
	}
}
  • 內存存入本地:
void SaveContact(const Contact* pc)
{
	FILE* pf = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\contact.txt", "wb");
	if (NULL == pf)
	{
		perror("SaveContact error");
	}
	else
	{
		int i = 0;
		for (i = 0; i < pc->sz; i++)
		{
			fwrite((pc->data + i), sizeof(PeoInfo), 1, pf);
		}
		fclose(pf);
		pf = NULL;
		printf("保存成功\n");
	}
}

這就實現(xiàn)了通訊錄的基本功能嘍

3.8 分組打?。?/h3>

這里我的通訊錄是把分組定義為聯(lián)系人的屬性了的,所以只需要按照分組查找打印即可:

	void SearchByClass(const Contact* ps)
{
	{
		int i = 0;
		char class[CLASS_MAX];
		int flag = 0;
		int k = 1;
		printf("請輸入需要查找聯(lián)系人的組別:");
		scanf("%s", class);
		for (i = 0; i < ps->sz; i++)
		{
			if (strcmp(class, ps->data[i].class) == 0)
			{
				flag = 1;
				if (k == 1)
				{
					printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
					k--;
				}
				printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
					ps->data[i].name,
					ps->data[i].age,
					ps->data[i].sex,
					ps->data[i].address,
					ps->data[i].phone,
					ps->data[i].class);
			}
		}
		if (flag)
		{
			return;
		}
		else
		{
			printf("無法找到該聯(lián)系人信息\n");
		}
	}
}

3.9 隱蔽空間的實現(xiàn):

  • 這里的思路就是另外開辟本地文件,作為存儲空間,但要注意的是,調用隱蔽空間時,切記先保存通訊錄原本空間,并且退出(銷毀)。再打開隱蔽空間的文件,就相當于實現(xiàn)一個小的通訊錄,功能可照搬所以就不過多介紹。
  • 只介紹一下進入空間時的一些優(yōu)化吧,比如ShowHide()函數(shù),看似只是加載界面,其實他還可以實現(xiàn)清除屏幕(調用windows自帶的cls)原先信息,做到更舒服的訪問。代碼如下:
void ShowHide()
{
	char arr1[] = "Welcome to Hide Room !!!";
	char arr2[] = "########################";

	int left = 0;
	int right = strlen(arr1) - 1;

	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);
		//清屏
		system("cls");
		left++;
		right--;
	}
	printf("%s\n", arr1);
}
  • 輸入密碼進入bool EncryptionContact()函數(shù),這個函數(shù)還有太多可優(yōu)化的地方:比如三次密碼輸入失敗,24小時重試,這里用C語言就不方便了,可以用linux實現(xiàn)(后續(xù)會出相關博客)這里只能打印表示,還有就是密碼的修改,這里我想的是還可以實現(xiàn)一個管理程序(哈哈,寫博客想著想著就去實現(xiàn)了個,現(xiàn)在和大家分享?。。。?/li>
void Administrators(char* password)
{
	char newpassword[20];
	printf("請輸入修改密碼》:");
	scanf("%s", newpassword);
	strcpy(password, newpassword);
	printf("修改成功\n");
}

bool EncryptionContact()
{
	int i = 0;
	char password[20] = { 0 };
	char insure[20] = { "123456" };
//打開一個文件夾用來記錄空間密碼:
	FILE* pf1 = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\password.txt", "rb");
	if (NULL == pf1)
	{
		perror("password1 error");
	}
	else
	{
		char tmp[20] = { 0 };
		fread(&tmp, 20, 1, pf1);
		strcpy(insure, tmp);
		fclose(pf1);
		pf1 = NULL;
	}
//判斷的主要函數(shù):
	printf("請輸入進入密碼》:");
	for (i = 0; i < 3; i++)
	{
		scanf("%s", password);
		if (0 == strcmp(password, insure))
		{
			return true;
		}
		else if (0==strcmp(password,"管理員入口"))
		{
		//進入管理員系統(tǒng)進行密碼修改
			Administrators(insure);
		//存入密碼文件中
			FILE* pf2 = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\password.txt", "wb");
			if (NULL == pf2)
			{
				perror("password2 error");
			}
			else
			{
				fwrite(insure, 20, 1, pf2);
				fclose(pf2);
				pf2 = NULL;
				printf("保存成功\n");
			}
			printf("請輸入進入密碼》:");
		}
		else
		{
			printf("第%d次密碼輸入錯誤\n", i + 1);
			if (i < 2)
				printf("請重新輸入》:");
		}
	}
	//linux操作系統(tǒng)實現(xiàn)
	printf("密碼輸入三次錯誤!請在24小時后重試\n");
	return false;
}

運行效果:
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)

這里可以形成一個對比,就是代碼沒有封裝可讀性就很差,這里可以把寫入和寫出封裝成函數(shù)。這里關于隱蔽空間其他功能大致相同就不過多介紹了。

Contact.c完整代碼:

#include"Contact.h"

void mune()
{
	printf("*******************************************************\n");
	printf("********1.SearchByName    2.SearchByAge ***************\n");
	printf("********3.SearchBySex     4.SearchByAddr   ************\n");
	printf("********5.SearchByPhone   6.SearchByclass  ************\n");
	printf("*******************  0.exit  **************************\n");
	printf("*******************************************************\n");
}
void mune1()
{
	printf("**************************************\n");
	printf("********1.ADD    2.DEL ***************\n");
	printf("********3.SEARCH 4.MODIFY ************\n");
	printf("********5.SHOW   6.SORT   ************\n");
	printf("********0.EXIT            ************\n");

}

void func(Contact* pc)
{
	int input;
	mune1();
	do {
		printf("請輸入選項>:");
		scanf("%d", &input);
		//若輸入的是菜單選擇里面的,就執(zhí)行但不跳出循環(huán),處于等待界面
		//若輸入為0,則判斷為FALSE,跳出循環(huán),退出通訊錄
		switch (input)
		{
		case ADD:
			AddContact(pc);
			break;
		case DEL:
			DelContact(pc);
			break;
		case SEARCH:
			SearchContact(pc);
			break;
		case MODIFY:
			ModifyContact(pc);
			break;
		case SHOW:
			PrintContact(pc);
			break;
		case SORT:
			SortContact(pc);
			break;
		case EXIT:
			//保存到文件中
			Hide_SaveContact(pc);
			//銷毀通訊錄空間
			DestroyContact(pc);
			printf("退出通訊錄\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入\n");
			break;
		}
	} while (input);

	return;
}

void LondContact(Contact* pc)
{
	FILE* pf = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\contact.txt", "rb");
	if (NULL == pf)
	{
		perror("LondContact error");
	}
	else
	{
		int i = 0;
		PeoInfo tmp = { 0 };
		while (fread(&tmp, sizeof(PeoInfo), 1, pf))
		{
			CapacityContact(pc);
			pc->data[i] = tmp;
			pc->sz++;
			i++;
		}
		fclose(pf);
		pf = NULL;
	}
}

//主要用于函數(shù)的實現(xiàn)操作,功能實現(xiàn)處
//動態(tài)內存處理
void InitContact(Contact* pc)
{
	assert(pc);
	pc->data = (PeoInfo*)malloc(sizeof(PeoInfo) * INIT_MAX);
	if (pc->data == NULL)
	{
		perror("malloc error");
	}
	pc->sz = 0;
	pc->capacity = INIT_MAX;

	//讀取文件
	LondContact(pc);
}

void CapacityContact(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		pc->data = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * INIT_MAX * 2);
		if (pc->data == NULL)
		{
			perror("realloc error");
		}
		pc->capacity = pc->capacity * 2;
		printf("擴容成功\n");
	}
}

void AddContact(Contact* pc)
{
	assert(pc);
	//自動擴容
	CapacityContact(pc);

	printf("請輸入聯(lián)系人名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("請輸入聯(lián)系人年齡:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請輸入聯(lián)系人性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請輸入聯(lián)系人地址:");
	scanf("%s", pc->data[pc->sz].address);
	printf("請輸入聯(lián)系人電話:");
	scanf("%s", pc->data[pc->sz].phone);
	printf("請設置聯(lián)系人組別:");
	scanf("%s", pc->data[pc->sz].class);

	pc->sz++;
	return;
}

void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄中無對象可操作!請先增加!");
		mune1();
		return;
	}
	int ret = SearchByName(pc);
	if (ret == -1)
	{
		printf("刪除失敗請重新操作!");
		mune1();
		return;
	}
	int i = ret;
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];

	}

	printf("刪除成功!\n");
	//這里并不是完全刪除,把\0發(fā)給int時默認為零,我們sz減減,就相當于訪問不到那片空間
	pc->sz--;
	mune1();
}

int SearchContact(const Contact* pc)
{
	assert(pc);
	//多種方式查找:
	mune();
	int input;
	int ret = -1;
	do {
		//選項的輸入
		printf("請輸入選項>:");
		scanf("%d", &input);
		//若輸入的是菜單選擇里面的,就執(zhí)行但不跳出循環(huán),處于等待界面
		//若輸入為0,則判斷為FALSE,跳出循環(huán),
		switch (input)
		{
		case S_ByName:
			ret = SearchByName(pc);
			break;
		case S_ByAge:
			SearchByAge(pc);
			break;
		case S_BySex:
			SearchBySex(pc);
			break;
		case S_ByAddr:
			SearchByAddr(pc);
			break;
		case S_ByPhone:
			ret = SearchByPhone(pc);
			break;
		case S_ByClass:
			SearchByClass(pc);
			break;
		case EXIT:
			printf("查找完成,已經(jīng)返回上一級\n");
			mune1();
			break;
		default:
			printf("該查找方式還待開發(fā)哦,請重新輸入\n");
			break;
		}
	} while (input);
	return ret;
}

	int SearchByName(const Contact* ps)
{
	int i = 0;
	char name[NAME_MAX];
	int k = 1;
	printf("請輸入需要的聯(lián)系人名字:");
	scanf("%s", name);
	for (i = 0; i < ps->sz; i++)
	{
		if (strcmp(name, ps->data[i].name) == 0)
		{
			//暫時不考慮重名
			if (k == 1)
			{
				printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
				k--;
			}

			printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].address,
				ps->data[i].phone,
				ps->data[i].class);

			return i;
		}
	}
	printf("無法找到該聯(lián)系人信息\n");
	return -1;
}

	void SearchByAge(const Contact* ps)
{
	int i = 0;
	int age;
	int flag = 0;
	int k = 1;
	printf("請輸入需要查找聯(lián)系人的年齡:");
	scanf("%d", &age);
	for (i = 0; i < ps->sz; i++)
	{
		if (age == ps->data[i].age)
		{
			flag = 1;
			if (k == 1)
			{
				printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
				k--;
			}

			printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].address,
				ps->data[i].phone,
				ps->data[i].class);
		}
	}
	if (flag)
	{
		return;
	}
	else
	{
		printf("無法找到該聯(lián)系人信息\n");
	}
}

	void SearchBySex(const Contact* ps)
{
	int i = 0;
	char sex[SEX_MAX];
	int flag = 0;
	int k = 1;
	printf("請輸入需要查找聯(lián)系人的性別:");
	scanf("%s", sex);
	for (i = 0; i < ps->sz; i++)
	{
		if (strcmp(sex, ps->data[i].sex) == 0)
		{
			flag = 1;
			if (k == 1)
			{
				printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
				k--;
			}
			printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].address,
				ps->data[i].phone,
				ps->data[i].class);
		}
	}
	if (flag)
	{
		return;
	}
	else
	{
		printf("無法找到該聯(lián)系人信息\n");
	}
}

	void SearchByAddr(const Contact* ps)
{
	{
		int i = 0;
		char addr[ADDR_MAX];
		int flag = 0;
		int k = 1;
		printf("請輸入需要查找聯(lián)系人的地址:");
		scanf("%s", addr);
		for (i = 0; i < ps->sz; i++)
		{
			if (strcmp(addr, ps->data[i].address) == 0)
			{
				flag = 1;
				if (k == 1)
				{
					printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
					k--;
				}
				printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
					ps->data[i].name,
					ps->data[i].age,
					ps->data[i].sex,
					ps->data[i].address,
					ps->data[i].phone,
					ps->data[i].class);
			}
		}
		if (flag)
		{
			return;
		}
		else
		{
			printf("無法找到該聯(lián)系人信息\n");
		}
	}
}

	void SearchByClass(const Contact* ps)
{
	{
		int i = 0;
		char class[CLASS_MAX];
		int flag = 0;
		int k = 1;
		printf("請輸入需要查找聯(lián)系人的組別:");
		scanf("%s", class);
		for (i = 0; i < ps->sz; i++)
		{
			if (strcmp(class, ps->data[i].class) == 0)
			{
				flag = 1;
				if (k == 1)
				{
					printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
					k--;
				}
				printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
					ps->data[i].name,
					ps->data[i].age,
					ps->data[i].sex,
					ps->data[i].address,
					ps->data[i].phone,
					ps->data[i].class);
			}
		}
		if (flag)
		{
			return;
		}
		else
		{
			printf("無法找到該聯(lián)系人信息\n");
		}
	}
}

	int SearchByPhone(const Contact* ps)
{
	int i = 0;
	char phone[PHONE_MAX];
	int k = 1;
	printf("請輸入需要查找聯(lián)系人電話號碼:");
	scanf("%s", phone);
	for (i = 0; i < ps->sz; i++)
	{
		if (strcmp(phone, ps->data[i].phone) == 0)
		{
			if (k == 1)
			{
				printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
				k--;
			}

			printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].address,
				ps->data[i].phone,
				ps->data[i].class);

			return i;
		}
	}
	printf("無法找到該聯(lián)系人信息\n");
	return -1;
}

void ModifyContact(Contact* pc)
{
	int ret = -1;
	int i;
	i = SearchByName(pc);
	if (i != ret)
	{
		printf("請輸入修改的內容(部分):\n");
		printf("請輸入聯(lián)系人名字:");
		scanf("%s", pc->data[i].name);
		printf("請輸入聯(lián)系人年齡:");
		scanf("%d", &(pc->data[i].age));
		printf("請輸入聯(lián)系人性別:");
		scanf("%s", pc->data[i].sex);
		printf("請輸入聯(lián)系人地址:");
		scanf("%s", pc->data[i].address);
		printf("請輸入聯(lián)系人電話:");
		scanf("%s", pc->data[i].phone);

	}

}

void PrintContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t%-12s\n", "姓名", "年齡", "性別", "地址", "電話", "組別");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t%-12s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].address,
			pc->data[i].phone,
			pc->data[i].class);
	}
}

void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}

void SaveContact(const Contact* pc)
{
	FILE* pf = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\contact.txt", "wb");
	if (NULL == pf)
	{
		perror("SaveContact error");
	}
	else
	{
		int i = 0;
		for (i = 0; i < pc->sz; i++)
		{
			fwrite((pc->data + i), sizeof(PeoInfo), 1, pf);
		}
		fclose(pf);
		pf = NULL;
		printf("保存成功\n");
	}
}

void SortContact(const Contact* pc)
{
	assert(pc);

	DP_QuickSort(pc->data, 0, pc->sz - 1);

	printf("排序完成\n");

}

void Swap(PeoInfo* left, PeoInfo* right)
{
	PeoInfo t = *left;
	*left = *right;
	*right = t;
}

int GerMidNumi(PeoInfo* a, int left, int right)
{
	int mid = (right + left) / 2;

	if (strcmp(a[left].name, a[mid].name) > 0)
	{
		if (strcmp(a[mid].name, a[right].name) > 0)
		{
			return mid;
		}
		else if (strcmp(a[left].name, a[right].name) < 0)
		{
			return left;
		}
		else
		{
			return right;
		}
	}
	else
	{
		if (strcmp(a[left].name, a[right].name) > 0)
		{
			return left;
		}
		else if (strcmp(a[mid].name, a[right].name) < 0)
		{
			return mid;
		}
		else
		{
			return right;
		}
	}
}

void  DP_QuickSort(PeoInfo* a, int left, int right)
{
	int end = right, begin = left;
	if (left >= right)
		return;
	//小區(qū)間優(yōu)化:
	if ((right - left + 1) > 10)
	{
		//方案二:優(yōu)化:三數(shù)取中:不是最小,最大的哪一個(優(yōu)化更加明顯)
		int midi = GerMidNumi(a, left, right);
		if (midi != left)
			Swap(&a[left], &a[midi]);

		int prev = left;
		int cur = prev + 1;
		int keyi = left;

		while (cur <= right)
		{
			if (strcmp(a[cur].name, a[keyi].name) < 0 && ++prev != cur)
				Swap(&a[cur], &a[prev]);
			cur++;
		}
		Swap(&a[prev], &a[keyi]);
		keyi = prev;

		DP_QuickSort(a, begin, keyi - 1);
		DP_QuickSort(a, keyi + 1, end);
	}
	else
	{
		InsertSort(a, right - left + 1);
	}
}

void InsertSort(PeoInfo* a, int n)
{
	for (int i = 1; i < n; i++)
	{
		int end = i - 1;
		PeoInfo tmp = a[i];
		// 將tmp插入到[0,end]區(qū)間中,保持有序
		while (end >= 0)
		{
			if (strcmp(tmp.name, a[end].name) < 0)
			{
				a[end + 1] = a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

void  Hide_InitContact(Contact* pc)
{
	assert(pc);
	pc->data = (PeoInfo*)malloc(sizeof(PeoInfo) * INIT_MAX);
	if (pc->data == NULL)
	{
		perror("Hide_malloc error");
	}
	pc->sz = 0;
	pc->capacity = INIT_MAX;

	//讀取文件
	Hide_LondContact(pc);
}

void Hide_LondContact(Contact* pc)
{
	FILE* pf = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\hide_contact.txt", "rb");
	if (NULL == pf)
	{
		perror("Hide_LondContact error");
	}
	else
	{
		int i = 0;
		PeoInfo tmp = { 0 };
		while (fread(&tmp, sizeof(PeoInfo), 1, pf))
		{
			CapacityContact(pc);
			pc->data[i] = tmp;
			pc->sz++;
			i++;
		}
		fclose(pf);
		pf = NULL;
	}
}

void ShowHide()
{
	char arr1[] = "Welcome to Hide Room !!!";
	char arr2[] = "########################";

	int left = 0;
	int right = strlen(arr1) - 1;

	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);
		system("cls");
		left++;
		right--;
	}
	printf("%s\n", arr1);
}

void Administrators(char* password)
{
	char newpassword[20];
	printf("請輸入修改密碼》:");
	scanf("%s", newpassword);
	strcpy(password, newpassword);
	printf("修改成功\n");
}

bool EncryptionContact()
{
	int i = 0;
	char password[20] = { 0 };
	char insure[20] = { "123456" };

	FILE* pf1 = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\password.txt", "rb");
	if (NULL == pf1)
	{
		perror("password1 error");
	}
	else
	{
		char tmp[20] = { 0 };
		fread(&tmp, 20, 1, pf1);
		strcpy(insure, tmp);
		fclose(pf1);
		pf1 = NULL;
	}

	printf("請輸入進入密碼》:");
	for (i = 0; i < 3; i++)
	{
		scanf("%s", password);
		if (0 == strcmp(password, insure))
		{
			return true;
		}
		else if (0==strcmp(password,"管理員入口"))
		{
			Administrators(insure);
			FILE* pf2 = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\password.txt", "wb");
			if (NULL == pf2)
			{
				perror("password2 error");
			}
			else
			{
				fwrite(insure, 20, 1, pf2);
				fclose(pf2);
				pf2 = NULL;
				printf("保存成功\n");
			}
			printf("請輸入進入密碼》:");
		}
		else
		{
			printf("第%d次密碼輸入錯誤\n", i + 1);
			if (i < 2)
				printf("請重新輸入》:");
		}
	}
	//linux操作系統(tǒng)實現(xiàn)
	printf("密碼輸入三次錯誤!請在24小時后重試\n");
	return false;

}

void Hide_SaveContact(const Contact* pc)
{
	FILE* pf = fopen("D:\\class\\c學\\上傳c學\\c-science\\text.txl.c\\text.txl.c\\hide_contact.txt", "wb");
	if (NULL == pf)
	{
		perror("Hide_SaveContact error");
	}
	else
	{
		int i = 0;
		for (i = 0; i < pc->sz; i++)
		{
			fwrite((pc->data + i), sizeof(PeoInfo), 1, pf);
		}
		fclose(pf);
		pf = NULL;
		printf("保存成功\n");
	}
}

4.代碼缺陷,以及優(yōu)化:

4.1 內存泄漏:

內存泄漏是必須注意的,這里開始malloc了空間,如果沒有釋放則會影響項目的速度,舉個例子:

  • 這里是一個死循環(huán),用來模擬長期在線的服務器,當出現(xiàn)內存泄漏問題會有什么后果:
    C語言實現(xiàn)個人通訊錄(功能優(yōu)化)
  • 開始運行代碼:
    C語言實現(xiàn)個人通訊錄(功能優(yōu)化)
    可以注意vs2019所占得內存以及多了這么多,這些沒用的空間,會影響項目整體性能,當然在這里只需要把黑匣子關掉,就馬上恢復了,這是結束的時候自動釋放了。如果未來我們從事的是24小時在線的服務器(比如各種app),出現(xiàn)這種內存泄漏可是及其危險的。所以我們需要手動釋放。
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}

代碼簡單不累,相當實惠哈哈,所以這是要養(yǎng)成的習慣,在申請空間后一定記住手動free多余空間;

4.2 代碼可讀性維護:

  • 有句流傳江湖的話:程序員寫完代碼,只有自己和上帝認識!
  • 在項目合作過程中的,代碼可讀性十分重要
  • 比如函數(shù)命名、Switch語句的case選項可以枚舉代替、以及增加必要注釋。增加代碼可讀性,這里就舉case這個例子

C語言實現(xiàn)個人通訊錄(功能優(yōu)化)
是不是還是有些區(qū)別的呢?

4.3 代碼的可調式性:

我們往往可以發(fā)現(xiàn)我們在寫類似“項目”的時候,發(fā)現(xiàn)代碼一長,是真的難調,一調就是一天,所以我們就要用一些技巧:

  • 1.善用const關鍵字,對于一些參數(shù)無需修改的函數(shù),大膽加上這個關鍵字,比如通訊錄的打印函數(shù)
  • 2.會用assert()函數(shù),使用函數(shù)我們通常成為暴力檢查,這個函數(shù)會讓你的調試找到方向,明白什么地方錯了,便于調試。
  • 3.perror()函數(shù)也是如此,若不清楚可以自行查詢。

PS:好久沒寫博客咯,后續(xù)會抓緊的哈哈!美圖獻上(夾帶私貨),一起加油!
C語言實現(xiàn)個人通訊錄(功能優(yōu)化)文章來源地址http://www.zghlxwxcb.cn/news/detail-455441.html

到了這里,關于C語言實現(xiàn)個人通訊錄(功能優(yōu)化)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索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)
  • 通訊錄(純C語言實現(xiàn))

    通訊錄(純C語言實現(xiàn))

    相信大家都有過通訊錄,今天我來帶大家實現(xiàn)以下最簡單的通訊錄,通過本篇文章,相信可以讓大家對C語言有進一步的認識。 話不多說,我們先放函數(shù)的實現(xiàn) ?是不是看到這里會感到很害怕??不用怕,跟著我的思路,你也可以實現(xiàn)它,我?guī)е阋徊揭徊綄崿F(xiàn)每一個功能 ?

    2024年02月16日
    瀏覽(134)
  • C語言--通訊錄的實現(xiàn)

    人的信息:姓名+年齡+性別+住址+電話 通訊錄中可以存放100個人的信息 增加聯(lián)系人 刪除指定聯(lián)系人 查找指定聯(lián)系人 修改指定聯(lián)系人 顯示所有聯(lián)系人的信息 test.c----測試通訊錄 contact.c----通訊錄的實現(xiàn) contact.h----函數(shù)的聲明 代碼如下(示例): 代碼如下(示例):

    2024年02月15日
    瀏覽(141)
  • 動態(tài)通訊錄實現(xiàn)(C語言)

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

    目錄 前言: 一:單個節(jié)點的設計和主邏輯? 結點設計 主邏輯 二:接口實現(xiàn) (1)生成一個新的結點 (2)增加信息 (3)打印信息 (4)查找? (5)刪除信息 (6)修改信息 (7)排序 ?插入排序 快速排序 (8)已有數(shù)據(jù)讀取 (9)更新數(shù)據(jù)錄入 三:全部代碼 contact.h(聲明) contact.c(接口) test.c(主邏輯) 本

    2024年02月05日
    瀏覽(96)
  • 【C語言】實現(xiàn)動態(tài)版通訊錄

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

    ??內容專欄:【C語言】進階部分 ??本文概括: 結合自定義類型、動態(tài)內存管理知識,對靜態(tài)版本的通訊錄進行優(yōu)化。 ??本文作者:花 碟 ??發(fā)布時間:2023.4.2 ? 目錄 前言: 一、靜態(tài)版本代碼實現(xiàn): 二、動態(tài)通訊錄? 三、代碼整理? 前面我們學過了結構體、枚舉等自定義

    2024年02月02日
    瀏覽(96)
  • C語言進階——通訊錄模擬實現(xiàn)

    C語言進階——通訊錄模擬實現(xiàn)

    ??個人主頁:_麥麥_ ??今日名言:只有走在路上,才能擺脫局限,擺脫執(zhí)著,讓所有的選擇,探尋,猜測,想象都生機勃勃?!嗲镉辍段幕嗦谩?目錄 一、前言 二、正文 1.大體框架 2.界面顯示 3. 創(chuàng)建通訊錄 4.初始化通訊錄 5.增加聯(lián)系人 6.顯示聯(lián)系人 7. 刪除聯(lián)系人 ?

    2024年02月02日
    瀏覽(81)
  • 【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)
  • C語言實現(xiàn)通訊錄--動態(tài)版

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

    實現(xiàn)一個通訊錄,聯(lián)系人的數(shù)量可多可少 1.在靜態(tài)版本的基礎上改用動態(tài)的方法: (1)默認能夠存放三個人的信息 (2)不夠的話,每次增加兩個人的信息 2.其他功能不變 建立三個文件: test.c 用于測試通訊錄的相關功能 contsct.c 通訊錄的實現(xiàn)模塊(用函數(shù)實現(xiàn)功能) conta

    2024年02月15日
    瀏覽(99)
  • 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)通訊錄(文件版)

    C語言實現(xiàn)通訊錄(文件版)

    學習完C語言的文件讀寫,我們又可以將通訊錄增加以下功能: 1.當退出通訊錄的時候,把已增加的聯(lián)系人信息寫到文件中。 2.當通訊錄初始化的時候,加載(讀取)文件里的信息到通訊錄 ——(直接使用打印函數(shù)可以顯示在屏幕上) 分析: 當我們退出通訊錄的時候要實現(xiàn)通訊錄

    2024年02月01日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包