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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

通讯录管理系统(C语言版)

發(fā)布時(shí)間:2023/12/20 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通讯录管理系统(C语言版) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

通訊錄管理系統(tǒng):

  • 一:靜態(tài)版本
    • 1.通訊錄前期準(zhǔn)備
      • (1)菜單函數(shù)的實(shí)現(xiàn)
      • (2)菜單的功能
      • (3)關(guān)于聯(lián)系人結(jié)構(gòu)體的創(chuàng)建
      • (4)全局變量的定義
    • 2.通訊錄的功能實(shí)現(xiàn)
      • (1)初始化通訊錄
      • (2)添加聯(lián)系人
      • (3)刪除聯(lián)系人
      • (4)查找聯(lián)系人
      • (4)修改聯(lián)系人
      • (5)顯示聯(lián)系人
      • (6)對(duì)通訊錄中聯(lián)系人的信息進(jìn)行排序
    • 3. 代碼呈現(xiàn)(分文件呈現(xiàn))
      • (1)test.c
      • (2)contact.h
      • (3)contact.c
  • 二:動(dòng)態(tài)版本
    • 1.動(dòng)態(tài)版本的一些改變
      • (1)ccontact.h
      • (2)contact.c
  • 三:文件操作版本
    • 1.文件版本的改變
      • (1)主函數(shù)實(shí)現(xiàn)
      • (2)初始化功能實(shí)現(xiàn)
      • (3)保存通訊錄中的信息
    • 2.代碼的呈現(xiàn)
      • (1)test.c
      • (2)contact.h
      • (3)contact.c

一:靜態(tài)版本

1.通訊錄前期準(zhǔn)備

(1)菜單函數(shù)的實(shí)現(xiàn)

1.先實(shí)現(xiàn)菜單函數(shù),能夠?qū)崿F(xiàn)與用戶(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"); }

(2)菜單的功能

1.用switch選擇語(yǔ)句來(lái)實(shí)現(xiàn)各自的功能
代碼如下:

do{menu();printf("請(qǐng)選擇:>");scanf("%d", &input);switch (input){case 1:AddContact(&con); //增加break;case 2:DelContact(&con); //刪除break;case 3:SearchContact(&con); //查找break;case 4:ModifyContact(&con); //修改break;case 5:ShowContact(&con); //顯示break;case 6:SortContact(&con); //排序break;default:printf("選擇錯(cuò)誤");break;}} while (input);return 0;

(3)關(guān)于聯(lián)系人結(jié)構(gòu)體的創(chuàng)建

1.結(jié)構(gòu)體的創(chuàng)建
第一個(gè)結(jié)構(gòu)體PeoInfo是是用來(lái)存放人的信息,第二個(gè)結(jié)構(gòu)體Contact是通訊錄的信息,data是以第一個(gè)結(jié)構(gòu)體為類(lèi)型的數(shù)組,count用來(lái)記錄當(dāng)前通訊錄中實(shí)際的人數(shù)。

//類(lèi)型的聲明 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_DDR]; }PeoInfo;//通訊錄 typedef struct Contact {PeoInfo data[100];//存放人的信息int count;//記錄當(dāng)前通訊錄中的實(shí)際人的個(gè)數(shù) } Contact;

(4)全局變量的定義

1.利用宏定義處理
代碼如下:

#define MAX 100 //總?cè)藬?shù)的大小 #define MAX_NAME 20 // 名字的長(zhǎng)度 #define MAX_SEX 10 //性別的長(zhǎng)度 #define MAX_TELE 12 //電話號(hào)碼的長(zhǎng)度 #define MAX_DDR 30 //地址的長(zhǎng)度

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

(1)初始化通訊錄

這里用到memset函數(shù),要包含含有string.h的頭文件。
1.代碼如下:

void InitContact(Contact* pc) { //初始化結(jié)構(gòu)體pc->count = 0;memset(pc->data, 0, sizeof(pc->data)); //長(zhǎng)度為pc->data }

(2)添加聯(lián)系人

void AddContact(Contact* pc) {assert(pc);if (pc->count == MAX){printf("通訊錄已滿,無(wú)法添加\n");return;}printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }

測(cè)試結(jié)果如下:

(3)刪除聯(lián)系人

1,。先查找,再刪除。

void DelContact(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒(méi)有信息可以刪除\n");return ;}printf("請(qǐng)輸入要?jiǎng)h除的名字\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要?jiǎng)h除的人不存在\n");return;}//2.刪除for (i = pos; i < pc->count-1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋} pc->count--;printf("刪除成功"); }

測(cè)試結(jié)果如下:

(4)查找聯(lián)系人

這里需要構(gòu)建一個(gè)函數(shù)FindByName,如果找到名字,就返回i,否則返回-1。

static int FindByName(Contact* pc, char name[]) {assert(pc);int i = 0;for (i = 0; i < pc->count; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1; }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要查找的名字\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }

測(cè)試結(jié)構(gòu)如下:

(4)修改聯(lián)系人

void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來(lái)開(kāi)始修改");//2.修改printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pos].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); }

測(cè)試結(jié)果如下:

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

遍歷,打印每一個(gè)元素即可。

void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);} }

