【C語言】通訊錄系統實現

目錄

1、通訊錄系統介紹

?2、代碼分裝

?3、代碼實現步驟

3.1制作菜單函數以及游戲運行邏輯流程

?3.2、封裝人的信息PeoInfo以及通訊錄Contact結構體類型

3.3、初始化通訊錄InitContact函數

3.4、增加聯系人AddContact函數

?3.5、顯示所有聯系人ShowContact函數

?3.6、刪除聯系人DelContact函數以及判斷是否存在FindByName函數

?3.7、查找指定聯系人SearchContact函數

3.8、修改指定聯系人ModifyContact函數

?3.9、以年齡排序聯系人SortContact函數

?4、使用動態規劃優化通訊錄?


1、通訊錄系統介紹

實現一個通訊錄:

  1. 可以保存100個人的信息(后續優化成動態開辟)
  2. 增加人的信息
  3. 刪除指定聯系人的信息
  4. 修改指定聯系人的信息?
  5. 查詢指定聯系人的信息
  6. 顯示所有聯系人的信息
  7. 排序通訊錄的信息

其中,人的信息包括:名字、年齡、性別、電話 、地址


?2、代碼分裝

源文件:tect.c? 測試通訊錄的基本功能

contact.c? 相關函數的實現

頭文件 contact.h相關函數和類型的聲明,包含要引用的頭文件和宏



?3、代碼實現步驟

3.1制作菜單函數以及游戲運行邏輯流程

在 test.c 中定義一個menu函數打印菜單,提示玩家進行選擇,增刪查改等選線;


scanf接收玩家輸入并用switch判斷,針對判斷進行相應操作,輸入錯誤時提示選擇錯誤,重新選擇。

用到do while語句:為了能夠讓用戶重新選擇以及完成一個功能操作時再繼續下一個功能操作,需要使用do while語句將它們包含起來。


使用枚舉一一列舉菜單選擇的可能取值,便于后續使用時能夠見名知意,增加代碼可讀性,而且枚舉變量的值是默認從0開始。

【test.c】?

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");
}enum Option  //枚舉常量
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};int main()
{int input = 0;do{menu();printf("請輸入你的選擇:>");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("選擇錯誤,重新選擇\n");break;}} while (input);return 0;
}


?3.2、封裝人的信息PeoInfo以及通訊錄Contact結構體類型

一個人的信息包括很多,名字、年齡、性別、電話 、地址。這些成員是不同類型,所以創建一個結構體變量來保存人的信息Peoinfo。

同理通訊錄也是使用一個結構體,要包括人的信息,也要知道已經存入多少個人的信息了。

?【contact.h】

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30#define MAX 100typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];int sz; //記錄的是當前通訊錄中存放的人的信息個數
}Contact;

Contact這個結構體類型中包含了PeoInfo類型的數組data,數組的元素是?PeoInfo類型。

還包括sz用于記錄當前保存了多少個聯系人的信息。



3.3、初始化通訊錄InitContact函數

【contact.h】

//初始化通訊錄
void InitContact(Contact* pc);

?【contact.c】?

void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}

?在contact.c中具體的實現這個函數,采用指針+箭頭操作符來訪問初始化con中的data成員。

將data和sz初始化為0

assert斷言,對傳入的指針進行判斷,防止對空指針進行操作。

使用?memset函數?初始化結構體中的數據。

?【test.c】?

int main()
{int input = 0;Contact con; //通訊錄InitContact(&con);//初始化通訊錄do{menu();printf("請輸入你的選擇:>");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("選擇錯誤,重新選擇\n");break;}} while (input);return 0;
}

創建了一個Contact類型的結構體變量con,調用初始化函數,把con的地址作為參數傳出

在contact.c中具體的實現這個函數,采用指針+箭頭操作符來訪問初始化con中的data成員。



3.4、增加聯系人AddContact函數

同樣是函數的聲明

函數的實現

函數的調用

函數的聲明【contact.h】

//增加聯系人
void AddContact(Contact* pc);

?函數的實現【contact.c】

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

就是訪問data數組中的第sz個元素的name。也就是用戶要添加的是第幾個聯系人,他的名字,年齡,性別....



?3.5、顯示所有聯系人ShowContact函數

【contact.h】

//顯示所有聯系人
void ShowContact(const Contact* pc);

【contact.c】

void ShowContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通訊錄為空,無需打印\n");return;}int i = 0;printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");  //標題行for ( i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}
  • 名為ShowContact的函數,用于打印通訊錄對象的內容。函數的參數是一個指向const Contact類型的指針。
  • 在函數內部,首先使用assert宏對傳入的指針進行斷言,確保指針非空。然后判斷通訊錄的大小(sz字段)是否為0如果為0則說明通訊錄為空,打印提示信息并返回
  • 接下來使用一個循環來遍歷通訊錄的每個聯系人對象,并使用printf函數按照一定的格式打印聯系人的信息。第一次循環打印標題行,后續循環每次打印一個聯系人的信息。
  • 打印的信息包括:名字(name)、年齡(age)、性別(sex)、電話(tele)和地址(addr)。

?【test.c】

在switch語句中的case show調用函數

switch (input){case ADD:AddContact(&con);break;case DEL:break;case SEARCH:break;case MODIFY:break;case SHOW:ShowContact(&con);break;case SORT:break;case EXIT:printf("退出通訊錄\n");break;default:printf("選擇錯誤,重新選擇\n");break;}



?3.6、刪除聯系人DelContact函數以及判斷是否存在FindByName函數

【contact.h】

//刪除聯系人
void DelContact(Contact* pc);

?【contact.c】

  • 因為通過名字判斷此人是否存在的FindByName函數這個功能在其他操作上也需要使用到,所以最好將它封裝成一個函數,減少代碼冗余并且提高寫代碼效率。
  • 當FindByName函數在通訊錄中找到此人時返回此人在data數組中的下標,找不到是返回-1。返回-1就是為假
  • 又因為FindByName函數只在contact.c中被使用,因此可以加上static關鍵字修飾。

static int FindByName(Contact* pc, char name[])
{assert(pc);int i = 0;for ( i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0)  //兩個字符串比較用strcmpreturn i;}return -1;
}void DelContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通訊錄為空,無法刪除\n");return;}printf("請輸入要刪除人的名字:");scanf("%s", name);//查找名字為name的人int ret = FindByName(pc, name);if (ret == -1){printf("要刪除的人不存在\n");return;}//刪除這個人int i = 0;for (i = ret; i < pc->sz - 1; i++)    //注意此處的sz - 1 {pc->data[i] = pc->data[i + 1];}pc->sz--;printf("刪除成功\n");
}
  • DelContact函數中創建的char類型的數組name是為了存儲要刪除的聯系人的名字。這是因為在循環中進行聯系人比較時,我們需要將要刪除的聯系人的名字與contacts數組中的每個聯系人的名字進行比較,以找到要刪除的聯系人的索引。
  • 如果沒有name數組并且直接在循環中將contacts[i].name與要刪除的聯系人的名字進行比較,那么在找到要刪除的聯系人之后,我們將無法在后續的循環中對其進行操作。因為我們只能訪問到contacts[i]和contacts[i-1],找不到要刪除的聯系人的索引。
  • 通過將要刪除的聯系人的名字存儲在name數組中,我們可以在找到要刪除的聯系人之后,繼續使用它的索引進行相應操作,例如移動后面的聯系人、更新sz等等。這樣就可以正確地刪除聯系人,并保持contacts數組的完整性。

  • 在代碼中,DelContact函數的最后一個循環是為了從contacts數組中刪除指定的聯系人。循環通過將指定位置后面的聯系人逐個向前移動一位來實現。因此,循環條件是i < sz-1,即i的值需要小于sz-1。
  • 這是因為刪除聯系人時,需要將后面的聯系人向前移動一個位置。而不是用后面的一個聯系人來覆蓋要刪除的聯系人。如果循環條件是i < sz,那么最后一個聯系人將無法被移動,因為沒有后面的聯系人可以填充它的位置。比如現在是10個聯系人
  • 因此,循環條件為i < sz-1確保了所有聯系人都能被正確地向前移動一位,保證了聯系人信息的完整性。

?將ret后面的所有內容向前平移一位,就可以覆蓋掉要ret指向的內容,然后再對sz--,這樣變相地完成了對信息的刪除。等將來又有新聯系人加入時,因為sz--了所以寫入信息時會覆蓋掉下標為ret中的內容。



?3.7、查找指定聯系人SearchContact函數

【contact.h】

//查找指定聯系人
void SearchContact(Contact* pc);

?【contact.c】

void SearchContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("請輸入要查找人的名字:");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}//顯示查查找到的信息printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");printf("%-20s%-5d%-5s%-12s%-30s\n",pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);}



3.8、修改指定聯系人ModifyContact函數

?【contact.h】

//修改指定聯系人
void ModifyContact(Contact* pc);

?【contact.c】

void ModifyContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("請輸入要修改人的名字:");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}//修改printf("請輸入名字:");scanf("%s", pc->data[ret].name);printf("請輸入年齡:");scanf("%d", &(pc->data[ret].age));printf("請輸入性別:");scanf("%s", pc->data[ret].sex);printf("請輸入電話:");scanf("%s", pc->data[ret].tele);printf("請輸入地址:");scanf("%s", pc->data[ret].addr);
}

調用FindByName函數進行判斷,有此人則返回下標,沒有此人則返回-1。

找到之后直接將該下標下的所有信息都重新接收并覆蓋,就完成了修改操作。



?3.9、以年齡排序聯系人SortContact函數

?【contact.h】

//排序聯系人
void SortContact(Contact* pc);

?【contact.c】

int cmp_age(const void* e1, const void* e2)
{return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}void SortContact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通訊錄為空,無需排序\n");return;}qsort(pc, pc->sz, sizeof(PeoInfo), cmp_age);printf("排序成功\n");
}

?仍然存在的問題:

1.錄入的信息,等程序結束后就不存在了,這是因為數據存放在內存中的。為了解決這個問題,需要使用到文件存儲的知識。
2.通訊錄的大小是固定的100個元素,只能最多存放100個人。當信息太少時,就會導致空間剩余過大浪費空間,而當信息太多時空間又太小了無法進行存入,而解決這個問題需要使用到動態內存管理的知識。下面就來優化一下通訊錄。



?4、使用動態規劃優化通訊錄?

規定:

  1. 通訊錄剛開始時可以存放3個人的信息。#define DEFAULT_SZ 3
  2. 當空間放滿時,自動增加容量,每次增加2個信息的空間。#define DEFAULT_INC 2

?定義通訊錄Contact結構體:

?首先是通訊錄這個結構體要修改,因為原來定死了是100人,這里使用一個PeoInfo類型的指針,空間是malloc開辟的,方便我們使用realloc來調整大小

?【靜態】

靜態版本
typedef struct Contact
{PeoInfo data[MAX];int sz; //記錄的是當前通訊錄中存放的人的信息個數
}Contact;

?【動態】

動態版本
typedef struct Contact
{PeoInfo* data;int sz; //記錄的是當前通訊錄中存放的人的信息個數int capacity; //記錄的時通訊錄當前的最大容量
}Contact;

?sz記錄的是當前通訊錄中存放的人的信息個數
?capacity記錄的時通訊錄當前的最大容量

當sz==capacit就要考慮增容了


?初始化通訊錄InitContact函數:?

使用calloc對data指針進行動態開辟空間,如果開辟失敗則用perror打印錯誤信息

【靜態】?


靜態版本
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}

【動態】

初始化sz,capacity,data(使用calloc來開辟)就要判斷返回的指針是不是為NULL

void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;pc->capacity = DEFAULT_SZ;  //#define DEFAULT_SZ 3pc->data = (PeoInfo*)calloc(pc->capacity, sizeof(PeoInfo));if (pc->data == NULL){perror("InitContact->calloc");return;}
}


??增加聯系人AddContact函數:

人滿了就要增加容量判斷條件是當sz==capacit就要考慮增容了。使用if語句。使用realloc函數增容,記得要先創建一個指針tmp來判斷返回的指針是不是為NULL不為NULL是賦值給p

【靜態】


