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

C語(yǔ)言實(shí)現(xiàn)通訊錄(三合一版本)

這篇具有很好參考價(jià)值的文章主要介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄(三合一版本)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

作者主頁(yè):paper jie的博客_CSDN博客

本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。

本文錄入于《C語(yǔ)言》專欄,本專欄是針對(duì)于大學(xué)生,編程小白精心打造的。筆者用重金(時(shí)間和精力)打造,將基礎(chǔ)知識(shí)一網(wǎng)打盡,希望可以幫到讀者們哦。

其他專欄:《算法詳解》《系統(tǒng)解析C語(yǔ)言》《C語(yǔ)言-語(yǔ)法篇》等

內(nèi)容分享:本期將用C的知識(shí)來(lái)通訊錄 將分為三個(gè)版本

目錄

前言

基本要求

通訊錄實(shí)現(xiàn)思想

通訊錄的構(gòu)成

設(shè)計(jì)思路

具體代碼

靜態(tài)版本

contact.h

contact.c

test.c

動(dòng)態(tài)版本

malloc_contact.h

malloc_contact.c

malloc_test.c

文件版本

FILE_contact.h

FILE_contact.c

test.c

總結(jié)


前言

在我們的日藏生活中,經(jīng)常會(huì)通過(guò)手機(jī)來(lái)互相聯(lián)系交流,而我們常常會(huì)把常聯(lián)系的電話號(hào)碼添加進(jìn)我們的通訊錄里面。它是一種利用互聯(lián)網(wǎng)或實(shí)現(xiàn)通訊錄信息同步更新和備份的應(yīng)用,服務(wù)。你可以在個(gè)人電腦、移動(dòng)電話等任何聯(lián)網(wǎng)設(shè)備上錄入你的聯(lián)系人的手機(jī),通信地址等通訊錄信息,或?qū)σ郧暗男畔⑦M(jìn)行分組、管理和更新,在你的許可下,該聯(lián)系人可以看到他所在組內(nèi)的其他聯(lián)系人信息,從而實(shí)現(xiàn)通訊錄共享,如果該聯(lián)系人更新自己的聯(lián)系信息,你的通訊錄會(huì)自動(dòng)更新,實(shí)現(xiàn)同步通訊錄,并留下舊版本的通訊錄信息。但這里的原理和代碼是怎么樣的我們就不得而知了。今天我們就通過(guò)C來(lái)編寫通訊錄的后端代碼,我們將分為三個(gè)版本來(lái)實(shí)現(xiàn),由易到難,干貨滿滿,大家放心食用。

基本要求

通訊錄可以存儲(chǔ)多個(gè)人的信息,信息需要包括:姓名 年齡 性別 地址 電話? ? ? ? ? ? ? ? ?

功能:

添加新增聯(lián)系人

刪除不需要的聯(lián)系人

查找聯(lián)系人

修改聯(lián)系人信息

查看所有聯(lián)系人信息

可以對(duì)聯(lián)系人進(jìn)行排序

通訊錄實(shí)現(xiàn)思想

通訊錄的構(gòu)成

為了讓代碼不會(huì)太過(guò)冗余,這里將用三個(gè)文件test.c contact.c contact.h 來(lái)存放代碼. test.c用于來(lái)測(cè)試我們的代碼, contact.c來(lái)實(shí)現(xiàn)通訊錄需要的函數(shù)代碼,contact.h用來(lái)存放函數(shù)的聲明和頭文件包含。

設(shè)計(jì)思路

添加一個(gè)菜單提示用戶如何使用

讓通訊錄可以多次使用

設(shè)置一個(gè)合理的變量為通訊錄,對(duì)通訊錄進(jìn)行初始化

實(shí)現(xiàn)功能所需要的函數(shù)

具體代碼

靜態(tài)版本

contact.h

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

#define MAX 1000
#define MAX_NAME 10
#define MAX_SEX 4
#define MAX_ADDRESS 10
#define MAX_TELE 11

