日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言实现通讯录管理

發布時間:2024/3/26 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言实现通讯录管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注釋說明:由于是第一次寫博客,沒什么經驗,如果有不對的地方還請各位友友們留言指正

前言


首先呢本次通訊錄的實現主要使用結構體,通過結構體嵌套的方式實現通訊錄的基本功能包括:添加、刪除、查找、修改、打印、排序,再利用枚舉變相的改變switch case語句,使代碼的輸入更加明確具體,我們分成三個部分來寫一個頭文件(contact.h用來存放函數聲明)兩個源文件(contact.c存放函數和course-22.c存放菜單欄和函數調用),之所以分成三部分來寫是因為這樣可以使代碼不容亂,如果講一堆函數和主文件混在一起寫,那么代碼的可讀性將大大降低,好了,我們不羅嗦了,具體情況我們代碼中分析。


菜單欄


菜單欄呢我們主要采用switch case語句和while循環語句實現,主要實現菜單和函數調用,上代碼,我建議大家在寫代碼時從主函數開始寫,免得無從下手,需要什么時,就從存放函數的文件中再調用,好的,我們來講解一下代碼的主要實現,因為需要設置菜單所以就會用到switch case語句,這樣的實現是最方便的(我們將case后面的數字利用枚舉變換成對應的功能函數名,這樣在寫代碼時就不用來回翻看菜單欄了),當我們在錄信息時只需要輸入相關數字即可,通過將輸入的input作為switch的選擇,然后我們在錄取信息往往是多次使用的就需要循環來實現,但是while循環的條件就是一個很苦惱的事情,條件為真時循環,為假跳出循環,仔細想想我們錄入的數字1 2 3 4····都為真只有錄入0時為假,我們就可以很巧妙地將0設置為退出通訊錄,這樣當我們輸入1 2 3···時便可以一直循環

course-22.c文件

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #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"); } int main() {int input = 0;//創建通訊錄struct contact con;//通訊錄,里面有1000人的信息//初始化通訊錄initcontact(&con);do{menu();printf("請選擇:");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("選擇錯誤,請重新選擇\n");break;}} while (input);return 0; }


創建通訊錄


contact.h頭文件
(小注:大家千萬別忘記調用頭文件哦)

首先呢我們先創建一個結構體類型struct peoinfo包含通訊錄的一些基本信息,然后在創建一個結構體struct contact,注意哦這里劃重點,這里我們把struct peoinfo結構體嵌套進去了,為什么這樣做呢,因為struct peoinfo只包含了通訊錄的一些基本信息,但是并不能記錄我們的通訊錄里有多少個客戶信息,而struct contact結構體中的size恰恰可以記錄成員數量,從而有效地幫我們實現通訊錄的監管,一個size對應一個data,這里細心的小伙伴可能注意了我在struct peoinfo成員中定義的變量并沒有給定大小,而是用define定義的變量,這樣做的好處是后期我們該數據只需要修改define定義的值就可以實現全局的修改

?

#define _CRT_SECURE_NO_WARNINGS 1#define MAX 1000 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30enum option//枚舉,用于替換swith case語句中的0 1 2 3···,增強代碼的可讀性 {exit,add,del,search,modify,show,sort }; struct peoinfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR]; };//通訊錄類型 struct contact {struct peoinfo data[MAX];//存放1000信息int size;//記錄當前已經有的元素個數 };//函數聲明 void initcontact(struct contact* ps);//初始化 void addcontact(struct contact* ps);//增加一個信息 void showcontact(const struct contact* ps);//打印通訊錄中的信息 void delcontact(struct contact* ps);//刪除信息 void searchcontact(const struct contact* ps);//查找信息 void modifycontact(struct contact* ps);//修改信息 void sortcontact(struct contact* ps);//排序信息


?初始化通訊錄
下面我們正式進入函數的書寫之中

一條小小的建議,我們再寫這種復雜性代碼時,第一條先初始化,只有初始化完成之后,才方便我們的后續操作,這里說明一下我們通過菜單文件傳地址以方便對通訊錄的相關修改,函數部分都是用無返回值類型,結構體類型的指針來接收傳來的地址,memset內存設置函數,需要引用頭文件#include<string.h>,其主要功能目標值設置為自己想要的字符

void initcontact(struct contact* ps)//通訊錄初始化函數 {memset(ps->data,0,sizeof(ps->data));//初始化通信錄全部為0ps->size = 0;//設置通訊錄最初只有0個元素 }



