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

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

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

目錄

前言

一、整體邏輯分析

二、實現(xiàn)步驟

1、創(chuàng)建菜單和多次操作問題

2、創(chuàng)建通訊錄

3、初始化通訊錄

4、添加聯(lián)系人

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

6、刪除指定聯(lián)系人

?7、查找指定聯(lián)系人

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

9、排序聯(lián)系人信息

三、全部源碼


前言

我們上期已經(jīng)詳細的介紹了自定義類型,本期我們來用學(xué)過的知識來做個小項目來練習(xí)練習(xí)。本期我們將用C語言實現(xiàn)通訊錄靜態(tài)版!后期介紹了動態(tài)內(nèi)存管理和文件操作我們將會在此版本的基礎(chǔ)上進行優(yōu)化改進!

一、整體邏輯分析

我們還和以前實現(xiàn)三子棋和掃雷小項目一樣,先對整體工程的邏輯盡可能詳細的梳理,否則一開就是一頓狂敲,最后一走發(fā)現(xiàn)全是Bug這樣就不好了!我們一開始盡可能的分析清楚,后面即使出現(xiàn)了問題也能快速確定!本期還是和往期一樣采用多文件編程!OK,我們下面一起來梳理一下這個小項目的基本實現(xiàn)邏輯:

1、創(chuàng)建菜單和多次操作問題

2、創(chuàng)建通訊錄

3、通訊錄的初始化以及增刪查改等操作

二、實現(xiàn)步驟

1、創(chuàng)建菜單和多次操作問題

我們期望當(dāng)我們進行對通訊錄操作時可以給我們在進行操作前給一個菜單功能我們操作!考慮到后面還要多次操作通訊錄(增刪查改等)我們結(jié)合起來很快想到用do..while循環(huán)處理最為合理,這里以前寫過兩三遍了我們直接上代碼:

#include"contact.h"

void menu()
{
	printf("*****************************************\n");
	printf("********* 1. add     2. del    **********\n");
	printf("********* 3. search  4. modify **********\n");
	printf("********* 5. show    6. sort   **********\n");
	printf("********* 0. exit              **********\n");
	printf("*****************************************\n");
}

void test()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇操作數(shù):> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//add
			break;
		case 2:
			//del
			break;
		case 3:
			//search
			break;
		case 4:
			//modify
			break;
		case 5:
			//show
			break;
		case 6:
			//sort
			break;
		case 0:
			printf("退出成功!\n");
			break;
		default:
			printf("選擇數(shù)非法!\n");
			break;
		}

	} while (input);
}

int main()
{
	test();
	return 0;
}

看效果:

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

2、創(chuàng)建通訊錄

我們在對通訊錄進行各種操作前先得有個通訊錄吧!通訊錄的本質(zhì)還是描述一個人的屬性例如:姓名、年齡、性別、電話、住址等!這些都是不同的類型,我們很容易想到用結(jié)構(gòu)體就能解決!但這只是描述一個人,你的通訊錄不可能只有一個人吧應(yīng)該是有很多個!而這些聯(lián)系人又是同一類型,因此采用結(jié)構(gòu)體數(shù)組來創(chuàng)建通訊錄!

typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[15];
	char addr[20];
}PeoInfo;

這就是描述一個人基本屬性的結(jié)構(gòu)體!當(dāng)創(chuàng)建好了這個結(jié)構(gòu)體后,我們就可以在test.c這個文件中do..while循環(huán)那里可以創(chuàng)建結(jié)構(gòu)體數(shù)組來作為通訊錄了!

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

但這樣寫會有個問題就是,當(dāng)你存入或刪除聯(lián)系人后想打印出來看看是此時通訊錄中的聯(lián)系人時應(yīng)該打印多少?我們還想不知道。所以這里我們還得再定義一個變量sz來記錄通訊錄的大??!

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

其實我們發(fā)現(xiàn),sz不僅是可以記錄通訊錄的大小,而且增加聯(lián)系人的時候只需要增加到sz位置即可,增加一個sz++,當(dāng)刪除一個sz--;這樣其實?sz和通訊錄是綁定在一起的,我們不妨在對通訊錄進行一層封裝,把他也封裝成一個結(jié)構(gòu)體,一個成員是PeoInfo結(jié)構(gòu)體數(shù)組,一個是記錄通訊錄大小的sz:

typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[15];
	char addr[20];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[100];
	int sz;
}Contact;

然后再在test.c文件中創(chuàng)建即可!

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

OK!這個創(chuàng)建通訊錄記好了!其實這里還可已在稍微優(yōu)化一下:我們發(fā)現(xiàn)兩個結(jié)構(gòu)體中都出現(xiàn)了大量的常數(shù),我們?nèi)f一后期需求有變,這些都得改!因此為了后期修改方便,我們把這些都改成#define的常量,后期修改起來容易!這里你可能會說上期不是介紹了枚舉嗎,這里正好是多個常量枚舉不是更好嗎?這里枚舉確實可以達到目的,但枚舉是在沒開始前就能列舉出來所有可能,我們這個可不是!所以,這里不用枚舉!

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 15
#define ADDR_MAX 20
#define MAX 100

typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact;

這樣才是當(dāng)前邏輯下的最優(yōu)代碼!

3、初始化通訊錄

當(dāng)我們創(chuàng)建好了通訊錄后我們先對其進行一個初始化!把結(jié)構(gòu)體數(shù)組的每個元素都初始化為0,通訊錄大小也置為0!因為我們要改變結(jié)構(gòu)體的內(nèi)容所以應(yīng)該傳地址!我們這里采用的是memset這個函數(shù)直接初始化為0,也可以用個循環(huán)來初始化!不了解memset的點擊memset

void InitContact(Contact* pc)
{
	assert(pc);

	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

4、添加聯(lián)系人

我們前面已經(jīng)說過了,只需要在sz的位置增加即可!但要考慮通訊錄滿的情況!

void AddContact(Contact* pc) 
{
	assert(pc);
	//通訊錄已滿
	if (pc->sz == MAX)
	{
		printf("通訊錄已滿,無法添加!\n");
		return;
	}

	//添加聯(lián)系人
	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].tele);
	printf("請輸入聯(lián)系人住址:> ");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;

	printf("添加成功!\n");
}

OK,我們下面先來寫一個顯示聯(lián)系人,來驗證一下是否添加成功!

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

顯示聯(lián)系人就是把通訊錄中的聯(lián)系人打印在控制臺!

void ShowContact(Contact* pc)
{
	assert(pc);

	printf("%-s\t%-s\t%-5s\t%-15s\t%-20s\n", "姓名", "年齡", "性別", "電話", "住址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-s\t%-d\t%-5s\t%-15s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr
		);
	}
}

OK,我們來看看是否添加成功以及顯示聯(lián)系人!

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

OK,添加聯(lián)系人和顯示聯(lián)系人都成功了!說明我們上面邏輯沒有問題!

6、刪除指定聯(lián)系人

我們輸入要刪除的人的姓名,進行查找,找到了刪除,否則輸出沒有此聯(lián)系人!注意考慮通訊錄為空的情況!這里提到了查找,這個查找和通訊錄的那個查找有點不一樣,這個是查找后返回下標(biāo)即可,那個是還要打印聯(lián)系人信息功能不一樣。因此我們單獨在封裝一個函數(shù)!

//查找要刪除的人并返回下標(biāo)
int FindContact(const Contact* pc, const char* name)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到了
		}
	}

	return -1;//沒找到
}

//刪除聯(lián)系人
void DelContact(Contact* pc)
{
	assert(pc);
    //通訊錄為空
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法刪除!\n");
		return;
	}

	char name[NAME_MAX] = { 0 };
	printf("請輸入要刪除人的姓名:> ");
	scanf("%s", name);

	int pos = FindContact(pc, name);

	if (pos != -1)
	{
		//刪除
		for (int i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}

		pc->sz--;
		printf("成功刪除聯(lián)系人!\n");
	}
	else
	{
		printf("沒有此聯(lián)系人!\n");
	}
}

這里要注意的是比較字符串要用strcmp,不能用 == 這個我們在字符串函數(shù)和內(nèi)存函數(shù)那一期詳細介紹過!另外注意刪除的時候那里下標(biāo)越界問題!