enum OPION
{
	eit,
	add,
	del,
	modfiy,
	search,
	show,
	sort
};

typedef struct ProInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char address[MAX_ADDRESS];
	char tele[MAX_TELE];
	int age;
}ProInfo;

typedef struct contact
{
	ProInfo data[MAX];
	int sz;
}contact;

//初始化
void Initcontact(contact* pc);
//添加
void addconcact(contact* pc);
//顯示
void showcontact(contact* pc);
//刪除
void delcontact(contact* pc);
//修改
void modfiycontact(contact* pc);
//查找
void searchcontact(contact* pc);
//排序
void sortcontact(contact* pc);

contact.c

#include "contact.h"
//初始化
void Initcontact(contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

//增加
void addconcact(contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通迅錄已滿,無(wú)法再添加\n");
		return;
	}
	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].tele);
	printf("住址:\n");
	scanf("%s", pc->data[pc->sz].address);
	pc->sz++;
	printf("添加聯(lián)系人成功\n");
}

//顯示
void showcontact(contact* pc)
{
	printf("%-8s\t%-6s\t%6s\t%-15s\t%-10s\n", "名字", "年齡", "性別", "電話", "住址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n",   pc->data[i].name, 
																					pc->data[i].age,
																					pc->data[i].sex,
																					pc->data[i].tele,
																					pc->data[i].address);
	}
}

//查找
int Findcontact(contact* pc, char* name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		//找到了
		if (strcmp(pc->data[i].name, name) == 0)
			return i;
	}
	//沒(méi)找到
	return -1;
}
//刪除
void delcontact(contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無(wú)法刪除\n");
		return;
	}
	char name[MAX_NAME] = {0};
	printf("輸入要查找的對(duì)象:\n");
	scanf("%s", name);
	int del = Findcontact(pc, name);
	if (del == -1)
	{
		printf("查找的人不存在\n");
		return;
	}

	int i = 0;
	for (i = del; del < pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("刪除成功\n");
}

//修改
void modfiycontact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("請(qǐng)輸入要修改的對(duì)象:\n");
	scanf("%s", name);
	int flag = Findcontact(pc, name);
	if (flag == -1)
	{
		printf("修改對(duì)象不存在,修改失敗\n");
		return;
	}
	printf("姓名:\n");
	scanf("%s", pc->data[flag].name);
	printf("年齡:\n");
	scanf("%d", &(pc->data[flag].age));
	printf("性別:\n");
	scanf("%s", pc->data[flag].sex);
	printf("電話:\n");
	scanf("%s", pc->data[flag].tele);
	printf("住址:\n");
	scanf("%s", pc->data[flag].address);
}