功能


1.添加


這里用ps->size==MAX作為if的條件,MAX我們定義的為1000為通訊錄的最大容量,當信客戶息超出容量范圍時,便不可輸入,沒滿則錄入信息,這里的錄入就采取最簡單的方式,記得ps->size++,這可是我們判斷的條件哦
?

void addcontact(struct contact* ps)//增加函數 {if (ps->size==MAX){printf("通訊錄以滿,無法增加\n");}else{printf("請輸入名字:");scanf("%s",ps->data[ps->size].name);//將信息放入下標為size的空間printf("請輸入年齡:");scanf("%d", &(ps->data[ps->size].age));printf("請輸入性別:");scanf("%s", ps->data[ps->size].sex);printf("請輸入電話:");scanf("%s", ps->data[ps->size].tele);printf("請輸入地址:");scanf("%s", ps->data[ps->size].addr);ps->size++;printf("添加成功\n");} }


2.刪除


刪除我是依據客戶姓名刪除的,當然小伙伴們愿意也可以依據別的,首先我們通過與通訊錄中的姓名做對比,匹配成功則刪除,這里我寫了一個findbyname函數,因為后續的功能操作也會用到名字匹配,所以寫成一個函數方便些,findbyname函數用到了一個重要的庫函數strcmp,這個函數的功能就是比較兩個字符串的,如果相同返回下標i,不同返回-1,我們的刪除操作是采用將刪除數據之后的數據向前移動從而將其覆蓋實現的利用返回來的下標找到后續數據下標,ps->data[j] = ps->data[j+1],后一個賦值給前一個從實現向前移動,還有我們的ps->size--操作哦,既然刪除了通訊錄數據肯定減一
?

static int findbyname(const struct contact*ps,char name[MAX_NAME])//static修飾函數,使此函數今在本文件(contact.c)中起作用 {int i = 0;for (i = 0; i < ps->size; i++){if (strcmp(ps->data[i].name, name) == 0){return i;//找到返回下標}}return -1;//沒找到 } void delcontact(struct contact* ps)//刪除函數 {char name[MAX_NAME];printf("請輸入要刪除的人的姓名:");scanf("%s",name);//查找要刪除的人在什么位置int pos=findbyname(ps,name);//這里把查找名字寫成一個函數,找到返回1,找不到返回-1//刪除if (pos==-1)//沒找到的情況{printf("要刪除的人不存在\n");}else{int j = 0;for (j=pos;j<ps->size-1;j++){ps->data[j] = ps->data[j+1];}ps->size--;printf("刪除成功\n");} }


3.查找


查找就行對簡單些了,和刪除操作一樣,先匹配姓名,成功則打印數據


?

void searchcontact(const struct contact* ps)//查找函數 {char name[MAX_NAME];printf("請輸入要查找人的姓名:");scanf("%s",name);int pos = findbyname(ps,name);if (pos == -1) ? ? //沒找到的情況{printf("要查找的人不存在\n");}else//找到了{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//打印標題printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",ps->data[pos].name,ps->data[pos].age,ps->data[pos].sex,ps->data[pos].tele,ps->data[pos].addr);} }


4.修改


修改函數同樣是先匹配姓名,成功的話,就在錄一遍信息,就像添加函數一樣的操作
?

void modifycontact(struct contact* ps)//修改函數 {char name[MAX_NAME];printf("請輸入要修改人的名字:");scanf("%s",name);int pos = findbyname(ps,name);if (pos == -1){printf("要修改人的信息不存在\n");}else{printf("請輸入名字:");scanf("%s", ps->data[pos].name);//將信息放入下標為pos的空間printf("請輸入年齡:");scanf("%d", &(ps->data[pos].age));printf("請輸入性別:");scanf("%s", ps->data[pos].sex);printf("請輸入電話:");scanf("%s", ps->data[pos].tele);printf("請輸入地址:");scanf("%s", ps->data[pos].addr);printf("修改成功\n");} }


5.打印


打印同樣需要判斷if,通訊錄為空打印個寂寞對吧,這里的打印采用的就是結構體嵌套的輸出首先ps指向結構體struct contact,而->data指向struct peoinfo結構體最后 .name則具體到每一個數據,注:其中[i]是不同的客戶,打印函數中的\t可以使每個數據具有一定間隔,而%-20s\t這里的-20,也是起到間隔作用,使打印效果更美觀