看效果:

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言?7、查找指定聯(lián)系人

查找指定聯(lián)系人還是先按指定方式進行查找, 找到了打印,否則輸出沒有此聯(lián)系人!這里顯示一個聯(lián)系人的這個里后面修改聯(lián)系人也可能要用所以我們?yōu)榱朔奖惆阉庋b成一個函數(shù)后面直接調(diào)用即可!


//顯示單個聯(lián)系人信息
void Print(const Contact* pc, int pos)
{
	assert(pc);

	printf("%-s\t%-s\t%-5s\t%-15s\t%-20s\n", "姓名", "年齡", "性別", "電話", "住址");

	printf("%-s\t%-d\t%-5s\t%-15s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);

}

//查找指定聯(lián)系人
void Search(const Contact* pc)
{
	assert(pc);

	char name[NAME_MAX] = { 0 };
	printf("請輸入要查找聯(lián)系人姓名:> ");
	scanf("%s", name);

	int pos = -1;//初始化為-1表示沒有此聯(lián)系人
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			pos = i;//找到了
			break;
		}
	}

	if (pos != -1)
	{
		Print(pc, pos);
	}
	else
	{
		printf("沒有此聯(lián)系人!\n");
	}
}

其實還可以在簡潔一點,上面已經(jīng)實現(xiàn)了FindContact我們可以用一下:

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

	char name[NAME_MAX] = { 0 };
	printf("請輸入要查找聯(lián)系人姓名:> ");
	scanf("%s", name);

	int pos = FindContact(pc, name);

	if (pos != -1)
	{
		Print(pc, pos);
	}
	else
	{
		printf("沒有此聯(lián)系人!\n");
	}
}

看效果:

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

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

修改聯(lián)系人信息這塊就有很多可能,比如只修改一項例如名字或性別等,也有可能修改多項例如名字、年齡等,也有可能得全部修改這幾種情況。當(dāng)我們要修改之前群毆我們能還是期望有一個菜單供我們選擇,當(dāng)修改完一項后我們可能還要繼續(xù)修改?;诖宋覀儾捎煤蛅est.c文件中得do...while循環(huán)+菜單!

//修改聯(lián)系人信息菜單
void menu1()
{
    system("cls");
	printf("*****************************************\n");
	printf("********* 1. name     2. age   **********\n");
	printf("********* 3. sex      4. tele  **********\n");
	printf("********* 5. addr     6. all   **********\n");
	printf("********* 0. exit              **********\n");
	printf("*****************************************\n");
}

//修改名字
void ModName(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人姓名:> ");
	scanf("%s", pc->data[ret].name);
	printf("修改成功!\n");
}

//修改年齡
void ModAge(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人年齡:> ");
	scanf("%d", &pc->data[ret].age);
	printf("修改成功!\n");
}

//修改性別
void ModSex(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人性別:> ");
	scanf("%s", &pc->data[ret].sex);
	printf("修改成功!\n");
}

//修改電話
void ModTele(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人電話:> ");
	scanf("%s", &pc->data[ret].tele);
	printf("修改成功!\n");
}

//修改住址
void ModAddr(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人住址:> ");
	scanf("%s", &pc->data[ret].addr);
	printf("修改成功!\n");
}


void ModAll(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入聯(lián)系人姓名:> ");
	scanf("%s", pc->data[ret].name);
	printf("請輸入聯(lián)系人年齡:> ");
	scanf("%d", &pc->data[ret].age);
	printf("請輸入聯(lián)系人性別:> ");
	scanf("%s", pc->data[ret].sex);
	printf("請輸入聯(lián)系人電話:> ");
	scanf("%s", pc->data[ret].tele);
	printf("請輸入聯(lián)系人住址:> ");
	scanf("%s", pc->data[ret].addr);
	
	printf("修改成功!\n");
}