//查找
void searchcontact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("請(qǐng)輸入查找的對(duì)象:\n");
	scanf("%s", name);
	int flag = Findcontact(pc, name);
	if (flag == -1)
	{
		printf("查找失敗\n");
		return;
	}
	printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[flag].name,
		pc->data[flag].age,
		pc->data[flag].sex,
		pc->data[flag].tele,
		pc->data[flag].address);
}
//名字排序
int comper_name(const void* e1, const void* e2)
{
	return strcmp(((ProInfo*)e1)->name, ((ProInfo*)e2)->name);
}
//年齡排序
int comper_age(const void* e1, const void* e2)
{
	return ((ProInfo*)e1)->age - ((ProInfo*)e2)->age;
}
//性別排序
int comper_sex(const void* e1, const void* e2)
{
	return strcmp(((ProInfo*)e1)->sex, ((ProInfo*)e2)->sex);
}
//排序
void sortcontact(contact* pc)
{
	printf("***************************\n");
	printf("1. 名字排序   2. 年齡排序\n");
	printf("3. 性別排序   \n");
	printf("***************************\n");
	printf("請(qǐng)選擇排序方法:");
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_name);
		showcontact(pc);
		printf("排序成功\n");
		break;
	case 2:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_age);
		showcontact(pc);
		printf("排序完成\n");
		break;
	case 3:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_sex);
		showcontact(pc);
		printf("排序完成\n");
		break;
	default:
		printf("選擇錯(cuò)誤\n");
		break;
	}
}

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");
}
void test()
{
	menu();
	int input = 0;
	contact con;
	//初始化通訊錄
	Initcontact(&con);
	do
	{
		printf("請(qǐng)輸入:\n");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			//添加
			addconcact(&con);
			break;
		case del:
			//刪除
			delcontact(&con);
			break;
		case modfiy:
			//修改
			modfiycontact(&con);
			break;
		case search:
			//查找
			searchcontact(&con);
			break;
		case show:
			//顯示
			showcontact(&con);
			break;
		case sort:
			//排序
			sortcontact(&con);
			break;
		case eit:
			printf("退出成功\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

動(dòng)態(tài)版本

上面的版本我們發(fā)現(xiàn)通訊錄是固定的,添加滿后不能繼續(xù)添加,我們需要設(shè)計(jì)一個(gè)可以增容的代碼。

malloc_contact.h

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

#define MAX 2
#define MAX_NAME 10
#define MAX_SEX 4
#define MAX_ADDRESS 10
#define MAX_TELE 11
#define MAX_SZ 2

enum OPION
{
	eit,
	add,
	del,
	modfiy,
	search,
	show,
	sort
};

typedef struct ProInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char address[MAX_ADDRESS];
	char tele[MAX_TELE];
	int age;
}ProInfo;

typedef struct contact
{
	ProInfo* data;
	int sz;
	int max;
}contact;

//初始化
void Initcontact(contact* pc);
//添加
void addconcact(contact* pc);
//顯示
void showcontact(contact* pc);
//刪除
void delcontact(contact* pc);
//修改
void modfiycontact(contact* pc);
//查找
void searchcontact(contact* pc);
//排序
void sortcontact(contact* pc);
//釋放空間
void Destroycontact(contact* pc);

malloc_contact.c

#include "contact.h"
//初始化
void Initcontact(contact* pc)
{
	pc->data = (ProInfo*)malloc(MAX_SZ * sizeof(ProInfo));
	pc->sz = 0;
	pc->max = MAX_SZ;
}

//增加容量
int CheckCapacity(contact* pc)
{
	ProInfo* pf = (ProInfo*)realloc(pc->data, (pc->max + MAX_SZ) * sizeof(ProInfo));
	if (pf == NULL)
	{
		return 0;
	}
	pc->data = pf;
	pc->max += MAX_SZ;
	printf("增容成功\n");
	return 1;
}

//增加
void addconcact(contact* pc)
{
	if (pc->sz == pc->max)
	{
		if (0 == CheckCapacity(pc))
		{
			printf("通訊錄已滿,增容失敗\n");
			return 1;
		}
	}
	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].tele);
	printf("住址:\n");
	scanf("%s", pc->data[pc->sz].address);
	pc->sz++;
	printf("添加聯(lián)系人成功\n");
}

//顯示
void showcontact(contact* pc)
{
	printf("%-8s\t%-6s\t%6s\t%-15s\t%-10s\n", "名字", "年齡", "性別", "電話", "住址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n",   pc->data[i].name, 
																					pc->data[i].age,
																					pc->data[i].sex,
																					pc->data[i].tele,
																					pc->data[i].address);
	}
}

//查找
int Findcontact(contact* pc, char* name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		//找到了
		if (strcmp(pc->data[i].name, name) == 0)
			return i;
	}
	//沒(méi)找到
	return -1;
}
//刪除
void delcontact(contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無(wú)法刪除\n");
		return;
	}
	char name[MAX_NAME] = {0};
	printf("輸入要查找的對(duì)象:\n");
	scanf("%s", name);
	int del = Findcontact(pc, name);
	if (del == -1)
	{
		printf("查找的人不存在\n");
		return;
	}

	int i = 0;
	for (i = del; del < pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("刪除成功\n");
}