?

void showcontact(const struct contact* ps)//打印函數 {if (ps->size==0){printf("通訊錄為空\n");}else{int i = 0;//打印標題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n","名字","年齡","性別","電話","地址");//打印數據for (i=0;i<ps->size;i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",?ps->data[i].name,ps->data[i].age,ps->data[i].sex,ps->data[i].tele,ps->data[i].addr);}} }


6.排序


排序呢我這里給出兩種方法,可供參考

第一種方法,使用庫函數qsort,引用頭文件#include<stdlib.h>

qsort函數用起來參數比較復雜一共四個參數,1.目標數組2.目標數組的個數3.目標數組元素的大小4.比較函數(比較函數要我自己寫哦,很簡單的)來看代碼,同樣是先判斷通訊錄為不為空,重中之重!!!!我們要排序的目標是struct contact結構體,因為要根據姓名排序,實則有三個數據都是要和struct peoinfo結構體有關,如圖,比較函數用void指針接收可以接受任何數據類型,因為void不能解引用所以要強制類型轉換(struct peoinfo*)類型
?

int int_name(const void*e1,const void*e2)//比較函數 {return strcmp(((struct peoinfo*)e1)->name, ((struct peoinfo*)e2)->name); }void sortcontact(struct contact* ps)//排序函數,用庫函數qsort實現 {if (ps->size == 0){printf("通訊錄中無聯系人,不可排序\n");}else{qsort(ps->data, ps->size, sizeof(ps->data[0]), int_name);printf("排序成功\n");} }


方法二

利用冒泡排序,冒泡排序的核心思想就是排幾趟,一趟交換機此數據,利用strcmp庫函數判斷數據的大小,然后交換數據

//void sortcontact(struct contact* ps)//排序函數,冒泡排序 //{ // ?if (ps->size == 0) // ?{ // ? ?printf("通訊錄中無聯系人,不可排序\n"); // ?} // ?else // ?{ // ? ?int i = 0; // ? ?for (i = 0; i < ps->size - 1; i++)//一趟 // ? ?{ // ? ? ?int j = 0; // ? ? ?for (j = 0; j < ps->size - 1 - j; j++)//一趟交換次數 // ? ? ?{ // ? ? ? ?if (strcmp(ps->data[j].name, ps->data[j + 1].name) > 0) // ? ? ? ?{ // ? ? ? ? ?struct peoinfo tmp = ps->data[j]; // ? ? ? ? ?ps->data[j] = ps->data[j + 1]; // ? ? ? ? ?ps->data[j + 1] = tmp; // ? ? ? ?} // ? ? ?} // ? ?} // ? ?printf("排序成功\n"); // ?} //}


最后感謝觀看哦,如果覺得還不錯請多多評論點贊支持一下哦,謝謝!

代碼匯總


course-22.c

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #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"); } int main() {int input = 0;//創建通訊錄struct contact con;//通訊錄,里面有1000人的信息//初始化通訊錄initcontact(&con);do{menu();printf("請選擇:");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("選擇錯誤,請重新選擇\n");break;}} while (input);return 0; }




contact.c

