用C語(yǔ)言實(shí)現(xiàn)通訊錄
相信大家都見(jiàn)識(shí)過(guò)通訊錄,通訊錄里面一般有的內(nèi)容為姓名,聯(lián)系方式,年齡等信息。通訊錄的主要功能有:增加、刪除、查找、排序、修改、展示等操作。
那么具體應(yīng)該用C語(yǔ)言怎么實(shí)現(xiàn)這個(gè)呢?接下來(lái)我們大家一起來(lái)看一下,一起用前一段時(shí)間所學(xué)習(xí)的C語(yǔ)言相關(guān)知識(shí)來(lái)看看!
1. 先定義主函數(shù)
Contact.h
里面聲明通訊錄所要實(shí)現(xiàn)的功能,第一次的功能可能考慮不全。沒(méi)關(guān)系,可以在想要某個(gè)功能時(shí)再添加即可。
#define _CRT_SECURE_NO_WARNINGS 1 #ifndef __CONTACT_H_ #define __CONTACT_H_ #include<stdio.h> #include<stdlib.h> #include<string.h> #define DEFAULT_SZ 3//初始通訊錄大小 enum CHOOSE//選擇功能 { ? ? EXIT, ? ? ADD, ? ? DEL, ? ? SHOW, ? ? FIND, ? ? SORT, ? ? MODIFY, }; typedef struct CONTACT//結(jié)構(gòu)體:每個(gè)成員的信息 { ? ? char name[20]; ? ? int age; ? ? char phone[12]; }PeoInfo; typedef struct Contact//結(jié)構(gòu)體:將成員信息封裝 { ? ? PeoInfo* data; ?//柔性指針 ? ? int count; ?//當(dāng)前個(gè)數(shù) ? ? int capacity;//最大容量 }Contact, *pContact; //通訊錄的主要功能 void AddCintact(pContact pc);//增加信息 void InitContact(pContact pc);//初始化通訊錄 void ShowContact(pContact pc);//展示通訊錄 void DelContact(pContact pc);//刪除通訊錄 void FindContact(pContact pc);//查找 void DestroyContact(pContact pc);//銷毀通訊錄 void ModifyContact(pContact pc);//修改通訊錄信息 void SortContact(pContact pc);//排序通訊錄 #endif //CONTACT
2.接下來(lái)就是通訊錄的選擇界面
main.c
里面主要是該通訊錄的選擇界面。
#include"Contact.h" #include"bubble_sort.h" void menu() { ? ? int choose = 0; ? ? printf("+-------------------------------+\n"); ? ? printf("| ? 1.Add ? ? ? ?2.Del ? ? ? ? ?|\n"); ? ? printf("| ? 3.Show ? ? ? 4.Find ? ? ? ? |\n"); ? ? printf("| ? 5.Sort ? ? ? 6.Modify ? ? ? |\n"); ? ? printf("| ? ? ? ?0.Exit ? ? ? ? ? ? ? ? |\n"); ? ? printf("+-------------------------------+\n"); } int main() { ? ? int choose = 0; ? ? Contact my_con; ? ? InitContact(&my_con);? ? ? do ? ? { ? ? ? ? menu(); ? ? ? ? printf("請(qǐng)選擇要進(jìn)行的操作:\n"); ? ? ? ? scanf_s("%d", &choose); ? ? ? ? switch (choose) ? ? ? ? { ? ? ? ? case ADD: ? ? ? ? ? ? AddContact(&my_con); ? ? ? ? ? ? break; ? ? ? ? case DEL: ? ? ? ? ? ? DelContact(&my_con); ? ? ? ? ? ? break; ? ? ? ? case SHOW: ? ? ? ? ? ? ShowContact(&my_con); ? ? ? ? ? ? break; ? ? ? ? case FIND: ? ? ? ? ? ? FindContact(&my_con); ? ? ? ? ? ? break; ? ? ? ? case SORT: ? ? ? ? ? ? SortContact(&my_con); ? ? ? ? ? ? break; ? ? ? ? case MODIFY: ? ? ? ? ? ? ModifyContact(&my_con); ? ? ? ? ? ? break; ? ? ? ? case EXIT: ? ? ? ? ? ? DestroyContact(&my_con); ? ? ? ? ? ? break; ? ? ? ? default: ? ? ? ? ? ? printf("請(qǐng)重新選擇!\n"); ? ? ? ? ? ? break; ? ? ? ? } ? ? } while (choose); ? ? system("pause"); ? ? return 0; }
3.剩下的就是通訊錄主要函數(shù)的具體實(shí)現(xiàn)
test.c
#include"Contact.h" #include"bubble_sort.h" void InitContact(pContact pc)//初始化通訊錄 { ? ? pc->count = 0; ? ? pc->capacity = DEFAULT_SZ; ? ? pc->data =(PeoInfo *) calloc(sizeof(PeoInfo),pc->capacity); } void check_capacity(pContact pc)//檢查通訊錄空間 { ? ? PeoInfo* p = (PeoInfo *)realloc(pc->data, (pc->capacity + 2)*sizeof(PeoInfo)); ? ? if (p != NULL) ? ? { ? ? ? ? pc->data = p; ? ? ? ? p = NULL; ? ? } ? ? pc->capacity += 2; ? ? printf("增容成功!\n"); } void AddContact(pContact pc)//增加信息 { ? ? char c = 0; ? ? if (pc->count == pc->capacity) ? ? { ? ? ? ? printf("通訊錄已滿!\n"); ? ? ? ? printf("請(qǐng)問(wèn)是否增容:(Y \\ N)\n"); ? ? ? ? getchar(); ? ? ? ? scanf("%c", &c); ? ? ? ? if (c == 'Y') ? ? ? ? { ? ? ? ? ? ? check_capacity(pc); ? ? ? ? } ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? return; ? ? ? ? } ? ? } ? ? printf("請(qǐng)輸入名字:"); ? ? scanf("%s", pc->data[pc->count].name); ? ? printf("請(qǐng)輸入年齡:"); ? ? scanf("%d", &(pc->data[pc->count].age)); ? ? printf("請(qǐng)輸入電話:"); ? ? scanf("%s", pc->data[pc->count].phone); ? ? pc->count++; ? ? printf("添加成功!\n"); } void ShowContact(pContact pc)//展示通訊錄 { ? ? int i = 0; ? ? if (pc->count == 0) ? ? { ? ? ? ? printf("通訊錄為空!\n"); ? ? ? ? return; ? ? } ? ? printf("%7s %5s %10s\n","姓名","年齡","電話"); ? ? for (i = 0; i < pc->count; i++) ? ? { ? ? ? ? printf("%7s %5d %10s\n", pc->data[i].name, pc->data[i].age, pc->data[i].phone); ? ? } ? ? printf("--------------------------\n"); } int FindEntry(char name[],pContact pc)//查找 { ? ? int i = 0; ? ? for (i = 0; i < pc->count; i++) ? ? { ? ? ? ? if (strcmp(pc->data[i].name, name) == 0) ? ? ? ? { ? ? ? ? ? ? return i; ? ? ? ? } ? ? } ? ? return -1; } void DelContact(pContact pc)//刪除通訊錄 { ? ? char name[20] = { 0 }; ? ? int pos = 0; ? ? int i = 0; ? ? if (pc->count == 0) ? ? { ? ? ? ? printf("通訊錄為空!\n"); ? ? ? ? return ; ? ? } ? ? //1.查找 ? ? printf("要查找的人的名字:"); ? ? scanf("%s", name); ? ? pos = FindEntry(name,pc); ? ? if (pos == -1) ? ? { ? ? ? ? printf("要?jiǎng)h除的人不存在!\n"); ? ? ? ? return ; ? ? } ? ? //2.刪除 ? ? for (i = pos; i < pc->count-1;i++) ? ? { ? ? ? ? pc->data[i] = pc->data[i + 1]; ? ? } ? ? pc->count--; ? ? printf("刪除成功!\n"); } void FindContact(pContact pc)//查找 { ? ? int n = 0; ? ? char name[20] = { 0 }; ? ? printf("請(qǐng)輸入要查找的人名:\n"); ? ? scanf("%s", name); ? ? n = FindEntry(name,pc); ? ? if (n >= 0) ? ? { ? ? ? ? printf("%s ? ? %d ? ? ?%s\n", pc->data[n].name, pc->data[n].age, pc->data[n].phone); ? ? } ? ? else if (n = -1) ? ? { ? ? ? ? printf("查無(wú)此人!\n"); ? ? } } void DestroyContact(pContact pc)//銷毀通訊錄 { ? ? free(pc->data); ? ? pc->data = NULL; ? ? pc->count = 0; ? ? pc->capacity = 0; ? ? printf("成功銷毀!\n"); } void ModifyContact(pContact pc)//修改通訊錄信息 { ? ? char name[20] = { 0 }; ? ? int n = 0; ? ? printf("請(qǐng)輸入要修改的人名:\n"); ? ? scanf("%s", name); ? ? if (n >= 0) ? ? { ? ? ? ? n = FindEntry(name, pc); ? ? ? ? printf("請(qǐng)輸入名字:"); ? ? ? ? scanf("%s", pc->data[n].name); ? ? ? ? printf("請(qǐng)輸入年齡:"); ? ? ? ? scanf("%d", &(pc->data[n].age)); ? ? ? ? printf("請(qǐng)輸入電話:"); ? ? ? ? scanf("%s", pc->data[n].phone); ? ? } ? ? else ? ? { ? ? ? ? printf("查無(wú)此人!\n"); ? ? } ? ? printf("修改成功!\n"); } //通訊錄的排序 void Menu() { ? ? printf("請(qǐng)選擇按照何種方式排序:\n"); ? ? printf("1.姓名 ? ? ?2.年齡 ? ? ?\n"); ? ? printf(" ? ? ?0.exit ? ? ? ? ? ?\n"); } void SortContact(pContact pc) { ? ? int input = 0; ? ? ? ? Menu(); ? ? ? ? scanf("%d", &input); ? ? ? ? switch (input) ? ? ? ? { ? ? ? ? case 1: ? ? ? ? ? ? bubble_sort(pc->data,pc->count, sizeof(PeoInfo),cmp_name); ? ? ? ? ? ? break; ? ? ? ? case 2: ? ? ? ? ? ? bubble_sort(pc->data, pc->count, sizeof(PeoInfo), cmp_age); ? ? ? ? ? ? break; ? ? ? ? case 0: ? ? ? ? ? ? break; ? ? ? ? default: ? ? ? ? ? ? printf("請(qǐng)重新選擇!\n"); ? ? ? ? } ? ? ? ? printf("排序成功!\n"); }
4.可以發(fā)現(xiàn),上面我們的通訊錄的排序函數(shù)還沒(méi)有具體實(shí)現(xiàn)。這里用冒泡排序?qū)崿F(xiàn)。
bubble_sort.h
#ifndef __BUBBLESORT_H_ #define __BUBBLESORT_H_ #include<stdlib.h> #include<stdio.h> void bubble_sort(void * base, int sz, int width, int(*cmp)(const void* e1, const void *e2)); void swap(char *buf1, char ?*buf2, int width); int cmp_name(const void *e1, const void *e2); int cmp_age(const void *e1, const void *e2); #endif //__BUBBLESORT_H__
bubble.c
#include"bubble_sort.h" #include"Contact.h" void swap(char *buf1, char ?*buf2, int width) { ? ? int i = 0; ? ? for (i = 0; i < width; i++) ? ? { ? ? ? ? char tmp = *buf1; ? ? ? ? *buf1 = *buf2; ? ? ? ? *buf2 = tmp; ? ? ? ? buf1++; ? ? ? ? buf2++; ? ? } } int cmp_name(const void *e1, const void *e2) { ? ? return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } int cmp_age(const void *e1, const void *e2) { ? ? return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age; } void bubble_sort(void * base, int sz, int width, int(*cmp)(const void* e1, const void *e2)) { ? ? int i = 0; ? ? int j = 0; ? ? for (i = 0; i < sz - 1; i++) ? ? { ? ? ? ? for (j = 0; j < sz - 1 - i; j++) ? ? ? ? { ? ? ? ? ? ? if (cmp((char*)base+width*j, (char*)base+width*(j+1))>0) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //交換 ? ? ? ? ? ? ? ? swap((char *)base + width*j, (char*)base + width*(j + 1),width); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
以上就是通訊錄的大概步驟了,希望可以幫到大家!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言代碼實(shí)現(xiàn)通訊錄管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)通訊錄系統(tǒng)程序
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過(guò)程
- C語(yǔ)言與C++動(dòng)態(tài)通訊錄超詳細(xì)實(shí)現(xiàn)流程
- C語(yǔ)言動(dòng)態(tài)與靜態(tài)分別實(shí)現(xiàn)通訊錄詳細(xì)過(guò)程
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄實(shí)例
- C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼
- C語(yǔ)言實(shí)現(xiàn)通訊錄功能的流程與代碼
相關(guān)文章
Visual?Studio?2022?激活碼(親測(cè)可用)
在?Visual?Studio?2019?的基礎(chǔ)上,新版集成開(kāi)發(fā)壞境提供了非常多的改進(jìn),包括對(duì)?64?位、.NET?6?的支持,為核心調(diào)試器提供更好的性能。本文給大家分享Visual?Studio?2022?激活碼,需要的朋友參考下吧2021-12-12C/C++獲取Windows平臺(tái)CPU占用率的方法
最近在做系統(tǒng)信息相關(guān)的接口,為了實(shí)現(xiàn)跨平臺(tái),故在linux和Windows平臺(tái)獲取占用率信息,文章主要介紹Windows下的方法,文中給出了參考代碼,需要的朋友可以參考下2023-12-12C++實(shí)現(xiàn)簡(jiǎn)單走迷宮的代碼
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單走迷宮的代碼,利用回溯法求解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之圖書(shū)借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之圖書(shū)借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換 先進(jìn)先出算法(FIFO)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換,先進(jìn)先出算法(FIFO),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C語(yǔ)言基礎(chǔ)使用IDE快速開(kāi)發(fā)的方法
這篇文章主要介紹了C語(yǔ)言基礎(chǔ)使用IDE快速開(kāi)發(fā)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11C語(yǔ)言16進(jìn)制與ASCII字符相互轉(zhuǎn)換
大家好,本篇文章主要講的是C語(yǔ)言16進(jìn)制與ASCII字符相互轉(zhuǎn)換,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01