//修改
void modfiycontact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("請(qǐng)輸入要修改的對(duì)象:\n");
	scanf("%s", name);
	int flag = Findcontact(pc, name);
	if (flag == -1)
	{
		printf("修改對(duì)象不存在,修改失敗\n");
		return;
	}
	printf("姓名:\n");
	scanf("%s", pc->data[flag].name);
	printf("年齡:\n");
	scanf("%d", &(pc->data[flag].age));
	printf("性別:\n");
	scanf("%s", pc->data[flag].sex);
	printf("電話:\n");
	scanf("%s", pc->data[flag].tele);
	printf("住址:\n");
	scanf("%s", pc->data[flag].address);
}

//查找
void searchcontact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("請(qǐng)輸入查找的對(duì)象:\n");
	scanf("%s", name);
	int flag = Findcontact(pc, name);
	if (flag == -1)
	{
		printf("查找失敗\n");
		return;
	}
	printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[flag].name,
		pc->data[flag].age,
		pc->data[flag].sex,
		pc->data[flag].tele,
		pc->data[flag].address);
}
//名字排序
int comper_name(const void* e1, const void* e2)
{
	return strcmp(((ProInfo*)e1)->name, ((ProInfo*)e2)->name);
}
//年齡排序
int comper_age(const void* e1, const void* e2)
{
	return ((ProInfo*)e1)->age - ((ProInfo*)e2)->age;
}
//性別排序
int comper_sex(const void* e1, const void* e2)
{
	return strcmp(((ProInfo*)e1)->sex, ((ProInfo*)e2)->sex);
}
//排序
void sortcontact(contact* pc)
{
	printf("***************************\n");
	printf("1. 名字排序   2. 年齡排序\n");
	printf("3. 性別排序   \n");
	printf("***************************\n");
	printf("請(qǐng)選擇排序方法:");
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_name);
		showcontact(pc);
		printf("排序成功\n");
		break;
	case 2:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_age);
		showcontact(pc);
		printf("排序完成\n");
		break;
	case 3:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_sex);
		showcontact(pc);
		printf("排序完成\n");
		break;
	default:
		printf("選擇錯(cuò)誤\n");
		break;
	}
}

//釋放空間
void Destroycontact(contact* pc)
{
	free(pc->data);
	pc->data = NULL;
}

malloc_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");
}
void test()
{
	menu();
	int input = 0;
	contact con;
	//初始化通訊錄
	Initcontact(&con);
	do
	{
		printf("請(qǐng)輸入:\n");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			//添加
			addconcact(&con);
			break;
		case del:
			//刪除
			delcontact(&con);
			break;
		case modfiy:
			//修改
			modfiycontact(&con);
			break;
		case search:
			//查找
			searchcontact(&con);
			break;
		case show:
			//顯示
			showcontact(&con);
			break;
		case sort:
			//排序
			sortcontact(&con);
			break;
		case eit:
			Destroycontact(&con);
			printf("退出成功\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

文件版本

上面的代碼雖然可以實(shí)現(xiàn)增容,但是可以發(fā)現(xiàn)一旦程序退出后,下次代碼再運(yùn)行起來(lái)上一次的數(shù)據(jù)就丟失了。我們需要一個(gè)可以一直保存數(shù)據(jù)的代碼。

FILE_contact.h

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

#define MAX 2
#define MAX_NAME 10
#define MAX_SEX 4
#define MAX_ADDRESS 10
#define MAX_TELE 11
#define MAX_SZ 2

enum OPION
{
	eit,
	add,
	del,
	modfiy,
	search,
	show,
	sort
};

typedef struct ProInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char address[MAX_ADDRESS];
	char tele[MAX_TELE];
	int age;
}ProInfo;

typedef struct contact
{
	ProInfo* data;
	int sz;
	int max;
}contact;

//初始化
void Initcontact(contact* pc);
//添加
void addconcact(contact* pc);
//顯示
void showcontact(contact* pc);
//刪除
void delcontact(contact* pc);
//修改
void modfiycontact(contact* pc);
//查找
void searchcontact(contact* pc);
//排序
void sortcontact(contact* pc);
//釋放空間
void Destroycontact(contact* pc);
//保存
void Savecontact(contact* pc);

FILE_contact.c

#include "FILE_contact.h"
//初始化
int CheckCapacity(contact* pc);

void Loadcontact(contact* pc)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("Loadcontact");
		return ;
	}
	ProInfo tmp = { 0 };
	while (fread(&tmp, sizeof(ProInfo), 1, pf))
	{
		if (0 == CheckCapacity(pc))
			return;
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}

	fclose(pf);
	pf = NULL;
}