#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" #include<stdio.h> #include<string.h>void initcontact(struct contact* ps)//通訊錄初始化函數 {memset(ps->data,0,sizeof(ps->data));//初始化通信錄全部為0ps->size = 0;//設置通訊錄最初只有0個元素 }void addcontact(struct contact* ps)//增加函數 {if (ps->size==MAX){printf("通訊錄以滿,無法增加\n");}else{printf("請輸入名字:");scanf("%s",ps->data[ps->size].name);//將信息放入下標為size的空間printf("請輸入年齡:");scanf("%d", &(ps->data[ps->size].age));printf("請輸入性別:");scanf("%s", ps->data[ps->size].sex);printf("請輸入電話:");scanf("%s", ps->data[ps->size].tele);printf("請輸入地址:");scanf("%s", ps->data[ps->size].addr);ps->size++;printf("添加成功\n");} }void showcontact(const struct contact* ps)//打印函數 {if (ps->size==0){printf("通訊錄為空\n");}else{int i = 0;//打印標題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n","名字","年齡","性別","電話","地址");//打印數據for (i=0;i<ps->size;i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",?ps->data[i].name,ps->data[i].age,ps->data[i].sex,ps->data[i].tele,ps->data[i].addr);}} }static int findbyname(const struct contact*ps,char name[MAX_NAME])//static修飾函數,使此函數今在本文件(contact.c)中起作用 {int i = 0;for (i = 0; i < ps->size; i++){if (strcmp(ps->data[i].name, name) == 0){return i;//找到返回下標}}return -1;//沒找到 } void delcontact(struct contact* ps)//刪除函數 {char name[MAX_NAME];printf("請輸入要刪除的人的姓名:");scanf("%s",name);//查找要刪除的人在什么位置int pos=findbyname(ps,name);//這里把查找名字寫成一個函數,找到返回1,找不到返回-1//刪除if (pos==-1)//沒找到的情況{printf("要刪除的人不存在\n");}else{int j = 0;for (j=pos;j<ps->size-1;j++){ps->data[j] = ps->data[j+1];}ps->size--;printf("刪除成功\n");} }void searchcontact(const struct contact* ps)//查找函數 {char name[MAX_NAME];printf("請輸入要查找人的姓名:");scanf("%s",name);int pos = findbyname(ps,name);if (pos == -1) ? ? //沒找到的情況{printf("要查找的人不存在\n");}else//找到了{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//打印標題printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",ps->data[pos].name,ps->data[pos].age,ps->data[pos].sex,ps->data[pos].tele,ps->data[pos].addr);} }void modifycontact(struct contact* ps)//修改函數 {char name[MAX_NAME];printf("請輸入要修改人的名字:");scanf("%s",name);int pos = findbyname(ps,name);if (pos == -1){printf("要修改人的信息不存在\n");}else{printf("請輸入名字:");scanf("%s", ps->data[pos].name);//將信息放入下標為pos的空間printf("請輸入年齡:");scanf("%d", &(ps->data[pos].age));printf("請輸入性別:");scanf("%s", ps->data[pos].sex);printf("請輸入電話:");scanf("%s", ps->data[pos].tele);printf("請輸入地址:");scanf("%s", ps->data[pos].addr);printf("修改成功\n");} }int int_name(const void*e1,const void*e2)//比較函數 {return strcmp(((struct peoinfo*)e1)->name, ((struct peoinfo*)e2)->name); }void sortcontact(struct contact* ps)//排序函數,用庫函數qsort實現 {if (ps->size == 0){printf("通訊錄中無聯系人,不可排序\n");}else{qsort(ps->data, ps->size, sizeof(ps->data[0]), int_name);printf("排序成功\n");} }//void sortcontact(struct contact* ps)//排序函數,冒泡排序 //{ // ?if (ps->size == 0) // ?{ // ? ?printf("通訊錄中無聯系人,不可排序\n"); // ?} // ?else // ?{ // ? ?int i = 0; // ? ?for (i = 0; i < ps->size - 1; i++)//一趟 // ? ?{ // ? ? ?int j = 0; // ? ? ?for (j = 0; j < ps->size - 1 - j; j++)//一趟交換次數 // ? ? ?{ // ? ? ? ?if (strcmp(ps->data[j].name, ps->data[j + 1].name) > 0) // ? ? ? ?{ // ? ? ? ? ?struct peoinfo tmp = ps->data[j]; // ? ? ? ? ?ps->data[j] = ps->data[j + 1]; // ? ? ? ? ?ps->data[j + 1] = tmp; // ? ? ? ?} // ? ? ?} // ? ?} // ? ?printf("排序成功\n"); // ?} //}




contact.h

#define _CRT_SECURE_NO_WARNINGS 1#define MAX 1000 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30enum option//枚舉,用于替換swith case語句中的0 1 2 3···,增強代碼的可讀性 {exit,add,del,search,modify,show,sort }; struct peoinfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR]; };//通訊錄類型 struct contact {struct peoinfo data[MAX];//存放1000信息int size;//記錄當前已經有的元素個數 };//函數聲明 void initcontact(struct contact* ps);//初始化 void addcontact(struct contact* ps);//增加一個信息 void showcontact(const struct contact* ps);//打印通訊錄中的信息 void delcontact(struct contact* ps);//刪除信息 void searchcontact(const struct contact* ps);//查找信息 void modifycontact(struct contact* ps);//修改信息 void sortcontact(struct contact* ps);//排序信息



?

-----------------------------------
用c語言簡單實現通訊錄
?

總結

以上是生活随笔為你收集整理的c语言实现通讯录管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。