//修改聯(lián)系人
void ModContact(Contact* pc)
{
	assert(pc);
	//判斷是否為空
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法修改!\n");
		return;
	}

	char name[NAME_MAX] = { 0 };
	printf("請輸入要修改系人姓名:> ");
	scanf("%s", name);
	//判斷是否有該聯(lián)系人
	int ret = FindContact(pc, name);
	
	//有該聯(lián)系人
	if (ret != -1)
	{
		int n = 0;
		do
		{
			menu1();
			printf("請選擇修改內(nèi)容:> ");
			scanf("%d", &n);
			//修改
			switch (n)
			{
			case 1:
				ModName(pc,ret);
				break;
			case 2:
				ModAge(pc, ret);
				break;
			case 3:
				ModSex(pc, ret);
				break;
			case 4:
				ModTele(pc, ret);
				break;
			case 5:
				ModAddr(pc, ret);
				break;
			case 6:
				ModAll(pc, ret);
				break;
			case 0:
				printf("修改結(jié)束!\n");
				break;
			default:
				printf("選擇數(shù)非法!\n");
				break;
			}

		} while (n);
	}
	else
	{
		printf("沒有此聯(lián)系人!\n");
	}
}

看效果:(小編做了清屏)

修改前:

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

?修改后:

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

OK,還是比較成功的!我們再來進行對他實現(xiàn)一下排序!

9、排序聯(lián)系人信息

我們上面已經(jīng)實現(xiàn)了通訊錄的增刪查改的基本功能!我們想讓他再有一個排序功能,比如按名字排序,或年齡排序!我們在指針進階那塊介紹過回調(diào)函數(shù),這里我們用qsort進行對通訊錄排序!我們期望還是和上面一樣一開始有個菜單選擇!


//排序菜單
void menu2()
{
	system("cls");
	printf("**********************************\n");
	printf("***** 1. name    2. age **********\n");
	printf("**********************************\n");
}

//名字比較函數(shù)
int cmp_name(const void* str1, const void* str2)
{
	//return strcmp(((PeoInfo*)str1)->name, ((PeoInfo*)str2)->name);
	return strcmp((((Contact*)str1)->data)->name, (((Contact*)str2)->data)->name);
}

//名字排序
void SortName(Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
}

//年齡比較函數(shù)
int cmp_age(const void* str1, const void* str2)
{

	//return ((PeoInfo*)str1)->age - ((PeoInfo*)str2)->age;
	return (((Contact*)str1)->data)->age - (((Contact*)str2)->data)->age;
}
//年齡排序
void SortAge(Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_age);
}

//排序聯(lián)系人信息
void SortContact(Contact* pc)
{
	assert(pc);
	//判斷為空
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法排序!\n");
		Sleep(3000);
		system("cls");
		return;
	}


	menu2();
	int n = 0;
	printf("請選擇排序方式:> ");
	scanf("%d", &n);
	//排序
	switch (n)
	{
	case 1:
		SortName(pc);
		system("cls");
		printf("排序成功!\n");
		break;
	case 2:
		SortAge(pc);
		system("cls");
		printf("排序成功!\n");
		break;
	default:
		printf("選擇數(shù)非法!\n");
		Sleep(3000);
		system("cls");
		break;
	}
}

看效果:

排序前(年齡):

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

?排序后(年齡):

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

排序前(名字):

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

?排序后(名字):

通訊錄實現(xiàn)【C語言】,C語言從入門到進階,c語言

OK,實現(xiàn)了排序!

三、全部源碼

?contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<windows.h>

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 15
#define ADDR_MAX 20
#define MAX 100

typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact;


//初始化通訊錄
void InitContact(Contact* pc);

//添加聯(lián)系人
void AddContact(Contact* pc);

//顯示聯(lián)系人
void ShowContact(const Contact* pc);

//刪除聯(lián)系人
void DelContact(Contact* pc);

//查找指定聯(lián)系人
void Search(const Contact* pc);

//修改聯(lián)系人
void ModContact(Contact* pc);

//排序聯(lián)系人信息
void SortContact(Contact* pc);


contact.c

#include"contact.h"

//初始化通訊錄
void InitContact(Contact* pc)
{
	assert(pc);

	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

//增加聯(lián)系人
void AddContact(Contact* pc) 
{
	assert(pc);
	//通訊錄已滿
	if (pc->sz == MAX)
	{
		printf("通訊錄已滿,無法添加!\n");
		Sleep(2000);
		return;
	}

	//添加聯(lián)系人
	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].tele);
	printf("請輸入聯(lián)系人住址:> ");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;

	printf("添加成功!\n");
	Sleep(1000);
}