測(cè)試代碼如下:

(6)對(duì)通訊錄中聯(lián)系人的信息進(jìn)行排序

與冒泡排序差不多,如果只對(duì)名字來(lái)排序,就是比較首字母的大小。

int cmp_peo_by_name(const void* e1, const void* e2) {return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);}void SortContact(Contact* pc) {assert(pc); //void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*))qsort(pc->data, pc->count,sizeof(PeoInfo), cmp_peo_by_name);printf("排序成功"); } 或者排序也可以為: void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒(méi)有聯(lián)系人");}else{for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }

測(cè)試結(jié)果如下:

3. 代碼呈現(xiàn)(分文件呈現(xiàn))

(1)test.c

#define _CRT_SECURE_NO_WARNINGS #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; Contact con;//通訊錄//初始化通訊錄InitContact(&con);//do{menu();printf("請(qǐng)選擇:>");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;default:printf("選擇錯(cuò)誤");break;}} while (input);return 0; }

(2)contact.h

#pragma once #include <stdio.h> #include <stdlib.h> #include "contact.h" #include <assert.h> #include<string.h> #define MAX 100 //總?cè)藬?shù)的大小 #define MAX_NAME 20 // 名字的長(zhǎng)度 #define MAX_SEX 10 //性別的長(zhǎng)度 #define MAX_TELE 12 //電話號(hào)碼的長(zhǎng)度 #define MAX_DDR 30 //地址的長(zhǎng)度//類(lèi)型的聲明 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_DDR]; }PeoInfo;//通訊錄 typedef struct Contact {PeoInfo data[100];//存放人的信息int count;//記錄當(dāng)前通訊錄中的實(shí)際人的個(gè)數(shù) } Contact;//初始化通訊錄 void InitContact(Contact* pc);//增加聯(lián)系人通訊錄 void AddContact(Contact* pc);//打印通訊錄中的信息 void ShowContact(Contact* pc);//刪除指定聯(lián)系人 void DelContact(Contact* pc);//查找聯(lián)系人 void SearchContact(Contact* pc);//修改聯(lián)系人 void ModifyContact(Contact* pc);//排序通信錄中的內(nèi)容(按照名字排序) void SortContact(Contact* pc);

(3)contact.c

#define _CRT_SECURE_NO_WARNINGS #include "contact.h" //1.靜態(tài)版本 //2.動(dòng)態(tài)版本 //3.文件的版本void InitContact(Contact* pc) { //初始化結(jié)構(gòu)體pc->count = 0;memset(pc->data, 0, sizeof(pc->data)); //長(zhǎng)度為pc->data }void AddContact(Contact* pc) {assert(pc);if (pc->count == MAX){printf("通訊錄已滿,無(wú)法添加\n");return;}printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-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(Contact* pc, char name[]) {assert(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(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒(méi)有信息可以刪除\n");return ;}printf("請(qǐng)輸入要?jiǎng)h除的名字:>\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要?jiǎng)h除的人不存在\n");}else{//2.刪除for (i = pos; i < pc->count - 1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋}pc->count--;printf("刪除成功\n");} }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要查找的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來(lái)開(kāi)始修改");//2.修改printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pos].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); }//int cmp_peo_by_name(const void* e1, const void* e2) //{ // return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); // //} // //void SortContact(Contact* pc) //{ // assert(pc); //void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*)) // qsort(pc->data, pc->count,sizeof(PeoInfo), cmp_peo_by_name); // printf("排序成功"); //}//或者排序也可以為: void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒(méi)有聯(lián)系人");}else{for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }

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

1.動(dòng)態(tài)版本的一些改變

1.相較于靜態(tài)的實(shí)現(xiàn),兩者的差別并不大,前者是用一個(gè)固定數(shù)組來(lái)實(shí)現(xiàn)元素的,儲(chǔ)存后者則是用動(dòng)態(tài)申請(qǐng)的內(nèi)存來(lái)實(shí)現(xiàn)儲(chǔ)存,優(yōu)點(diǎn)是可以節(jié)省內(nèi)存區(qū)別在于通訊錄的初始化,這里引用了capcity容量來(lái)比較已有的容量來(lái)判斷內(nèi)存的使用量,便于擴(kuò)容其次就是Add函數(shù),增加聯(lián)系人最后再對(duì)釋放的內(nèi)存進(jìn)行釋放。所以以下的部分代碼是有區(qū)別的。

(1)ccontact.h

//動(dòng)態(tài)版本: #pragma once #include <stdio.h> #include <stdlib.h> #include "contact.h" #include <assert.h> #include<string.h> #define DEFAULT_SZ 3 #define INC_SZ 2 //增長(zhǎng)的個(gè)數(shù)2 #define MAX 100 //總?cè)藬?shù)的大小 #define MAX_NAME 20 // 名字的長(zhǎng)度 #define MAX_SEX 10 //性別的長(zhǎng)度 #define MAX_TELE 12 //電話號(hào)碼的長(zhǎng)度 #define MAX_DDR 30 //地址的長(zhǎng)度//類(lèi)型的聲明 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_DDR]; }PeoInfo; //動(dòng)態(tài)版本: typedef struct Contact {PeoInfo* data;//存放人的信息,用指針int count;//記錄當(dāng)前通訊錄中的實(shí)際人的個(gè)數(shù)int capacity;//當(dāng)前通訊錄的容量 } Contact;//初始化通訊錄 int InitContact(Contact* pc);//銷(xiāo)毀通訊錄 void DestoryContact(Contact* pc);//增加聯(lián)系人通訊錄 void AddContact(Contact* pc);//打印通訊錄中的信息 void ShowContact(Contact* pc);//刪除指定聯(lián)系人 void DelContact(Contact* pc);//查找聯(lián)系人 void SearchContact(Contact* pc);//修改聯(lián)系人 void ModifyContact(Contact* pc);//排序通信錄中的內(nèi)容(按照名字排序) void SortContact(Contact* pc);//增容 void CheckCapacity(Contact* pc);

(2)contact.c

//動(dòng)態(tài)版本: int InitContact(Contact* pc) //返回類(lèi)型改為int {assert(pc);pc->count = 0;pc->data = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));//三個(gè)if (pc->data == NULL){printf("InitContact::%s\n", strerror(errno));return 1;}pc->capacity = DEFAULT_SZ;return 0; } //動(dòng)態(tài)版本: void CheckCapacity(Contact* pc) {if (pc->count == pc->capacity) //(總?cè)萘?#43;新增長(zhǎng)的空間的個(gè)數(shù))*一個(gè)元素的大小{PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){printf("AddContact::%s\n", strerror(errno));return;}else{pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}} }void DestoryContact(Contact* pc) {assert(pc);free(pc->data);pc->data = NULL; }void AddContact(Contact* pc) {assert(pc);//增容CheckCapacity(pc);//printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-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(Contact* pc, char name[]) {assert(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(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒(méi)有信息可以刪除\n");return ;}printf("請(qǐng)輸入要?jiǎng)h除的名字:>\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要?jiǎng)h除的人不存在\n");}else{//2.刪除for (i = pos; i < pc->count - 1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋}pc->count--;printf("刪除成功\n");} }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要查找的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來(lái)開(kāi)始修改");//2.修改printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pos].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); } //或者排序也可以為: void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒(méi)有聯(lián)系人");}else{for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }

三:文件操作版本

1.文件版本的改變

(1)主函數(shù)實(shí)現(xiàn)

1.該版本創(chuàng)建通訊錄的時(shí)候,此處創(chuàng)建的是一個(gè)結(jié)構(gòu)體變量con,建立的是一個(gè)結(jié)構(gòu)體數(shù)組,此處結(jié)構(gòu)體變量中存儲(chǔ)的一方面有通訊錄中所有人的信息即data,這些信息打包成了一個(gè)數(shù)組,同時(shí)還有兩個(gè)整型變量,size存儲(chǔ)的是當(dāng)前已經(jīng)有的元素個(gè)數(shù),而capacity存儲(chǔ)的是當(dāng)前通訊錄的最大容量。相比之前的動(dòng)態(tài)管理版本,此處增加了保存選項(xiàng),同時(shí)在退出通訊錄之前都會(huì)默認(rèn)進(jìn)行一次保存,以防用戶(hù)在退出之前對(duì)通訊錄的信息忘記進(jìn)行保存。
代碼如下:

#define _CRT_SECURE_NO_WARNINGS #include "contact.h" 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 SRARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:SaveContact(&con);DestoryContact(&con);printf("退出通訊錄\n");break;default:printf("選擇錯(cuò)誤\n");break;}} while (input);return 0; }

(2)初始化功能實(shí)現(xiàn)

1.此處增加了一個(gè)LoadContact()函數(shù),是將之前文件中聯(lián)系人的信息加載到通訊錄中來(lái),使用了文件操作函數(shù)fread()函數(shù)來(lái)對(duì)文件中的信息進(jìn)行讀取,每次讀一個(gè)數(shù)據(jù)。
注意:當(dāng)動(dòng)態(tài)開(kāi)辟的空間不夠時(shí),要使用CheckCapacity()函數(shù)對(duì)容量進(jìn)行檢查,如果容量不夠就要進(jìn)行擴(kuò)容。

//加載文件中的信息到通訊錄 void LoadContact(Contact* pc) {FILE* pfRead = fopen("contact.txt", "rb");if(pfRead==NULL){perror("LoadContact");return; }PeoInfo tmp = { 0 }; while(fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1) {//判斷容量,是否需要擴(kuò)容CheckCapacity(pc);pc->data[pc->count] = tmp; // 一個(gè)一個(gè)放pc->count++; }fclose(pfRead);pfRead = NULL;}int InitContact(Contact* pc) //返回類(lèi)型改為int {assert(pc);pc->count = 0;pc->data = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));//三個(gè)if (pc->data == NULL){printf("InitContact::%s\n", strerror(errno));return 1;}pc->capacity = DEFAULT_SZ;//加載文件的信息到通訊錄中LoadContact(pc);return 0; }

(3)保存通訊錄中的信息

1.保存通訊錄中的信息,使用的是fwrite()函數(shù),即將通訊錄中的數(shù)據(jù)寫(xiě)入到文件中去,同時(shí)使用了fopen()和fclose()進(jìn)行關(guān)閉文件。最后要將文件指針置為空指針。

void SaveContact(const Contact* pc) {assert(pc);FILE* pfWrite = fopen("contact.txt","wb");if (pfWrite == NULL){perror("SaveContact");return;}//寫(xiě)文件 二進(jìn)制的形式int i = 0;for (i = 0; i < pc->count; i++){ //size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);//把ptr所指向的數(shù)組中的數(shù)據(jù)寫(xiě)入到給定的stream.}fclose(pfWrite); pfWrite = NULL; }

2.代碼的呈現(xiàn)

(1)test.c

#define _CRT_SECURE_NO_WARNINGS #include "contact.h"//設(shè)置枚舉類(lèi)型 enum Option {EXIT,ADD,DEL,SRARCH,MODIFY,SHOW,SORT };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; 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 SRARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:SaveContact(&con);DestoryContact(&con);printf("退出通訊錄\n");break;default:printf("選擇錯(cuò)誤\n");break;}} while (input);return 0;}

(2)contact.h

#pragma once #include <stdio.h> #include <stdlib.h> #include "contact.h" #include <assert.h> #include<string.h> #define DEFAULT_SZ 3 #define INC_SZ 2 //增長(zhǎng)的個(gè)數(shù)2 #define MAX 100 //總?cè)藬?shù)的大小 #define MAX_NAME 20 // 名字的長(zhǎng)度 #define MAX_SEX 10 //性別的長(zhǎng)度 #define MAX_TELE 12 //電話號(hào)碼的長(zhǎng)度 #define MAX_DDR 30 //地址的長(zhǎng)度//類(lèi)型的聲明 typedef struct PeoInfo {char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_DDR]; }PeoInfo;//動(dòng)態(tài)版本: typedef struct Contact {PeoInfo* data;//存放人的信息,用指針int count;//記錄當(dāng)前通訊錄中的實(shí)際人的個(gè)數(shù)int capacity;//當(dāng)前通訊錄的容量 } Contact;//初始化通訊錄 int InitContact(Contact* pc);//銷(xiāo)毀通訊錄 void DestoryContact(Contact* pc);//增加聯(lián)系人通訊錄 void AddContact(Contact* pc);//打印通訊錄中的信息 void ShowContact(Contact* pc);//刪除指定聯(lián)系人 void DelContact(Contact* pc);//查找聯(lián)系人 void SearchContact(Contact* pc);//修改聯(lián)系人 void ModifyContact(Contact* pc);//排序通信錄中的內(nèi)容(按照名字排序) void SortContact(Contact* pc);//增容 void CheckCapacity(Contact* pc);//保存通訊錄 void SaveContact(const Contact* pc);//加載文件的通訊錄void LoadContact(Contact* pc);

(3)contact.c

#define _CRT_SECURE_NO_WARNINGS #include "contact.h" //加載文件中的信息到通訊錄 void LoadContact(Contact* pc) {FILE* pfRead = fopen("contact.txt", "rb");if(pfRead==NULL){perror("LoadContact");return; }PeoInfo tmp = { 0 };while(fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1) {//判斷容量,是否需要擴(kuò)容CheckCapacity(pc);pc->data[pc->count] = tmp; // 一個(gè)一個(gè)放pc->count++; }fclose(pfRead);pfRead = NULL;}//初始化: int InitContact(Contact* pc) //返回類(lèi)型改為int {assert(pc);pc->count = 0;pc->data = (PeoInfo*)calloc(DEFAULT_SZ,sizeof(PeoInfo));//三個(gè)if (pc->data == NULL){printf("InitContact::%s\n", strerror(errno));return 1;}pc->capacity = DEFAULT_SZ;//加載文件的信息到通訊錄中LoadContact(pc);return 0; } //增容 void CheckCapacity(Contact* pc) {if (pc->count == pc->capacity) //(總?cè)萘?#43;新增長(zhǎng)的空間的個(gè)數(shù))*一個(gè)元素的大小{PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){printf("AddContact::%s\n", strerror(errno));return;}else{pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}} }void DestoryContact(Contact* pc) {assert(pc); free(pc->data);pc->data = NULL; }void AddContact(Contact* pc) {assert(pc);//增容CheckCapacity(pc);//printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pc->count].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pc->count].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pc->count].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pc->count].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n"); }void ShowContact(Contact* pc) {assert(pc);int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-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(Contact* pc, char name[]) {assert(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(Contact* pc) {char name[MAX_NAME] = { 0 };assert(pc);int i = 0;if (pc->count == 0){printf("通訊錄為空,沒(méi)有信息可以刪除\n");return ;}printf("請(qǐng)輸入要?jiǎng)h除的名字:>\n"); scanf("%s", name);//刪除//1.查找int pos=FindByName(pc, name);if (pos == -1){printf("要?jiǎng)h除的人不存在\n");}else{//2.刪除for (i = pos; i < pc->count - 1; i++)//100-1{pc->data[i] = pc-> data[i + 1]; //后邊元素往前覆蓋}pc->count--;printf("刪除成功\n");} }void SearchContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要查找的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}else//2打印{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");for (i = 0; i < pc->count; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}} }void ModifyContact(Contact* pc) {assert(pc);char name[MAX_NAME] = { 0 };printf("請(qǐng)輸入要修改的名字:>\n");scanf("%s", name);//1.查找int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return ;}printf("要修改的人的信息已經(jīng)查找到,接下來(lái)開(kāi)始修改");//2.修改printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pos].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pos].age));//注意:age要傳地址加上&printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n"); }void SortContact(Contact* pc) {if (pc->count == 0){printf("通訊錄中沒(méi)有聯(lián)系人");}else{ for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");} }void SaveContact(const Contact* pc) {assert(pc);FILE* pfWrite = fopen("contact.txt","wb");if (pfWrite == NULL){perror("SaveContact");return;}//寫(xiě)文件 二進(jìn)制的形式int i = 0;for (i = 0; i < pc->count; i++){ //size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);//把ptr所指向的數(shù)組中的數(shù)據(jù)寫(xiě)入到給定的stream.}fclose(pfWrite); pfWrite = NULL; }

總結(jié)

以上是生活随笔為你收集整理的通讯录管理系统(C语言版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。