【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码

文章目录

  • 通讯录管理系统
    • 一、系统需求以及成品演示
    • 二、代码实现
    • 三、完整代码

通讯录管理系统

一、系统需求以及成品演示

1.1 系统需求

通讯录是一个可以记录亲人、好友信息的工具。这里利用C++来实现一个通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

1.2 成品演示

通讯录管理系统

二、代码实现

2.1 菜单功能

功能描述: 用户选择功能的界面
步骤:

  • 封装函数显示该界面 void showMenu()
  • 在main函数中调用封装好的函数
// 菜单函数
void showMenu()
{cout << "***************************" << endl;cout << "*****  1、添加联系人  *****" << endl;cout << "*****  2、显示联系人  *****" << endl;cout << "*****  3、删除联系人  *****" << endl;cout << "*****  4、查找联系人  *****" << endl;cout << "*****  5、修改联系人  *****" << endl;cout << "*****  6、清空联系人  *****" << endl;cout << "*****  0、退出通讯录  *****" << endl;cout << "***************************" << endl;cout << "请选择:  ";
}

在这里插入图片描述

2.2 退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序

int main()
{while (true){showMenu();  // 调用菜单函数int select = 0;  // 用户选择变量cin >> select;switch (select){case 1:  // 1、添加联系人break;case 2:  // 2、显示联系人break;case 3:  // 3、删除联系人break;case 4:  // 4、查找联系人break;case 5:  // 5、修改联系人break;case 6:  // 6、清空联系人break;case 0:  // 0、退出通讯录cout << "欢迎下次使用" << endl;system("pause");return 0;break;default:break;}}system("pause");return 0;
}

在这里插入图片描述

2.3 添加联系人

功能描述:

实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)

添加联系人实现步骤:

  • 设计联系人结构体
  • 设计通讯录结构体
  • main函数中创建通讯录
  • 封装添加联系人函数
  • 测试添加联系人功能

设计联系人结构体
联系人信息包括:姓名、性别、年龄、联系电话、家庭住址

// 联系人结构体
struct Person
{// 姓名string m_Name;// 性别     1、男    2、女int m_Set;// 年龄int m_Age;// 电话string m_Phone;// 地址string m_Addr;
};

设计通讯录结构体
设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量。

#define MAX 1000  // 最大人数
// 设计通讯录结构体
struct Addressbooks
{// 通讯录中保存的联系人数组struct Person personArray[MAX];// 通讯录中人员个数int m_Size;
};

main函数中创建通讯录
添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录

mian函数起始位置添加:
// 创建通讯录
Addressbooks abs;
//初始化通讯录中人数
abs.m_Size = 0;

封装添加联系人函数
思路:添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录

// 1、添加联系人信息
void addPerson(Addressbooks* abs)
{// 判断通讯录是否已满if (abs->m_Size == MAX){cout << "通讯录已满,无法继续添加新联系人!!!" << endl;return;}else {// 姓名string name;  cout << "请输入姓名: ";cin >> name;abs->personArray[abs->m_Size].m_Name = name;// 性别int sex;while (true){cout << "请输入性别(1、男 or 2、女):  ";cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[abs->m_Size].m_Sex = sex;break;}cout << "输入错误,请重新输入" << endl;}// 年龄int age;cout << "请输入年龄:  ";cin >> age;abs->personArray[abs->m_Size].m_Age = age;// 联系电话string phone;cout << "请输入联系电话:  ";cin >> phone;abs->personArray[abs->m_Size].m_Phone = phone;// 家庭地址string address;cout << "请输入家庭地址:  ";cin >> address;abs->personArray[abs->m_Size].m_Addr = address;// 更新通讯录人数abs->m_Size++;cout << "添加成功" << endl;system("pause");system("cls");}
}

测试添加联系人功能
选择界面中,如果玩家选择了1,代表添加联系人,我们可以测试下该功能

case 1:  //添加联系人addPerson(&abs);break;

在这里插入图片描述

2.4 显示联系人

功能描述:显示通讯录中已有的联系人信息

显示联系人实现步骤:

  • 封装显示联系人函数
  • 测试显示联系人功能

封装显示联系人函数
思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息。