//顯示聯(lián)系人
void ShowContact(const Contact* pc)
{
	assert(pc);

	printf("%-s\t%-s\t%-5s\t%-15s\t%-20s\n", "姓名", "年齡", "性別", "電話", "住址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-s\t%-d\t%-5s\t%-15s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr
		);
	}
}


//查找要刪除的人并返回下標(biāo)
int FindContact(const Contact* pc, const char* name)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到了
		}
	}

	return -1;//沒找到
}

//刪除聯(lián)系人
void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法刪除!\n");
		Sleep(2000);
		return;
	}

	char name[NAME_MAX] = { 0 };
	printf("請輸入要刪除人的姓名:> ");
	scanf("%s", name);

	int pos = FindContact(pc, name);

	if (pos != -1)
	{
		//刪除
		for (int i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}

		pc->sz--;
		printf("成功刪除聯(lián)系人!\n");
		Sleep(1000);
	}
	else
	{
		printf("沒有此聯(lián)系人!\n");
		Sleep(2000);
	}
}



//顯示單個聯(lián)系人信息
void Print(const Contact* pc, int pos)
{
	assert(pc);

	printf("%-s\t%-s\t%-5s\t%-15s\t%-20s\n", "姓名", "年齡", "性別", "電話", "住址");

	printf("%-s\t%-d\t%-5s\t%-15s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);

}

//查找指定聯(lián)系人
void Search(const Contact* pc)
{
	assert(pc);

	char name[NAME_MAX] = { 0 };
	printf("請輸入要查找聯(lián)系人姓名:> ");
	scanf("%s", name);

	int pos = FindContact(pc, name);
	if (pos != -1)
	{
		Print(pc, pos);
	}
	else
	{
		printf("沒有此聯(lián)系人!\n");
		Sleep(2000);
		system("cls");
	}
}


//修改聯(lián)系人信息菜單
void menu1()
{
	system("cls");
	printf("*****************************************\n");
	printf("********* 1. name     2. age   **********\n");
	printf("********* 3. sex      4. tele  **********\n");
	printf("********* 5. addr     6. all   **********\n");
	printf("********* 0. exit              **********\n");
	printf("*****************************************\n");
}

//修改名字
void ModName(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人姓名:> ");
	scanf("%s", pc->data[ret].name);
}

//修改年齡
void ModAge(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人年齡:> ");
	scanf("%d", &pc->data[ret].age);
}

//修改性別
void ModSex(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人性別:> ");
	scanf("%s", &pc->data[ret].sex);
}

//修改電話
void ModTele(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人電話:> ");
	scanf("%s", &pc->data[ret].tele);
}

//修改住址
void ModAddr(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入修改后聯(lián)系人住址:> ");
	scanf("%s", &pc->data[ret].addr);
}


void ModAll(Contact* pc, int ret)
{
	assert(pc);

	printf("請輸入聯(lián)系人姓名:> ");
	scanf("%s", pc->data[ret].name);
	printf("請輸入聯(lián)系人年齡:> ");
	scanf("%d", &pc->data[ret].age);
	printf("請輸入聯(lián)系人性別:> ");
	scanf("%s", pc->data[ret].sex);
	printf("請輸入聯(lián)系人電話:> ");
	scanf("%s", pc->data[ret].tele);
	printf("請輸入聯(lián)系人住址:> ");
	scanf("%s", pc->data[ret].addr);
}


//修改聯(lián)系人
void ModContact(Contact* pc)
{
	assert(pc);
	//判斷是否為空
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法修改!\n");
		Sleep(2000);
		system("cls");
		return;
	}

	char name[NAME_MAX] = { 0 };
	printf("請輸入要修改系人姓名:> ");
	scanf("%s", name);
	//判斷是否有該聯(lián)系人
	int ret = FindContact(pc, name);
	
	//有該聯(lián)系人
	if (ret != -1)
	{
		int n = 0;
		do
		{
			menu1();
			Print(pc, ret);
			printf("請選擇修改內(nèi)容:> ");
			scanf("%d", &n);
			//修改
			switch (n)
			{
			case 1:
				ModName(pc,ret);
				break;
			case 2:
				ModAge(pc, ret);
				break;
			case 3:
				ModSex(pc, ret);
				break;
			case 4:
				ModTele(pc, ret);
				break;
			case 5:
				ModAddr(pc, ret);
				break;
			case 6:
				ModAll(pc, ret);
				break;
			case 0:
				printf("修改結(jié)束!\n");
				Sleep(2000);
				system("cls");
				break;
			default:
				printf("選擇數(shù)非法!\n");
				Sleep(2000);
				system("cls");
				break;
			}

		} while (n);
	}
	else
	{
		printf("沒有此聯(lián)系人!\n");
		Sleep(2000);
		system("cls");
	}
}