void Initcontact(contact* pc)
{
	pc->data = (ProInfo*)malloc(MAX_SZ * sizeof(ProInfo));
	pc->sz = 0;
	pc->max = MAX_SZ;
	Loadcontact(pc);
}

//增加容量
int CheckCapacity(contact* pc)
{
	if (pc->sz == pc->max)
	{
		ProInfo* pf = (ProInfo*)realloc(pc->data, (pc->max + MAX_SZ) * sizeof(ProInfo));
		if (pf == NULL)
		{
			return 0;
		}
		pc->data = pf;
		pc->max += MAX_SZ;
		printf("增容成功\n");
		return 1;
	}
	return 1;
}

//增加
void addconcact(contact* pc)
{
		if (0 == CheckCapacity(pc))
		{
			printf("通訊錄已滿,增容失敗\n");
			return 1;
		}
	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].tele);
	printf("住址:\n");
	scanf("%s", pc->data[pc->sz].address);
	pc->sz++;
	printf("添加聯(lián)系人成功\n");
}

//顯示
void showcontact(contact* pc)
{
	printf("%-8s\t%-6s\t%6s\t%-15s\t%-10s\n", "名字", "年齡", "性別", "電話", "住址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].address);
	}
}

//查找
int Findcontact(contact* pc, char* name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		//找到了
		if (strcmp(pc->data[i].name, name) == 0)
			return i;
	}
	//沒(méi)找到
	return -1;
}
//刪除
void delcontact(contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無(wú)法刪除\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("輸入要查找的對(duì)象:\n");
	scanf("%s", name);
	int del = Findcontact(pc, name);
	if (del == -1)
	{
		printf("查找的人不存在\n");
		return;
	}

	int i = 0;
	for (i = del; del < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("刪除成功\n");
}

//修改
void modfiycontact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("請(qǐng)輸入要修改的對(duì)象:\n");
	scanf("%s", name);
	int flag = Findcontact(pc, name);
	if (flag == -1)
	{
		printf("修改對(duì)象不存在,修改失敗\n");
		return;
	}
	printf("姓名:\n");
	scanf("%s", pc->data[flag].name);
	printf("年齡:\n");
	scanf("%d", &(pc->data[flag].age));
	printf("性別:\n");
	scanf("%s", pc->data[flag].sex);
	printf("電話:\n");
	scanf("%s", pc->data[flag].tele);
	printf("住址:\n");
	scanf("%s", pc->data[flag].address);
}