靜態版本
void AddContact(Contact* pc)
{assert(pc);if (pc->sz == MAX){printf("通訊錄已滿,無法增加\n");return;}printf("請輸入名字:");scanf("%s", pc->data[pc->sz].name);printf("請輸入年齡:");scanf("%d", &(pc->data[pc->sz].age));printf("請輸入性別:");scanf("%s", pc->data[pc->sz].sex);printf("請輸入電話:");scanf("%s", pc->data[pc->sz].tele);printf("請輸入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("增加成功\n");}

?【動態】


void AddContact(Contact* pc)
{assert(pc);if (pc->sz == pc->capacity){PeoInfo* tmp = (PeoInfo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));if (tmp != NULL){pc->data = tmp;pc->capacity += DEFAULT_INC;  //#define DEFAULT_INC 2printf("增容成功\n");}else{perror("AddContact->realloc");return;}}printf("請輸入名字:");scanf("%s", pc->data[pc->sz].name);printf("請輸入年齡:");scanf("%d", &(pc->data[pc->sz].age));printf("請輸入性別:");scanf("%s", pc->data[pc->sz].sex);printf("請輸入電話:");scanf("%s", pc->data[pc->sz].tele);printf("請輸入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("增加成功\n");}

?pc->data就是指針這個data是一個PeoInfo類型的指針

?也可以把這個增容的操作單獨封裝成一個函數

if (pc->sz == pc->capacity){PeoInfo* tmp = (PeoInfo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));if (tmp != NULL){pc->data = tmp;pc->capacity += DEFAULT_INC;  //#define DEFAULT_INC 2printf("增容成功\n");}else{perror("AddContact->realloc");return;}}


在EXIT退出通訊錄時候記得對動態開辟的空間進行free操作:

【contact.h】

//銷毀通訊錄
void DestroyContact(Contact* pc);

【contact.c】

void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}

?結束

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12899.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shell之常用命令

目錄 1.排序工具--sort命令 1.1 快讀查找一個目錄中最大文件 2.去重工具--uniq命令 2.1 分析判斷遠程登錄錯誤次數&#xff0c;禁止該用戶遠程登錄 3.修改工具--tr命令 4.列截取工具--cut命令 5.分割文件工具--split命令 6.合并文件列--paste命令 7.掃描工具--eval命令…

OpenAI和互聯網行業的發展,有著異曲同工之處

當OpenAI首席技術官米拉穆拉提發布桌面版本的ChatGPT和新的旗艦模型—GPT-4o&#xff0c;OpenAI的發展&#xff0c;進入到了一個真正意義上的奇點時刻。 OpenAI的短短26分鐘的發布會&#xff0c;卻依然引發了不少波瀾。 無論是ChatGPT-4o的完全免費&#xff0c;抑或是推出PC桌…

【Linux】常用指令、熱鍵與權限管理

一、常用指令 &#xff08;1&#xff09;ls 功能&#xff1a;列出指定目錄下的所有子目錄與文件 用法&#xff1a;ls &#xff08;選項&#xff09; &#xff08;目錄或文件名&#xff09; 常用選項&#xff1a; -a&#xff1a;列出目錄下的所有文件&#xff0c;包括隱藏…

c語言中數字字符串和數字互轉

#include <getopt.h> #include <stdio.h> #include <stdlib.h>#define MAX_PATH 256 char filename[MAX_PATH 5]; int main(int argc, char** argv) {//數字字符串轉數字const char* kk "689";int zhi atoi(kk) 8;//數字字符串轉doubledoub…

從HTTP遷移到HTTPS:一篇全面的測試方案設計指南

在當今的互聯網世界里&#xff0c;數據安全性日益受到重視。將網站從HTTP遷移到HTTPS已成為提升數據傳輸安全性的重要一步。HTTPS&#xff08;超文本傳輸安全協議&#xff09;通過SSL/TLS協議為客戶端和服務器之間的通信加密&#xff0c;保護數據免受中間人攻擊&#xff08;MIT…

代碼隨想錄訓練營Day 29|力扣39. 組合總和、40.組合總和II、131.分割回文串

1.組合總和 題目鏈接/文章講解&#xff1a; 代碼隨想錄 視頻講解&#xff1a;帶你學透回溯算法-組合總和&#xff08;對應「leetcode」力扣題目&#xff1a;39.組合總和&#xff09;| 回溯法精講&#xff01;_嗶哩嗶哩_bilibili 代碼&#xff1a;&#xff08;未剪枝版 &#xf…

ChatGPT未來可能應用于iPhone?

蘋果接即將與OpenAI達成協議 ChatGPT未來應用于iPhone 前言 就在5月11日&#xff0c;蘋果公司正與OpenAI進行深入討論&#xff0c;計劃在其最新的iOS操作系統中整合OpenAI的先進技術。這一舉措是蘋果公司在為其產品線融入更先進的人工智能功能所做努力的一部分。 目前情況雙方…

vue2 八大組件通信,父子通信,跨層級通信,事件總線,vuex等

文章目錄 什么是組件通信&#xff1f;父子通信流程propsProps 定義Props 作用特點數組寫法對象寫法&#xff08;props校驗&#xff09;簡寫只驗證數據類型&#xff1a;完整寫法&#xff0c;完整的驗證&#xff1a; props父向子傳值用props父傳子在子組件中修改props $emit子向父…

自定義 Gradle 插件進行統一的靜態代碼分析

靜態代碼分析是一項了不起的技術, 它能讓代碼庫更易于維護. 但是, 如果你在不同的版本庫中擁有多個服務(可能由不同的團隊開發), 如何才能讓每個人都遵循既定的代碼風格呢? 一個好辦法是將所有規則封裝在一個插件中, 該插件會在每個項目構建時自動執行所需的驗證. 因此, 在本…

最新版rancher環境配置安裝和集群搭建詳細教程記錄

&#x1f680; 作者 &#xff1a;“二當家-小D” &#x1f680; 博主簡介&#xff1a;?前荔枝FM架構師、阿里資深工程師||曾任職于阿里巴巴擔任多個項目負責人&#xff0c;8年開發架構經驗&#xff0c;精通java,擅長分布式高并發架構,自動化壓力測試&#xff0c;微服務容器化k…

2024-05-15 問AI: 介紹一下 , Tacotron系列

文心一言 Tacotron系列是由谷歌開發的&#xff0c;主要用于文本到語音&#xff08;TTS&#xff09;轉換的模型。該系列模型基于端到端的序列到序列&#xff08;Seq2Seq&#xff09;架構&#xff0c;能夠直接從文本中生成聽起來自然的語音。 Tacotron模型是首個端到端的TTS深度…

BGP學習三:BGP路由優選12條規則,閃亮登場啦啦啦啦啦

目錄 一.BGP策略工具 &#xff08;1&#xff09;Router-policy作用 &#xff08;2&#xff09;組成部分 &#xff08;3&#xff09;router-policy注意事項 二.優選規則 ①丟棄下一跳不可達 (1)優選prefered-value值大的路由 1.首選優先級 (2)優選local-preference(本地…

Fast-Poisson-Image-Editing代碼介紹(二)

目錄 2.fpei文件下 2.6 number_solver.py 2.7 process.py 2.8 taichi_solver.py 3. 算法總結 4. 代碼運行 4.1 測試 4.2 基于GUI后端自定義框輸出編輯圖像結果 4.2.1 下載open-cv 4.2.2 輸入命令 4.2.3 自定義框 4.2.4 按ESC退出 接續Fast-Poisson-Image-Editing代碼…

企業研發必備網絡:這些關鍵特性,你get了嗎?

對于以研發為核心的企業&#xff0c;如軟件開發、生物制藥、智能汽車等&#xff0c;安全、穩定的研發網絡可是他們業務發展不可或缺的。那么&#xff0c;這些研發網絡究竟有哪些獨特之處&#xff0c;又能為企業帶來哪些價值呢&#xff1f; 首先&#xff0c;我們知道企業研發常常…

開放式耳機哪款具有高性價比?5款高分開放式耳機傾力推薦

作為多年的耳機發燒友&#xff0c;強烈給你們安利開放式耳機&#xff0c;真的是舒適耐用&#xff0c;性價比高。開放式耳機以其獨特的不入耳設計&#xff0c;給用戶帶來了最舒適的佩戴感受。如果小白還不知道怎么選擇高性價比的開放式耳機那就看看我的總結吧&#xff01;下面就…

前端面試題(二十三)(答案版)

面試形式&#xff1a;線上電話面試&#xff1a;一面&#xff1a;時長30分鐘 面試評價&#xff1a;精準考察項目所需技術理論工作實踐 面試官的提問大綱&#xff1a;本公司項目要求本人簡歷 工作經驗&#xff1a;2-4年 公司名稱&#xff1a;深圳XX&#xff08;想知道的就滴喔…

馮喜運:5.15黃金原油晚盤分析:鮑威爾再放鷹,降息懸念重重

【黃金消息面分析】&#xff1a;在全球經濟動蕩和通脹預期不斷上升的背景下&#xff0c;黃金作為傳統的避險資產&#xff0c;再次成為投資者關注的焦點。當前&#xff0c;黃金價格交投于2370美元/盎司左右&#xff0c;連續兩日日線呈現上漲趨勢&#xff0c;而白銀價格也在連續三…

超級數據查看器 教程合集 整理版本 pdf格式 1-31集

點擊下載 超級數據查看器 教程合集整理版本 pdf格式https://download.csdn.net/download/qq63889657/89311725?spm1001.2014.3001.5501

16個可幫助我們工作的職場神器

在職場中&#xff0c;有效的工具可以顯著提高工作效率和組織能力。以下是一些可以幫助我們更好地組織工作的“職場神器”&#xff1a; 項目管理軟件 - zz-plan https://zz-plan.com/ 利用在線甘特圖和看板功能&#xff0c;幫助團隊成員清晰地規劃和跟蹤項目進度。支持資源視圖&…

微信小程序更新日志

還不會用github&#xff0c;git等&#xff0c;先用熟悉的記了 20240514 1.添加了簡易的錄音功能 2.添加了簡易的鬧鐘到時振動功能。 3.準備使用setInterval實現持續振動&#xff0c;直到用戶停止。 4.實現3的功能 5.獲取了訂閱消息模版