//排序菜單
void menu2()
{
	system("cls");
	printf("**********************************\n");
	printf("***** 1. name    2. age **********\n");
	printf("**********************************\n");
}

//名字比較函數(shù)
int cmp_name(const void* str1, const void* str2)
{
	return strcmp(((PeoInfo*)str1)->name, ((PeoInfo*)str2)->name);
}

//名字排序
void SortName(Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
}

//年齡比較函數(shù)
int cmp_age(const void* str1, const void* str2)
{

	return ((PeoInfo*)str1)->age - ((PeoInfo*)str2)->age;
}
//年齡排序
void SortAge(Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_age);
}

//排序聯(lián)系人信息
void SortContact(Contact* pc)
{
	assert(pc);
	//判斷為空
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法排序!\n");
		Sleep(3000);
		system("cls");
		return;
	}


	menu2();
	int n = 0;
	printf("請選擇排序方式:> ");
	scanf("%d", &n);
	//排序
	switch (n)
	{
	case 1:
		SortName(pc);
		system("cls");
		printf("排序成功!\n");
		break;
	case 2:
		SortAge(pc);
		system("cls");
		printf("排序成功!\n");
		break;
	default:
		printf("選擇數(shù)非法!\n");
		Sleep(3000);
		system("cls");
		break;
	}
}

test.c

#include"contact.h"

void menu()
{
	printf("*****************************************\n");
	printf("********* 1. add     2. del    **********\n");
	printf("********* 3. search  4. modify **********\n");
	printf("********* 5. show    6. sort   **********\n");
	printf("********* 0. exit              **********\n");
	printf("*****************************************\n");
}

void test()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("請選擇操作數(shù):> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			system("cls");
			break;
		case 2:
			DelContact(&con);
			system("cls"); 
			break;
		case 3:
			system("cls");
			Search(&con);
			break;
		case 4:
			ModContact(&con);
			break;
		case 5:
			system("cls");
			ShowContact(&con);
			break;
		case 6:
			SortContact(&con);
			break;
		case 0:
			printf("退出成功!\n");
			break;
		default:
			printf("選擇數(shù)非法!\n");
			break;
		}

	} while (input);
}

int main()
{
	test();
	return 0;
}

OK,本期分享就到這里!好兄弟,我們下期再見!文章來源地址http://www.zghlxwxcb.cn/news/detail-665490.html

到了這里,關(guān)于通訊錄實現(xiàn)【C語言】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 通訊錄實現(xiàn)【C語言】

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

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

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

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

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

    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日
    瀏覽(140)
  • 動態(tài)通訊錄實現(xiàn)(C語言)

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

    目錄 前言: 一:單個節(jié)點的設(shè)計和主邏輯? 結(jié)點設(shè)計 主邏輯 二:接口實現(xiàn) (1)生成一個新的結(jié)點 (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)版通訊錄

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

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

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

    在之前三子棋和掃雷的基礎(chǔ)上,本篇文章博主將給大家逐步分析實現(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)版本的基礎(chǔ)上改用動態(tài)的方法: (1)默認能夠存放三個人的信息 (2)不夠的話,每次增加兩個人的信息 2.其他功能不變 建立三個文件: test.c 用于測試通訊錄的相關(guān)功能 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)通訊錄(文件版)

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

    2024年02月01日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包