//查找
void searchcontact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("請(qǐng)輸入查找的對(duì)象:\n");
	scanf("%s", name);
	int flag = Findcontact(pc, name);
	if (flag == -1)
	{
		printf("查找失敗\n");
		return;
	}
	printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[flag].name,
		pc->data[flag].age,
		pc->data[flag].sex,
		pc->data[flag].tele,
		pc->data[flag].address);
}
//名字排序
int comper_name(const void* e1, const void* e2)
{
	return strcmp(((ProInfo*)e1)->name, ((ProInfo*)e2)->name);
}
//年齡排序
int comper_age(const void* e1, const void* e2)
{
	return ((ProInfo*)e1)->age - ((ProInfo*)e2)->age;
}
//性別排序
int comper_sex(const void* e1, const void* e2)
{
	return strcmp(((ProInfo*)e1)->sex, ((ProInfo*)e2)->sex);
}
//排序
void sortcontact(contact* pc)
{
	printf("***************************\n");
	printf("1. 名字排序   2. 年齡排序\n");
	printf("3. 性別排序   \n");
	printf("***************************\n");
	printf("請(qǐng)選擇排序方法:");
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_name);
		showcontact(pc);
		printf("排序成功\n");
		break;
	case 2:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_age);
		showcontact(pc);
		printf("排序完成\n");
		break;
	case 3:
		qsort(pc->data, pc->sz, sizeof(ProInfo), comper_sex);
		showcontact(pc);
		printf("排序完成\n");
		break;
	default:
		printf("選擇錯(cuò)誤\n");
		break;
	}
}

//釋放空間
void Destroycontact(contact* pc)
{
	free(pc->data);
	pc->data = NULL;
}

//保存
void Savecontact(contact* pc)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(pc->data+i, sizeof(ProInfo), 1, pf);
	}
	fclose(pf);
	pf = NULL;
}

文件部分:

int CheckCapacity(contact* pc);

void Loadcontact(contact* pc)
{
?? ?FILE* pf = fopen("contact.txt", "rb");
?? ?if (pf == NULL)
?? ?{
?? ??? ?perror("Loadcontact");
?? ??? ?return ;
?? ?}
?? ?ProInfo tmp = { 0 };
?? ?while (fread(&tmp, sizeof(ProInfo), 1, pf))
?? ?{
?? ??? ?if (0 == CheckCapacity(pc))
?? ??? ??? ?return;
?? ??? ?pc->data[pc->sz] = tmp;
?? ??? ?pc->sz++;
?? ?}

?? ?fclose(pf);
?? ?pf = NULL;
}

test.c

#include "FILE_contact.h"

