【C语言】—— 通讯录
目錄
一、基本思路及功能介紹
二、功能實(shí)現(xiàn)?
1.基礎(chǔ)菜單的實(shí)現(xiàn)?
3.添加聯(lián)系人信息功能實(shí)現(xiàn)
4.顯示聯(lián)系人信息功能實(shí)現(xiàn)
5.刪除聯(lián)系人信息功能實(shí)現(xiàn)
6.查找聯(lián)系人信息功能實(shí)現(xiàn)
7.修改聯(lián)系人信息功能實(shí)現(xiàn)
8.排序聯(lián)系人信息功能實(shí)現(xiàn)
9.加載和保存聯(lián)系人信息功能實(shí)現(xiàn)
?三、源文件展示
1.test.c?
2.contact.c?
3.contact.h?
四、演示效果?
一、基本思路及功能介紹
? ? ? ? ?想要用C語(yǔ)言實(shí)現(xiàn)通訊錄的功能,基本上涵概了C語(yǔ)言入門(mén)的一些知識(shí)運(yùn)用,如:指針、結(jié)構(gòu)體、文件操作、動(dòng)態(tài)內(nèi)存管理等相關(guān)的知識(shí);
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的通訊錄的基本功能:
? ? ? ? 1.添加聯(lián)系人信息;
? ? ? ? 2.刪除聯(lián)系人信息;
? ? ? ? 3.查找聯(lián)系人信息;
? ? ? ? 4.修改聯(lián)系人信息;
? ? ? ? 5.顯示聯(lián)系人信息;
? ? ? ? 6.排序聯(lián)系人信息;? ?
? ? ? ? 7.保存聯(lián)系人信息;
? ? ? ? 8.退出通訊錄;
二、功能實(shí)現(xiàn)?
1.基礎(chǔ)菜單的實(shí)現(xiàn)?
void menu() {printf("\t\t\t\t**********************************\n");printf("\t\t\t\t****** 通訊錄管理系統(tǒng) *******\n");printf("\t\t\t\t**********************************\n");printf("\t\t\t\t* 1.添加聯(lián)系人---ADD *\n");printf("\t\t\t\t* 2.刪除聯(lián)系人---DEL *\n");printf("\t\t\t\t* 3.查找聯(lián)系人---SEARCH *\n");printf("\t\t\t\t* 4.修改聯(lián)系人---MODIFY *\n");printf("\t\t\t\t* 5.顯示聯(lián)系人---SHOW *\n");printf("\t\t\t\t* 6.排序聯(lián)系人---SORT *\n");printf("\t\t\t\t* 0.退出通訊錄---EXIT *\n");printf("\t\t\t\t**********************************\n");printf("\t\t\t\t**********************************\n"); } enum {EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT }; int main() {int input = 0;do{menu();printf("請(qǐng)輸入:>");scanf("%d", &input);switch (input){case ADD:break;case DEL:break;case SEARCH:break;case MODIFY:break;case SHOW:break;case SORT:break;case EXIT:printf("退出通訊錄\n");break;default:printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");break;}} while (input);return 0; }?2.如何創(chuàng)建通訊錄及所有函數(shù)功能
注意點(diǎn):
? ? ? ? 通訊錄的容量應(yīng)該隨著我們存儲(chǔ)的聯(lián)系人個(gè)數(shù)去增長(zhǎng),讓系統(tǒng)自動(dòng)分配,既不會(huì)過(guò)多也不會(huì)過(guò)少;
#define NAME_MAX 20 #define SEX_MAX 20 #define TELE_MAX 20 #define ADDR_MAX 20struct PeoInfo {char name[NAME_MAX];//姓名int age; //年齡char sex[SEX_MAX]; //性別char tele[TELE_MAX];//電話char addr[ADDR_MAX];//住址 };struct Contact {struct PeoInfo* data;//能夠動(dòng)態(tài)存儲(chǔ)聯(lián)系人的信息int sz; //記錄當(dāng)前聯(lián)系人的個(gè)數(shù)int capacity; //記錄當(dāng)前通訊錄的容量 };//初始化通訊錄 void InitContact(struct Contact* pc);//添加聯(lián)系人信息 void AddContact(struct Contact* pc);//銷毀通訊錄信息 void DistroyContact(struct Contact* pc);//顯示聯(lián)系人信息 void ShowContact(struct Contact* pc);//刪除聯(lián)系人信息 void DelContact(struct Contact* pc);//查找聯(lián)系人信息 void SearchContact(struct Contact* pc);//修改聯(lián)系人信息 void ModifyContact(struct Contact* pc);//排序聯(lián)系人信息 void SortContact(struct Contact* pc);//加載有效信息到通訊錄中 void LoadContact(struct Contact* pc);//保存信息 void SaveContact(struct Contact* pc);3.添加聯(lián)系人信息功能實(shí)現(xiàn)
#define NAME_MAX 20 #define SEX_MAX 20 #define TELE_MAX 20 #define ADDR_MAX 20 #define DEFAULT_SZ 3 //擴(kuò)充容量 void CheckContact(struct Contact* pc) {if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("擴(kuò)容成功\n");}else{printf("擴(kuò)容失敗\n");exit(1);}} }//初始化通訊錄 void InitContact(struct Contact* pc) {pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ; }//添加聯(lián)系人信息 void AddContact(struct Contact* pc) {CheckContact(pc);printf("請(qǐng)輸入聯(lián)系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("請(qǐng)輸入聯(lián)系人的年齡:>");scanf("%d", &pc->data[pc->sz].age);printf("請(qǐng)輸入聯(lián)系人的性別:>");scanf("%s", pc->data[pc->sz].sex);printf("請(qǐng)輸入聯(lián)系人的電話:>");scanf("%s", pc->data[pc->sz].tele);printf("請(qǐng)輸入聯(lián)系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++; }4.顯示聯(lián)系人信息功能實(shí)現(xiàn)
//顯示聯(lián)系人信息 void ShowContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,顯示失敗!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年齡", "性別", "電話", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n"); }5.刪除聯(lián)系人信息功能實(shí)現(xiàn)
//刪除聯(lián)系人信息 int FindContactByName(const struct Contact* pc, char* name) {int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1; }void DelContact(struct Contact* pc) {if (pc->sz == 0){printf("聯(lián)系人為空,操作失敗\n");return;}char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的聯(lián)系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("刪除成功\n");} }6.查找聯(lián)系人信息功能實(shí)現(xiàn)
//查找聯(lián)系人信息 void SearchContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,查找失敗!!!\n");return;}char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要查找的聯(lián)系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("聯(lián)系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年齡", "性別", "電話", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);} }7.修改聯(lián)系人信息功能實(shí)現(xiàn)
//修改聯(lián)系人信息 void ModifyContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,查找失敗!!!\n");return;}char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要修改的聯(lián)系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("聯(lián)系人不存在!!!\n");return;}else{printf("請(qǐng)輸入新的聯(lián)系人姓名:>");scanf("%s", pc->data[pos].name);printf("請(qǐng)輸入新的聯(lián)系人年齡:>");scanf("%d", &pc->data[pos].age);printf("請(qǐng)輸入新的聯(lián)系人性別:>");scanf("%s", pc->data[pos].sex);printf("請(qǐng)輸入新的聯(lián)系人電話:>");scanf("%s", pc->data[pos].tele);printf("請(qǐng)輸入新的聯(lián)系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n"); }8.排序聯(lián)系人信息功能實(shí)現(xiàn)
//排序聯(lián)系人信息 void SortContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,無(wú)法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n"); }9.加載和保存聯(lián)系人信息功能實(shí)現(xiàn)
//加載有效信息到通訊錄中 void LoadContact(struct Contact* pc) {FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL; }//保存信息 void SaveContact(struct Contact* pc) {//1.打開(kāi)文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.寫(xiě)數(shù)據(jù)int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.關(guān)閉文件fclose(pf);pf = NULL; }?三、源文件展示
1.test.c?
#define _CRT_SECURE_NO_WARNINGS 10 #include "contact.h" void menu() {printf("\t\t\t\t************************************\n");printf("\t\t\t\t****** 通訊錄管理系統(tǒng) ********\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t* 1.添加聯(lián)系人---ADD *\n");printf("\t\t\t\t* 2.刪除聯(lián)系人---DEL *\n");printf("\t\t\t\t* 3.查找聯(lián)系人---SEARCH *\n");printf("\t\t\t\t* 4.修改聯(lián)系人---MODIFY *\n");printf("\t\t\t\t* 5.顯示聯(lián)系人---SHOW *\n");printf("\t\t\t\t* 6.排序聯(lián)系人---SORT *\n");printf("\t\t\t\t* 0.退出通訊錄---EXIT *\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t************************************\n"); } enum {EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT }; int main() {int input = 0;struct Contact con;InitContact(&con);//初始化通訊錄do{menu();printf("請(qǐng)輸入:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);//添加聯(lián)系人信息break;case DEL:DelContact(&con);//刪除聯(lián)系人信息break;case SEARCH:SearchContact(&con);//查找聯(lián)系人信息break;case MODIFY:ModifyContact(&con);//修改聯(lián)系人信息break;case SHOW:ShowContact(&con);//顯示聯(lián)系人信息break;case SORT:SortContact(&con);//排序聯(lián)系人信息break;case EXIT:SaveContact(&con);//保存信息DistroyContact(&con);//銷毀通訊錄信息printf("退出通訊錄\n");break;default:printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");break;}} while (input);return 0; }2.contact.c?
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h"//擴(kuò)充容量 void CheckContact(struct Contact* pc) {if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("擴(kuò)容成功\n");}else{printf("擴(kuò)容失敗\n");exit(1);}} }//加載有效信息到通訊錄中 void LoadContact(struct Contact* pc) {FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL; }//初始化通訊錄 void InitContact(struct Contact* pc) {pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ;LoadContact(pc);//加載有效信息到通訊錄中 }//添加聯(lián)系人信息 void AddContact(struct Contact* pc) {CheckContact(pc);printf("請(qǐng)輸入聯(lián)系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("請(qǐng)輸入聯(lián)系人的年齡:>");scanf("%d", &pc->data[pc->sz].age);printf("請(qǐng)輸入聯(lián)系人的性別:>");scanf("%s", pc->data[pc->sz].sex);printf("請(qǐng)輸入聯(lián)系人的電話:>");scanf("%s", pc->data[pc->sz].tele);printf("請(qǐng)輸入聯(lián)系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++; }//銷毀通訊錄 void DistroyContact(struct Contact* pc) {free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0; }//顯示聯(lián)系人信息 void ShowContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,顯示失敗!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年齡", "性別", "電話", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n"); }//刪除聯(lián)系人信息 int FindContactByName(const struct Contact* pc, char* name) {int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1; }void DelContact(struct Contact* pc) {if (pc->sz == 0){printf("聯(lián)系人為空,操作失敗\n");return;}char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的聯(lián)系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("刪除成功\n");} }//查找聯(lián)系人信息 void SearchContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,查找失敗!!!\n");return;}char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要查找的聯(lián)系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("聯(lián)系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年齡", "性別", "電話", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);} }//修改聯(lián)系人信息 void ModifyContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,查找失敗!!!\n");return;}char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要修改的聯(lián)系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("聯(lián)系人不存在!!!\n");return;}else{printf("請(qǐng)輸入新的聯(lián)系人姓名:>");scanf("%s", pc->data[pos].name);printf("請(qǐng)輸入新的聯(lián)系人年齡:>");scanf("%d", &pc->data[pos].age);printf("請(qǐng)輸入新的聯(lián)系人性別:>");scanf("%s", pc->data[pos].sex);printf("請(qǐng)輸入新的聯(lián)系人電話:>");scanf("%s", pc->data[pos].tele);printf("請(qǐng)輸入新的聯(lián)系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n"); }//排序聯(lián)系人信息 void SortContact(struct Contact* pc) {if (pc->sz == 0){printf("通訊錄為空,無(wú)法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n"); }//保存信息 void SaveContact(struct Contact* pc) {//1.打開(kāi)文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.寫(xiě)數(shù)據(jù)int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.關(guān)閉文件fclose(pf);pf = NULL; }3.contact.h?
#pragma once #include <stdio.h> #include <stdlib.h> #include <string.h>#define NAME_MAX 20 #define SEX_MAX 20 #define TELE_MAX 20 #define ADDR_MAX 20 #define DEFAULT_SZ 3struct PeoInfo {char name[NAME_MAX];//姓名int age; //年齡char sex[SEX_MAX]; //性別char tele[TELE_MAX];//電話char addr[ADDR_MAX];//住址 };struct Contact {struct PeoInfo* data;//能夠動(dòng)態(tài)存儲(chǔ)聯(lián)系人的信息int sz; //記錄當(dāng)前聯(lián)系人的個(gè)數(shù)int capacity; //記錄當(dāng)前通訊錄的容量 };//初始化通訊錄 void InitContact(struct Contact* pc);//添加聯(lián)系人信息 void AddContact(struct Contact* pc);//銷毀通訊錄信息 void DistroyContact(struct Contact* pc);//顯示聯(lián)系人信息 void ShowContact(struct Contact* pc);//刪除聯(lián)系人信息 void DelContact(struct Contact* pc);//查找聯(lián)系人信息 void SearchContact(struct Contact* pc);//修改聯(lián)系人信息 void ModifyContact(struct Contact* pc);//排序聯(lián)系人信息 void SortContact(struct Contact* pc);//加載有效信息到通訊錄中 void LoadContact(struct Contact* pc);//保存信息 void SaveContact(struct Contact* pc);四、演示效果?
一個(gè)聯(lián)系人都沒(méi)有?
?存入聯(lián)系人
刪除聯(lián)系人1?
查找聯(lián)系人2?
修改聯(lián)系人2為4?
排序聯(lián)系人 前后對(duì)比
?
退出通訊錄再次打開(kāi),看是否保存了記錄?
?開(kāi)始運(yùn)行后直接讓程序打印結(jié)果,此時(shí)看到屏幕上已經(jīng)保存了我們之前存的數(shù)據(jù),以上就是通訊錄的全部?jī)?nèi)容,如有錯(cuò)誤請(qǐng)聯(lián)系博主;
總結(jié)
以上是生活随笔為你收集整理的【C语言】—— 通讯录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RRT算法及其部分改进算法介绍
- 下一篇: 原声php 读取excel乱码_如何解决