// 显示所有联系人信息
void showPerson(Addressbooks* abs)
{if (abs->m_Size == 0) {cout << "当前记录为空" << endl;}else{for (int i = 0; i < abs->m_Size; i++) {cout << "姓名: " << abs->personArray[i].m_Name << "\t";cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄: " << abs->personArray[i].m_Age << "\t";cout << "联系电话: " << abs->personArray[i].m_Phone << "\t";cout << "家庭地址: " << abs->personArray[i].m_Addr << endl;}}system("pause");system("cls");
}

测试显示联系人功能
在switch case语句中,case 2 里添加

case 2:  //显示联系人showPerson(&abs);break;

在这里插入图片描述

2.5 删除联系人

功能描述:按照姓名进行删除指定联系人

删除联系人实现步骤:

  • 封装检测联系人是否存在
  • 封装删除联系人函数
  • 测试删除联系人功能

封装检测联系人是否存在

设计思路:

删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人
因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1。

// 判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1
int isExist(Addressbooks* abs, string name)
{for (int i = 0; i < abs->m_Size; i++) {if (abs->personArray[i].m_Name == name)return i;  // 找到了}return -1;  // 没找到
}

封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人,查找到进行删除,并提示删除成功,查不到提示查无此人。

// 3、删除指定联系人信息
void deletePerson(Addressbooks* abs)
{string name;cout << "请输入你要删除的联系人:  ";cin >> name;int ret = isExist(abs, name);if (ret != -1) {for (int i = ret; i < abs->m_Size; i++) {abs->personArray[i] = abs->personArray[i + 1];}abs->m_Size--;cout << "删除成功" << endl;}else {cout << "查无此人" << endl;}system("pause");system("cls");
}

测试删除联系人功能

case 3:  //删除联系人deletePerson(&abs);break;

在这里插入图片描述

2.6 查找联系人

功能描述:按照姓名查看指定联系人信息

查找联系人实现步骤

  • 封装查找联系人函数
  • 测试查找指定联系人

封装查找联系人函数
实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。

// 4、查找指定联系人信息
void findPerson(Addressbooks* abs)
{string name;cout << "请输入你要查找的联系人姓名:  ";cin >> name;int ret = isExist(abs, name);if (ret != -1) {cout << "姓名: " << abs->personArray[ret].m_Name << "\t";cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄: " << abs->personArray[ret].m_Age << "\t";cout << "联系电话: " << abs->personArray[ret].m_Phone << "\t";cout << "家庭地址: " << abs->personArray[ret].m_Addr << endl;}else {cout << "查无此人" << endl;}system("pause");system("cls");
}

测试查找指定联系人
在switch case 语句中,case4里添加:

case 4:  //查找联系人findPerson(&abs);break;

在这里插入图片描述

2.7 修改联系人

功能描述:按照姓名重新修改指定联系人

修改联系人实现步骤

  • 封装修改联系人函数
  • 测试修改联系人功能

封装修改联系人函数
实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人。

// 5、修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{string name;cout << "请输入你要修改的联系人姓名:  ";cin >> name;int ret = isExist(abs, name);if (ret != -1){// 姓名string name;cout << "请输入姓名: ";cin >> name;abs->personArray[ret].m_Name = name;// 性别int sex;while (true){cout << "请输入性别(1、男 or 2、女):  ";cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[ret].m_Sex = sex;break;}cout << "输入错误,请重新输入" << endl;}// 年龄int age;cout << "请输入年龄:  ";cin >> age;abs->personArray[ret].m_Age = age;// 联系电话string phone;cout << "请输入联系电话:  ";cin >> phone;abs->personArray[ret].m_Phone = phone;// 家庭地址string address;cout << "请输入家庭地址:  ";cin >> address;abs->personArray[ret].m_Addr = address;cout << "联系人信息修改成功" << endl;}else {cout << "查无此人" << endl;}system("pause");system("cls");
}

测试修改联系人功能
在switch case 语句中,case 5里添加:

case 5:  //修改联系人modifyPerson(&abs);break;

在这里插入图片描述

2.8 清空联系人

功能描述:清空通讯录中所有信息

清空联系人实现步骤

  • 封装清空联系人函数
  • 测试清空联系人

封装清空联系人函数
实现思路: 将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。

// 6、清空所有联系人
void cleanPerson(Addressbooks* abs)
{char chiose;cout << "确认清空通讯录吗(y/n): ";while (true){cin >> chiose;if (chiose == 'y') {abs->m_Size = 0;cout << "通讯录已清空" << endl;break;}else if (chiose == 'n') {cout << "已取消清空" << endl;break;}else {cout << "输入错误,请重新输入" << endl;}}system("pause");system("cls");
}

测试清空联系人
在switch case 语句中,case 6 里添加:

case 6:  //清空联系人cleanPerson(&abs);break;

在这里插入图片描述

三、完整代码

#include<iostream>
#include<string>
using namespace std;
#define MAX 1000  // 最大人数// 联系人结构体
struct Person
{// 姓名string m_Name;// 性别     1、男    2、女int m_Sex;// 年龄int m_Age;// 电话string m_Phone;// 地址string m_Addr;
};// 设计通讯录结构体
struct Addressbooks
{// 通讯录中保存的联系人数组struct Person personArray[MAX];// 通讯录中人员个数int m_Size;
};// 1、添加联系人信息
void addPerson(Addressbooks* abs)
{// 判断通讯录是否已满if (abs->m_Size == MAX){cout << "通讯录已满,无法继续添加新联系人!!!" << endl;return;}else {// 姓名string name;  cout << "请输入姓名: ";cin >> name;abs->personArray[abs->m_Size].m_Name = name;// 性别int sex;while (true){cout << "请输入性别(1、男 or 2、女):  ";cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[abs->m_Size].m_Sex = sex;break;}cout << "输入错误,请重新输入" << endl;}// 年龄int age;cout << "请输入年龄:  ";cin >> age;abs->personArray[abs->m_Size].m_Age = age;// 联系电话string phone;cout << "请输入联系电话:  ";cin >> phone;abs->personArray[abs->m_Size].m_Phone = phone;// 家庭地址string address;cout << "请输入家庭地址:  ";cin >> address;abs->personArray[abs->m_Size].m_Addr = address;// 更新通讯录人数abs->m_Size++;cout << "添加成功" << endl;system("pause");system("cls");}
}// 显示所有联系人信息
void showPerson(Addressbooks* abs)
{if (abs->m_Size == 0) {cout << "当前记录为空" << endl;}else{for (int i = 0; i < abs->m_Size; i++) {cout << "姓名: " << abs->personArray[i].m_Name << "\t";cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄: " << abs->personArray[i].m_Age << "\t";cout << "联系电话: " << abs->personArray[i].m_Phone << "\t";cout << "家庭地址: " << abs->personArray[i].m_Addr << endl;}}system("pause");system("cls");
}// 判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1
int isExist(Addressbooks* abs, string name)
{for (int i = 0; i < abs->m_Size; i++) {if (abs->personArray[i].m_Name == name)return i;  // 找到了}return -1;  // 没找到
}// 3、删除指定联系人信息
void deletePerson(Addressbooks* abs)
{string name;cout << "请输入你要删除的联系人:  ";cin >> name;int ret = isExist(abs, name);if (ret != -1) {for (int i = ret; i < abs->m_Size; i++) {abs->personArray[i] = abs->personArray[i + 1];}abs->m_Size--;cout << "删除成功" << endl;}else {cout << "查无此人" << endl;}system("pause");system("cls");
}// 4、查找指定联系人信息
void findPerson(Addressbooks* abs)
{string name;cout << "请输入你要查找的联系人姓名:  ";cin >> name;int ret = isExist(abs, name);if (ret != -1) {cout << "姓名: " << abs->personArray[ret].m_Name << "\t";cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄: " << abs->personArray[ret].m_Age << "\t";cout << "联系电话: " << abs->personArray[ret].m_Phone << "\t";cout << "家庭地址: " << abs->personArray[ret].m_Addr << endl;}else {cout << "查无此人" << endl;}system("pause");system("cls");
}// 5、修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{string name;cout << "请输入你要修改的联系人姓名:  ";cin >> name;int ret = isExist(abs, name);if (ret != -1){// 姓名string name;cout << "请输入姓名: ";cin >> name;abs->personArray[ret].m_Name = name;// 性别int sex;while (true){cout << "请输入性别(1、男 or 2、女):  ";cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[ret].m_Sex = sex;break;}cout << "输入错误,请重新输入" << endl;}// 年龄int age;cout << "请输入年龄:  ";cin >> age;abs->personArray[ret].m_Age = age;// 联系电话string phone;cout << "请输入联系电话:  ";cin >> phone;abs->personArray[ret].m_Phone = phone;// 家庭地址string address;cout << "请输入家庭地址:  ";cin >> address;abs->personArray[ret].m_Addr = address;cout << "联系人信息修改成功" << endl;}else {cout << "查无此人" << endl;}system("pause");system("cls");
}// 6、清空所有联系人
void cleanPerson(Addressbooks* abs)
{char chiose;cout << "确认清空通讯录吗(y/n): ";while (true){cin >> chiose;if (chiose == 'y') {abs->m_Size = 0;cout << "通讯录已清空" << endl;break;}else if (chiose == 'n') {cout << "已取消清空" << endl;break;}else {cout << "输入错误,请重新输入" << endl;}}system("pause");system("cls");
}// 菜单函数
void showMenu()
{cout << "***************************" << endl;cout << "*****  1、添加联系人  *****" << endl;cout << "*****  2、显示联系人  *****" << endl;cout << "*****  3、删除联系人  *****" << endl;cout << "*****  4、查找联系人  *****" << endl;cout << "*****  5、修改联系人  *****" << endl;cout << "*****  6、清空联系人  *****" << endl;cout << "*****  0、退出通讯录  *****" << endl;cout << "***************************" << endl;cout << "请选择:  ";
}int main()
{// 创建通讯录Addressbooks abs;//初始化通讯录中人数abs.m_Size = 0;while (true){showMenu();  // 调用菜单函数int select = 0;  // 用户选择变量cin >> select;switch (select){case 1:  // 1、添加联系人addPerson(&abs);break;case 2:  // 2、显示联系人showPerson(&abs);break;case 3:  // 3、删除联系人deletePerson(&abs);break;case 4:  // 4、查找联系人findPerson(&abs);break;case 5:  // 5、修改联系人modifyPerson(&abs);break;case 6:  // 6、清空联系人cleanPerson(&abs);break;case 0:  // 0、退出通讯录cout << "欢迎下次使用" << endl;system("pause");return 0;break;default:break;}}system("pause");return 0;
}

至此,通讯录管理系统完成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

申请的商标名称相同或近似,如何解决!

最近遇到一些首次申请注册商标的主体&#xff0c;基本想的名称都是两个字或或者两个字加通用词&#xff0c;还有用的行业描述词或缺乏显著特征词&#xff0c;这样去申请注册商标&#xff0c;普推知产老杨分析这样去直接申请注册大概率驳回。 两个字基本上注册的差不多了&#…

Ubuntu 20.04中用scrapy爬取博客园新闻首页的简单示例

一、梳理scrapy项目目录创建&#xff1a; 1、命令行终端定位到pycharm主目录&#xff1a;cd PycharmProjects 2、建立项目名称&#xff1a;scrapy startproject searchArticle 3、定位到项目目录下&#xff1a;cd searchArticle 4、设置爬虫名称与欲爬取的域名地址&#xf…

为什么c语言不对0和NULL做严格的区分?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;这个答案很简单:c语言不区分…

上海亚商投顾:沪指冲高回落 电力、电网产业链持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指均跌超1%。电力、电网股再度爆发&#xff0c;众智科技、郴电国…

展望跨境智慧银行在全球化金融服务中的发展趋势和机遇

一、引言 随着全球经济的不断融合和金融科技的迅猛发展,跨境智慧银行作为连接不同国家和地区金融市场的桥梁,正逐渐展现出其独特的魅力和潜力。跨境支付与结算作为跨境智慧银行的核心业务之一,随着全球化的深入发展和国际贸易的日益频繁,其业务场景也愈发丰富和复杂。本文…

Xcode 15 libarclite 缺失问题

升级到Xcode 15运行项目报错&#xff0c;报错信息如下&#xff1a; SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum d…

基于PHP+MySQL组合开发的720VR全景小程序源码系统 一键生成三维实景 前后端分离带网站的安装代码包以及搭建教程

系统概述 这款源码系统是专门为实现 720VR 全景展示而设计的。它结合了先进的技术和创新的理念&#xff0c;能够将真实场景以全景的形式呈现给用户&#xff0c;让用户仿佛身临其境。该系统采用 PHP 进行后端开发&#xff0c;MySQL 作为数据库管理系统&#xff0c;确保了系统的…

G60-M60F-ZQ手动抓取快速接头,专用于吊装设备的重物快速抓取

客户需求概述&#xff1a; 客户需要将重达将近400公斤的产品从一个工作台移动至另一个工作台&#xff0c;目前的方法是通过人工将吊环的螺纹与产品的螺纹相互拧紧&#xff0c;然后利用装备吊起移动&#xff0c;但这种方式效率低下&#xff0c;且因为工人的操作有时难以达到理想…

使用vanna实现Text2SQL

这节一起用vanna来实现自然语言转SQL&#xff0c;之前的大模型一直停留在问答阶段&#xff0c;答案基本都是大模型提供的&#xff0c;至多是加点本地知识库&#xff0c;tet&#xff0c;pdf等文档&#xff0c;丰富大模型的内容&#xff0c;但是想要大模型与一些管理系统对接还是…

XDebug配置极简教程,phpstorm实现http请求断点调试

写这篇的文章的初衷:网络上配置XDebug的文章有很多,XDebug也有官方的文档, PhpStorm也有官方的文档,为什么还要写那? 相信不少人,都有一种感觉,虽然教程很多,但是按教程走一遍,自己的确不能正常调试。 问题出在下面几个方面: 1. 对调试过程中,没有一定的认识,因此…

使用ETL读取文件数据并快速写入mysql中

本文介绍使用国产的ETL工具ETLCloud平台来读取文件文件中的数据到mysql数据库中&#xff0c;首先需要安装ETLCloud的社区版本&#xff0c;然后在示例应用中创建一个文件读取流程如下&#xff1a; 点击“流程设计”后打开流程图如下 打开文本文件读取节点配置要读取的文件目录和…

刷代码随想录有感(82):贪心算法——摆动序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() < 1)return nums.size();int prediff 0;int curdiff 0;int res 1;for(int i 0; i < nums.size() - 1; i){curdiff nums[i 1] - nu…

【美羊羊拿金币问题】

问题&#xff1a; 有一天美羊羊正在草地上玩耍&#xff0c;突然天上开始落金币&#xff0c;这些金币掉落的范围在一个固定的水平区域内&#xff0c;但这些金币一旦掉落到地上就消失了&#xff0c;因此美羊羊只有不断地移动并从空中接住这些金币才能得到它们。假设金币掉落的位…

【OCPP】ocpp1.6协议第3.13章节SmartCharging介绍及翻译

目录 3.13 SmartCharging智能充电-概述 智能充电的目标 关键功能 消息类型 负载管理 动态电量配置 总结 3.13 SmartCharging智能充电-译文 3.13.1 Charging Profile Purpose充电配置的目的 3.13.2 Stacking charging profile堆叠充电配置 3.13.3 Combining charging profile pu…

OrangePi AIpro开发板,使用了310B,昇腾310B较于昇腾310有何性能提升?

OrangePi AIpro开发板 他们对应的模组分别是&#xff1a;Atlas 200 AI和Atlas 200I A2 310&#xff1a;基本规格 - Atlas 200 AI加速模块 用户指南 14 - 华为 (huawei.com) 310B&#xff1a;基本规格 - Atlas 200I A2 加速模块 用户指南 04 - 华为 (huawei.com)

java面试(多线程)

线程和进程的区别 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘&#xff0c;网络等设备。进程就是用来加载指令&#xff0c;管理内存&#xff0c;管…

详解makefile中addprefix

在 Makefile 中&#xff0c;$(addprefix prefix,names…) 是一个函数&#xff0c;用于将指定的前缀添加到一组空格分隔的文件名中。这个函数通常用于将相同的前缀添加到一组文件名或路径中&#xff0c;非常适合在 Makefile 中进行路径拼接操作。 语法&#xff1a; makefile C…

微软提出“Copilot+ PCs”构想,强调本地AI处理;OpenAI暂停ChatGPT语音功能因声音相似争议

&#x1f989; AI新闻 &#x1f680; 微软提出“Copilot PCs”构想&#xff0c;强调本地AI处理 摘要&#xff1a;在微软 Build 开发者前瞻大会上&#xff0c;CEO 萨蒂亚・纳德拉介绍了“Copilot PCs”&#xff0c;一种新类 Windows PC&#xff0c;需配备神经处理单元&#xf…

27快28了,想转行JAVA或者大数据,还来得及吗?

转行到JAVA或者大数据领域&#xff0c;27岁快28岁的年龄完全来得及。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。…

通义千问图像识别功能的23个实用案例

●给出穿搭建议 这位女士佩戴的是一款精致的长款耳坠&#xff0c;设计上融合了复古和现代元素。为了更好地搭配这款耳环&#xff0c;以下是一些建议&#xff1a; 服装风格&#xff1a;由于耳环本身具有一定的华丽感&#xff0c;建议选择简约而优雅的服装来平衡整体造型。可以选…