void menu()
{
	printf("---------------------------------------------------\n");
	printf("1.增加                               2.刪除                         \n");
	printf("3.修改                               4.查找                         \n");
	printf("5.顯示                               6.排序                         \n");
	printf("0.退出                                                                 \n");
	printf("---------------------------------------------------\n");
}
void test()
{
	menu();
	int input = 0;
	contact con;
	//初始化通訊錄
	Initcontact(&con);
	do
	{
		printf("請(qǐng)輸入:\n");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			//添加
			addconcact(&con);
			break;
		case del:
			//刪除
			delcontact(&con);
			break;
		case modfiy:
			//修改
			modfiycontact(&con);
			break;
		case search:
			//查找
			searchcontact(&con);
			break;
		case show:
			//顯示
			showcontact(&con);
			break;
		case sort:
			//排序
			sortcontact(&con);
			break;
		case eit:
			Savecontact(&con);
			Destroycontact(&con);
			printf("退出成功\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

總結(jié)

到這里,三個(gè)版本的代碼就已經(jīng)寫完了。其實(shí)總的來(lái)看通訊錄的實(shí)現(xiàn)也不是很很難。就是用到了C中的結(jié)構(gòu)體,動(dòng)態(tài)管理和文件操作。上面的代碼都是對(duì)這些知識(shí)的掌握,學(xué)懂了這三部分的內(nèi)容,想必實(shí)現(xiàn)一個(gè)小小通訊錄對(duì)你來(lái)說(shuō)舉手之勞罷了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-601704.html

到了這里,關(guān)于C語(yǔ)言實(shí)現(xiàn)通訊錄(三合一版本)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • NexNoSQL Client:Elasticsearch、Redis、MongoDB三合一的可視化客戶端管理工具

    NexNoSQL Client:Elasticsearch、Redis、MongoDB三合一的可視化客戶端管理工具

    工作中我們使用了Elasticsearch作為存儲(chǔ),來(lái)支持內(nèi)容的搜索,Elasticsearch這個(gè)軟件大家都耳熟能詳,它是一個(gè)分布式、高擴(kuò)展、高實(shí)時(shí)的搜索與數(shù)據(jù)分析引擎,不僅僅支持文本索引,還支持聚合操作,使用它既可以做數(shù)據(jù)搜索,還可以做報(bào)表分析,非常的方便。 在使用過(guò)程中我

    2024年02月15日
    瀏覽(167)
  • 通訊錄實(shí)現(xiàn)【C語(yǔ)言】

    通訊錄實(shí)現(xiàn)【C語(yǔ)言】

    目錄 前言 一、整體邏輯分析 二、實(shí)現(xiàn)步驟 1、創(chuàng)建菜單和多次操作問(wèn)題 2、創(chuàng)建通訊錄 3、初始化通訊錄 4、添加聯(lián)系人 5、顯示聯(lián)系人 6、刪除指定聯(lián)系人 ?7、查找指定聯(lián)系人 8、修改聯(lián)系人信息 9、排序聯(lián)系人信息 三、全部源碼 我們上期已經(jīng)詳細(xì)的介紹了自定義類型,本

    2024年02月11日
    瀏覽(90)
  • C語(yǔ)言---認(rèn)識(shí)動(dòng)態(tài)內(nèi)存管理并實(shí)現(xiàn)一個(gè)動(dòng)態(tài)通訊錄:靜態(tài)通訊錄別來(lái)沾邊

    C語(yǔ)言---認(rèn)識(shí)動(dòng)態(tài)內(nèi)存管理并實(shí)現(xiàn)一個(gè)動(dòng)態(tài)通訊錄:靜態(tài)通訊錄別來(lái)沾邊

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

    2024年02月08日
    瀏覽(171)
  • 動(dòng)態(tài)通訊錄實(shí)現(xiàn)(C語(yǔ)言)

    動(dòng)態(tài)通訊錄實(shí)現(xiàn)(C語(yǔ)言)

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

    2024年02月05日
    瀏覽(95)
  • 通訊錄(純C語(yǔ)言實(shí)現(xiàn))

    通訊錄(純C語(yǔ)言實(shí)現(xiàn))

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

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

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

    2024年02月15日
    瀏覽(140)
  • C語(yǔ)言進(jìn)階——通訊錄模擬實(shí)現(xiàn)

    C語(yǔ)言進(jìn)階——通訊錄模擬實(shí)現(xiàn)

    ??個(gè)人主頁(yè):_麥麥_ ??今日名言:只有走在路上,才能擺脫局限,擺脫執(zhí)著,讓所有的選擇,探尋,猜測(cè),想象都生機(jī)勃勃。——余秋雨《文化苦旅》 目錄 一、前言 二、正文 1.大體框架 2.界面顯示 3. 創(chuàng)建通訊錄 4.初始化通訊錄 5.增加聯(lián)系人 6.顯示聯(lián)系人 7. 刪除聯(lián)系人 ?

    2024年02月02日
    瀏覽(81)
  • 【C語(yǔ)言】實(shí)現(xiàn)通訊錄(動(dòng)態(tài)+文件)

    【C語(yǔ)言】實(shí)現(xiàn)通訊錄(動(dòng)態(tài)+文件)

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

    2024年02月13日
    瀏覽(78)
  • C語(yǔ)言實(shí)現(xiàn)通訊錄--動(dòng)態(tài)版

    C語(yǔ)言實(shí)現(xiàn)通訊錄--動(dòng)態(tài)版

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

    2024年02月15日
    瀏覽(99)
  • C語(yǔ)言——靜態(tài)通訊錄的實(shí)現(xiàn)

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

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

    2024年01月22日
    瀏覽(93)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包