From 0c8a5b600265e01dcbf25341a1b51dd316cae9a0 Mon Sep 17 00:00:00 2001 From: superhandsomechuan <781728963@qq.com> Date: Mon, 29 Jun 2020 08:57:48 +0800 Subject: [PATCH] 1 --- Coding/Project/02_通讯录/AddressBook.c | 300 ++++++++++++++++++++++ Coding/Project/02_通讯录/AddressBook.h | 41 +++ Coding/Project/02_通讯录/Main.c | 57 ++++ Coding/Project/02_通讯录/address_book.txt | Bin 0 -> 600 bytes 4 files changed, 398 insertions(+) create mode 100644 Coding/Project/02_通讯录/AddressBook.c create mode 100644 Coding/Project/02_通讯录/AddressBook.h create mode 100644 Coding/Project/02_通讯录/Main.c create mode 100644 Coding/Project/02_通讯录/address_book.txt diff --git a/Coding/Project/02_通讯录/AddressBook.c b/Coding/Project/02_通讯录/AddressBook.c new file mode 100644 index 0000000..4214124 --- /dev/null +++ b/Coding/Project/02_通讯录/AddressBook.c @@ -0,0 +1,300 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include"AddressBook.h" + +#define PRIVATE static + +PRIVATE int FindName(AddressBook* address_book, char search_name[100]) { + + for (int i = 0; i < address_book->size; i++) { + // ÕÒµ½·µ»ØÊý×éϱê + // ×¢Òâ all_address[i] µÄ³ÉÔ±·ÃÎÊ·½Ê½Îª . ¶ø²»ÊÇ -> + if (strcmp(address_book->all_address[i].name, search_name) == 0) { + return i; + } + } + //ûÓÐÕÒµ½£¬·µ»Ø -1 + return -1; +} + +// À©ÈÝ +PRIVATE void ReallocBook(AddressBook* address_book){ + // ³õʼ capacity Ϊ 1£¬¶þ±¶ÔöÈÝ + int newSize = address_book->capacity == 0 ? 1 : 2 * address_book->capacity; + + PersonInfo* newAddress = realloc(address_book->all_address, newSize * sizeof(PersonInfo)); + if (!newAddress){ + strerror(errno); + exit(EXIT_FAILURE); + } + // ¸üР+ address_book->all_address = newAddress; + address_book->capacity = newSize; +} + +// ´ÓÎļþ¶ÁÈ¡Êý¾Ýµ½»º³åÇøÖÐ +PRIVATE void LoadBook(AddressBook* address_book){ + FILE* fp = fopen("address_book.txt", "r"); + + if (fp == NULL){ + strerror(errno); + exit(EXIT_FAILURE); + } + + // Ïò»º³åÇø¶ÁÈ¡£¬ÒÔΪ²»ÖªµÀÎļþÖÐÓжàÉÙѧÉúÐÅÏ¢£¬ËùÒÔÎÒÃDz»ÄÜÒ»´ÎÐÔ¶ÁÍê + // ʹÓà while Ñ­»·²»¶ÏÖØ¸´¶ÁÈ¡µ¥¸öѧÉúÐÅÏ¢ + while (1) { + if (address_book->size == address_book->capacity) { + ReallocBook(address_book); + } + PersonInfo tmp = {0}; + int n = fread(&tmp, sizeof(PersonInfo), 1, fp); + // ¶ÁÈ¡Íê³É + if (n < 1) { + break; + } + // ½« tmp ·ÅÈ뻺³åÇø£¬²¢ÇÒ½« size ¼Ó 1 + address_book->all_address[address_book->size++] = tmp; + } + printf("ÎļþÒÑÔØÈ룡\n"); + fclose(fp); +} + +// ±£´æ»º³åÇøµÄÊý¾Ýµ½ÎļþÖÐ +PRIVATE void SaveBook(AddressBook* address_book) { + FILE* fp = fopen("address_book.txt", "w"); + + if (fp == NULL) { + strerror(errno); + exit(EXIT_FAILURE); + } + // ½«»º³åÇøÄÚµÄËùÓÐÄÚÈÝдÈëÎļþ + int n = fwrite(address_book->all_address, sizeof(PersonInfo), address_book->size, fp); + if (n != address_book->size) { + strerror(errno); + exit(EXIT_FAILURE); + } + printf("ÎļþÒѱ£´æ£¡\n"); + fclose(fp); +} + + +int Menu(void) { + printf("\n\n\n\n\n\t\t\t\t\t\t AddressBook Management System\n"); + printf("\t\t\t\t\t\t @author£ºShepard Wang \n"); + printf("\t\t\t\t\t\033[0;42m ´úÂëÏêϸעÊÍÒÔ¼°½²½â¼û¹«Öںţº²»»á±à³ÌµÄ³ÌÐòÔ² \033[0m \n"); + printf("\t\t\t\t\t\t ======================\n"); + printf("\t\t\t\t\t\t *** 0.Í˳ö ***\n"); + printf("\t\t\t\t\t\t *** 1.ÐÂÔöÁªÏµÈË ***\n"); + printf("\t\t\t\t\t\t *** 2.ɾ³ýÁªÏµÈË ***\n"); + printf("\t\t\t\t\t\t *** 3.²éÕÒÁªÏµÈË ***\n"); + printf("\t\t\t\t\t\t *** 4.ÐÞ¸ÄÁªÏµÈË ***\n"); + printf("\t\t\t\t\t\t *** 5.´òÓ¡ÁªÏµÈË ***\n"); + printf("\t\t\t\t\t\t *** 6.Çå³ýÁªÏµÈË ***\n"); + printf("\t\t\t\t\t\t *** 7.ÅÅÐòÁªÏµÈË ***\n"); + printf("\t\t\t\t\t\t ======================\n"); + + printf("ÇëÊäÈëÄãµÄÑ¡Ôñ£º"); + int choice; + scanf("%d", &choice); + + return choice; +} + +//³õʼ»¯ +void InitBook(AddressBook* address_book) { + + address_book->size = 0; + //¾¡Á¿ÉÙÓà magic number(²»Ã÷º¬ÒåµÄÊý×Ö) + address_book->all_address = NULL; + address_book->capacity = 0; + + // ³õʼ»¯ºÃ»º³åÇøºó´ÓÎļþ¶ÁÈ¡Êý¾Ý + LoadBook(address_book); +} + +void AddPersonInfo(AddressBook* address_book) { + + printf("ÐÂÔöÁªÏµÈË\n"); + + if (address_book->size >= address_book->capacity) { + ReallocBook(address_book); + } + + PersonInfo* info = &address_book->all_address[address_book->size]; + + printf("ÇëÊäÈëÁªÏµÈËÐÕÃû£º"); + scanf("%s", info->name); + printf("ÇëÊäÈëÁªÏµÈ˵绰£º"); + scanf("%s", info->phone); + + address_book->size++; + + system("pause"); +} + +void DelPersonInfo(AddressBook* address_book) { + + //ɾ³ýµÄ·½·¨ºÜ¶à£¬¿ÉÒÔ¸ù¾ÝÐÕÃû£¬µç»°£¬ÐòºÅµÈµÈÀ´É¾³ý£¬ + //ÕâÀïÎÒÃǾÍÓÃÎÒ¸öÈ˱Ƚϳ£ÓÃµÄ ËÑË÷Ãû×ÖµÄɾ³ý·½·¨ + + char search_name[100] = { 0 }; + + printf("ɾ³ýÁªÏµÈË\n"); + printf("ÇëÊäÈëÁªÏµÈËÐÕÃû£º"); + scanf("%s", search_name); + + int name_exist = FindName(address_book, search_name); + + //ÕâÀï×¢Òâ FindName ·µ»ØÖµÉ趨£¬Òª±»É¾³ýµÄÔªËØÏ±ê¿ÉÄÜÊÇ 0£¬ÕâÖÖÇé¿öÏ»᷵»Ø 0 + if (name_exist == -1) { + printf("¸ÃÁªÏµÈ˲»´æÔÚ£¡\n"); + system("pause"); + return; + } + + //ɾ³ýÁËÏàͬÐÕÃûµÄµÚÒ»¸öºó£¬¼ÌÐøÑ°ÕÒ¸ÄÃû×Ö£¬Èç¹ûÕÒµ½ÁË£¬Öظ´ÉÏÃæµÄ²Ù×÷£¬Èç¹ûûÕÒµ½£¬Í˳öÑ­»· + //ÏàͬµÄÐÕÃûµÄÇé¿ö±È½Ï¸´ÔÓ£¬ÔÚÐ޸쬲éÕÒ£¬ÅÅÐòµÈµÈ³¡¾°¶¼»á´øÀ´Âé·³£¬ + //¶øÇÒÆ½Ê±ÄãµÄͨѶ¼ÖÐÄѵÀ»á½«Á½¸öÏàͬÐÕÃûµÄÈ˵ı¸×¢Ð´³ÉÒ»ÑùµÄÂ𣿠+ //ËùÒÔ£¬ÎÒ½ö½öÔÚɾ³ý¹¦ÄÜÖÐʵÏÖÒ»ÖÖÕë¶ÔÏàͬÐÕÃûµÄÇé¿öµÄÉè¼ÆË¼Â·£¬ºóÃæµÄÆäËû¹¦ÄÜĬÈÏûÓÐÖØ¸´ÐÕÃûµÄÇé¿ö¡£ + while (name_exist != -1) { + + //½« all_address Êý×éµÄ×îºóÒ»¸öÔªËØ¸³Öµ¸øÒªÉ¾³ýµÄÔªËØ£¬Íê³Éɾ³ý + //½á¹¹ÌåÀàÐÍÊÇ¿ÉÒÔÖ±½Ó¸³ÖµµÄ + address_book->all_address[name_exist] = address_book->all_address[address_book->size - 1]; + address_book->size--; + // ¼ÌÐøÑ°ÕÒͬÃûÈË + name_exist = FindName(address_book, search_name); + } + + printf("ɾ³ý³É¹¦£¡\n"); + + system("pause"); +} + + +void FindPersonInfo(AddressBook* address_book) { + + char search_name[100] = { 0 }; + + //ËÑË÷È˵ķ½Ê½Ò²ºÜ¶à£¬ÎÒÃÇÕâÀïÓÃËÑË÷Ãû×ֵķ½·¨ + printf("¸üÐÂÁªÏµÈË\n"); + printf("ÇëÊäÈëÈËÃû£º"); + scanf("%s", search_name); + + for (int i = 0; i < address_book->size; i++) { + PersonInfo* info = &address_book->all_address[i];// ´´½¨Ò»¸ö PersonInfo ÀàÐ͵ıäÁ¿¼ò»¯³ÌÐò£¬²»È»ÏÂÃæµÄÐÕÃû·ÃÎʾÍÌ«³¤ÁË + if (strcmp(info->name, search_name) == 0) { + printf("[%d] %s %s\n", i, info->name, info->phone); + } + } + + system("pause"); +} + +void ModifyPersonInfo(AddressBook* address_book) { + + char search_name[100] = { 0 }; + int isjump = 1; + + printf("ÐÞ¸ÄÁªÏµÈË\n"); + printf("ÇëÊäÈëÁªÏµÈËÐÕÃû£º"); + scanf("%s", search_name); + + int name_exist = FindName(address_book, search_name); + + if (name_exist == -1) { + printf("¸ÃÁªÏµÈ˲»´æÔÚ£¡\n"); + system("pause"); + return; + } + + //ÓÅ»¯Óû§µÄÌåÑé + printf("ÇëÊäÈëеÄÐÕÃû£¬ÊäÈë 0 Ìø¹ý£º"); + scanf("%d", &isjump); + if (isjump) { + scanf("%s", address_book->all_address[name_exist].name); + } + printf("ÇëÊäÈëеĵ绰£¬ÊäÈë 0 Ìø¹ý£º"); + scanf("%d", &isjump); + if (isjump) { + scanf("%s", address_book->all_address[name_exist].phone); + } + + printf("¸üгɹ¦£¡\n"); + system("pause"); +} + +void PrintPersonInfo(AddressBook* address_book) { + + PersonInfo* info; + + if (address_book->size == 0) { + printf("µ±Ç°Ã»ÓÐÁªÏµÈË£¡\n"); + system("pause"); + return; + } + + printf("ËùÓÐÁªÏµÈËÐÅÏ¢ÈçÏ£º\n"); + + for (int i = 0; i < address_book->size; i++) { + info = &address_book->all_address[i]; + printf("[%03d]%4s %s\n", i, info->name, info->phone); + } + + system("pause"); +} + +void ClearPersonInfo(AddressBook* address_book) { + + //Çå³ýËùÓÐÐÅÏ¢ÊÇÒ»ÖÖ Î£ÏÕµÄÐÐΪ£¬ÎÒÃÇ×îºÃÈÃÓû§È·ÈÏÒ»´Î + //Ïà±ÈÄãÓ¦¸ÃÔÚ×Ô¼ºµÄÊÖ»úÉϻظ´¹ý³ö³§ÉèÖã¬ÏµÍ³Ó¦¸Ã»áÈÃÄãÈ·Èϲ»Ö¹Ò»´Î£¡ + int is_continue = 0; + + printf("Çå³ýËùÓÐÁªÏµÈË£¬ÄãÈ·¶¨Âð£¿ÊäÈë 0 ¼ÌÐø: "); + scanf("%d", &is_continue); + if(is_continue == 0) { + //½« size ÖÃΪ 0 ¼´¿É£¬²»¹ýÄãÒ²¿ÉÒÔ½«Êý×éµÄÿ¸öÔªËØ¶¼½øÐÐÖØÖà + address_book->size = 0; + printf("Çå³ýÍê³É£¡\n"); + } + printf("ÒÑÈ¡Ïû£¡\n"); + + system("pause"); +} + +void SortPersonInfo(AddressBook* address_book) { + + printf("ÅÅÐòͨѶ¼\n"); + + for (int i = 0; i < address_book->size - 1; i++) { + for (int j = 0; j < address_book->size - 1 - i; j++) { + PersonInfo* info = &address_book->all_address[j]; + PersonInfo* info_next = &address_book->all_address[j + 1]; + //¼òµ¥µÄÓà strcmp ½øÐÐÅÅÐò£¬²»¹ýÅÅÐòµÄÐÐΪ¸Ð¾õÊÇ¡°Î´¶¨Ò塱µÄ£¬ + //¿´×ÅÓйæÂÉ£¬µ«ÔÙ¶àÊÔÊԻᷢÏֺܶàÇé¿ö²¢Ã»ÓйæÂÉ¡£ + //Ò²»¹Óкܶà¿ÉÒÔÅÅÐòµÄº¯Êý¡£±ÈÈ磺strcoll,wcsscoll,wcscmp ÕâЩֻҪÄãÄÜŪ¶®£¬ÎÒÏëÄãÒ²¿ÉÒÔÓᣠ+ //»òÕßÓÐÆäËû¸üºÃµÄʵÏÖ°ì·¨£¬µ«Õâ²¢²»ÊÇÎÒÃÇÔÚÕâÀïµÄÖØµã¡£ + if (strcmp(info->name, info_next->name) > 0) { + PersonInfo tmp; + tmp = *info; + *info = *info_next; + *info_next = tmp; + } + } + } + printf("ÅÅÐò³É¹¦£¡\n"); + + system("pause"); +} + +void DestoryBook(AddressBook* address_book) { + + // ÔÚÒªÍ˳ö³ÌÐòʱ½«»º³åÇøÄÚµÄÄÚÈÝдÈëÎļþÖÐ + SaveBook(address_book); + + free(address_book->all_address); + address_book->all_address = NULL; + address_book->capacity = address_book->size = 0; +} + diff --git a/Coding/Project/02_通讯录/AddressBook.h b/Coding/Project/02_通讯录/AddressBook.h new file mode 100644 index 0000000..4714963 --- /dev/null +++ b/Coding/Project/02_通讯录/AddressBook.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include + +typedef struct PersonInfo { + char name[100]; + char phone[100]; +}PersonInfo; + +typedef struct AddressBook { + PersonInfo* all_address; + int size; + int capacity; +}AddressBook; +// size µÄº¬ÒåÊÇ£º +// Êý×é all_address ϱ귶ΧÔÚ [0,size) ÄÚµÄÔªËØÊÇÓÐÒâÒåµÄ +// [size, 200) ÊÇÎÒÃÇûÓÐÓõ½µÄ +// capacity ¿ÉÓõĿռä´óС + + +int Menu(void); + +void InitBook(AddressBook* address_book); + +void AddPersonInfo(AddressBook* address_book); + +void DelPersonInfo(AddressBook* address_book); + +void FindPersonInfo(AddressBook* address_book); + +void ModifyPersonInfo(AddressBook* address_book); + +void PrintPersonInfo(AddressBook* address_book); + +void ClearPersonInfo(AddressBook* address_book); + +void SortPersonInfo(AddressBook* address_book); + +void DestoryBook(AddressBook* address_book); diff --git a/Coding/Project/02_通讯录/Main.c b/Coding/Project/02_通讯录/Main.c new file mode 100644 index 0000000..000105a --- /dev/null +++ b/Coding/Project/02_通讯录/Main.c @@ -0,0 +1,57 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include"AddressBook.h" + +int main(int argc, char* argv[]) { + + AddressBook address_book; + + //ÉùÃ÷Ò»¸öº¯ÊýÖ¸ÕëÀàÐÍ + typedef void (*Func)(AddressBook*); + Func func_table[] = { + DestoryBook, + AddPersonInfo, + DelPersonInfo, + FindPersonInfo, + ModifyPersonInfo, + PrintPersonInfo, + ClearPersonInfo, + SortPersonInfo, + }; + //»òÕßÄãÒ²¿ÉÒÔÕâô×ö£º + //ÉùÃ÷Ò»¸öº¯ÊýÀàÐÍ£º + //typedef void (Func)(AddressBook*); + //ÎÒÃÇÓõÄÊÇÖ¸ÕëÊý×飬Êý×éÀàÐͱØÐëÊÇÖ¸ÕëÀàÐÍ£¬ËùÒÔÓ¦¸Ã¼ÓÉÏ * + //Func* func_table[] = { + //NULL, + //AddPersonInfo, + //DelPersonInfo, + //FindPersonInfo, + //ModifyPersonInfo, + //PrintPersonInfo, + //ClearPersonInfo, + //SortPersonInfo, + //}; + + InitBook(&address_book); + + + while (1) { + system("cls"); + int choice = Menu(); + + if (choice < 0 || choice > 7) { + printf("ÊäÈë´íÎó£¡\n"); + continue; + } + + func_table[choice](&address_book); + + if (choice == 0) { + printf("\n ÔÙ¼û£¡\n"); + break; + } + } + + return 0; +} diff --git a/Coding/Project/02_通讯录/address_book.txt b/Coding/Project/02_通讯录/address_book.txt new file mode 100644 index 0000000000000000000000000000000000000000..99d78faf1a71bac04f4af99e1cea103e267e73c8 GIT binary patch literal 600 zcmcb5^u%9=6%1!-2@H*lO-yNP#n}VzP9I^od-rY&hj7n^ItGRchDOE;uLee-5Y>PQ c2!Jf1AvpW>(97$W8E6_>W*|UQ8_u2u0Q7s*8~^|S literal 0 HcmV?d00001