溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

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

發(fā)布時(shí)間:2023-04-19 11:27:03 來(lái)源:億速云 閱讀:74 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

    1. 配置運(yùn)行環(huán)境

    本通訊錄運(yùn)用到了三個(gè)文件

    test.c //測(cè)試通訊錄的相關(guān)功能

    contact.h //聲明

    contact.c //通訊錄的實(shí)現(xiàn)模塊

    2. 通訊錄的實(shí)現(xiàn)

    想要做通訊錄,首要任務(wù)就是要把模塊想好。

    先打印一個(gè)通訊錄的界面菜單

    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");
    }

    2.1 通訊錄的功能目錄

    通訊錄的功能有7種:

    • 增加聯(lián)系人

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

    • 查找聯(lián)系人

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

    • 對(duì)聯(lián)系人的排序

    • 顯示聯(lián)系人的信息

    • 退出通訊錄

    創(chuàng)建人的信息的結(jié)構(gòu)體類(lèi)型

    第一步是封裝一個(gè)人的信息的結(jié)構(gòu)體類(lèi)型

    由于封裝的結(jié)構(gòu)體類(lèi)型的名字太長(zhǎng),總是寫(xiě)的話(huà)感覺(jué)太麻煩了

    對(duì) struct PeoInfo進(jìn)行了typdef類(lèi)型重命名

    struct PeoInfp 改成 PeoInfp

    //表示一個(gè)人的信息
    typedef struct PeoInfo
    {
    	char name[20];
    	int age;
    	char sex[5];
    	char tele[12];
    	char addr[30];
    }PeoInfo;

    以上的數(shù)值如果以后會(huì)經(jīng)常用到的話(huà),可以用#define 來(lái)定義,方便以后修改

    #define MAX 100
    #define MAX_NAME 20
    #define MAX_SEX 5
    #define MAX_TELE 12
    #define MAX_ADDR 30

    2.2 增加信息功能代碼的實(shí)現(xiàn)

    //增加通訊錄信息
    void AddContact(Contact* pc)
    {
    	if (DATA_MAX == pc->sz)
    	{
    		printf("通訊錄信息存儲(chǔ)空間已滿(mǎn)!\n");
    		return;
    	}
    	printf("請(qǐng)輸入名字:> ");
    	scanf("%s", pc->data[pc->sz].name);
    	printf("請(qǐng)輸入年齡:> ");
    	scanf("%d", &(pc->data[pc->sz].age));
    	printf("請(qǐng)輸入性別:> ");
    	scanf("%s", pc->data[pc->sz].sex);
    	printf("請(qǐng)輸入電話(huà):> ");
    	scanf("%s", pc->data[pc->sz].tele);
    	printf("請(qǐng)輸入住址:> ");
    	scanf("%s", pc->data[pc->sz].addr);
    	printf("信息添加成功!\n");
    	pc->sz++;
    }

    2.3 顯示信息功能代碼的實(shí)現(xiàn)

    void ShowContact(const Contact* pc)
    {
    	int i = 0;
    	//姓名      年齡      性別     電話(huà)      地址
    	//zhangsan 20        男      123456    北京
    	//
    	//打印標(biāo)題
    	printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址");
    	//打印數(shù)據(jù)
    	for (i = 0; i < pc->sz; i++)
    	{
    		printf("%-10s %-4d %-5s %-12s %-30s\n", 
    			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    	}
    }

    2.4 刪除信息功能代碼的實(shí)現(xiàn)

    void DelContact(pContact pc)
    {
    	char name[MAX_NAME] = { 0 };
    	if (pc->sz == 0)
    	{
    		printf("通訊錄為空,無(wú)法刪除\n");
    		return;
    	}
    	//刪除
    	//1. 找到要?jiǎng)h除的人 - 位置(下標(biāo))
    	printf("輸入要?jiǎng)h除人的名字:>");
    	scanf("%s", name);
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要?jiǎng)h除的人不存在\n");
    		return;
    	}
    	int i = 0;
    	//2. 刪除 - 刪除pos位置上的數(shù)據(jù)
    	for (i = pos; i<pc->sz-1; i++)
    	{
    		pc->data[i] = pc->data[i + 1];
    	}
    	pc->sz--;
    	printf("刪除成功\n");
    }

    2.5 查詢(xún)信息功能代碼的實(shí)現(xiàn)

    void SearchContact(const Contact* pc)
    {
    	char name[MAX_NAME] = {0};
    	printf("請(qǐng)輸入要查找人的名字:>");
    	scanf("%s", name);
    	//查找
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要查找的人不存在\n");
    		return;
    	}
    	//打印
    	printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址");
    	//打印數(shù)據(jù)
    	printf("%-10s %-4d %-5s %-12s %-30s\n",
    		pc->data[pos].name,
    		pc->data[pos].age,
    		pc->data[pos].sex,
    		pc->data[pos].tele,
    		pc->data[pos].addr);
    }

    2.6 修改信息功能代碼的實(shí)現(xiàn)

    void ModifyContact(Contact* pc)
    {
    	char name[MAX_NAME] = {0};
    	printf("請(qǐng)輸入要修改人的名字:>");
    	scanf("%s", name);
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要修改的人不存在\n");
    		return;
    	}
    	//修改
    	printf("請(qǐng)輸入名字:>");
    	scanf("%s", pc->data[pos].name);
    	printf("請(qǐng)輸入年齡:>");
    	scanf("%d", &(pc->data[pos].age));
    	printf("請(qǐng)輸入性別:>");
    	scanf("%s", pc->data[pos].sex);
    	printf("請(qǐng)輸入電話(huà):>");
    	scanf("%s", pc->data[pos].tele);
    	printf("請(qǐng)輸入地址:>");
    	scanf("%s", pc->data[pos].addr);
    	printf("修改成功\n");
    }

    2.7 按名字排序信息功能代碼的實(shí)現(xiàn)

    //按照名字來(lái)排序
    int cmp_by_name(const void* e1, const void* e2)
    {
    	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    }
    void SortContact(Contact* pc)
    {
    	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    	printf("排序成功\n");
    }

    3. 完整靜態(tài)版本通訊錄的全部源碼

    3.1 contact.c

    #define _CRT_SECURE_NO_WARNINGS 1
    #include "contact.h"
    void InitContact(Contact* pc)
    {
    	pc->sz = 0;
    	memset(pc->data, 0, sizeof(pc->data));
    }
    void AddContact(Contact* pc)
    {
    	if (pc->sz == MAX)
    	{
    		printf("通訊錄已滿(mǎn),無(wú)法增加\n");
    		return;
    	}
    	printf("請(qǐng)輸入名字:>");
    	scanf("%s", pc->data[pc->sz].name);
    	printf("請(qǐng)輸入年齡:>");
    	scanf("%d", &(pc->data[pc->sz].age));
    	printf("請(qǐng)輸入性別:>");
    	scanf("%s", pc->data[pc->sz].sex);
    	printf("請(qǐng)輸入電話(huà):>");
    	scanf("%s", pc->data[pc->sz].tele);
    	printf("請(qǐng)輸入地址:>");
    	scanf("%s", pc->data[pc->sz].addr);
    	pc->sz++;
    	printf("添加成功\n");
    }
    void ShowContact(const Contact* pc)
    {
    	int i = 0;
    	//姓名      年齡      性別     電話(huà)      地址
    	//hengchuan 20        男      123456    北京
    	//
    	//打印標(biāo)題
    	printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址");
    	//打印數(shù)據(jù)
    	for (i = 0; i < pc->sz; i++)
    	{
    		printf("%-10s %-4d %-5s %-12s %-30s\n",
    			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    	}
    }
    static int FindByName(const Contact* pc, char name[])
    {
    	int i = 0;
    	for (i = 0; i < pc->sz; i++)
    	{
    		if (0 == strcmp(pc->data[i].name, name))
    		{
    			return i;
    		}
    	}
    	return -1;
    }
    void DelContact(pContact pc)
    {
    	char name[MAX_NAME] = { 0 };
    	if (pc->sz == 0)
    	{
    		printf("通訊錄為空,無(wú)法刪除\n");
    		return;
    	}
    	//刪除
    	//1. 找到要?jiǎng)h除的人 - 位置(下標(biāo))
    	printf("輸入要?jiǎng)h除人的名字:>");
    	scanf("%s", name);
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要?jiǎng)h除的人不存在\n");
    		return;
    	}
    	int i = 0;
    	//2. 刪除 - 刪除pos位置上的數(shù)據(jù)
    	for (i = pos; i < pc->sz - 1; i++)
    	{
    		pc->data[i] = pc->data[i + 1];
    	}
    	pc->sz--;
    	printf("刪除成功\n");
    }
    void SearchContact(const Contact* pc)
    {
    	char name[MAX_NAME] = { 0 };
    	printf("請(qǐng)輸入要查找人的名字:>");
    	scanf("%s", name);
    	//查找
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要查找的人不存在\n");
    		return;
    	}
    	//打印
    	printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話(huà)", "地址");
    	//打印數(shù)據(jù)
    	printf("%-10s %-4d %-5s %-12s %-30s\n",
    		pc->data[pos].name,
    		pc->data[pos].age,
    		pc->data[pos].sex,
    		pc->data[pos].tele,
    		pc->data[pos].addr);
    }
    void ModifyContact(Contact* pc)
    {
    	char name[MAX_NAME] = { 0 };
    	printf("請(qǐng)輸入要修改人的名字:>");
    	scanf("%s", name);
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要修改的人不存在\n");
    		return;
    	}
    	//修改
    	printf("請(qǐng)輸入名字:>");
    	scanf("%s", pc->data[pos].name);
    	printf("請(qǐng)輸入年齡:>");
    	scanf("%d", &(pc->data[pos].age));
    	printf("請(qǐng)輸入性別:>");
    	scanf("%s", pc->data[pos].sex);
    	printf("請(qǐng)輸入電話(huà):>");
    	scanf("%s", pc->data[pos].tele);
    	printf("請(qǐng)輸入地址:>");
    	scanf("%s", pc->data[pos].addr);
    	printf("修改成功\n");
    }
    //按照名字來(lái)排序
    int cmp_by_name(const void* e1, const void* e2)
    {
    	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    }
    void SortContact(Contact* pc)
    {
    	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    	printf("排序成功\n");
    }

    3.2 contact.h

    #pragma once
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #define MAX 100
    #define MAX_NAME 20
    #define MAX_SEX 5
    #define MAX_TELE 12
    #define MAX_ADDR 30
    //表示一個(gè)人的信息
    typedef struct PeoInfo
    {
    	char name[MAX_NAME];
    	int age;
    	char sex[MAX_SEX];
    	char tele[MAX_TELE];
    	char addr[MAX_ADDR];
    }PeoInfo;
    //靜態(tài)版本的設(shè)計(jì)
    typedef struct Contact
    {
    	PeoInfo data[MAX];//存放數(shù)據(jù)
    	int sz;//記錄通訊錄中的有效信息個(gè)數(shù)
    }Contact, *pContact;
    //初始化通訊錄
    void InitContact(Contact* pc);
    //增加指定聯(lián)系人
    void AddContact(Contact* pc);
    //顯示聯(lián)系人信息
    void ShowContact(const Contact* pc);
    //刪除指定聯(lián)系人
    //void DelContact(Contact* pc);
    void DelContact(pContact pc);
    //查找指定聯(lián)系人
    void SearchContact(const Contact* pc);
    //修改通訊錄
    void ModifyContact(Contact* pc);
    //排序通訊錄元素
    void SortContact(Contact* pc);

    3.3 test.c

    #define _CRT_SECURE_NO_WARNINGS 1
    #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");
    }
    enum Option
    {
    	EXIT,
    	ADD,
    	DEL,
    	SEARCH,
    	MODIFY,
    	SHOW,
    	SORT
    };
    int main()
    {
    	int input = 0;
    	Contact con;//通訊錄
    	//初始化通訊錄
    	//加載文件的信息到通訊錄中
    	InitContact(&con);
    	do
    	{
    		menu();
    		printf("請(qǐng)選擇:>");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case ADD:
    			AddContact(&con);
    			break;
    		case DEL:
    			DelContact(&con);
    			break;
    		case SEARCH:
    			SearchContact(&con);
    			break;
    		case MODIFY:
    			ModifyContact(&con);
    			break;
    		case SHOW:
    			ShowContact(&con);
    			break;
    		case SORT:
    			SortContact(&con);
    			break;
    		case EXIT:
    			printf("退出通訊錄\n");
    			break;
    		default:
    			printf("選擇錯(cuò)誤\n");
    			break;
    		}
    	} while (input);
    	return 0;
    }

    4. 靜態(tài)版本通訊錄的缺點(diǎn)

    缺點(diǎn):

    通訊錄的大小是固定的 - 100個(gè)元素當(dāng)通訊錄退出后,重新運(yùn)行,之前的信息都丟了

    當(dāng)前通訊錄中的信息都是保存在內(nèi)存中的,程序退出,內(nèi)存就回收了,下一次重新運(yùn)行程序,內(nèi)存重新分配,之前的數(shù)據(jù)就不見(jiàn)了

    到此,關(guān)于“C語(yǔ)言靜態(tài)版通訊錄怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI