C語(yǔ)言小項(xiàng)目實(shí)戰(zhàn)之通訊錄功能
功能介紹:
1.聯(lián)系人信息:姓名+年齡+性別+地址+電話
2.通訊錄中可以存放100個(gè)人的信息
3.功能:
1>增加聯(lián)系人
2>刪除指定聯(lián)系人
3>查找指定聯(lián)系人的信息
4>修改指定聯(lián)系人的信息
5顯示所有聯(lián)系人的信息
6>排序(名字)
我們將采用模塊化設(shè)計(jì),分為三個(gè)模塊:
1. test.c ——— 測(cè)試通訊錄
2. contact.c ——— 通訊錄的聲明
3. contact.h ——— 函數(shù)的聲明
首先,我們需要一個(gè)菜單,以及主函數(shù)選擇功能的部分。
```test.c #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> void menu() { printf("*******************歡迎來到你的通訊錄*******************\n"); printf("**********1.添加聯(lián)系人************2.刪除聯(lián)系人**********\n"); printf("**********3.查找聯(lián)系人************4.修改聯(lián)系人**********\n"); printf("**********5.顯示聯(lián)系人************6.聯(lián)系人排序**********\n"); printf("**********0.退出通訊錄*********************************\n"); printf("*******************歡迎來到你的通訊錄*******************\n"); } int main() { int input = 0; do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); switch (input) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 0: printf("退出通訊錄"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); return 0; } ```
- 在
main
函數(shù)中,使用do-while
循環(huán)不斷調(diào)用menu
函數(shù)顯示菜單,并使用scanf
函數(shù)獲取用戶的輸入。然后通過switch
語(yǔ)句根據(jù)用戶的輸入執(zhí)行相應(yīng)的操作,如果輸入為0
,則輸出 “退出通訊錄” 并結(jié)束程序;如果輸入為其他值,則輸出 “選擇錯(cuò)誤”。
那么通訊錄中肯定需要人的信息,那么這些人的信息,我們可以把他封裝成一個(gè)結(jié)構(gòu)體。我們將這些類型信息放進(jìn)頭文件中,在這里我們將它放進(jìn)已經(jīng)創(chuàng)建好的contact.h中。
```contact.h //人的信息 typedef struct Peopleinform { char name[40]; int age; char sex[5]; char addr[20]; char telephone[20]; }Peopleinform; ```
在這里,我們定義了一個(gè)名為
Peopleinform
的結(jié)構(gòu)體類型,用于存儲(chǔ)人員的信息。我們通過使用typedef
關(guān)鍵字,可以為這個(gè)結(jié)構(gòu)體類型定義一個(gè)別名Peopleinform
,這樣在后續(xù)的代碼中就可以直接使用Peopleinform
來聲明該類型的變量,而不需要每次都寫完整的struct Peopleinform
。
我們繼續(xù)往下寫,接下來我們創(chuàng)建通訊錄,我們可以聲明一個(gè)名為data
的數(shù)組,數(shù)組的元素類型為Peopleinform
結(jié)構(gòu)體,當(dāng)然我們?cè)谶@里必須添加contact.h頭文件才能使用它。代碼部分如下:
```test.c #include<stdio.h> #include"contact.h" /* --省略void menu部分--*/ int main() { int input = 0; //創(chuàng)建通訊錄 Peopleinform data[100]; do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); /*-- 省略switch部分 --*/ } while (input); return 0; } ```
在我們的項(xiàng)目中,自己創(chuàng)建的頭文件通常用雙引號(hào)''"包裹起來,這樣我們就可以在.c文件中使用它啦!當(dāng)然,我們?nèi)绻堰@個(gè)通訊錄存放人的信息的容量,以及可以顯示的當(dāng)前創(chuàng)建的人的信息封裝起來,變成一個(gè)結(jié)構(gòu)體。為了方便之后修改我們?cè)黾右粋€(gè)預(yù)處理器指令#define MAX 100
```contact.h #define MAX 100 typedef struct Contact { Peopleinform data[MAX];//存放人的信息的容量 int sz;//當(dāng)前存放信息的個(gè)數(shù) }Contact; ```
那么我們?nèi)绻朐谥骱瘮?shù)中使用,只需要?jiǎng)?chuàng)建一個(gè)名為con
的Contact
類型的對(duì)象。這樣就可以使用con
來存儲(chǔ)和操作通訊錄相關(guān)的數(shù)據(jù)了。接著我們初始化通訊錄。并在contact.h頭文件中為他聲明。
```test.c int main() { int input = 0; //創(chuàng)建通訊錄 Contact con;//創(chuàng)建一個(gè)名為con的Contact對(duì)象 //初始化通訊錄 InitContact(&con); do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); /*-- 省略switch部分 --*/ } while (input); ```
```contact.h void InitContact(Contact *pc); ```
接下來,contact.c文件終于出場(chǎng)了,由于我們?cè)赾ontact.h頭文件聲明過void InitContact(Contact *pc); 接下來,我們就可以在contact.c直接使用它。
我們給這個(gè)Contact
結(jié)構(gòu)體的函數(shù)初始化一下:
```contact.c #include"contact.h" void InitContact(Contact* pc) { pc->sz=0; memset(pc->data,0,sizeof(pc->data)); } ```
這里我們選擇使用memset函數(shù)進(jìn)行初始化,
(注:memset
函數(shù)是 C 標(biāo)準(zhǔn)庫(kù)中的一個(gè)函數(shù),定義在<string.h>
頭文件中。它的作用是將一段內(nèi)存區(qū)域設(shè)置為指定的值。函數(shù)原型為void *memset(void *s, int c, size_t n)
,其中s
是指向要填充的內(nèi)存塊的指針,c
是要設(shè)置的值,n
是要填充的字節(jié)數(shù)。)
緊接著,我們?cè)赟witch()語(yǔ)句中,加入我們目前需要的語(yǔ)句,我們現(xiàn)在來寫添加聯(lián)系人模塊。
添加聯(lián)系人模塊
```contact.h //增加聯(lián)系人 void AddContact(Contact* pc); ```
```contact.c void AddContact(Contact* pc) { if (pc->sz == MAX) { printf("通訊錄已滿!無法添加!\n"); return; } //增加一個(gè)人的信息 printf("請(qǐng)輸入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("請(qǐng)輸入年齡:>"); scanf("%s", &pc->data[pc->sz].age); printf("請(qǐng)輸入性別:>"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("請(qǐng)輸入電話:>"); scanf("%s", pc->data[pc->sz].telephone); pc->sz++; } ```
(注:在
InitContact
和AddContact
函數(shù)中,pc
用于訪問和修改調(diào)用者提供的Contact
結(jié)構(gòu)體實(shí)例。當(dāng)調(diào)用這些函數(shù)時(shí),傳遞的是Contact
結(jié)構(gòu)體變量的地址,函數(shù)內(nèi)部通過這個(gè)指針來操作外部傳入的結(jié)構(gòu)體。)
pc-sz++; 的作用
假設(shè)
sz
初始值為5
,執(zhí)行pc->sz++;
后,sz
的值變?yōu)?nbsp;6
,表示通訊錄中聯(lián)系人的數(shù)量從5
個(gè)增加到了6
個(gè)。 這對(duì)于跟蹤通訊錄中實(shí)際存儲(chǔ)的聯(lián)系人數(shù)量非常重要,在后續(xù)的操作,如顯示聯(lián)系人列表、檢查通訊錄是否已滿等功能中,都依賴這個(gè)計(jì)數(shù)。
顯示聯(lián)系人模塊
顯示聯(lián)系人模塊也是一樣,我們現(xiàn)將函數(shù)聲明放在頭文件當(dāng)中,
void ShowContact(const Contact* pc);
然后我們用一個(gè)for
循環(huán)遍歷pc->data
數(shù)組,其中,pc->data
數(shù)組存儲(chǔ)了所有聯(lián)系人的信息,循環(huán)條件i < pc->sz
確保只遍歷已存儲(chǔ)聯(lián)系人的部分,pc->sz
表示當(dāng)前通訊錄中實(shí)際存儲(chǔ)的聯(lián)系人數(shù)量。
```contact.c void ShowContact(Contact* pc) { int i = 0; printf("%s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "姓名","年齡","性別","地址","電話"); for (i = 0; i < pc->sz; i++) { printf("%s\t%d\t%s\t%s\t%s\t",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].telephone); } } ```
這樣,我們就基本完成了這個(gè)顯示聯(lián)系人的設(shè)計(jì)啦!那么緊接著,我們?nèi)绻胍獎(jiǎng)h除這個(gè)指定的聯(lián)系人,該怎么辦呢?和上面一樣,我們先在頭文件中添加一個(gè)聲明。
void DelContact(Contact* pc);
接著,我們?cè)赾ontact.c文件中去構(gòu)建這個(gè)刪除聯(lián)系人模塊,
刪除聯(lián)系人模塊
void DelContact(Contact* pc) { if (pc->sz ==0) { printf("無可刪除的聯(lián)系人"); return; } //刪除 //找到要?jiǎng)h除的人 printf("請(qǐng)輸入要?jiǎng)h除的人的名字:"); scanf("%s", name); int i = 0; int del = 0; for (i = 0; i<pc->sz; i++) { if(strcmp(pc->data[i].name,name))==0 { del = i; break; } //刪除 for (i = 0; i < pc->sz; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功"); } }
當(dāng)我們通訊錄里面沒有聯(lián)系人的時(shí)候,我們輸出“無可刪除的聯(lián)系人”。接著,我們使用 for
循環(huán)遍歷聯(lián)系人列表,使用 strcmp
函數(shù)比較每個(gè)聯(lián)系人的名字和輸入的名字,如果相等則將該元素的索引存儲(chǔ)在 del
中并跳出循環(huán)。
那么接下來,我們可以發(fā)現(xiàn)的是,無論是刪除模塊、查找模塊和修改模塊中,我們都需要先找到聯(lián)系人,才能進(jìn)行下一步的操作,既然都需要,我們似乎就可以把這個(gè)查找部分封裝成一個(gè)函數(shù),
// 根據(jù)姓名查找聯(lián)系人在數(shù)組中的位置,如果找到返回對(duì)應(yīng)索引,未找到返回 -1 int FINDBY_NAME(const 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; // 未找到返回 -1 }
替換后代碼如下:
// 刪除聯(lián)系人的函數(shù) void DelContact(Contact* pc) { if (pc->sz == 0) { printf("沒有聯(lián)系人可刪除\n"); return; } // 輸入要?jiǎng)h除的聯(lián)系人姓名 char name[40] = { 0 }; printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名: "); scanf("%s", name); int ret = FINDBY_NAME(pc, name); if (ret == -1) { printf("要?jiǎng)h除的聯(lián)系人不存在\n"); return; } // 刪除操作,將后面的元素依次往前移 for (int i = ret; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); }
我們來看查找聯(lián)系人模塊,
查找聯(lián)系人模塊
void SerContact(const Contact* pc) { char name[NAME_MAX] = { 0 }; printf("請(qǐng)輸入要查找人的名字:"); scanf("%s",name); int pos = FINDBY_NAME(pc, name); if (-1 == pos) { printf("要查找的人不存在\n"); return; } //打印信息 printf("%s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "姓名", "年齡", "性別", "地址", "電話"); printf("%s\t%-5d\t%-5s\t%-5s\t%-5s\t\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr, pc->data[pos].telephone); }
我們查找模塊,首先輸入要查找的聯(lián)系人姓名,調(diào)用 FINDBY_NAME
函數(shù)查找該聯(lián)系人的位置,如果不存在則提示聯(lián)系人不存在并返回。否則,打印該聯(lián)系人的詳細(xì)信息。
緊接著,我們?cè)賮砜葱薷穆?lián)系人,
修改聯(lián)系人模塊
//修改聯(lián)系人 void ReviContact(Contact* pc) { char name[NAME_MAX] = { 0 }; printf("請(qǐng)輸入要修改人的名字:"); scanf("%s", name); int pos = FINDBY_NAME(pc, name); if (-1 == pos) { printf("要修改的人不存在\n"); return; } printf("請(qǐng)輸入名字:>"); scanf("%s", pc->data[pos].name); printf("請(qǐng)輸入年齡:>"); scanf("%d", &pc->data[pos].age); printf("請(qǐng)輸入性別:>"); scanf("%s", pc->data[pos].sex); printf("請(qǐng)輸入地址:>"); scanf("%s", pc->data[pos].addr); printf("請(qǐng)輸入電話:>"); scanf("%s", pc->data[pos].telephone); printf("修改完成\n"); }
我們想要修改聯(lián)系人,首先肯定需要找到這個(gè)聯(lián)系人,所以我們首先要查找,輸入要修改的聯(lián)系人姓名,調(diào)用FINDBY_NAME
函數(shù)可以查找該聯(lián)系人的位置,如果不存在則提示聯(lián)系人不存在并返回。否則,依次輸入新的聯(lián)系人信息。
排序聯(lián)系人模塊
最后一個(gè)模塊,就是對(duì)這些聯(lián)系人進(jìn)行排序,這里使用使用冒泡排序算法,比較相鄰聯(lián)系人的姓名,如果前一個(gè)聯(lián)系人的姓名大于后一個(gè)聯(lián)系人的姓名,則交換它們的位置。
// 排序聯(lián)系人(按姓名升序排序) void SortContact(Contact* pc) { int i, j; Peopleinform temp; for (i = 0; i < pc->sz - 1; i++) { for (j = 0; j < pc->sz - i - 1; j++) { if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) { temp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = temp; } } } printf("聯(lián)系人已按姓名排序\n"); }
strcmp
是 C 語(yǔ)言標(biāo)準(zhǔn)庫(kù) <string.h>
中的一個(gè)字符串比較函數(shù),用于比較兩個(gè)字符串的大小。
函數(shù)原型int strcmp(const char *str1, const char *str2);
在 SortContact
函數(shù)中,strcmp(pc->data[j].name, pc->data[j + 1].name) > 0
表示如果 pc->data[j].name
這個(gè)字符串在字典序上大于 pc->data[j + 1].name
這個(gè)字符串,就交換這兩個(gè)聯(lián)系人的信息,從而實(shí)現(xiàn)按姓名排序的功能。
源代碼如下:
```contact.h #pragma once #include<stdio.h> #include<string.h> #define MAX 100 #define NAME_MAX 40 // 定義 NAME_MAX 的大小 // 個(gè)人信息 typedef struct Peopleinform { char name[40]; int age; char sex[5]; char addr[20]; char telephone[20]; }Peopleinform; typedef struct Contact { Peopleinform data[MAX];// 存儲(chǔ)個(gè)人信息的數(shù)組 int sz;// 當(dāng)前存儲(chǔ)信息的數(shù)量 }Contact; // 初始化通訊錄 void InitContact(Contact* pc); // 添加聯(lián)系人 void AddContact(Contact* pc); // 刪除聯(lián)系人 void DelContact(Contact* pc); // 查找聯(lián)系人 void SerContact(const Contact* pc); // 修改聯(lián)系人 void ReviContact(Contact* pc); // 排序聯(lián)系人 void SortContact(Contact* pc); // 顯示聯(lián)系人 void ShowContact(const Contact* pc); ```
```contact.c #define _CRT_SECURE_NO_WARNINGS #include"contact.h" void InitContact(Contact* pc) { pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } void AddContact(Contact* pc) { char name[NAME_MAX] = { 0 }; if (pc->sz == MAX) { printf("通訊錄已滿!無法添加!\n"); return; } //增加一個(gè)人的信息 printf("請(qǐng)輸入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("請(qǐng)輸入年齡:>"); scanf("%d", &pc->data[pc->sz].age); printf("請(qǐng)輸入性別:>"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("請(qǐng)輸入電話:>"); scanf("%s", pc->data[pc->sz].telephone); pc->sz++; } // 根據(jù)姓名查找聯(lián)系人在數(shù)組中的位置,如果找到返回對(duì)應(yīng)索引,未找到返回 -1 int FINDBY_NAME(const 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; // 未找到返回 -1 } // 刪除聯(lián)系人的函數(shù) void DelContact(Contact* pc) { if (pc->sz == 0) { printf("沒有聯(lián)系人可刪除\n"); return; } // 輸入要?jiǎng)h除的聯(lián)系人姓名 char name[40] = { 0 }; printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名: "); scanf("%s", name); int ret = FINDBY_NAME(pc, name); if (ret == -1) { printf("要?jiǎng)h除的聯(lián)系人不存在\n"); return; } // 刪除操作,將后面的元素依次往前移 for (int i = ret; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); } //查找聯(lián)系人 void SerContact(const Contact* pc) { char name[NAME_MAX] = { 0 }; printf("請(qǐng)輸入要查找人的名字:"); scanf("%s",name); int pos = FINDBY_NAME(pc, name); if (-1 == pos) { printf("要查找的人不存在\n"); return; } //打印信息 printf("%s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "姓名", "年齡", "性別", "地址", "電話"); printf("%s\t%-5d\t%-5s\t%-5s\t%-5s\t\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr, pc->data[pos].telephone); } //修改聯(lián)系人 void ReviContact(Contact* pc) { char name[NAME_MAX] = { 0 }; printf("請(qǐng)輸入要修改人的名字:"); scanf("%s", name); int pos = FINDBY_NAME(pc, name); if (-1 == pos) { printf("要修改的人不存在\n"); return; } printf("請(qǐng)輸入名字:>"); scanf("%s", pc->data[pos].name); printf("請(qǐng)輸入年齡:>"); scanf("%d", &pc->data[pos].age); printf("請(qǐng)輸入性別:>"); scanf("%s", pc->data[pos].sex); printf("請(qǐng)輸入地址:>"); scanf("%s", pc->data[pos].addr); printf("請(qǐng)輸入電話:>"); scanf("%s", pc->data[pos].telephone); printf("修改完成\n"); } // 排序聯(lián)系人(按姓名升序排序) void SortContact(Contact* pc) { int i, j; Peopleinform temp; for (i = 0; i < pc->sz - 1; i++) { for (j = 0; j < pc->sz - i - 1; j++) { if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) { temp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = temp; } } } printf("聯(lián)系人已按姓名排序\n"); } // 顯示所有聯(lián)系人信息的函數(shù) void ShowContact(const Contact* pc) { int i = 0; printf("%s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "姓名", "年齡", "性別", "地址", "電話"); for (i = 0; i < pc->sz; i++) { printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].telephone); } } ```
```test.c #define _CRT_SECURE_NO_WARNINGS #include"contact.h" void menu() { printf("*******************歡迎來到你的通訊錄*******************\n"); printf("**********1.添加聯(lián)系人************2.刪除聯(lián)系人**********\n"); printf("**********3.查找聯(lián)系人************4.修改聯(lián)系人**********\n"); printf("**********5.顯示聯(lián)系人************6.聯(lián)系人排序**********\n"); printf("**********0.退出通訊錄**********************************\n"); printf("*******************歡迎來到你的通訊錄*******************\n"); } int main() { int input = 0; //創(chuàng)建通訊錄 Contact con;//創(chuàng)建一個(gè)名為con的Contact對(duì)象 //初始化通訊錄 InitContact(&con); do { menu(); printf("請(qǐng)選擇:>"); if (scanf("%d", &input) != 1) { // 處理輸入錯(cuò)誤的情況,例如提示用戶重新輸入 printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n"); // 清空輸入緩沖區(qū) while (getchar() != '\n'); continue; } switch (input) { case 1: AddContact(&con); break; case 2: DelContact(&con); break; case 3: SerContact(&con); break; case 4: ReviContact(&con); break; case 5: ShowContact(&con); break; case 6: SortContact(&con); case 0: printf("退出通訊錄"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input!=0); } ```
總結(jié)
到此這篇關(guān)于C語(yǔ)言小項(xiàng)目實(shí)戰(zhàn)之通訊錄功能的文章就介紹到這了,更多相關(guān)C語(yǔ)言通訊錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析ORB、SURF、SIFT特征點(diǎn)提取方法以及ICP匹配方法
這篇文章主要為大家介紹了常用的特征點(diǎn)提取方法(ORB、SURF、SIFT)和ICP匹配方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12詳解C++中的const關(guān)鍵字及與C語(yǔ)言中const的區(qū)別
這篇文章主要介紹了C++中的const關(guān)鍵字及與C語(yǔ)言中const的區(qū)別,const將所修飾的變量對(duì)象轉(zhuǎn)化為常量,需要的朋友可以參考下2016-04-04OpenCV實(shí)現(xiàn)簡(jiǎn)單套索工具
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)簡(jiǎn)單套索工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01如何判斷一個(gè)數(shù)是否為4的冪次方?若是,并判斷出來是多少次方?
本篇文章是對(duì)如何判斷一個(gè)數(shù)是否為4的冪次方?若是,并判斷出來是多少次方的實(shí)現(xiàn)方法,進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++深入詳解單例模式與特殊類設(shè)計(jì)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++單例模式和特殊類的設(shè)計(jì),單例模式這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-06-06